@duckduckgo/autoconsent 16.48.0 → 16.50.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.
Files changed (115) hide show
  1. package/.agents/skills/optimize-button-patterns/SKILL.md +145 -0
  2. package/.agents/skills/oxylabs-testing/SKILL.md +1 -1
  3. package/.claude/skills/optimize-button-patterns/SKILL.md +7 -0
  4. package/.github/workflows/release-labels.yml +2 -6
  5. package/AGENTS.md +2 -0
  6. package/CHANGELOG.md +77 -0
  7. package/data/Readme.md +6 -0
  8. package/data/labelled-button-texts.csv +7006 -0
  9. package/dist/addon-firefox/background.bundle.js +6 -1
  10. package/dist/addon-firefox/compact-rules.json +1 -1
  11. package/dist/addon-firefox/content.bundle.js +26 -13
  12. package/dist/addon-firefox/manifest.json +1 -1
  13. package/dist/addon-firefox/rule-index.json +1 -1
  14. package/dist/addon-firefox/rules.json +1 -1
  15. package/dist/addon-mv3/background.bundle.js +6 -1
  16. package/dist/addon-mv3/compact-rules.json +1 -1
  17. package/dist/addon-mv3/content.bundle.js +26 -13
  18. package/dist/addon-mv3/manifest.json +1 -1
  19. package/dist/addon-mv3/rule-index.json +1 -1
  20. package/dist/addon-mv3/rules.json +1 -1
  21. package/dist/autoconsent.cjs.js +26 -13
  22. package/dist/autoconsent.esm.js +26 -13
  23. package/dist/autoconsent.playwright.js +26 -13
  24. package/dist/autoconsent.standalone.js +27 -14
  25. package/dist/types/eval-snippets.d.ts +3 -0
  26. package/lib/eval-snippets.ts +7 -0
  27. package/lib/heuristic-patterns.ts +20 -11
  28. package/package.json +3 -1
  29. package/rules/autoconsent/amazon-hiring.json +16 -0
  30. package/rules/autoconsent/avada-cookie-consent.json +43 -0
  31. package/rules/autoconsent/axeptio.json +17 -4
  32. package/rules/autoconsent/bigcrunch.json +39 -0
  33. package/rules/autoconsent/borlabs.json +5 -0
  34. package/rules/autoconsent/bricklink.json +33 -0
  35. package/rules/autoconsent/ceneo.json +9 -0
  36. package/rules/autoconsent/conjointly.json +43 -0
  37. package/rules/autoconsent/consentmo.json +51 -7
  38. package/rules/autoconsent/cookie-popup-close-cookies.json +37 -0
  39. package/rules/autoconsent/cookieconsent2.json +6 -1
  40. package/rules/autoconsent/costco.json +27 -0
  41. package/rules/autoconsent/datasign.json +85 -0
  42. package/rules/autoconsent/dhbbank.json +13 -0
  43. package/rules/autoconsent/ee-consent-notice.json +40 -0
  44. package/rules/autoconsent/ensembleartsphilly.json +33 -0
  45. package/rules/autoconsent/evium.de.json +33 -0
  46. package/rules/autoconsent/fera-cookies.json +67 -0
  47. package/rules/autoconsent/iubenda.json +13 -7
  48. package/rules/autoconsent/la7-cmp.json +30 -0
  49. package/rules/autoconsent/laravel-cookie-consent.json +45 -0
  50. package/rules/autoconsent/legislation-gov-uk.json +43 -0
  51. package/rules/autoconsent/mackeeper.json +34 -0
  52. package/rules/autoconsent/ndl-go-jp.json +35 -0
  53. package/rules/autoconsent/pandectes.json +48 -15
  54. package/rules/autoconsent/passle.json +32 -0
  55. package/rules/autoconsent/paypal-us.json +3 -3
  56. package/rules/autoconsent/paypal.json +5 -2
  57. package/rules/autoconsent/primeconsent.json +39 -0
  58. package/rules/autoconsent/shinden.pl.json +34 -0
  59. package/rules/autoconsent/texas-instruments.json +17 -0
  60. package/rules/autoconsent/thegrandyork.json +46 -0
  61. package/rules/autoconsent/thenounproject.json +61 -0
  62. package/rules/autoconsent/toyota.json +16 -5
  63. package/rules/autoconsent/tri-table.json +14 -0
  64. package/rules/autoconsent/truevault-polaris.json +63 -0
  65. package/rules/autoconsent/uft-cookie-notice.json +15 -0
  66. package/rules/autoconsent/wbd-legal-terms.json +32 -0
  67. package/rules/autoconsent/webflow.json +1 -1
  68. package/rules/autoconsent/wix.json +90 -8
  69. package/rules/compact-rules.json +1 -1
  70. package/rules/rule-index.json +1 -1
  71. package/rules/rules.json +1 -1
  72. package/scripts/benchmark-button-classification.ts +75 -0
  73. package/scripts/button-text-benchmark.ts +102 -0
  74. package/tests/amazon-hiring.spec.ts +3 -0
  75. package/tests/avada-cookie-consent.spec.ts +9 -0
  76. package/tests/axeptio.spec.ts +8 -4
  77. package/tests/bigcrunch.spec.ts +16 -0
  78. package/tests/borlabs.spec.ts +7 -3
  79. package/tests/bricklink.spec.ts +3 -0
  80. package/tests/ceneo.spec.ts +3 -0
  81. package/tests/conjointly.spec.ts +3 -0
  82. package/tests/consentmo.spec.ts +1 -0
  83. package/tests/cookie-popup-close-cookies.spec.ts +10 -0
  84. package/tests/cookieconsent2.spec.ts +6 -1
  85. package/tests/costco.spec.ts +5 -0
  86. package/tests/datasign.spec.ts +8 -0
  87. package/tests/dhbbank.spec.ts +6 -0
  88. package/tests/ee-consent-notice.spec.ts +9 -0
  89. package/tests/ensembleartsphilly.spec.ts +6 -0
  90. package/tests/evium.de.spec.ts +5 -0
  91. package/tests/fera-cookies.spec.ts +6 -0
  92. package/tests/iubenda.spec.ts +6 -0
  93. package/tests/la7-cmp.spec.ts +6 -0
  94. package/tests/laravel-cookie-consent.spec.ts +10 -0
  95. package/tests/legislation-gov-uk.spec.ts +3 -0
  96. package/tests/mackeeper.spec.ts +3 -0
  97. package/tests/ndl-go-jp.spec.ts +8 -0
  98. package/tests/pandectes.spec.ts +20 -1
  99. package/tests/passle.spec.ts +8 -0
  100. package/tests/paypal-us.spec.ts +2 -3
  101. package/tests/primeconsent.spec.ts +11 -0
  102. package/tests/shinden.pl.spec.ts +5 -0
  103. package/tests/texas-instruments.spec.ts +3 -0
  104. package/tests/thegrandyork.spec.ts +3 -0
  105. package/tests/thenounproject.spec.ts +3 -0
  106. package/tests/tri-table.spec.ts +5 -0
  107. package/tests/truevault-polaris.spec.ts +9 -0
  108. package/tests/uft-cookie-notice.spec.ts +3 -0
  109. package/tests/wbd-legal-terms.spec.ts +18 -0
  110. package/tests/webflow.spec.ts +7 -1
  111. package/tests/wix.spec.ts +8 -1
  112. package/tests-wtr/heuristics/button-classification-accuracy.test.ts +41 -0
  113. package/tests-wtr/heuristics/heuristics-utils.test.ts +64 -0
  114. package/rules/autoconsent/paypal-cookieprefs.json +0 -29
  115. package/tests/paypal-cookieprefs.spec.ts +0 -7
@@ -29,6 +29,7 @@ export declare const snippets: {
29
29
  EVAL_BORLABS_0: () => boolean;
30
30
  EVAL_CC_BANNER2_0: () => boolean;
31
31
  EVAL_COINBASE_0: () => boolean;
32
+ EVAL_COOKIE_POPUP_CLOSE: () => true;
32
33
  EVAL_COOKIE_LAW_INFO_0: () => boolean;
33
34
  EVAL_COOKIE_LAW_INFO_DETECT: () => boolean;
34
35
  EVAL_COOKIE_MANAGER_POPUP_0: () => boolean;
@@ -39,6 +40,7 @@ export declare const snippets: {
39
40
  EVAL_COOKIEFIRST_1: () => boolean;
40
41
  EVAL_COOKIEINFORMATION_0: () => any;
41
42
  EVAL_COOKIEINFORMATION_1: () => any;
43
+ EVAL_EE_CONSENT_DECLINE_0: () => boolean;
42
44
  EVAL_ETSY_0: () => boolean;
43
45
  EVAL_ETSY_1: () => any;
44
46
  EVAL_EZOIC_0: () => any;
@@ -86,5 +88,6 @@ export declare const snippets: {
86
88
  EVAL_USERCENTRICS_API_6: () => boolean;
87
89
  EVAL_USERCENTRICS_BUTTON_0: () => any;
88
90
  EVAL_WAITROSE_0: () => boolean;
91
+ EVAL_WBD_LTP_CLOSE: () => any;
89
92
  };
90
93
  export declare function getFunctionBody(snippetFunc: () => any): string;
@@ -111,6 +111,9 @@ export const snippets = {
111
111
  EVAL_COINBASE_0: () =>
112
112
  JSON.parse(decodeURIComponent(document.cookie.match(/cm_(eu|default)_preferences=([0-9a-zA-Z\\{\\}\\[\\]%:]*);?/)[2])).consent
113
113
  .length <= 1,
114
+ // the close icon is an SVG, which has no click() method
115
+ EVAL_COOKIE_POPUP_CLOSE: () =>
116
+ document.querySelector('#cookie-popup #close-cookies').dispatchEvent(new MouseEvent('click', { bubbles: true })) || true,
114
117
  EVAL_COOKIE_LAW_INFO_0: () => {
115
118
  if (CLI.disableAllCookies) CLI.disableAllCookies();
116
119
  if (CLI.reject_close) CLI.reject_close();
@@ -145,6 +148,9 @@ export const snippets = {
145
148
  .forEach((i) => i.getAttribute('aria-checked') === 'true' && i.click()) || true,
146
149
  EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
147
150
  EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
151
+ // turn the single-button form into a decline submission, same fields as the CMP's own decline form
152
+ EVAL_EE_CONSENT_DECLINE_0: () =>
153
+ document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => (i.value = 'n')) || true,
148
154
  EVAL_ETSY_0: () =>
149
155
  document.querySelectorAll('.gdpr-overlay-body input').forEach((toggle) => {
150
156
  toggle.checked = false;
@@ -261,6 +267,7 @@ export const snippets = {
261
267
  EVAL_USERCENTRICS_BUTTON_0: () =>
262
268
  JSON.parse(localStorage.getItem('usercentrics')).consents.every((c) => c.isEssential || !c.consentStatus),
263
269
  EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll('label[id$=cookies-deny-label]')).forEach((e) => e.click()) || true,
270
+ EVAL_WBD_LTP_CLOSE: () => document.querySelector('dialog#ltp-dialog').close() || true,
264
271
  };
265
272
 
266
273
  export function getFunctionBody(snippetFunc: () => any) {
@@ -7,7 +7,8 @@ export const DETECT_PATTERNS = [
7
7
  /only necessary cookies/gi, // "only necessary" is probably too broad
8
8
  /(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
9
9
  /(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
10
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
10
+ // a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
11
+ /we (?:use|serve)(?: \w+)? cookies/gi,
11
12
  /we are using cookies/gi,
12
13
  /use of cookies/gi,
13
14
  /website uses cookies to enhance your browsing experience/gi,
@@ -165,6 +166,10 @@ export const DETECT_PATTERNS = [
165
166
 
166
167
  // Italian (IT)
167
168
  /usiamo.{0,20}cookie/gi,
169
+
170
+ // Japanese (JA)
171
+ // e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
172
+ /(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi,
168
173
  ];
169
174
 
170
175
  const REJECT_PATTERNS_ENGLISH = [
@@ -180,13 +185,13 @@ const REJECT_PATTERNS_ENGLISH = [
180
185
  /^\s*(continue|proceed|continue\s+browsing)\s+without\s+(accepting|agreeing|consent|cookies|tracking)(\s*→)?\s*$/is,
181
186
 
182
187
  // essential/necessary/functional-only, e.g. "essential cookies only", "accept only essential cookies",
183
- // "allow necessary cookies continue", "use essential cookies only", "functional only", "i confirm necessary"
188
+ // "allow necessary cookies continue", "use essential cookies only", "functional only", "essential only cookies", "i confirm necessary"
184
189
  /^\s*(i\s+)?(want\s+to\s+)?(only\s+)?(use|accept|allow|keep|enable|choose|continue\s+with|i\s+confirm)\s*(only\s+)?(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
185
190
  /^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
186
- /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s+only\s*$/is,
191
+ /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
187
192
 
188
- // e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
189
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
193
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
194
+ /do\s+not\s+sell|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
190
195
 
191
196
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
192
197
  /^opt[ -]?out of /is,
@@ -390,6 +395,13 @@ const REJECT_PATTERNS_TURKISH = ['reddet', 'çerezleri reddet'];
390
395
 
391
396
  const REJECT_PATTERNS_INDONESIAN = ['tolak cookie'];
392
397
 
398
+ const REJECT_PATTERNS_JAPANESE = [
399
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
400
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
401
+ '同意しない',
402
+ '同意しません',
403
+ ];
404
+
393
405
  /**
394
406
  * @type {Array<string|RegExp>}
395
407
  */
@@ -411,6 +423,7 @@ export const REJECT_PATTERNS = [
411
423
  ...REJECT_PATTERNS_RUSSIAN,
412
424
  ...REJECT_PATTERNS_TURKISH,
413
425
  ...REJECT_PATTERNS_INDONESIAN,
426
+ ...REJECT_PATTERNS_JAPANESE,
414
427
  ];
415
428
 
416
429
  export const BUTTON_NEVER_MATCH_PATTERNS = [
@@ -645,13 +658,13 @@ export const ACCEPT_PATTERNS = [
645
658
  /^continue (and accept|using cookies|with (all|recommended cookies|cookies))$/is,
646
659
 
647
660
  // DE accept verbs
648
- /^(alle[sn]?\s+|allem\s+|ich\s+|cookies\s+|ausgewählte\s+|webanalyse\s+)?(cookies?\s+)?(akzeptieren|annehmen|zustimmen|zulassen|erlauben|einwilligen|aktivieren|auswählen)(\s+(und\s+)?(weiter|schließen))?\s*$/is,
661
+ /^(alle[sn]?\s+|allem\s+|ich\s+|cookies\s+|ausgewählte\s+|webanalyse\s+)?(cookies?\s+)?(akzeptieren|annehmen|zustimmen|zulassen|erlauben|einwilligen|aktivieren|auswählen)(\s+(und\s+)?(weiter|schlie(ß|ss)en))?\s*$/is,
649
662
  /^((meine\s+)?auswahl|alle)\s+(bestätigen|akzeptieren|auswählen)$/is,
650
663
  /^(alle[nm]?\s+)?(zustimmen|einverstanden|einwilligung|zustimmung)$/is,
651
664
  /^ich (bin einverstanden|akzeptiere( alle)?|stimme zu)$/is,
652
665
 
653
666
  // NL accept verbs
654
- /^(ja,?\s+)?(alle[s]?\s+|ik\s+)?(cookies?\s+)?(accepteer|accepteren|toestaan|aanvaard|aanvaarden|ga akkoord|akkoord)(\s+(en\s+(sluiten|doorgaan|verdergaan)|cookies|alle))?\s*$/is,
667
+ /^(ja,?\s+)?(alle[s]?\s+|ik\s+)?(cookies?\s+)?(accepteer|accepteren|toestaan|aanvaard|aanvaarden|ga akkoord|akkoord)(\s+((en\s+)?sluiten|en\s+(doorgaan|verdergaan)|cookies|alle))?\s*$/is,
655
668
  /^(selectie (accepteren|toestaan)|accepteer (selectie|alle)|alle (toestaan|accepteren|aanvaarden)|ja, (dat is prima|prima|alles toestaan|accepteren|ik accepteer cookies|ik ga akkoord)|is goed)$/is,
656
669
 
657
670
  // FR accept verbs
@@ -813,11 +826,7 @@ export const ACKNOWLEDGE_PATTERNS = [
813
826
  /understood$/is,
814
827
  'confirm my choices',
815
828
 
816
- // French (FR)
817
- 'accepter fermer',
818
-
819
829
  // German (DE)
820
- 'akzeptieren schließen',
821
830
  'speichern schließen',
822
831
 
823
832
  // Spanish (ES)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckduckgo/autoconsent",
3
- "version": "16.48.0",
3
+ "version": "16.50.0",
4
4
  "description": "",
5
5
  "types": "./dist/types/web.d.ts",
6
6
  "exports": {
@@ -36,6 +36,7 @@
36
36
  "launch:firefox": "web-ext run -s dist/addon-firefox",
37
37
  "release": "auto shipit",
38
38
  "get-text-for-xpath": "ts-node scripts/get-text-for-xpath.ts",
39
+ "benchmark-buttons": "ts-node scripts/benchmark-button-classification.ts",
39
40
  "bundle-config-rules": "ts-node scripts/bundle-config-rules.ts",
40
41
  "check-pr-release-labels": "ts-node scripts/check-pr-release-labels.ts"
41
42
  },
@@ -59,6 +60,7 @@
59
60
  "bulma": "^1.0.2",
60
61
  "chai": "^6.0.1",
61
62
  "chokidar-cli": "^3.0.0",
63
+ "csv-parse": "^6.2.1",
62
64
  "esbuild": "^0.28.0",
63
65
  "eslint": "^10.0.3",
64
66
  "globals": "^17.4.0",
@@ -0,0 +1,16 @@
1
+ {
2
+ "name": "amazon-hiring",
3
+ "vendorUrl": "https://hiring.amazon.com/",
4
+ "detectCmp": [{ "exists": "[data-test-id=\"consentModal\"] [data-test-id=\"consentBtn\"]" }],
5
+ "detectPopup": [{ "visible": "[data-test-id=\"consentModal\"] [data-test-id=\"consentBtn\"]" }],
6
+ "optIn": [{ "waitForThenClick": "[data-test-id=\"consentModal\"] [data-test-id=\"consentBtn\"]" }],
7
+ "optOut": [
8
+ { "click": "[data-test-id=\"consentModal\"] button[aria-label=\"Continue without accepting cookies\"]" },
9
+ { "waitForVisible": "[data-test-id=\"consentModal\"] [data-test-id=\"consentBtn\"]", "check": "none", "timeout": 2000 },
10
+ {
11
+ "if": { "exists": "[data-test-id=\"consentModal\"] button[aria-label=\"Close cookie consent card popup\"]" },
12
+ "then": [{ "click": "[data-test-id=\"consentModal\"] button[aria-label=\"Close cookie consent card popup\"]" }]
13
+ },
14
+ { "waitForVisible": "[data-test-id=\"consentModal\"]", "check": "none", "timeout": 2000 }
15
+ ]
16
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "avada-cookie-consent",
3
+ "vendorUrl": "https://apps.shopify.com/avada-cookie-bar",
4
+ "prehideSelectors": [".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_Container"],
5
+ "detectCmp": [
6
+ {
7
+ "exists": ".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_BtnDeny"
8
+ }
9
+ ],
10
+ "detectPopup": [
11
+ {
12
+ "visible": ".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_BtnDeny",
13
+ "check": "any"
14
+ }
15
+ ],
16
+ "optIn": [
17
+ {
18
+ "waitForThenClick": ".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_BtnAgree"
19
+ }
20
+ ],
21
+ "optOut": [
22
+ {
23
+ "waitForThenClick": ".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_BtnDeny"
24
+ },
25
+ {
26
+ "any": [
27
+ {
28
+ "waitForVisible": ".Avada-CookiesBar__OuterWrapper .Avada-CookiesBar_Container",
29
+ "check": "none",
30
+ "timeout": 1000
31
+ },
32
+ {
33
+ "waitForThenClick": ".Avada-CookiesBar-Preferences__PopUp .Avada-CookiesBar_BtnDeny"
34
+ }
35
+ ]
36
+ }
37
+ ],
38
+ "test": [
39
+ {
40
+ "cookieContains": "\"analytics\":false,\"marketing\":false"
41
+ }
42
+ ]
43
+ }
@@ -32,14 +32,27 @@
32
32
  {
33
33
  "if": { "exists": ".axeptio_mount .needsclick" },
34
34
  "then": [
35
- { "waitForVisible": [".axeptio_mount .needsclick", "button#axeptio_btn_dismiss,button.ax-discardButton"] },
35
+ {
36
+ "waitForVisible": [
37
+ ".axeptio_mount .needsclick",
38
+ "button#axeptio_btn_dismiss,button.ax-discardButton,button#axeptio_btn_close"
39
+ ]
40
+ },
36
41
  { "wait": 300 },
37
- { "click": [".axeptio_mount .needsclick", "button#axeptio_btn_dismiss,button.ax-discardButton"] }
42
+ {
43
+ "if": { "exists": [".axeptio_mount .needsclick", "button#axeptio_btn_dismiss,button.ax-discardButton"] },
44
+ "then": [{ "click": [".axeptio_mount .needsclick", "button#axeptio_btn_dismiss,button.ax-discardButton"] }],
45
+ "else": [{ "click": [".axeptio_mount .needsclick", "button#axeptio_btn_close"] }]
46
+ }
38
47
  ],
39
48
  "else": [
40
- { "waitForVisible": "button#axeptio_btn_dismiss,button.ax-discardButton" },
49
+ { "waitForVisible": "button#axeptio_btn_dismiss,button.ax-discardButton,button#axeptio_btn_close" },
41
50
  { "wait": 300 },
42
- { "click": "button#axeptio_btn_dismiss,button.ax-discardButton" }
51
+ {
52
+ "if": { "exists": "button#axeptio_btn_dismiss,button.ax-discardButton" },
53
+ "then": [{ "click": "button#axeptio_btn_dismiss,button.ax-discardButton" }],
54
+ "else": [{ "click": "button#axeptio_btn_close" }]
55
+ }
43
56
  ]
44
57
  }
45
58
  ],
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "bigcrunch",
3
+ "vendorUrl": "https://www.bigcrunch.com/",
4
+ "runContext": {
5
+ "main": true,
6
+ "frame": false
7
+ },
8
+ "prehideSelectors": ["#bc-cmp-host", "#bc-cmp-host-auto"],
9
+ "detectCmp": [
10
+ {
11
+ "exists": ["#bc-cmp-host, #bc-cmp-host-auto", "#bc-cmp-banner"]
12
+ }
13
+ ],
14
+ "detectPopup": [
15
+ {
16
+ "visible": ["#bc-cmp-host, #bc-cmp-host-auto", "#bc-cmp-banner-container:not([style*=\"display: none\"]) #bc-cmp-banner"]
17
+ }
18
+ ],
19
+ "optIn": [
20
+ {
21
+ "waitForThenClick": ["#bc-cmp-host, #bc-cmp-host-auto", "#bc-cmp-banner [data-action=accept-all]"]
22
+ }
23
+ ],
24
+ "optOut": [
25
+ {
26
+ "waitForThenClick": ["#bc-cmp-host, #bc-cmp-host-auto", "#bc-cmp-banner [data-action=reject-all]"]
27
+ }
28
+ ],
29
+ "test": [
30
+ {
31
+ "waitForVisible": [
32
+ "#bc-cmp-host, #bc-cmp-host-auto",
33
+ "#bc-cmp-banner-container:not([style*=\"display: none\"]) #bc-cmp-banner"
34
+ ],
35
+ "timeout": 2000,
36
+ "check": "none"
37
+ }
38
+ ]
39
+ }
@@ -17,6 +17,11 @@
17
17
  }
18
18
  ],
19
19
  "optOut": [
20
+ {
21
+ "waitFor": ".brlbs-btn-accept-only-essential,a[data-cookie-refuse],.brlbs-btn-save,#CookieBoxSaveButton,.brlbs-cmpnt-close-button[data-borlabs-cookie-actions=\"close-button\"],a[data-cookie-individual]",
22
+ "timeout": 3000,
23
+ "optional": true
24
+ },
20
25
  {
21
26
  "if": {
22
27
  "exists": ".brlbs-btn-accept-only-essential,a[data-cookie-refuse]"
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "bricklink",
3
+ "vendorUrl": "https://www.bricklink.com/",
4
+ "runContext": {
5
+ "urlPattern": "^https?://([a-z0-9-]+\\.)?bricklink\\.com/"
6
+ },
7
+ "prehideSelectors": [".blp-necessary-cookies-banner"],
8
+ "detectCmp": [
9
+ {
10
+ "exists": ".blp-necessary-cookies-banner"
11
+ }
12
+ ],
13
+ "detectPopup": [
14
+ {
15
+ "visible": ".blp-necessary-cookies-banner"
16
+ }
17
+ ],
18
+ "optIn": [
19
+ {
20
+ "waitForThenClick": ".blp-necessary-cookies-banner__button"
21
+ }
22
+ ],
23
+ "optOut": [
24
+ {
25
+ "waitForThenClick": ".blp-necessary-cookies-banner__button"
26
+ }
27
+ ],
28
+ "test": [
29
+ {
30
+ "cookieContains": "has-dismissed-necessary-cookies-banner=true"
31
+ }
32
+ ]
33
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "ceneo",
3
+ "prehideSelectors": ["#js_cookie-consent-banner"],
4
+ "detectCmp": [{ "exists": "#js_cookie-consent-banner .js_cookie-consent-necessary" }],
5
+ "detectPopup": [{ "visible": "#js_cookie-consent-banner .js_cookie-consent-necessary" }],
6
+ "optIn": [{ "waitForThenClick": "#js_cookie-consent-banner .js_cookie-consent-agree" }],
7
+ "optOut": [{ "waitForThenClick": "#js_cookie-consent-banner .js_cookie-consent-necessary" }],
8
+ "test": [{ "waitForVisible": "#js_cookie-consent-banner", "timeout": 1000, "check": "none" }]
9
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "conjointly",
3
+ "vendorUrl": "https://conjointly.com/",
4
+ "runContext": {
5
+ "urlPattern": "^https://(www\\.)?conjointly\\.com/"
6
+ },
7
+ "prehideSelectors": [".cookie-prompt-container"],
8
+ "detectCmp": [
9
+ {
10
+ "exists": ".cookie-prompt-container #custom-cookie-banner-container"
11
+ }
12
+ ],
13
+ "detectPopup": [
14
+ {
15
+ "visible": ".cookie-prompt-container #custom-cookie-banner-container"
16
+ }
17
+ ],
18
+ "optIn": [
19
+ {
20
+ "waitForThenClick": ".cookie-prompt-container .confirm-all-cookies"
21
+ }
22
+ ],
23
+ "optOut": [
24
+ {
25
+ "if": {
26
+ "exists": ".cookie-prompt-container #analytic-cookie:checked"
27
+ },
28
+ "then": [
29
+ {
30
+ "click": ".cookie-prompt-container #analytic-cookie"
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "waitForThenClick": ".cookie-prompt-container .confirm-cookies"
36
+ }
37
+ ],
38
+ "test": [
39
+ {
40
+ "cookieContains": "cookie_policy=false"
41
+ }
42
+ ]
43
+ }
@@ -13,23 +13,67 @@
13
13
  ],
14
14
  "optIn": [
15
15
  {
16
- "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper .cc-allow"]
16
+ "waitForThenClick": [
17
+ "csm-cookie-consent",
18
+ ".csm-wrapper [data-csm-button-type='accept'], .csm-wrapper .cc-allow:not([data-csm-button-type])"
19
+ ]
17
20
  }
18
21
  ],
19
22
  "optOut": [
20
23
  {
21
- "if": { "exists": ["csm-cookie-consent", ".csm-wrapper .cc-deny"] },
24
+ "if": {
25
+ "exists": ["csm-cookie-consent", ".csm-wrapper .cc-deny, .csm-wrapper [data-csm-button-type='reject']"]
26
+ },
22
27
  "then": [
23
28
  {
24
- "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper .cc-deny"]
29
+ "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper .cc-deny, .csm-wrapper [data-csm-button-type='reject']"]
25
30
  }
26
31
  ],
27
32
  "else": [
28
33
  {
29
- "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper .cc-settings"]
30
- },
31
- {
32
- "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper .cc-deny"]
34
+ "if": {
35
+ "exists": ["csm-cookie-consent", ".csm-wrapper [data-csm-button-type='do_not_sell']"]
36
+ },
37
+ "then": [
38
+ {
39
+ "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper [data-csm-button-type='do_not_sell']"]
40
+ },
41
+ {
42
+ "comment": "the banner stays open after opting out of sale, close it",
43
+ "waitForThenClick": ["csm-cookie-consent", ".csm-wrapper [data-csm-button-type='dismiss']"],
44
+ "timeout": 2000,
45
+ "optional": true
46
+ }
47
+ ],
48
+ "else": [
49
+ {
50
+ "waitForThenClick": [
51
+ "csm-cookie-consent",
52
+ ".csm-wrapper .cc-settings, .csm-wrapper [data-csm-button-type='preferences']"
53
+ ]
54
+ },
55
+ {
56
+ "waitForVisible": [
57
+ "csm-cookie-consent",
58
+ ".csm-wrapper .cc-deny, .csm-wrapper [data-csm-button-type='accept_selected']"
59
+ ]
60
+ },
61
+ {
62
+ "if": {
63
+ "exists": ["csm-cookie-consent", ".csm-wrapper .cc-deny"]
64
+ },
65
+ "then": [
66
+ {
67
+ "click": ["csm-cookie-consent", ".csm-wrapper .cc-deny"]
68
+ }
69
+ ],
70
+ "else": [
71
+ {
72
+ "click": ["csm-cookie-consent", ".csm-wrapper [data-csm-button-type='accept_selected']"]
73
+ }
74
+ ]
75
+ }
76
+ ]
33
77
  }
34
78
  ]
35
79
  }
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "cookie-popup-close-cookies",
3
+ "prehideSelectors": ["#cookie-popup"],
4
+ "detectCmp": [
5
+ {
6
+ "exists": "#cookie-popup #close-cookies"
7
+ },
8
+ {
9
+ "exists": "#cookie-popup #view-all"
10
+ }
11
+ ],
12
+ "detectPopup": [
13
+ {
14
+ "exists": "#cookie-popup:not([class*=\"invisible\"]) #close-cookies"
15
+ }
16
+ ],
17
+ "optIn": [
18
+ {
19
+ "waitForThenClick": "#cookie-popup #accept-all"
20
+ }
21
+ ],
22
+ "optOut": [
23
+ {
24
+ "eval": "EVAL_COOKIE_POPUP_CLOSE"
25
+ },
26
+ {
27
+ "waitFor": "#cookie-popup[class*=\"invisible\"]",
28
+ "timeout": 2000
29
+ }
30
+ ],
31
+ "test": [
32
+ {
33
+ "cookieContains": "acceptedAnalytics=granted",
34
+ "negated": true
35
+ }
36
+ ]
37
+ }
@@ -25,7 +25,12 @@
25
25
  {
26
26
  "if": { "exists": "#s-rall-bn" },
27
27
  "then": [{ "waitForThenClick": "#s-rall-bn" }],
28
- "else": [{ "waitForThenClick": "#c-s-bn" }, { "wait": 500 }, { "waitForThenClick": "#s-sv-bn" }]
28
+ "else": [
29
+ { "waitForThenClick": "#c-s-bn" },
30
+ { "wait": 500 },
31
+ { "click": "#s-bl input.c-tgl:checked:not(:disabled)", "all": true, "optional": true },
32
+ { "waitForThenClick": "#s-sv-bn" }
33
+ ]
29
34
  }
30
35
  ],
31
36
  "test": [
@@ -0,0 +1,27 @@
1
+ {
2
+ "name": "costco",
3
+ "vendorUrl": "https://www.costco.ca/",
4
+ "cosmetic": true,
5
+ "comment": "The banner runs on Transcend airgap, whose setConsent() rejects consent changes unless the click event is trusted (isTrusted), so scripted clicks can't save an opt-out.",
6
+ "prehideSelectors": ["#costco-consent-manager [data-testid=\"Popup\"]"],
7
+ "detectCmp": [
8
+ {
9
+ "exists": "#costco-consent-manager [data-testid=\"Popup\"]"
10
+ }
11
+ ],
12
+ "detectPopup": [
13
+ {
14
+ "visible": "#costco-consent-manager [data-testid=\"Popup\"]"
15
+ }
16
+ ],
17
+ "optIn": [
18
+ {
19
+ "waitForThenClick": "#costco-consent-manager [data-testid=\"Popup\"] button.MuiButton-primary"
20
+ }
21
+ ],
22
+ "optOut": [
23
+ {
24
+ "hide": "#costco-consent-manager"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,85 @@
1
+ {
2
+ "name": "datasign",
3
+ "vendorUrl": "https://datasign.jp/",
4
+ "cosmetic": false,
5
+ "prehideSelectors": [],
6
+ "detectCmp": [
7
+ {
8
+ "exists": "#datasign_cmp__host"
9
+ }
10
+ ],
11
+ "detectPopup": [
12
+ {
13
+ "visible": ["#datasign_cmp__host", "#datasign_cmp__cmp_summary"]
14
+ }
15
+ ],
16
+ "optIn": [
17
+ {
18
+ "if": {
19
+ "exists": ["#datasign_cmp__host", "#datasign_cmp__cmp_content input[type=checkbox]:not([disabled])"]
20
+ },
21
+ "then": [
22
+ {
23
+ "waitForThenClick": [
24
+ "#datasign_cmp__host",
25
+ "#datasign_cmp__config-button, #datasign_cmp__cmp_summary [aria-controls=datasign_cmp__cmp_content]"
26
+ ]
27
+ },
28
+ {
29
+ "waitForVisible": ["#datasign_cmp__host", "#datasign_cmp__cmp_content_apply-button"]
30
+ },
31
+ {
32
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_content input[type=checkbox]:not(:checked):not([disabled])"],
33
+ "all": true,
34
+ "optional": true
35
+ },
36
+ {
37
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_content_apply-button"]
38
+ }
39
+ ],
40
+ "else": [
41
+ {
42
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_summary .datasign__dialogCloseButton--index-module"]
43
+ }
44
+ ]
45
+ }
46
+ ],
47
+ "optOut": [
48
+ {
49
+ "if": {
50
+ "exists": ["#datasign_cmp__host", "#datasign_cmp__cmp_content input[type=checkbox]:not([disabled])"]
51
+ },
52
+ "then": [
53
+ {
54
+ "waitForThenClick": [
55
+ "#datasign_cmp__host",
56
+ "#datasign_cmp__config-button, #datasign_cmp__cmp_summary [aria-controls=datasign_cmp__cmp_content]"
57
+ ]
58
+ },
59
+ {
60
+ "waitForVisible": ["#datasign_cmp__host", "#datasign_cmp__cmp_content_apply-button"]
61
+ },
62
+ {
63
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_content input[type=checkbox]:checked:not([disabled])"],
64
+ "all": true,
65
+ "optional": true
66
+ },
67
+ {
68
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_content_apply-button"]
69
+ }
70
+ ],
71
+ "else": [
72
+ {
73
+ "click": ["#datasign_cmp__host", "#datasign_cmp__cmp_summary .datasign__dialogCloseButton--index-module"]
74
+ }
75
+ ]
76
+ }
77
+ ],
78
+ "test": [
79
+ {
80
+ "waitForVisible": ["#datasign_cmp__host", "#datasign_cmp__cmp_summary"],
81
+ "check": "none",
82
+ "timeout": 3000
83
+ }
84
+ ]
85
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "dhbbank",
3
+ "vendorUrl": "https://www.dhbbank.com/",
4
+ "runContext": {
5
+ "urlPattern": "^https?://(www\\.)?dhbbank\\.(com|nl|be|de)/"
6
+ },
7
+ "prehideSelectors": ["dialog.js-cookie-bar"],
8
+ "detectCmp": [{ "exists": "dialog.js-cookie-bar .js-reject-all" }],
9
+ "detectPopup": [{ "visible": "dialog.js-cookie-bar .js-reject-all" }],
10
+ "optIn": [{ "waitForThenClick": "dialog.js-cookie-bar .js-accept-all" }],
11
+ "optOut": [{ "waitForThenClick": "dialog.js-cookie-bar .js-reject-all" }],
12
+ "test": [{ "waitForVisible": "dialog.js-cookie-bar", "check": "none", "timeout": 3000 }, { "cookieContains": "CookieLevel=Functional" }]
13
+ }