@duckduckgo/autoconsent 1.0.6 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.cjs +14 -0
- package/.vscode/settings.json +7 -0
- package/Jenkinsfile +68 -39
- package/api.md +104 -0
- package/dist/autoconsent.cjs.js +1 -1371
- package/dist/autoconsent.esm.js +1 -1363
- package/dist/autoconsent.playwright.js +1 -0
- package/dist/autoconsent.standalone.js +1 -0
- package/lib/cmps/all.ts +15 -10
- package/lib/cmps/base.ts +91 -91
- package/lib/cmps/consentmanager.ts +31 -19
- package/lib/cmps/consentomatic.ts +89 -0
- package/lib/cmps/cookiebot.ts +62 -53
- package/lib/cmps/evidon.ts +29 -18
- package/lib/cmps/onetrust.ts +37 -19
- package/lib/cmps/sourcepoint-frame.ts +102 -0
- package/lib/cmps/sourcepoint-top.ts +47 -0
- package/lib/cmps/trustarc-frame.ts +115 -0
- package/lib/cmps/trustarc-top.ts +91 -0
- package/lib/consentomatic/index.ts +233 -70
- package/lib/{web/consentomatic → consentomatic}/tools.ts +0 -0
- package/lib/eval-handler.ts +58 -0
- package/lib/index.ts +0 -2
- package/lib/messages.ts +100 -0
- package/lib/rule-executors.ts +108 -0
- package/lib/rules.ts +82 -0
- package/lib/types.ts +35 -0
- package/lib/utils.ts +64 -0
- package/lib/web.ts +283 -74
- package/package.json +17 -14
- package/playwright/content.ts +27 -0
- package/playwright/runner.ts +131 -0
- package/playwright/standalone.ts +36 -0
- package/playwright.config.ts +7 -0
- package/readme.md +57 -47
- package/rollup.config.js +23 -15
- package/rules/autoconsent/192.json +17 -0
- package/rules/autoconsent/ausopen.json +7 -0
- package/rules/autoconsent/aws-amazon.json +1 -1
- package/rules/autoconsent/baden-wuerttemberg-de.json +7 -3
- package/rules/autoconsent/bing.json +14 -0
- package/rules/autoconsent/bundesregierung-de.json +6 -2
- package/rules/autoconsent/cc-banner.json +0 -1
- package/rules/autoconsent/cookie-notice.json +0 -1
- package/rules/autoconsent/cookieconsent.json +5 -6
- package/rules/autoconsent/destatis-de.json +0 -1
- package/rules/autoconsent/dunelm.json +18 -0
- package/rules/autoconsent/etsy.json +3 -2
- package/rules/autoconsent/eu-cookie-compliance.json +0 -1
- package/rules/autoconsent/gov-uk.json +10 -0
- package/rules/autoconsent/hl-co-uk.json +8 -9
- package/rules/autoconsent/johnlewis.json +5 -2
- package/rules/autoconsent/marksandspencer.json +7 -0
- package/rules/autoconsent/notice-cookie.json +0 -1
- package/rules/autoconsent/osano.json +0 -1
- package/rules/autoconsent/{paypal-de.json → paypal.json} +6 -2
- package/rules/autoconsent/tealium.json +4 -5
- package/rules/autoconsent/uswitch.json +8 -0
- package/rules/autoconsent/waitrose.json +28 -0
- package/rules/autoconsent/wetransfer.json +7 -0
- package/rules/rules.json +314 -39
- package/tests/192.spec.ts +7 -0
- package/tests/arzt-auskunft.spec.ts +1 -1
- package/tests/asus.spec.ts +1 -1
- package/tests/ausopen.spec.ts +7 -0
- package/tests/aws.amazon.spec.ts +1 -1
- package/tests/baden-wuerttemberg.spec.ts +1 -1
- package/tests/borlabs.spec.ts +1 -1
- package/tests/bundesregierung.spec.ts +5 -2
- package/tests/ccbanner.spec.ts +1 -1
- package/tests/consentmanager.spec.ts +3 -3
- package/tests/cookiebot.spec.ts +8 -1
- package/tests/cookieconsent.spec.ts +1 -1
- package/tests/cookielawinfo.spec.ts +1 -1
- package/tests/cookienotice.spec.ts +1 -1
- package/tests/corona-in-zahlen.spec.ts +1 -1
- package/tests/deepl.spec.ts +1 -1
- package/tests/destatis.spec.ts +1 -1
- package/tests/didomi.spec.ts +6 -2
- package/tests/drupal.spec.ts +8 -0
- package/tests/dunelm.spec.ts +7 -0
- package/tests/etsy.spec.ts +1 -1
- package/tests/eu-cookie-compliance-banner.spec.ts +1 -1
- package/tests/evidon.spec.ts +1 -1
- package/tests/fundingchoices.spec.ts +2 -1
- package/tests/gov-uk.spec.ts +9 -0
- package/tests/hl-co-uk.spec.ts +1 -1
- package/tests/hubspot.spec.ts +1 -1
- package/tests/ionos.spec.ts +1 -1
- package/tests/johnlewis.spec.ts +2 -2
- package/tests/klaro.spec.ts +1 -1
- package/tests/marksandspencer.spec.ts +7 -0
- package/tests/mediamarkt.spec.ts +1 -1
- package/tests/metoffice-gov-uk.spec.ts +1 -1
- package/tests/microsoft.spec.ts +1 -1
- package/tests/moneysavingexpert.spec.ts +1 -1
- package/tests/motor-talk.spec.ts +1 -1
- package/tests/national-lottery.spec.ts +1 -1
- package/tests/netflix.spec.ts +1 -1
- package/tests/nhs.spec.ts +1 -1
- package/tests/notice-cookie.spec.ts +1 -1
- package/tests/obi.spec.ts +1 -1
- package/tests/oil.spec.ts +1 -1
- package/tests/onetrust.spec.ts +10 -1
- package/tests/osano.spec.ts +1 -1
- package/tests/otto.spec.ts +1 -1
- package/tests/paypal.spec.ts +8 -6
- package/tests/quantcast.spec.ts +4 -1
- package/tests/snigel.spec.ts +1 -1
- package/tests/sourcepoint.spec.ts +8 -8
- package/tests/springer.spec.ts +1 -1
- package/tests/steampowered.spec.ts +1 -1
- package/tests/tealium.spec.ts +1 -1
- package/tests/testcmp.spec.ts +1 -1
- package/tests/thalia.spec.ts +1 -1
- package/tests/thefreedictionary.spec.ts +1 -1
- package/tests/trustarc.spec.ts +25 -3
- package/tests/usercentrics-1.spec.ts +1 -1
- package/tests/uswitch.spec.ts +7 -0
- package/tests/vodafone.spec.ts +1 -1
- package/tests/waitrose.spec.ts +7 -0
- package/tests/wetransfer.spec.ts +7 -0
- package/tests/wordpressgdpr.spec.ts +1 -1
- package/tests/xing.spec.ts +1 -1
- package/tsconfig.json +2 -2
- package/.eslintrc +0 -12
- package/cosmetics/rules.json +0 -110
- package/dist/autoconsent.puppet.js +0 -1072
- package/lib/cmps/all.js +0 -19
- package/lib/cmps/base.js +0 -174
- package/lib/cmps/consentmanager.js +0 -31
- package/lib/cmps/cookiebot.js +0 -73
- package/lib/cmps/evidon.js +0 -26
- package/lib/cmps/onetrust.js +0 -32
- package/lib/cmps/sourcepoint.js +0 -82
- package/lib/cmps/sourcepoint.ts +0 -95
- package/lib/cmps/trustarc.js +0 -106
- package/lib/cmps/trustarc.ts +0 -147
- package/lib/config.js +0 -1
- package/lib/consentomatic/index.js +0 -52
- package/lib/detector.js +0 -33
- package/lib/detector.ts +0 -34
- package/lib/hider.js +0 -13
- package/lib/hider.ts +0 -16
- package/lib/index.js +0 -4
- package/lib/messages.d.ts +0 -61
- package/lib/node.js +0 -35
- package/lib/node.ts +0 -43
- package/lib/puppet/tab.js +0 -121
- package/lib/puppet/tab.ts +0 -146
- package/lib/rules.d.ts +0 -80
- package/lib/tabwrapper.js +0 -67
- package/lib/tabwrapper.ts +0 -74
- package/lib/types.d.ts +0 -61
- package/lib/web/consentomatic/index.js +0 -188
- package/lib/web/consentomatic/index.ts +0 -249
- package/lib/web/consentomatic/tools.js +0 -177
- package/lib/web/content-utils.js +0 -29
- package/lib/web/content-utils.ts +0 -31
- package/lib/web/content.js +0 -79
- package/lib/web/content.ts +0 -71
- package/lib/web/tab.js +0 -112
- package/lib/web/tab.ts +0 -178
- package/lib/web.js +0 -95
- package/tests/runner.ts +0 -61
|
@@ -1,249 +0,0 @@
|
|
|
1
|
-
import Tools from "./tools";
|
|
2
|
-
|
|
3
|
-
export function matches(config: any) {
|
|
4
|
-
const result = Tools.find(config);
|
|
5
|
-
if (config.type === "css") {
|
|
6
|
-
return !!result.target;
|
|
7
|
-
} else if (config.type === "checkbox") {
|
|
8
|
-
return !!result.target && result.target.checked;
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
export async function executeAction(config: any, param?: any): Promise<boolean | void> {
|
|
13
|
-
switch (config.type) {
|
|
14
|
-
case "click":
|
|
15
|
-
return clickAction(config);
|
|
16
|
-
case "list":
|
|
17
|
-
return listAction(config, param);
|
|
18
|
-
case "consent":
|
|
19
|
-
return consentAction(config, param);
|
|
20
|
-
case "ifcss":
|
|
21
|
-
return ifCssAction(config, param);
|
|
22
|
-
case "waitcss":
|
|
23
|
-
return waitCssAction(config);
|
|
24
|
-
case "foreach":
|
|
25
|
-
return forEachAction(config, param);
|
|
26
|
-
case "hide":
|
|
27
|
-
return hideAction(config);
|
|
28
|
-
case "slide":
|
|
29
|
-
return slideAction(config);
|
|
30
|
-
case "close":
|
|
31
|
-
return closeAction(config);
|
|
32
|
-
case "wait":
|
|
33
|
-
return waitAction(config);
|
|
34
|
-
case "eval":
|
|
35
|
-
return evalAction(config);
|
|
36
|
-
default:
|
|
37
|
-
throw "Unknown action type: " + config.type;
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const STEP_TIMEOUT = 0;
|
|
42
|
-
|
|
43
|
-
function waitTimeout(timeout: number): Promise<void> {
|
|
44
|
-
return new Promise(resolve => {
|
|
45
|
-
setTimeout(() => {
|
|
46
|
-
resolve();
|
|
47
|
-
}, timeout);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async function clickAction(config: any) {
|
|
52
|
-
const result = Tools.find(config);
|
|
53
|
-
if (result.target != null) {
|
|
54
|
-
result.target.click();
|
|
55
|
-
}
|
|
56
|
-
return waitTimeout(STEP_TIMEOUT);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
async function listAction(config: any, param: any) {
|
|
60
|
-
for (let action of config.actions) {
|
|
61
|
-
await executeAction(action, param);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
async function consentAction(config: any, consentTypes: any) {
|
|
66
|
-
for (const consentConfig of config.consents) {
|
|
67
|
-
const shouldEnable = consentTypes.indexOf(consentConfig.type) !== -1;
|
|
68
|
-
if (consentConfig.matcher && consentConfig.toggleAction) {
|
|
69
|
-
const isEnabled = matches(consentConfig.matcher);
|
|
70
|
-
if (isEnabled !== shouldEnable) {
|
|
71
|
-
await executeAction(consentConfig.toggleAction);
|
|
72
|
-
}
|
|
73
|
-
} else {
|
|
74
|
-
if (shouldEnable) {
|
|
75
|
-
await executeAction(consentConfig.trueAction);
|
|
76
|
-
} else {
|
|
77
|
-
await executeAction(consentConfig.falseAction);
|
|
78
|
-
}
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
async function ifCssAction(config: any, param: any) {
|
|
84
|
-
const result = Tools.find(config);
|
|
85
|
-
if (!result.target) {
|
|
86
|
-
if (config.trueAction) {
|
|
87
|
-
await executeAction(config.trueAction, param);
|
|
88
|
-
}
|
|
89
|
-
} else {
|
|
90
|
-
if (config.falseAction) {
|
|
91
|
-
await executeAction(config.falseAction, param);
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async function waitCssAction(config: any) {
|
|
97
|
-
await new Promise<void>(resolve => {
|
|
98
|
-
let numRetries = config.retries || 10;
|
|
99
|
-
const waitTime = config.waitTime || 250;
|
|
100
|
-
const checkCss = () => {
|
|
101
|
-
const result = Tools.find(config);
|
|
102
|
-
if (
|
|
103
|
-
(config.negated && result.target) ||
|
|
104
|
-
(!config.negated && !result.target)
|
|
105
|
-
) {
|
|
106
|
-
if (numRetries > 0) {
|
|
107
|
-
numRetries -= 1;
|
|
108
|
-
setTimeout(checkCss, waitTime);
|
|
109
|
-
} else {
|
|
110
|
-
resolve();
|
|
111
|
-
}
|
|
112
|
-
} else {
|
|
113
|
-
resolve();
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
|
-
checkCss();
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
async function forEachAction(config: any, param: any) {
|
|
121
|
-
const results = Tools.find(config, true);
|
|
122
|
-
const oldBase = Tools.base;
|
|
123
|
-
for (const result of results) {
|
|
124
|
-
if (result.target) {
|
|
125
|
-
Tools.setBase(result.target);
|
|
126
|
-
await executeAction(config.action, param);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
Tools.setBase(oldBase);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
async function hideAction(config: any) {
|
|
133
|
-
const result = Tools.find(config);
|
|
134
|
-
if (result.target) {
|
|
135
|
-
result.target.classList.add("Autoconsent-Hidden");
|
|
136
|
-
// result.target.setAttribute("style", "display: none;");
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
async function slideAction(config: any) {
|
|
141
|
-
const result = Tools.find(config);
|
|
142
|
-
const dragResult = Tools.find(config.dragTarget);
|
|
143
|
-
if (result.target) {
|
|
144
|
-
let targetBounds = result.target.getBoundingClientRect();
|
|
145
|
-
let dragTargetBounds = dragResult.target.getBoundingClientRect();
|
|
146
|
-
|
|
147
|
-
let yDiff = dragTargetBounds.top - targetBounds.top;
|
|
148
|
-
let xDiff = dragTargetBounds.left - targetBounds.left;
|
|
149
|
-
|
|
150
|
-
if (this.config.axis.toLowerCase() === "y") {
|
|
151
|
-
xDiff = 0;
|
|
152
|
-
}
|
|
153
|
-
if (this.config.axis.toLowerCase() === "x") {
|
|
154
|
-
yDiff = 0;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
let screenX = window.screenX + targetBounds.left + targetBounds.width / 2.0;
|
|
158
|
-
let screenY = window.screenY + targetBounds.top + targetBounds.height / 2.0;
|
|
159
|
-
let clientX = targetBounds.left + targetBounds.width / 2.0;
|
|
160
|
-
let clientY = targetBounds.top + targetBounds.height / 2.0;
|
|
161
|
-
|
|
162
|
-
let mouseDown = document.createEvent("MouseEvents");
|
|
163
|
-
mouseDown.initMouseEvent(
|
|
164
|
-
"mousedown",
|
|
165
|
-
true,
|
|
166
|
-
true,
|
|
167
|
-
window,
|
|
168
|
-
0,
|
|
169
|
-
screenX,
|
|
170
|
-
screenY,
|
|
171
|
-
clientX,
|
|
172
|
-
clientY,
|
|
173
|
-
false,
|
|
174
|
-
false,
|
|
175
|
-
false,
|
|
176
|
-
false,
|
|
177
|
-
0,
|
|
178
|
-
result.target
|
|
179
|
-
);
|
|
180
|
-
let mouseMove = document.createEvent("MouseEvents");
|
|
181
|
-
mouseMove.initMouseEvent(
|
|
182
|
-
"mousemove",
|
|
183
|
-
true,
|
|
184
|
-
true,
|
|
185
|
-
window,
|
|
186
|
-
0,
|
|
187
|
-
screenX + xDiff,
|
|
188
|
-
screenY + yDiff,
|
|
189
|
-
clientX + xDiff,
|
|
190
|
-
clientY + yDiff,
|
|
191
|
-
false,
|
|
192
|
-
false,
|
|
193
|
-
false,
|
|
194
|
-
false,
|
|
195
|
-
0,
|
|
196
|
-
result.target
|
|
197
|
-
);
|
|
198
|
-
let mouseUp = document.createEvent("MouseEvents");
|
|
199
|
-
mouseUp.initMouseEvent(
|
|
200
|
-
"mouseup",
|
|
201
|
-
true,
|
|
202
|
-
true,
|
|
203
|
-
window,
|
|
204
|
-
0,
|
|
205
|
-
screenX + xDiff,
|
|
206
|
-
screenY + yDiff,
|
|
207
|
-
clientX + xDiff,
|
|
208
|
-
clientY + yDiff,
|
|
209
|
-
false,
|
|
210
|
-
false,
|
|
211
|
-
false,
|
|
212
|
-
false,
|
|
213
|
-
0,
|
|
214
|
-
result.target
|
|
215
|
-
);
|
|
216
|
-
result.target.dispatchEvent(mouseDown);
|
|
217
|
-
await this.waitTimeout(10);
|
|
218
|
-
result.target.dispatchEvent(mouseMove);
|
|
219
|
-
await this.waitTimeout(10);
|
|
220
|
-
result.target.dispatchEvent(mouseUp);
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
async function waitAction(config: any) {
|
|
225
|
-
await waitTimeout(config.waitTime);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async function closeAction(config: any) {
|
|
229
|
-
window.close();
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
async function evalAction(config: any): Promise<boolean> {
|
|
233
|
-
console.log("eval!", config.code);
|
|
234
|
-
return new Promise(resolve => {
|
|
235
|
-
try {
|
|
236
|
-
if (config.async) {
|
|
237
|
-
window.eval(config.code);
|
|
238
|
-
setTimeout(() => {
|
|
239
|
-
resolve(window.eval("window.__consentCheckResult"));
|
|
240
|
-
}, config.timeout || 250);
|
|
241
|
-
} else {
|
|
242
|
-
resolve(window.eval(config.code));
|
|
243
|
-
}
|
|
244
|
-
} catch (e) {
|
|
245
|
-
console.warn("eval error", e, config.code);
|
|
246
|
-
resolve(false);
|
|
247
|
-
}
|
|
248
|
-
});
|
|
249
|
-
}
|
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* This code is in most parts copied from https://github.com/cavi-au/Consent-O-Matic/blob/master/Extension/Tools.js
|
|
3
|
-
* which is licened under the MIT.
|
|
4
|
-
*/
|
|
5
|
-
export default class Tools {
|
|
6
|
-
static setBase(base) {
|
|
7
|
-
Tools.base = base;
|
|
8
|
-
}
|
|
9
|
-
static findElement(options, parent = null, multiple = false) {
|
|
10
|
-
let possibleTargets = null;
|
|
11
|
-
if (parent != null) {
|
|
12
|
-
possibleTargets = Array.from(parent.querySelectorAll(options.selector));
|
|
13
|
-
}
|
|
14
|
-
else {
|
|
15
|
-
if (Tools.base != null) {
|
|
16
|
-
possibleTargets = Array.from(Tools.base.querySelectorAll(options.selector));
|
|
17
|
-
}
|
|
18
|
-
else {
|
|
19
|
-
possibleTargets = Array.from(document.querySelectorAll(options.selector));
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
if (options.textFilter != null) {
|
|
23
|
-
possibleTargets = possibleTargets.filter(possibleTarget => {
|
|
24
|
-
let textContent = possibleTarget.textContent.toLowerCase();
|
|
25
|
-
if (Array.isArray(options.textFilter)) {
|
|
26
|
-
let foundText = false;
|
|
27
|
-
for (let text of options.textFilter) {
|
|
28
|
-
if (textContent.indexOf(text.toLowerCase()) !== -1) {
|
|
29
|
-
foundText = true;
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
return foundText;
|
|
34
|
-
}
|
|
35
|
-
else if (options.textFilter != null) {
|
|
36
|
-
return textContent.indexOf(options.textFilter.toLowerCase()) !== -1;
|
|
37
|
-
}
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
if (options.styleFilters != null) {
|
|
41
|
-
possibleTargets = possibleTargets.filter(possibleTarget => {
|
|
42
|
-
let styles = window.getComputedStyle(possibleTarget);
|
|
43
|
-
let keep = true;
|
|
44
|
-
for (let styleFilter of options.styleFilters) {
|
|
45
|
-
let option = styles[styleFilter.option];
|
|
46
|
-
if (styleFilter.negated) {
|
|
47
|
-
keep = keep && option !== styleFilter.value;
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
keep = keep && option === styleFilter.value;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
return keep;
|
|
54
|
-
});
|
|
55
|
-
}
|
|
56
|
-
if (options.displayFilter != null) {
|
|
57
|
-
possibleTargets = possibleTargets.filter(possibleTarget => {
|
|
58
|
-
if (options.displayFilter) {
|
|
59
|
-
//We should be displayed
|
|
60
|
-
return possibleTarget.offsetHeight !== 0;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
//We should not be displayed
|
|
64
|
-
return possibleTarget.offsetHeight === 0;
|
|
65
|
-
}
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
if (options.iframeFilter != null) {
|
|
69
|
-
possibleTargets = possibleTargets.filter(possibleTarget => {
|
|
70
|
-
if (options.iframeFilter) {
|
|
71
|
-
//We should be inside an iframe
|
|
72
|
-
return window.location !== window.parent.location;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
//We should not be inside an iframe
|
|
76
|
-
return window.location === window.parent.location;
|
|
77
|
-
}
|
|
78
|
-
});
|
|
79
|
-
}
|
|
80
|
-
if (options.childFilter != null) {
|
|
81
|
-
possibleTargets = possibleTargets.filter(possibleTarget => {
|
|
82
|
-
let oldBase = Tools.base;
|
|
83
|
-
Tools.setBase(possibleTarget);
|
|
84
|
-
let childResults = Tools.find(options.childFilter);
|
|
85
|
-
Tools.setBase(oldBase);
|
|
86
|
-
return childResults.target != null;
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
if (multiple) {
|
|
90
|
-
return possibleTargets;
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
if (possibleTargets.length > 1) {
|
|
94
|
-
console.warn("Multiple possible targets: ", possibleTargets, options, parent);
|
|
95
|
-
}
|
|
96
|
-
return possibleTargets[0];
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
static find(options, multiple = false) {
|
|
100
|
-
let results = [];
|
|
101
|
-
if (options.parent != null) {
|
|
102
|
-
let parent = Tools.findElement(options.parent, null, multiple);
|
|
103
|
-
if (parent != null) {
|
|
104
|
-
if (parent instanceof Array) {
|
|
105
|
-
parent.forEach(p => {
|
|
106
|
-
let targets = Tools.findElement(options.target, p, multiple);
|
|
107
|
-
if (targets instanceof Array) {
|
|
108
|
-
targets.forEach(target => {
|
|
109
|
-
results.push({
|
|
110
|
-
parent: p,
|
|
111
|
-
target: target
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
else {
|
|
116
|
-
results.push({
|
|
117
|
-
parent: p,
|
|
118
|
-
target: targets
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
return results;
|
|
123
|
-
}
|
|
124
|
-
else {
|
|
125
|
-
let targets = Tools.findElement(options.target, parent, multiple);
|
|
126
|
-
if (targets instanceof Array) {
|
|
127
|
-
targets.forEach(target => {
|
|
128
|
-
results.push({
|
|
129
|
-
parent: parent,
|
|
130
|
-
target: target
|
|
131
|
-
});
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
results.push({
|
|
136
|
-
parent: parent,
|
|
137
|
-
target: targets
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
let targets = Tools.findElement(options.target, null, multiple);
|
|
145
|
-
if (targets instanceof Array) {
|
|
146
|
-
targets.forEach(target => {
|
|
147
|
-
results.push({
|
|
148
|
-
parent: null,
|
|
149
|
-
target: target
|
|
150
|
-
});
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
else {
|
|
154
|
-
results.push({
|
|
155
|
-
parent: null,
|
|
156
|
-
target: targets
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
if (results.length === 0) {
|
|
161
|
-
results.push({
|
|
162
|
-
parent: null,
|
|
163
|
-
target: null
|
|
164
|
-
});
|
|
165
|
-
}
|
|
166
|
-
if (multiple) {
|
|
167
|
-
return results;
|
|
168
|
-
}
|
|
169
|
-
else {
|
|
170
|
-
if (results.length !== 1) {
|
|
171
|
-
console.warn("Multiple results found, even though multiple false", results);
|
|
172
|
-
}
|
|
173
|
-
return results[0];
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
Tools.base = null;
|
package/lib/web/content-utils.js
DELETED
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
// get or create a style container for CSS overrides
|
|
2
|
-
export function getStyleElementUtil() {
|
|
3
|
-
const styleOverrideElementId = "autoconsent-css-rules";
|
|
4
|
-
const styleSelector = `style#${styleOverrideElementId}`;
|
|
5
|
-
const existingElement = document.querySelector(styleSelector);
|
|
6
|
-
if (existingElement && existingElement instanceof HTMLStyleElement) {
|
|
7
|
-
return existingElement;
|
|
8
|
-
}
|
|
9
|
-
else {
|
|
10
|
-
const parent = document.head ||
|
|
11
|
-
document.getElementsByTagName("head")[0] ||
|
|
12
|
-
document.documentElement;
|
|
13
|
-
const css = document.createElement("style");
|
|
14
|
-
css.id = styleOverrideElementId;
|
|
15
|
-
parent.appendChild(css);
|
|
16
|
-
return css;
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
// hide elements with a CSS rule
|
|
20
|
-
export function hideElementsUtil(selectors, method) {
|
|
21
|
-
const hidingSnippet = method === 'display' ? `display: none` : `opacity: 0`;
|
|
22
|
-
const rule = `${selectors.join(",")} { ${hidingSnippet} !important; z-index: -1 !important; pointer-events: none !important; } `;
|
|
23
|
-
const styleEl = getStyleElementUtil();
|
|
24
|
-
if (styleEl instanceof HTMLStyleElement) {
|
|
25
|
-
styleEl.innerText += rule;
|
|
26
|
-
return selectors.length > 0;
|
|
27
|
-
}
|
|
28
|
-
return false;
|
|
29
|
-
}
|
package/lib/web/content-utils.ts
DELETED
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { HideMethod } from "../messages";
|
|
2
|
-
|
|
3
|
-
// get or create a style container for CSS overrides
|
|
4
|
-
export function getStyleElementUtil(): HTMLStyleElement {
|
|
5
|
-
const styleOverrideElementId = "autoconsent-css-rules";
|
|
6
|
-
const styleSelector = `style#${styleOverrideElementId}`;
|
|
7
|
-
const existingElement = document.querySelector(styleSelector);
|
|
8
|
-
if (existingElement && existingElement instanceof HTMLStyleElement) {
|
|
9
|
-
return existingElement;
|
|
10
|
-
} else {
|
|
11
|
-
const parent = document.head ||
|
|
12
|
-
document.getElementsByTagName("head")[0] ||
|
|
13
|
-
document.documentElement;
|
|
14
|
-
const css = document.createElement("style");
|
|
15
|
-
css.id = styleOverrideElementId;
|
|
16
|
-
parent.appendChild(css);
|
|
17
|
-
return css;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// hide elements with a CSS rule
|
|
22
|
-
export function hideElementsUtil(selectors: string[], method: HideMethod): boolean {
|
|
23
|
-
const hidingSnippet = method === 'display' ? `display: none` : `opacity: 0`;
|
|
24
|
-
const rule = `${selectors.join(",")} { ${hidingSnippet} !important; z-index: -1 !important; pointer-events: none !important; } `;
|
|
25
|
-
const styleEl = getStyleElementUtil();
|
|
26
|
-
if (styleEl instanceof HTMLStyleElement) {
|
|
27
|
-
styleEl.innerText += rule;
|
|
28
|
-
return selectors.length > 0;
|
|
29
|
-
}
|
|
30
|
-
return false;
|
|
31
|
-
}
|
package/lib/web/content.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { matches, executeAction } from "./consentomatic/index";
|
|
2
|
-
import { hideElementsUtil, getStyleElementUtil } from "./content-utils";
|
|
3
|
-
let actionQueue = Promise.resolve(null);
|
|
4
|
-
export default function handleMessage(message, debug = false) {
|
|
5
|
-
if (message.type === "click") {
|
|
6
|
-
const elem = document.querySelectorAll(message.selector);
|
|
7
|
-
debug && console.log("[click]", message.selector, elem);
|
|
8
|
-
if (elem.length > 0) {
|
|
9
|
-
if (message.all === true) {
|
|
10
|
-
elem.forEach(e => e.click());
|
|
11
|
-
}
|
|
12
|
-
else {
|
|
13
|
-
elem[0].click();
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
return elem.length > 0;
|
|
17
|
-
}
|
|
18
|
-
else if (message.type === "elemExists") {
|
|
19
|
-
const exists = document.querySelector(message.selector) !== null;
|
|
20
|
-
debug && console.log("[exists?]", message.selector, exists);
|
|
21
|
-
return exists;
|
|
22
|
-
}
|
|
23
|
-
else if (message.type === "elemVisible") {
|
|
24
|
-
const elem = document.querySelectorAll(message.selector);
|
|
25
|
-
const results = new Array(elem.length);
|
|
26
|
-
elem.forEach((e, i) => {
|
|
27
|
-
results[i] = e.offsetParent !== null || window.getComputedStyle(e).display !== "none"; // TODO: handle visibility and z-index?
|
|
28
|
-
});
|
|
29
|
-
debug && console.log("[visible?]", message.selector, elem, results);
|
|
30
|
-
if (results.length === 0) {
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
|
-
else if (message.check === "any") {
|
|
34
|
-
return results.some(r => r);
|
|
35
|
-
}
|
|
36
|
-
else if (message.check === "none") {
|
|
37
|
-
return results.every(r => !r);
|
|
38
|
-
}
|
|
39
|
-
// all
|
|
40
|
-
return results.every(r => r);
|
|
41
|
-
}
|
|
42
|
-
else if (message.type === "getAttribute") {
|
|
43
|
-
const elem = document.querySelector(message.selector);
|
|
44
|
-
debug && console.log("[getAttribute]", message.selector, elem);
|
|
45
|
-
if (!elem) {
|
|
46
|
-
return false;
|
|
47
|
-
}
|
|
48
|
-
return elem.getAttribute(message.attribute);
|
|
49
|
-
}
|
|
50
|
-
else if (message.type === "eval") {
|
|
51
|
-
// TODO: chrome support
|
|
52
|
-
debug && console.log("about to [eval]", message.script); // this will not show in Webkit console
|
|
53
|
-
const result = window.eval(message.script); // eslint-disable-line no-eval
|
|
54
|
-
return result;
|
|
55
|
-
}
|
|
56
|
-
else if (message.type === "hide") {
|
|
57
|
-
debug && console.log("[hide]", message.selectors);
|
|
58
|
-
return hideElementsUtil(message.selectors, message.method);
|
|
59
|
-
}
|
|
60
|
-
else if (message.type === "undohide") {
|
|
61
|
-
const existingElement = getStyleElementUtil();
|
|
62
|
-
debug && console.log("[unhide]", !!existingElement);
|
|
63
|
-
if (existingElement) {
|
|
64
|
-
existingElement.remove();
|
|
65
|
-
}
|
|
66
|
-
return !!existingElement;
|
|
67
|
-
}
|
|
68
|
-
else if (message.type === "matches") {
|
|
69
|
-
const matched = matches(message.config);
|
|
70
|
-
debug && console.log("[matches?]", message.config.type, JSON.stringify(message.config), matched);
|
|
71
|
-
return matched;
|
|
72
|
-
}
|
|
73
|
-
else if (message.type === "executeAction") {
|
|
74
|
-
debug && console.log("[executeAction]", message);
|
|
75
|
-
actionQueue = actionQueue.then(() => executeAction(message.config, message.param));
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
return null;
|
|
79
|
-
}
|
package/lib/web/content.ts
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { matches, executeAction } from "./consentomatic/index";
|
|
2
|
-
import { ContentScriptMessage } from "../messages";
|
|
3
|
-
import { hideElementsUtil, getStyleElementUtil } from "./content-utils";
|
|
4
|
-
|
|
5
|
-
let actionQueue = Promise.resolve(null);
|
|
6
|
-
|
|
7
|
-
export default function handleMessage(message: ContentScriptMessage, debug = false) {
|
|
8
|
-
if (message.type === "click") {
|
|
9
|
-
const elem = document.querySelectorAll<HTMLElement>(message.selector);
|
|
10
|
-
debug && console.log("[click]", message.selector, elem);
|
|
11
|
-
if (elem.length > 0) {
|
|
12
|
-
if (message.all === true) {
|
|
13
|
-
elem.forEach(e => e.click());
|
|
14
|
-
} else {
|
|
15
|
-
elem[0].click();
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
return elem.length > 0;
|
|
19
|
-
} else if (message.type === "elemExists") {
|
|
20
|
-
const exists = document.querySelector(message.selector) !== null;
|
|
21
|
-
debug && console.log("[exists?]", message.selector, exists);
|
|
22
|
-
return exists;
|
|
23
|
-
} else if (message.type === "elemVisible") {
|
|
24
|
-
const elem = document.querySelectorAll<HTMLElement>(message.selector);
|
|
25
|
-
const results = new Array(elem.length);
|
|
26
|
-
elem.forEach((e, i) => {
|
|
27
|
-
results[i] = e.offsetParent !== null || window.getComputedStyle(e).display !== "none"; // TODO: handle visibility and z-index?
|
|
28
|
-
});
|
|
29
|
-
debug && console.log("[visible?]", message.selector, elem, results);
|
|
30
|
-
if (results.length === 0) {
|
|
31
|
-
return false;
|
|
32
|
-
} else if (message.check === "any") {
|
|
33
|
-
return results.some(r => r);
|
|
34
|
-
} else if (message.check === "none") {
|
|
35
|
-
return results.every(r => !r);
|
|
36
|
-
}
|
|
37
|
-
// all
|
|
38
|
-
return results.every(r => r);
|
|
39
|
-
} else if (message.type === "getAttribute") {
|
|
40
|
-
const elem = document.querySelector(message.selector);
|
|
41
|
-
debug && console.log("[getAttribute]", message.selector, elem);
|
|
42
|
-
if (!elem) {
|
|
43
|
-
return false;
|
|
44
|
-
}
|
|
45
|
-
return elem.getAttribute(message.attribute);
|
|
46
|
-
} else if (message.type === "eval") {
|
|
47
|
-
// TODO: chrome support
|
|
48
|
-
debug && console.log("about to [eval]", message.script); // this will not show in Webkit console
|
|
49
|
-
const result = window.eval(message.script); // eslint-disable-line no-eval
|
|
50
|
-
return result;
|
|
51
|
-
} else if (message.type === "hide") {
|
|
52
|
-
debug && console.log("[hide]", message.selectors);
|
|
53
|
-
return hideElementsUtil(message.selectors, message.method);
|
|
54
|
-
} else if (message.type === "undohide") {
|
|
55
|
-
const existingElement = getStyleElementUtil();
|
|
56
|
-
debug && console.log("[unhide]", !!existingElement);
|
|
57
|
-
if (existingElement) {
|
|
58
|
-
existingElement.remove();
|
|
59
|
-
}
|
|
60
|
-
return !!existingElement
|
|
61
|
-
} else if (message.type === "matches") {
|
|
62
|
-
const matched = matches(message.config);
|
|
63
|
-
debug && console.log("[matches?]", message.config.type, JSON.stringify(message.config), matched);
|
|
64
|
-
return matched;
|
|
65
|
-
} else if (message.type === "executeAction") {
|
|
66
|
-
debug && console.log("[executeAction]", message);
|
|
67
|
-
actionQueue = actionQueue.then(() => executeAction(message.config, message.param));
|
|
68
|
-
return true;
|
|
69
|
-
}
|
|
70
|
-
return null;
|
|
71
|
-
}
|