@duckduckgo/autoconsent 16.51.0 → 16.53.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 (124) hide show
  1. package/.github/workflows/ddg-release.yml +2 -2
  2. package/AGENTS.md +1 -0
  3. package/CHANGELOG.md +94 -0
  4. package/dist/addon-firefox/compact-rules.json +1 -1
  5. package/dist/addon-firefox/content.bundle.js +4 -1
  6. package/dist/addon-firefox/manifest.json +1 -1
  7. package/dist/addon-firefox/rule-index.json +1 -1
  8. package/dist/addon-firefox/rules.json +1 -1
  9. package/dist/addon-mv3/compact-rules.json +1 -1
  10. package/dist/addon-mv3/content.bundle.js +4 -1
  11. package/dist/addon-mv3/manifest.json +1 -1
  12. package/dist/addon-mv3/rule-index.json +1 -1
  13. package/dist/addon-mv3/rules.json +1 -1
  14. package/dist/autoconsent.cjs.js +4 -1
  15. package/dist/autoconsent.esm.js +4 -1
  16. package/dist/autoconsent.playwright.js +4 -1
  17. package/dist/autoconsent.standalone.js +5 -2
  18. package/docs/rule-syntax.md +1 -1
  19. package/lib/dom-actions.ts +5 -1
  20. package/package.json +2 -2
  21. package/rules/autoconsent/accurx.json +26 -0
  22. package/rules/autoconsent/aliexpress.json +37 -13
  23. package/rules/autoconsent/burpee-com.json +22 -10
  24. package/rules/autoconsent/ccm19.json +31 -0
  25. package/rules/autoconsent/channel4.json +5 -5
  26. package/rules/autoconsent/citizensadvice.json +43 -0
  27. package/rules/autoconsent/civic-cookie-control.json +9 -9
  28. package/rules/autoconsent/clasohlson.com.json +13 -0
  29. package/rules/autoconsent/cm-cookie-manager.json +20 -0
  30. package/rules/autoconsent/community.screwfix.com.json +23 -0
  31. package/rules/autoconsent/complianz-optin.json +11 -1
  32. package/rules/autoconsent/concept3d.json +19 -0
  33. package/rules/autoconsent/conextra.json +18 -0
  34. package/rules/autoconsent/cookie-script.json +23 -2
  35. package/rules/autoconsent/cookiecuttr.json +3 -2
  36. package/rules/autoconsent/craft-cookie-consent.json +65 -0
  37. package/rules/autoconsent/cz-eshop-cookies-consent.json +9 -0
  38. package/rules/autoconsent/depop.json +16 -14
  39. package/rules/autoconsent/dsgvo.json +8 -2
  40. package/rules/autoconsent/dwaalzin-nu.json +13 -0
  41. package/rules/autoconsent/elsevier.json +3 -3
  42. package/rules/autoconsent/eneba.json +66 -0
  43. package/rules/autoconsent/ensighten.json +2 -2
  44. package/rules/autoconsent/europa-eu.json +11 -7
  45. package/rules/autoconsent/finna.json +29 -0
  46. package/rules/autoconsent/head-fi.json +35 -0
  47. package/rules/autoconsent/istore-co-za.json +18 -0
  48. package/rules/autoconsent/kiwico.json +48 -0
  49. package/rules/autoconsent/la-becanerie.json +13 -0
  50. package/rules/autoconsent/lta.json +22 -0
  51. package/rules/autoconsent/meteored.json +40 -0
  52. package/rules/autoconsent/mizuno-com.json +13 -0
  53. package/rules/autoconsent/mobirise-cookies-alert-cosmetic.json +30 -0
  54. package/rules/autoconsent/mobirise-cookies-alert.json +34 -0
  55. package/rules/autoconsent/msg-cookie.json +9 -0
  56. package/rules/autoconsent/pigu.json +35 -0
  57. package/rules/autoconsent/plentyshop.json +27 -0
  58. package/rules/autoconsent/posthog.json +35 -0
  59. package/rules/autoconsent/quantcast.json +96 -34
  60. package/rules/autoconsent/quick-cookie-consent.json +70 -0
  61. package/rules/autoconsent/schadefonds.json +15 -0
  62. package/rules/autoconsent/service2school.json +45 -0
  63. package/rules/autoconsent/sportmedizin-rheuma.json +17 -0
  64. package/rules/autoconsent/tealium.json +10 -4
  65. package/rules/autoconsent/tracsis-delay-repay.json +13 -0
  66. package/rules/autoconsent/truendo.json +28 -0
  67. package/rules/autoconsent/truevault-polaris.json +8 -0
  68. package/rules/autoconsent/ubisoft-com.json +64 -0
  69. package/rules/autoconsent/volvocars-com.json +1 -1
  70. package/rules/autoconsent/wbd-legal-terms.json +28 -10
  71. package/rules/compact-rules.json +1 -1
  72. package/rules/rule-index.json +1 -1
  73. package/rules/rules.json +1 -1
  74. package/tests/accurx.spec.ts +3 -0
  75. package/tests/aliexpress.spec.ts +5 -1
  76. package/tests/burpee-com.spec.ts +3 -0
  77. package/tests/ccm19.spec.ts +11 -0
  78. package/tests/channel4.spec.ts +7 -3
  79. package/tests/citizensadvice.spec.ts +3 -0
  80. package/tests/civic-cookie-control.spec.ts +9 -1
  81. package/tests/clasohlson.com.spec.ts +3 -0
  82. package/tests/cm-cookie-manager.spec.ts +11 -0
  83. package/tests/community.screwfix.com.spec.ts +5 -0
  84. package/tests/complianz-optin.spec.ts +5 -1
  85. package/tests/concept3d.spec.ts +8 -0
  86. package/tests/conextra.spec.ts +8 -0
  87. package/tests/cookie-script.spec.ts +8 -3
  88. package/tests/cookiecuttr.spec.ts +8 -1
  89. package/tests/craft-cookie-consent.spec.ts +9 -0
  90. package/tests/cz-eshop-cookies-consent.spec.ts +10 -0
  91. package/tests/depop.spec.ts +3 -1
  92. package/tests/dsgvo.spec.ts +8 -10
  93. package/tests/dwaalzin-nu.spec.ts +6 -0
  94. package/tests/elsevier.spec.ts +5 -1
  95. package/tests/eneba.spec.ts +3 -0
  96. package/tests/europa-eu.spec.ts +6 -1
  97. package/tests/finna.spec.ts +3 -0
  98. package/tests/head-fi.spec.ts +3 -0
  99. package/tests/istore-co-za.spec.ts +3 -0
  100. package/tests/kiwico.spec.ts +5 -0
  101. package/tests/la-becanerie.spec.ts +3 -0
  102. package/tests/lta.spec.ts +7 -0
  103. package/tests/meteored.spec.ts +9 -0
  104. package/tests/mizuno-com.spec.ts +7 -0
  105. package/tests/mobirise-cookies-alert-cosmetic.spec.ts +8 -0
  106. package/tests/mobirise-cookies-alert.spec.ts +3 -0
  107. package/tests/msg-cookie.spec.ts +10 -0
  108. package/tests/pigu.spec.ts +3 -0
  109. package/tests/plentyshop.spec.ts +7 -0
  110. package/tests/posthog.spec.ts +3 -0
  111. package/tests/quantcast.spec.ts +15 -7
  112. package/tests/quick-cookie-consent.spec.ts +8 -0
  113. package/tests/schadefonds.spec.ts +3 -0
  114. package/tests/service2school.spec.ts +3 -0
  115. package/tests/sportmedizin-rheuma.spec.ts +3 -0
  116. package/tests/tealium.spec.ts +3 -0
  117. package/tests/tracsis-delay-repay.spec.ts +6 -0
  118. package/tests/truendo.spec.ts +9 -0
  119. package/tests/ubisoft-com.spec.ts +12 -0
  120. package/tests/wbd-legal-terms.spec.ts +2 -0
  121. package/tests-wtr/dom-actions/dom-actions.click.ts +18 -0
  122. package/Dockerfile +0 -9
  123. package/rules/autoconsent/sandhills.json +0 -26
  124. package/tests/sandhills.spec.ts +0 -8
@@ -96,7 +96,7 @@ Waits until element is visible in the page. After `timeout` ms the step fails. T
96
96
  "all": true | false,
97
97
  }
98
98
  ```
99
- Click on an element returned by `selector`. If `all` is `true`, all matching elements are clicked. If `all` is `false`, only the first returned value is clicked.
99
+ Click on an element returned by `selector`. If `all` is `true`, all matching elements are clicked one by one, letting the page handle each click before the next one (back-to-back clicks can lose state updates, e.g. on toggle switches). If `all` is `false`, only the first returned value is clicked.
100
100
 
101
101
  ## Wait for then click
102
102
  ```javascript
@@ -26,7 +26,11 @@ export class DomActions implements DomActionsProvider {
26
26
 
27
27
  if (elements.length > 0) {
28
28
  if (all) {
29
- elements.forEach((e) => e.click());
29
+ for (const e of elements) {
30
+ e.click();
31
+ // Let the page handle each click first: back-to-back clicks can overwrite each other's state updates.
32
+ await new Promise((resolve) => setTimeout(resolve, 0));
33
+ }
30
34
  } else {
31
35
  elements[0].click();
32
36
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckduckgo/autoconsent",
3
- "version": "16.51.0",
3
+ "version": "16.53.0",
4
4
  "description": "",
5
5
  "types": "./dist/types/web.d.ts",
6
6
  "exports": {
@@ -65,7 +65,7 @@
65
65
  "bulma": "^1.0.2",
66
66
  "chai": "^6.0.1",
67
67
  "chokidar-cli": "^3.0.0",
68
- "csv-parse": "^6.2.1",
68
+ "csv-parse": "^7.0.3",
69
69
  "esbuild": "^0.28.0",
70
70
  "eslint": "^10.0.3",
71
71
  "globals": "^17.4.0",
@@ -0,0 +1,26 @@
1
+ {
2
+ "name": "accurx",
3
+ "runContext": {
4
+ "urlPattern": "^https://(accurx\\.nhs\\.uk|patient\\.accurx\\.com)/"
5
+ },
6
+ "prehideSelectors": ["#__next > div:has(> p > a[href*='cookie-policy'])"],
7
+ "detectCmp": [{ "exists": "xpath///div[@id='__next']/div[h2[normalize-space(.)='Cookies on this website']]" }],
8
+ "detectPopup": [{ "visible": "xpath///div[@id='__next']/div[h2[normalize-space(.)='Cookies on this website']]" }],
9
+ "optIn": [
10
+ {
11
+ "waitForThenClick": "xpath///div[@id='__next']/div[h2[normalize-space(.)='Cookies on this website']]//button[contains(., 'Yes, I agree')]"
12
+ }
13
+ ],
14
+ "optOut": [
15
+ {
16
+ "waitForThenClick": "xpath///div[@id='__next']/div[h2[normalize-space(.)='Cookies on this website']]//button[contains(., 'do not use analytics cookies')]"
17
+ }
18
+ ],
19
+ "test": [
20
+ {
21
+ "waitForVisible": "xpath///div[@id='__next']/div[h2[normalize-space(.)='Cookies on this website']]",
22
+ "check": "none",
23
+ "timeout": 2000
24
+ }
25
+ ]
26
+ }
@@ -7,18 +7,18 @@
7
7
  "prehideSelectors": ["#gdpr-new-container"],
8
8
  "detectCmp": [
9
9
  {
10
- "exists": "#gdpr-new-container,#voyager-gdpr > div"
10
+ "exists": "#gdpr-new-container,#voyager-gdpr > div,#voyager-gdpr-2025 > div > div > button"
11
11
  }
12
12
  ],
13
13
  "detectPopup": [
14
14
  {
15
- "visible": "#gdpr-new-container,#voyager-gdpr > div",
15
+ "visible": "#gdpr-new-container,#voyager-gdpr > div,#voyager-gdpr-2025 > div > div > button",
16
16
  "check": "any"
17
17
  }
18
18
  ],
19
19
  "optIn": [
20
20
  {
21
- "waitForThenClick": "#gdpr-new-container button:last-of-type,#voyager-gdpr > div > div > button:nth-child(1)"
21
+ "waitForThenClick": "#gdpr-new-container button:last-of-type,#voyager-gdpr > div > div > button:nth-child(1),#voyager-gdpr-2025 > div > div > button:first-of-type"
22
22
  }
23
23
  ],
24
24
  "optOut": [
@@ -31,22 +31,46 @@
31
31
  ],
32
32
  "else": [
33
33
  {
34
- "if": { "exists": "#gdpr-new-container button:nth-of-type(3)" },
34
+ "if": { "exists": "#voyager-gdpr-2025 > div > div > button" },
35
35
  "then": [
36
36
  {
37
- "waitForThenClick": "#gdpr-new-container button:nth-of-type(2)"
37
+ "if": { "exists": "#voyager-gdpr-2025 > div > div > button:nth-of-type(3)" },
38
+ "then": [
39
+ {
40
+ "waitForThenClick": "#voyager-gdpr-2025 > div > div > button:nth-of-type(2)"
41
+ }
42
+ ],
43
+ "else": [
44
+ {
45
+ "waitForThenClick": "#voyager-gdpr-2025 > div > div > button:last-of-type"
46
+ },
47
+ {
48
+ "waitForThenClick": "#voyager-gdpr-2025 > div > div > div > button:last-of-type",
49
+ "timeout": 5000
50
+ }
51
+ ]
38
52
  }
39
53
  ],
40
54
  "else": [
41
55
  {
42
- "waitForThenClick": "#gdpr-new-container button:first-of-type"
43
- },
44
- {
45
- "waitForVisible": "#voyager-gdpr-2025",
46
- "timeout": 5000
47
- },
48
- {
49
- "waitForThenClick": "#voyager-gdpr-2025 button:last-of-type"
56
+ "if": { "exists": "#gdpr-new-container button:nth-of-type(3)" },
57
+ "then": [
58
+ {
59
+ "waitForThenClick": "#gdpr-new-container button:nth-of-type(2)"
60
+ }
61
+ ],
62
+ "else": [
63
+ {
64
+ "waitForThenClick": "#gdpr-new-container button:first-of-type"
65
+ },
66
+ {
67
+ "waitForVisible": "#voyager-gdpr-2025",
68
+ "timeout": 5000
69
+ },
70
+ {
71
+ "waitForThenClick": "#voyager-gdpr-2025 button:last-of-type"
72
+ }
73
+ ]
50
74
  }
51
75
  ]
52
76
  }
@@ -2,24 +2,36 @@
2
2
  "name": "burpee.com",
3
3
  "minimumRuleStepVersion": 2,
4
4
  "prehideSelectors": [".cookie-modal", "#notice-cookie-block"],
5
- "detectCmp": [{ "exists": "#notice-cookie-block" }],
5
+ "detectCmp": [{ "exists": "#notice-cookie-block" }, { "exists": "#notice-cookie-block #cm-selectSpecific", "negated": true }],
6
6
  "detectPopup": [{ "visible": "#html-body #notice-cookie-block" }],
7
- "optIn": [{ "waitForThenClick": "#btn-cookie-allow" }],
7
+ "optIn": [
8
+ {
9
+ "if": { "exists": "#notice-cookie-block button[\\@click^='acceptAll']" },
10
+ "then": [{ "waitForThenClick": "#notice-cookie-block button[\\@click^='acceptAll']" }],
11
+ "else": [{ "waitForThenClick": "#btn-cookie-allow" }]
12
+ }
13
+ ],
8
14
  "optOut": [
9
15
  {
10
16
  "if": { "exists": "#notice-cookie-block #btn-cookie-decline" },
11
17
  "then": [{ "waitForThenClick": "#notice-cookie-block #btn-cookie-decline" }],
12
18
  "else": [
13
19
  {
14
- "if": { "exists": "#btn-cookie-manage" },
15
- "then": [
16
- { "waitForThenClick": "#btn-cookie-manage" },
17
- { "click": "#notice-cookie-block input:checked", "all": true },
18
- { "click": "#btn-cookie-save" }
19
- ],
20
+ "if": { "exists": "#notice-cookie-block button[\\@click^='rejectAll']" },
21
+ "then": [{ "waitForThenClick": "#notice-cookie-block button[\\@click^='rejectAll']" }],
20
22
  "else": [
21
- { "hide": "#html-body #notice-cookie-block, #notice-cookie" },
22
- { "removeClass": "cookie-notification-active", "selector": "body", "optional": true }
23
+ {
24
+ "if": { "exists": "#btn-cookie-manage" },
25
+ "then": [
26
+ { "waitForThenClick": "#btn-cookie-manage" },
27
+ { "click": "#notice-cookie-block input:checked", "all": true },
28
+ { "click": "#btn-cookie-save" }
29
+ ],
30
+ "else": [
31
+ { "hide": "#html-body #notice-cookie-block, #notice-cookie" },
32
+ { "removeClass": "cookie-notification-active", "selector": "body", "optional": true }
33
+ ]
34
+ }
23
35
  ]
24
36
  }
25
37
  ]
@@ -0,0 +1,31 @@
1
+ {
2
+ "name": "ccm19",
3
+ "vendorUrl": "https://www.ccm19.de/",
4
+ "prehideSelectors": ["#ccm-widget.ccm-show"],
5
+ "detectCmp": [
6
+ {
7
+ "any": [{ "exists": "#ccm-widget" }, { "exists": "script[src*='ccm19'][src*='/app.js?apiKey=']" }],
8
+ "comment": "the widget is injected late, so detect the loader too"
9
+ }
10
+ ],
11
+ "detectPopup": [{ "visible": "#ccm-widget.ccm-show" }],
12
+ "optIn": [{ "waitForThenClick": "#ccm-widget .ccm--save-settings[data-full-consent='true']" }],
13
+ "optOut": [
14
+ {
15
+ "if": { "exists": "#ccm-widget .ccm--decline-cookies" },
16
+ "then": [{ "waitForThenClick": "#ccm-widget .ccm--decline-cookies" }],
17
+ "else": [
18
+ { "waitForThenClick": "#ccm-widget [data-ccm-modal='ccm-control-panel']" },
19
+ { "waitForThenClick": "#ccm-control-panel .ccm--save-settings:not([data-full-consent='true'])" }
20
+ ]
21
+ }
22
+ ],
23
+ "test": [
24
+ {
25
+ "waitForVisible": "#ccm-widget.ccm-show",
26
+ "timeout": 2000,
27
+ "check": "none",
28
+ "comment": "consent is stored in a cookie or localStorage depending on setup"
29
+ }
30
+ ]
31
+ }
@@ -5,21 +5,21 @@
5
5
  "frame": false,
6
6
  "urlPattern": "^https?://(www\\.)?channel4\\.com/"
7
7
  },
8
- "prehideSelectors": ["#cookie-consent-banner"],
9
- "detectCmp": [{ "exists": "#cookie-consent-banner" }],
8
+ "prehideSelectors": ["#cookie-consent-banner", ".cookie-banner"],
9
+ "detectCmp": [{ "exists": ".cookie-banner .all4-cc-primary-button" }],
10
10
  "detectPopup": [
11
11
  {
12
- "visible": "#cookie-consent-banner .all4-cc-primary-button"
12
+ "visible": ".cookie-banner .all4-cc-primary-button"
13
13
  }
14
14
  ],
15
15
  "optIn": [
16
16
  {
17
- "waitForThenClick": "#cookie-consent-banner .all4-cc-primary-button"
17
+ "waitForThenClick": ".cookie-banner .all4-cc-primary-button"
18
18
  }
19
19
  ],
20
20
  "optOut": [
21
21
  {
22
- "waitForThenClick": "#cookie-consent-banner button[aria-label=\"Reject non-essential cookies and continue.\"]"
22
+ "waitForThenClick": ".cookie-banner button[aria-label=\"Reject non-essential cookies and continue.\"]"
23
23
  }
24
24
  ],
25
25
  "test": [{ "cookieContains": "C4_CC=eyJ2ZXJzaW9uIjoxLCJjb25zZW50ZWQiOnRydWUs" }]
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "citizensadvice",
3
+ "vendorUrl": "https://www.citizensadvice.org.uk/",
4
+ "runContext": {
5
+ "urlPattern": "^https?://(\\w+\\.)?citizensadvice\\.org\\.uk/"
6
+ },
7
+ "prehideSelectors": [".js-cookie-banner"],
8
+ "detectCmp": [
9
+ {
10
+ "exists": "#js-cookie-banner__button-reject"
11
+ }
12
+ ],
13
+ "detectPopup": [
14
+ {
15
+ "visible": "#js-cookie-banner__button-reject"
16
+ }
17
+ ],
18
+ "optIn": [
19
+ {
20
+ "waitForThenClick": "#js-cookie-banner__button-accept"
21
+ },
22
+ {
23
+ "waitForThenClick": "#js-cookie-banner__button-hide",
24
+ "timeout": 2000,
25
+ "optional": true
26
+ }
27
+ ],
28
+ "optOut": [
29
+ {
30
+ "waitForThenClick": "#js-cookie-banner__button-reject"
31
+ },
32
+ {
33
+ "waitForThenClick": "#js-cookie-banner__button-hide",
34
+ "timeout": 2000,
35
+ "optional": true
36
+ }
37
+ ],
38
+ "test": [
39
+ {
40
+ "cookieContains": "%22analytics%22%3Afalse"
41
+ }
42
+ ]
43
+ }
@@ -11,17 +11,11 @@
11
11
  "else": [
12
12
  {
13
13
  "if": {
14
- "exists": [
15
- "#ccc #ccc-notify .ccc-notify-buttons",
16
- "xpath///button[contains(., 'Settings') or contains(., 'Cookie Preferences') or contains(., 'Einstellungen️')]"
17
- ]
14
+ "exists": "#ccc-notify .ccc-notify-buttons .ccc-notify-button:not(.ccc-accept-button):not(.ccc-reject-button)"
18
15
  },
19
16
  "then": [
20
17
  {
21
- "waitForThenClick": [
22
- "#ccc #ccc-notify .ccc-notify-buttons",
23
- "xpath///button[contains(., 'Settings') or contains(., 'Cookie Preferences') or contains(., 'Einstellungen️')]"
24
- ]
18
+ "waitForThenClick": "#ccc-notify .ccc-notify-buttons .ccc-notify-button:not(.ccc-accept-button):not(.ccc-reject-button)"
25
19
  },
26
20
  { "waitForVisible": "#ccc-module" }
27
21
  ]
@@ -29,7 +23,13 @@
29
23
  {
30
24
  "if": { "visible": ".ccc-reject-button" },
31
25
  "then": [{ "waitForThenClick": ".ccc-reject-button" }],
32
- "else": [{ "waitForThenClick": "#ccc-dismiss-button" }]
26
+ "else": [
27
+ {
28
+ "if": { "exists": "#ccc-dismiss-button" },
29
+ "then": [{ "waitForThenClick": "#ccc-dismiss-button" }],
30
+ "else": [{ "waitForThenClick": "#ccc-close" }]
31
+ }
32
+ ]
33
33
  }
34
34
  ]
35
35
  }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "clasohlson.com",
3
+ "runContext": { "urlPattern": "^https?://(www\\.)?clasohlson\\.com/" },
4
+ "prehideSelectors": [".cookie-bar-backdrop"],
5
+ "detectCmp": [{ "exists": "#js-cookie-notification .js-reject-cookie" }],
6
+ "detectPopup": [{ "visible": "#js-cookie-notification.opened" }],
7
+ "optIn": [{ "waitForThenClick": "#js-cookie-notification.opened .js-cookie-notification-accept", "retry": 10, "retryInterval": 500 }],
8
+ "optOut": [
9
+ { "waitForThenClick": "#js-cookie-notification.opened .js-reject-cookie", "retry": 10, "retryInterval": 500 },
10
+ { "waitForVisible": "#js-cookie-notification.opened", "check": "none" }
11
+ ],
12
+ "test": [{ "cookieContains": "cookie-notification=REJECTED" }]
13
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "name": "cm-cookie-manager",
3
+ "prehideSelectors": ["#cm-wrapper:has(#cm-selectSpecific)", "#cookie-consent:has(#cm-selectSpecific)"],
4
+ "detectCmp": [{ "exists": "#cm-selectSpecific" }, { "exists": "#cm-selectAllCheckboxes" }],
5
+ "detectPopup": [{ "visible": "#cm-selectAllCheckboxes" }],
6
+ "optIn": [{ "waitForThenClick": "#cm-selectAllCheckboxes" }],
7
+ "optOut": [
8
+ {
9
+ "if": { "visible": "#cm-openSettings" },
10
+ "then": [{ "click": "#cm-openSettings" }]
11
+ },
12
+ { "waitForVisible": "#cm-selectSpecific" },
13
+ {
14
+ "if": { "exists": ".cmCat-checkboxes:checked:not(:disabled)" },
15
+ "then": [{ "click": ".cmCat-checkboxes:checked:not(:disabled)", "all": true }]
16
+ },
17
+ { "click": "#cm-selectSpecific" }
18
+ ],
19
+ "test": [{ "visible": "#cm-selectAllCheckboxes", "check": "none" }]
20
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "community.screwfix.com",
3
+ "vendorUrl": "https://trustarc.com/",
4
+ "comment": "TrustArc banner whose custom CSS adds a full-page #consent-banner::before backdrop that is not removed when the banner closes, leaving the page dimmed and unclickable.",
5
+ "minimumRuleStepVersion": 3,
6
+ "runContext": {
7
+ "main": true,
8
+ "frame": false,
9
+ "urlPattern": "^https?://community\\.screwfix\\.com/"
10
+ },
11
+ "prehideSelectors": ["#consent-banner"],
12
+ "detectCmp": [{ "exists": "#consent-banner #truste-consent-track" }],
13
+ "detectPopup": [{ "visible": "#consent-banner #truste-consent-track" }],
14
+ "optIn": [
15
+ { "waitForThenClick": "#truste-consent-button" },
16
+ { "stylesheet": "#consent-banner::before { display: none !important; }", "stylesheetId": "screwfix-backdrop" }
17
+ ],
18
+ "optOut": [
19
+ { "waitForThenClick": "#truste-consent-required" },
20
+ { "stylesheet": "#consent-banner::before { display: none !important; }", "stylesheetId": "screwfix-backdrop" }
21
+ ],
22
+ "test": [{ "cookieContains": "cmapi_cookie_privacy=permit_1_required" }]
23
+ }
@@ -21,7 +21,17 @@
21
21
  { "click": ".cc-settings-view input[type=checkbox]:not([disabled]):checked", "all": true, "optional": true },
22
22
  { "click": ".cc-settings-view .cc-btn-accept-selected" }
23
23
  ],
24
- "else": [{ "click": ".cc-dismiss" }]
24
+ "else": [
25
+ {
26
+ "if": { "exists": ".cc-dismiss" },
27
+ "then": [{ "click": ".cc-dismiss" }],
28
+ "else": [
29
+ { "click": ".cmp-pref-link" },
30
+ { "waitForThenClick": ".cmp-body [id*=rejectAll]" },
31
+ { "waitForThenClick": ".cmp-body .cmp-save-btn" }
32
+ ]
33
+ }
34
+ ]
25
35
  }
26
36
  ]
27
37
  }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "concept3d",
3
+ "vendorUrl": "https://www.concept3d.com/",
4
+ "prehideSelectors": [".cookie-consent-card:has([data-cy=cookie-customize])"],
5
+ "detectCmp": [{ "exists": ".cookie-consent-card [data-cy=cookie-customize]" }],
6
+ "detectPopup": [{ "visible": ".cookie-consent-card [data-cy=cookie-customize]" }],
7
+ "optIn": [{ "waitForThenClick": ".cookie-consent-card [data-cy=cookie-accept-all]" }],
8
+ "optOut": [
9
+ { "waitForThenClick": ".cookie-consent-card [data-cy=cookie-customize]" },
10
+ { "waitForVisible": "#cookie-preferences-dialog [data-cy=cookie-save-preferences]" },
11
+ {
12
+ "click": "#cookie-preferences-dialog button[role=switch][aria-checked=true]:not([aria-disabled=true])",
13
+ "all": true,
14
+ "optional": true
15
+ },
16
+ { "waitForThenClick": "#cookie-preferences-dialog [data-cy=cookie-save-preferences]" }
17
+ ],
18
+ "test": [{ "cookieContains": "_cookieConsent=%7B%22analytics%22%3Afalse%2C%22marketing%22%3Afalse" }]
19
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "name": "conextra",
3
+ "prehideSelectors": [".cookiebanner:has(> #cookieform .chooseCookies)", ".diffusion_layer:has(#cookieform)"],
4
+ "detectCmp": [{ "exists": ".cookiebanner #cookieform .chooseCookies" }],
5
+ "detectPopup": [{ "visible": ".cookiebanner #cookieform .chooseCookies" }],
6
+ "optIn": [{ "waitForThenClick": ".cookiebanner [onclick^='sendForm(2']" }],
7
+ "optOut": [
8
+ {
9
+ "if": { "exists": ".cookiebanner [onclick^='sendForm(0']" },
10
+ "then": [{ "waitForThenClick": ".cookiebanner [onclick^='sendForm(0']" }],
11
+ "else": [
12
+ { "click": ".cookiebanner .chooseCookies input[type='checkbox']:checked:not([onclick])", "all": true, "optional": true },
13
+ { "waitForThenClick": ".cookiebanner [onclick^='sendForm(1']" }
14
+ ]
15
+ }
16
+ ],
17
+ "test": [{ "waitForVisible": ".cookiebanner #cookieform .chooseCookies", "timeout": 1000, "check": "none" }]
18
+ }
@@ -10,8 +10,29 @@
10
10
  "then": [{ "wait": 100 }, { "click": "#cookiescript_reject" }],
11
11
  "else": [
12
12
  { "click": "#cookiescript_manage" },
13
- { "waitForVisible": ".cookiescript_fsd_main" },
14
- { "waitForThenClick": "#cookiescript_reject" }
13
+ { "waitForVisible": ".cookiescript_fsd_main, #cookiescript_save", "timeout": 3000, "optional": true },
14
+ {
15
+ "if": { "exists": ".cookiescript_fsd_main" },
16
+ "then": [{ "waitForThenClick": "#cookiescript_reject" }],
17
+ "else": [
18
+ {
19
+ "if": { "visible": "#cookiescript_save" },
20
+ "then": [
21
+ {
22
+ "if": { "exists": "#cookiescript_injected input.cookiescript_checkbox_input:checked:not(:disabled)" },
23
+ "then": [
24
+ {
25
+ "click": "#cookiescript_injected input.cookiescript_checkbox_input:checked:not(:disabled)",
26
+ "all": true
27
+ }
28
+ ]
29
+ },
30
+ { "waitForThenClick": "#cookiescript_save", "retry": 6, "retryInterval": 1000 }
31
+ ],
32
+ "else": [{ "click": "#cookiescript_close" }]
33
+ }
34
+ ]
35
+ }
15
36
  ]
16
37
  }
17
38
  ],
@@ -14,12 +14,13 @@
14
14
  ],
15
15
  "detectPopup": [
16
16
  {
17
- "visible": ".cc-cookies .cc-cookie-accept"
17
+ "visible": ".cc-cookies:not(#cookies_declinedbar) .cc-cookie-accept",
18
+ "check": "any"
18
19
  }
19
20
  ],
20
21
  "optIn": [
21
22
  {
22
- "waitForThenClick": ".cc-cookies .cc-cookie-accept"
23
+ "waitForThenClick": ".cc-cookies:not(#cookies_declinedbar) .cc-cookie-accept"
23
24
  }
24
25
  ],
25
26
  "optOut": [
@@ -0,0 +1,65 @@
1
+ {
2
+ "name": "craft-cookie-consent",
3
+ "vendorUrl": "https://plugins.craftcms.com/cookie-consent",
4
+ "prehideSelectors": ["#elc-cookie-consent"],
5
+ "detectCmp": [
6
+ {
7
+ "exists": "#elc-cookie-consent #elc-cookie-consent-form"
8
+ }
9
+ ],
10
+ "detectPopup": [
11
+ {
12
+ "visible": "#elc-cookie-consent:not(.elc-hidden) #elc-cookie-consent-form"
13
+ }
14
+ ],
15
+ "optIn": [
16
+ {
17
+ "waitForThenClick": "#elc-accept-all-link"
18
+ }
19
+ ],
20
+ "optOut": [
21
+ {
22
+ "click": "#elc-cookie-consent-form input[type=checkbox][name^=\"group-\"]:checked:not([disabled]):not([name$=\"-necessary\"])",
23
+ "all": true,
24
+ "optional": true
25
+ },
26
+ {
27
+ "if": {
28
+ "visible": "#elc-accept-link"
29
+ },
30
+ "then": [
31
+ {
32
+ "click": "#elc-accept-link"
33
+ }
34
+ ],
35
+ "else": [
36
+ {
37
+ "click": "#elc-detail-link"
38
+ },
39
+ {
40
+ "waitForVisible": "#elc-save-link, #elc-accept-link"
41
+ },
42
+ {
43
+ "if": {
44
+ "visible": "#elc-save-link"
45
+ },
46
+ "then": [
47
+ {
48
+ "click": "#elc-save-link"
49
+ }
50
+ ],
51
+ "else": [
52
+ {
53
+ "click": "#elc-accept-link"
54
+ }
55
+ ]
56
+ }
57
+ ]
58
+ }
59
+ ],
60
+ "test": [
61
+ {
62
+ "waitFor": "#elc-cookie-consent.elc-hidden"
63
+ }
64
+ ]
65
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "name": "cz-eshop-cookies-consent",
3
+ "prehideSelectors": [".cookies-consent:has(.cookies-consent-accept-needed)"],
4
+ "detectCmp": [{ "exists": ".cookies-consent .cookies-consent-accept-needed" }],
5
+ "detectPopup": [{ "visible": ".cookies-consent .cookies-inner" }],
6
+ "optIn": [{ "waitForThenClick": ".cookies-consent .cookies-consent-accept-all" }],
7
+ "optOut": [{ "waitForThenClick": ".cookies-consent .cookies-consent-accept-needed", "retry": 10, "retryInterval": 500 }],
8
+ "test": [{ "cookieContains": "cookiesConsentAllowedServices=" }, { "cookieContains": "]},{\"type\":", "negated": true }]
9
+ }
@@ -1,42 +1,44 @@
1
1
  {
2
2
  "name": "depop",
3
3
  "vendorUrl": "https://www.depop.com/",
4
- "cosmetic": false,
4
+ "cosmetic": true,
5
+ "minimumRuleStepVersion": 2,
6
+ "comment": "Transcend airgap ignores untrusted clicks, so the banner is hidden together with the site's own backdrop and body scroll lock.",
5
7
  "runContext": {
6
8
  "urlPattern": "^https://(www\\.)?depop\\.com/"
7
9
  },
8
- "prehideSelectors": ["[data-testid=cookieBanner]"],
10
+ "prehideSelectors": ["#transcend-consent-manager", "#cookies-modal"],
9
11
  "detectCmp": [
10
12
  {
11
- "exists": "[data-testid=cookieBanner] button"
13
+ "exists": "#transcend-consent-manager"
12
14
  }
13
15
  ],
14
16
  "detectPopup": [
15
17
  {
16
- "visible": "[data-testid=cookieBanner] button"
18
+ "visible": ["#transcend-consent-manager", "#consentManagerMainDialog"]
17
19
  }
18
20
  ],
19
21
  "optIn": [
20
22
  {
21
- "waitForThenClick": "[data-testid=cookieBanner__acceptAllButton]"
23
+ "waitForThenClick": ["#transcend-consent-manager", "#consentManagerMainDialog .accept-or-reject-all-button-row button"]
22
24
  }
23
25
  ],
24
26
  "optOut": [
25
27
  {
26
- "waitForThenClick": "[data-testid=cookieBanner__manageCookiesButton]"
28
+ "hide": "#transcend-consent-manager"
27
29
  },
28
30
  {
29
- "click": "[data-testid=cookieModal] input[type=radio][value=false]:not(:checked):not(:disabled)",
30
- "all": true,
31
- "optional": true
31
+ "hide": "#cookies-modal"
32
32
  },
33
33
  {
34
- "waitForThenClick": "[data-testid=cookieModal__acceptButton]"
35
- }
36
- ],
37
- "test": [
34
+ "waitFor": "#cookies-modal",
35
+ "timeout": 3000,
36
+ "optional": true
37
+ },
38
38
  {
39
- "cookieContains": "gdpr__"
39
+ "addStyle": "overflow: auto !important",
40
+ "selector": "body",
41
+ "optional": true
40
42
  }
41
43
  ]
42
44
  }