@duckduckgo/autoconsent 16.49.0 → 16.51.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 (236) hide show
  1. package/.agents/skills/optimize-button-patterns/SKILL.md +4 -4
  2. package/.github/workflows/release-labels.yml +2 -6
  3. package/AGENTS.md +1 -1
  4. package/CHANGELOG.md +130 -0
  5. package/build.sh +2 -0
  6. package/data/labelled-button-texts.csv +36 -36
  7. package/dist/addon-firefox/background.bundle.js +4 -1
  8. package/dist/addon-firefox/compact-rules.json +1 -1
  9. package/dist/addon-firefox/content.bundle.js +67 -46
  10. package/dist/addon-firefox/manifest.json +1 -1
  11. package/dist/addon-firefox/rule-index.json +1 -1
  12. package/dist/addon-firefox/rules.json +1 -1
  13. package/dist/addon-mv3/background.bundle.js +4 -1
  14. package/dist/addon-mv3/compact-rules.json +1 -1
  15. package/dist/addon-mv3/content.bundle.js +67 -46
  16. package/dist/addon-mv3/manifest.json +1 -1
  17. package/dist/addon-mv3/rule-index.json +1 -1
  18. package/dist/addon-mv3/rules.json +1 -1
  19. package/dist/autoconsent.cjs.js +67 -46
  20. package/dist/autoconsent.esm.js +67 -46
  21. package/dist/autoconsent.playwright.js +68 -46
  22. package/dist/autoconsent.standalone.js +68 -47
  23. package/dist/heuristics.cjs.js +886 -0
  24. package/dist/heuristics.mjs +847 -0
  25. package/dist/types/eval-snippets.d.ts +2 -0
  26. package/dist/types/heuristic-classify.d.ts +16 -0
  27. package/dist/types/heuristics.d.ts +2 -9
  28. package/dist/types/types.d.ts +3 -5
  29. package/lib/eval-snippets.ts +4 -0
  30. package/lib/heuristic-classify.ts +136 -0
  31. package/lib/heuristic-patterns.ts +33 -16
  32. package/lib/heuristics.ts +3 -124
  33. package/lib/types.ts +3 -5
  34. package/lib/web.ts +1 -1
  35. package/package.json +7 -2
  36. package/playwright/content.ts +5 -0
  37. package/readme.md +12 -0
  38. package/rules/autoconsent/abcacupuncture1.json +34 -0
  39. package/rules/autoconsent/aceodds.json +13 -0
  40. package/rules/autoconsent/allabout-japan.json +42 -0
  41. package/rules/autoconsent/amazon-hiring.json +16 -0
  42. package/rules/autoconsent/avada-cookie-consent.json +43 -0
  43. package/rules/autoconsent/avvio.json +22 -0
  44. package/rules/autoconsent/axeptio.json +22 -6
  45. package/rules/autoconsent/bdirect-booking-engine.json +33 -0
  46. package/rules/autoconsent/berelax.com.json +33 -0
  47. package/rules/autoconsent/bigcrunch.json +39 -0
  48. package/rules/autoconsent/bigid.json +59 -0
  49. package/rules/autoconsent/bluepark.json +31 -0
  50. package/rules/autoconsent/bricklink.json +33 -0
  51. package/rules/autoconsent/burpee-com.json +5 -1
  52. package/rules/autoconsent/bynder.json +33 -0
  53. package/rules/autoconsent/ceneo.json +9 -0
  54. package/rules/autoconsent/cinemaplus.json +9 -0
  55. package/rules/autoconsent/columbia-privacy-notice.json +32 -0
  56. package/rules/autoconsent/complianz-notice.json +1 -1
  57. package/rules/autoconsent/conjointly.json +43 -0
  58. package/rules/autoconsent/cookieconsent2-legacy.json +44 -0
  59. package/rules/autoconsent/cookiesjsr.json +27 -0
  60. package/rules/autoconsent/copaamerica.json +29 -0
  61. package/rules/autoconsent/cornerstone-brands.json +51 -0
  62. package/rules/autoconsent/darkounity.com.json +35 -0
  63. package/rules/autoconsent/dhbbank.json +13 -0
  64. package/rules/autoconsent/duda-cookie-notification.json +41 -0
  65. package/rules/autoconsent/ee-consent-notice.json +40 -0
  66. package/rules/autoconsent/endocrine.org.json +35 -0
  67. package/rules/autoconsent/ezoic.json +2 -2
  68. package/rules/autoconsent/fera-cookies.json +67 -0
  69. package/rules/autoconsent/fis-data-exchange.json +13 -0
  70. package/rules/autoconsent/getproven.json +33 -0
  71. package/rules/autoconsent/givedirectly.json +36 -0
  72. package/rules/autoconsent/godaddy-website-builder-cosmetic.json +13 -0
  73. package/rules/autoconsent/godaddy-website-builder.json +9 -0
  74. package/rules/autoconsent/guesty.json +31 -0
  75. package/rules/autoconsent/gundam-base-entry.json +40 -0
  76. package/rules/autoconsent/hearst-us.json +1 -1
  77. package/rules/autoconsent/indy-systems.json +26 -0
  78. package/rules/autoconsent/ing-nl.json +54 -0
  79. package/rules/autoconsent/iubenda.json +25 -3
  80. package/rules/autoconsent/la7-cmp.json +30 -0
  81. package/rules/autoconsent/laravel-cookie-consent.json +45 -0
  82. package/rules/autoconsent/legislation-gov-uk.json +43 -0
  83. package/rules/autoconsent/lucrin.json +18 -0
  84. package/rules/autoconsent/mackeeper.json +34 -0
  85. package/rules/autoconsent/makitatools.json +41 -0
  86. package/rules/autoconsent/milestone-internet.json +32 -0
  87. package/rules/autoconsent/ndl-go-jp.json +35 -0
  88. package/rules/autoconsent/nhm-ac-uk.json +29 -0
  89. package/rules/autoconsent/npo-ccm.json +42 -0
  90. package/rules/autoconsent/opalcollection-com.json +12 -0
  91. package/rules/autoconsent/orw-cookie-banner.json +42 -0
  92. package/rules/autoconsent/osf-io.json +29 -0
  93. package/rules/autoconsent/palace-company.json +13 -0
  94. package/rules/autoconsent/paypal-us.json +3 -3
  95. package/rules/autoconsent/paypal.json +5 -2
  96. package/rules/autoconsent/paytronix.json +30 -0
  97. package/rules/autoconsent/pitt-edu.json +12 -0
  98. package/rules/autoconsent/pizzapilgrims.co.uk.json +49 -0
  99. package/rules/autoconsent/podimo.json +73 -0
  100. package/rules/autoconsent/publicmobile.json +16 -0
  101. package/rules/autoconsent/rakshaos.json +45 -0
  102. package/rules/autoconsent/rutjes.json +13 -0
  103. package/rules/autoconsent/saturdaysnyc.json +33 -0
  104. package/rules/autoconsent/serpstat-com.json +13 -0
  105. package/rules/autoconsent/shopquarters.json +41 -0
  106. package/rules/autoconsent/shopware.json +71 -0
  107. package/rules/autoconsent/simpleview-cookie-banner.json +27 -0
  108. package/rules/autoconsent/solvhealth-com.json +12 -0
  109. package/rules/autoconsent/spermidinelife-us.json +29 -0
  110. package/rules/autoconsent/squarespace-cookie-banner.json +1 -1
  111. package/rules/autoconsent/squarespace-cookie-notice.json +29 -0
  112. package/rules/autoconsent/store2000-fr.json +17 -0
  113. package/rules/autoconsent/tempest-cookie-notice.json +9 -0
  114. package/rules/autoconsent/termsfeed.json +4 -4
  115. package/rules/autoconsent/texas-instruments.json +17 -0
  116. package/rules/autoconsent/thegrandyork.json +46 -0
  117. package/rules/autoconsent/thenounproject.json +61 -0
  118. package/rules/autoconsent/therealest.json +42 -0
  119. package/rules/autoconsent/tineye.json +35 -0
  120. package/rules/autoconsent/tk-aerztefuehrer.de.json +18 -0
  121. package/rules/autoconsent/toyota.json +16 -5
  122. package/rules/autoconsent/tplink.json +57 -9
  123. package/rules/autoconsent/trust360.json +29 -0
  124. package/rules/autoconsent/uft-cookie-notice.json +15 -0
  125. package/rules/autoconsent/up-cookie-consent.json +53 -0
  126. package/rules/autoconsent/uw-madison-cookieconsent.json +10 -0
  127. package/rules/autoconsent/vowels.json +13 -0
  128. package/rules/autoconsent/wbd-legal-terms.json +32 -0
  129. package/rules/autoconsent/web-rewind.com.json +21 -0
  130. package/rules/autoconsent/wildling-com.json +29 -0
  131. package/rules/autoconsent/worldbank.json +30 -0
  132. package/rules/autoconsent/yuntrack.json +50 -0
  133. package/rules/compact-rules.json +1 -1
  134. package/rules/rule-index.json +1 -1
  135. package/rules/rules.json +1 -1
  136. package/scripts/benchmark-button-classification.ts +18 -3
  137. package/scripts/button-text-benchmark.ts +5 -5
  138. package/tests/abcacupuncture1.spec.ts +3 -0
  139. package/tests/aceodds.spec.ts +3 -0
  140. package/tests/allabout-japan.spec.ts +3 -0
  141. package/tests/amazon-hiring.spec.ts +3 -0
  142. package/tests/avada-cookie-consent.spec.ts +9 -0
  143. package/tests/avvio.spec.ts +8 -0
  144. package/tests/axeptio.spec.ts +11 -4
  145. package/tests/bdirect-booking-engine.spec.ts +9 -0
  146. package/tests/berelax.com.spec.ts +5 -0
  147. package/tests/bigcrunch.spec.ts +16 -0
  148. package/tests/bigid.spec.ts +8 -0
  149. package/tests/bluepark.spec.ts +8 -0
  150. package/tests/bricklink.spec.ts +3 -0
  151. package/tests/burpee-com.spec.ts +2 -0
  152. package/tests/bynder.spec.ts +3 -0
  153. package/tests/ceneo.spec.ts +3 -0
  154. package/tests/cinemaplus.spec.ts +8 -0
  155. package/tests/columbia-privacy-notice.spec.ts +8 -0
  156. package/tests/complianz-notice.spec.ts +7 -3
  157. package/tests/conjointly.spec.ts +3 -0
  158. package/tests/cookieconsent2-legacy.spec.ts +8 -0
  159. package/tests/cookiesjsr.spec.ts +9 -0
  160. package/tests/copaamerica.spec.ts +3 -0
  161. package/tests/cornerstone-brands.spec.ts +8 -0
  162. package/tests/darkounity.com.spec.ts +6 -0
  163. package/tests/dhbbank.spec.ts +6 -0
  164. package/tests/duda-cookie-notification.spec.ts +8 -0
  165. package/tests/ee-consent-notice.spec.ts +9 -0
  166. package/tests/endocrine.org.spec.ts +3 -0
  167. package/tests/ezoic.spec.ts +1 -1
  168. package/tests/fera-cookies.spec.ts +6 -0
  169. package/tests/fis-data-exchange.spec.ts +9 -0
  170. package/tests/getproven.spec.ts +5 -0
  171. package/tests/givedirectly.spec.ts +3 -0
  172. package/tests/godaddy-website-builder-cosmetic.spec.ts +7 -0
  173. package/tests/godaddy-website-builder.spec.ts +8 -0
  174. package/tests/guesty.spec.ts +7 -0
  175. package/tests/gundam-base-entry.spec.ts +3 -0
  176. package/tests/hearst-us.spec.ts +1 -0
  177. package/tests/indy-systems.spec.ts +8 -0
  178. package/tests/ing-nl.spec.ts +6 -0
  179. package/tests/iubenda.spec.ts +5 -0
  180. package/tests/la7-cmp.spec.ts +6 -0
  181. package/tests/laravel-cookie-consent.spec.ts +10 -0
  182. package/tests/legislation-gov-uk.spec.ts +3 -0
  183. package/tests/lucrin.spec.ts +3 -0
  184. package/tests/mackeeper.spec.ts +3 -0
  185. package/tests/makitatools.spec.ts +5 -0
  186. package/tests/milestone-internet.spec.ts +8 -0
  187. package/tests/ndl-go-jp.spec.ts +8 -0
  188. package/tests/nhm-ac-uk.spec.ts +3 -0
  189. package/tests/npo-ccm.spec.ts +17 -0
  190. package/tests/opalcollection-com.spec.ts +3 -0
  191. package/tests/orw-cookie-banner.spec.ts +5 -0
  192. package/tests/osf-io.spec.ts +3 -0
  193. package/tests/palace-company.spec.ts +8 -0
  194. package/tests/paypal-us.spec.ts +2 -3
  195. package/tests/paytronix.spec.ts +7 -0
  196. package/tests/pitt-edu.spec.ts +3 -0
  197. package/tests/pizzapilgrims.co.uk.spec.ts +3 -0
  198. package/tests/podimo.spec.ts +3 -0
  199. package/tests/publicmobile.spec.ts +3 -0
  200. package/tests/rakshaos.spec.ts +9 -0
  201. package/tests/rutjes.spec.ts +3 -0
  202. package/tests/saturdaysnyc.spec.ts +3 -0
  203. package/tests/serpstat-com.spec.ts +3 -0
  204. package/tests/shopquarters.spec.ts +5 -0
  205. package/tests/shopware.spec.ts +8 -0
  206. package/tests/simpleview-cookie-banner.spec.ts +10 -0
  207. package/tests/solvhealth-com.spec.ts +10 -0
  208. package/tests/spermidinelife-us.spec.ts +3 -0
  209. package/tests/squarespace-cookie-notice.spec.ts +9 -0
  210. package/tests/store2000-fr.spec.ts +5 -0
  211. package/tests/tempest-cookie-notice.spec.ts +7 -0
  212. package/tests/termsfeed.spec.ts +4 -0
  213. package/tests/texas-instruments.spec.ts +3 -0
  214. package/tests/thegrandyork.spec.ts +3 -0
  215. package/tests/thenounproject.spec.ts +3 -0
  216. package/tests/therealest.spec.ts +6 -0
  217. package/tests/tineye.spec.ts +3 -0
  218. package/tests/tk-aerztefuehrer.de.spec.ts +6 -0
  219. package/tests/tplink.spec.ts +11 -1
  220. package/tests/trust360.spec.ts +8 -0
  221. package/tests/uft-cookie-notice.spec.ts +3 -0
  222. package/tests/up-cookie-consent.spec.ts +9 -0
  223. package/tests/uw-madison-cookieconsent.spec.ts +7 -0
  224. package/tests/vowels.spec.ts +3 -0
  225. package/tests/wbd-legal-terms.spec.ts +18 -0
  226. package/tests/web-rewind.com.spec.ts +5 -0
  227. package/tests/wildling-com.spec.ts +3 -0
  228. package/tests/worldbank.spec.ts +7 -0
  229. package/tests/yuntrack.spec.ts +6 -0
  230. package/tests-wtr/heuristics/button-classification-accuracy.test.ts +9 -5
  231. package/tests-wtr/heuristics/get-potential-popups.test.ts +28 -0
  232. package/tests-wtr/heuristics/heuristics-utils.test.ts +57 -6
  233. package/tsconfig.build.json +1 -1
  234. package/tsconfig.heuristics.json +10 -0
  235. package/rules/autoconsent/paypal-cookieprefs.json +0 -29
  236. package/tests/paypal-cookieprefs.spec.ts +0 -7
@@ -336,6 +336,8 @@
336
336
  EVAL_COOKIEFIRST_1: () => document.querySelectorAll("button[data-cookiefirst-accent-color=true][role=checkbox]:not([disabled])").forEach((i) => i.getAttribute("aria-checked") === "true" && i.click()) || true,
337
337
  EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
338
338
  EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
339
+ // turn the single-button form into a decline submission, same fields as the CMP's own decline form
340
+ EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
339
341
  EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
340
342
  toggle.checked = false;
341
343
  }) || true,
@@ -422,7 +424,8 @@
422
424
  EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
423
425
  EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
424
426
  EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
425
- EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
427
+ EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
428
+ EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
426
429
  };
427
430
  function getFunctionBody(snippetFunc) {
428
431
  const snippetStr = snippetFunc.toString();
@@ -438,7 +441,8 @@
438
441
  // "only necessary" is probably too broad
439
442
  /(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
440
443
  /(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
441
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
444
+ // a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
445
+ /we (?:use|serve)(?: \w+)? cookies/gi,
442
446
  /we are using cookies/gi,
443
447
  /use of cookies/gi,
444
448
  /website uses cookies to enhance your browsing experience/gi,
@@ -582,7 +586,10 @@
582
586
  // "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
583
587
  /(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
584
588
  // Italian (IT)
585
- /usiamo.{0,20}cookie/gi
589
+ /usiamo.{0,20}cookie/gi,
590
+ // Japanese (JA)
591
+ // e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
592
+ /(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
586
593
  ];
587
594
  var REJECT_PATTERNS_ENGLISH = [
588
595
  // e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
@@ -598,8 +605,9 @@
598
605
  /^\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,
599
606
  /^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
600
607
  /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
601
- // e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
602
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
608
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
609
+ // "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
610
+ /do\s+not\s+sell(?!\s*(page|cookie settings))|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
603
611
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
604
612
  /^opt[ -]?out of /is,
605
613
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -610,7 +618,6 @@
610
618
  /^no,? thank(s| you)$/is,
611
619
  /^opt[ -]out$/is,
612
620
  "dont enable",
613
- "withdraw consent",
614
621
  "i do not agree"
615
622
  ];
616
623
  var REJECT_PATTERNS_DUTCH = [
@@ -637,9 +644,10 @@
637
644
  var REJECT_PATTERNS_FRENCH = [
638
645
  // refuser / rejeter / interdire / décliner (reject verbs, any position)
639
646
  // "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
640
- /(^|\s)(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
647
+ // skip English prose such as "cookies that you can refuse"
648
+ /^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
641
649
  // only necessary / essential / technical / functional
642
- /(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
650
+ /^(?=.*(cookie|nécessaire|essentiel|techni|requis|obligatoire|fonctionnel|indispensable|sdk)).*(uniquement|seulement|indispensable|strictement nécessaire|que les cookies\s+(nécessaires|techniques|essentiels|indispensables|fonctionnels))/is,
643
651
  // continue/proceed without accepting; refuse everything; disable purposes
644
652
  /(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
645
653
  // "non" / "non, merci"
@@ -697,7 +705,7 @@
697
705
  // "solo/sólo/no, sólo ... necessary/essential"
698
706
  /^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
699
707
  // refusals / opt-outs
700
- /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|revocar consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
708
+ /^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
701
709
  "acceptar nom\xE9s les necess\xE0ries",
702
710
  "nom\xE9s sutilitzen cookies quan \xE9s necessari",
703
711
  "pulsa aqu\xED para desactivar las cookies opcionales"
@@ -746,6 +754,12 @@
746
754
  ];
747
755
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
748
756
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
757
+ var REJECT_PATTERNS_JAPANESE = [
758
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
759
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
760
+ "\u540C\u610F\u3057\u306A\u3044",
761
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
762
+ ];
749
763
  var REJECT_PATTERNS = [
750
764
  ...REJECT_PATTERNS_ENGLISH,
751
765
  ...REJECT_PATTERNS_DUTCH,
@@ -763,9 +777,13 @@
763
777
  ...REJECT_PATTERNS_POLISH,
764
778
  ...REJECT_PATTERNS_RUSSIAN,
765
779
  ...REJECT_PATTERNS_TURKISH,
766
- ...REJECT_PATTERNS_INDONESIAN
780
+ ...REJECT_PATTERNS_INDONESIAN,
781
+ ...REJECT_PATTERNS_JAPANESE
767
782
  ];
768
783
  var BUTTON_NEVER_MATCH_PATTERNS = [
784
+ // text of several concatenated buttons, or popup body text rather than a button
785
+ /accept all.*reject all|reject all.*accept all/is,
786
+ /^.{300,}$/s,
769
787
  /pay|subscribe/is,
770
788
  /abonneer/is,
771
789
  /abonnier/is,
@@ -806,8 +824,10 @@
806
824
  // Multilingual "open customization" patterns: a customization verb next to a
807
825
  // cookie/preference/settings/options/details/purposes noun (both word orders).
808
826
  // The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
809
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
810
- /^(?!.*\b(policy|policies|notice|statement|impressum|richtlinie|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b.{0,15}(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
827
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b.{0,20}(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b/is,
828
+ /^(?!.*\b(policy|policies|notice|statement|impressum|\w*richtlinie\w*|\w*erklärung|page|beschrijving|privacy$|beleid|politique|política|polityk|speichern|guardar|opslaan|zapisz|enregistrer|sauvegarder|bevestig|bestätig|confirm|save|submit|akzeptier|accept|zaakcept)\b)(cookies?|preferences?|settings?|options?|choices?|controls?|details?|purposes?|services?|consent|einstellung\w*|optionen|präferenzen|einzelheiten|zwecke|dienste|datenschutz\w*|auswahl|voorkeur\w*|instelling\w*|opties|diensten|préférences|paramètres|réglages|choix|détails|finalités|témoins|preferencia\w*|opciones|ajustes|configuraci\w*|detalles|servicios|elección|preferencj\w*|ustawie\w*|opcje|szczegół\w*|cele|galetes)\b(.{0,14}\W)?(customi[sz]e|manage|adjust|configure|personali[sz]e|let me choose|edit|change|set|select|view|see|review|update|open|show|choose|anpassen|verwalten|konfigurieren|bearbeiten|öffnen|anzeigen|einblenden|einstellen|festlegen|auswählen|wählen|aanpassen|beheren|instellen|wijzig\w*|personaliseren|personaliseer|kies|bekijk|toon|personnaliser|paramétrer|gérer|configurer|choisir|afficher|définir|modifier|configurar|personalizar|gestionar|administrar|ajustar|seleccionar|modificar|establecer|dostosuj|zarządzaj|personalizuj|ustaw\w*|zmień|pokaż|wybierz)\b/is,
829
+ // settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
830
+ /^(paramètres|préférences|réglages|ajustes|opciones|elección|preferencias|instellingen)( (de|des|les|voor|van))? cookies( (et des|en|y) (services|diensten|servicios))?$/is,
811
831
  "settings",
812
832
  "preferences",
813
833
  /customi(s|z)e/is,
@@ -821,8 +841,8 @@
821
841
  "cookieconsent preferences",
822
842
  /privacy choices/is,
823
843
  /^(privacy|cookie|custom) settings$/is,
824
- /^cookies? (settings|preferences|setting)$/is,
825
- /(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
844
+ /^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
845
+ /^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
826
846
  "cookie consent options",
827
847
  "privacy controls",
828
848
  // German
@@ -993,7 +1013,7 @@
993
1013
  "yes",
994
1014
  /accept all above/is,
995
1015
  "close and accept",
996
- /accept all$/is,
1016
+ /(^|\s)accept all$/is,
997
1017
  "im ok with that",
998
1018
  // Spanish (ES)
999
1019
  /^acept(ar|o)( cookies)?$/,
@@ -1019,6 +1039,8 @@
1019
1039
  "accepta",
1020
1040
  "accepta totes les cookies",
1021
1041
  "accepta-ho tot",
1042
+ // FR/CA "d'accord" / "d'acord"
1043
+ /^dac?cord( fermer)?$/is,
1022
1044
  "accepta-les totes",
1023
1045
  "acceptar galetes",
1024
1046
  "acceptar i tancar",
@@ -1060,7 +1082,6 @@
1060
1082
  "akceptuj\u0119!",
1061
1083
  "ok, zgadzam si\u0119",
1062
1084
  "potwierdzam wszystkie",
1063
- "przejd\u017A do serwisu",
1064
1085
  "tak",
1065
1086
  "tak, zgadzam si\u0119 na wszystkie pliki cookie",
1066
1087
  "tak, zgadzam si\u0119",
@@ -1131,8 +1152,6 @@
1131
1152
  "seguir",
1132
1153
  "vale",
1133
1154
  "\xA1vamos!",
1134
- // Catalan (CA)
1135
- "dacord",
1136
1155
  // Polish (PL)
1137
1156
  "kontynuuj",
1138
1157
  "ok, zrozumia\u0142em",
@@ -1156,10 +1175,8 @@
1156
1175
  "\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
1157
1176
  ];
1158
1177
 
1159
- // lib/heuristics.ts
1160
- var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1178
+ // lib/heuristic-classify.ts
1161
1179
  var TEXT_LIMIT = 1e5;
1162
- var POPUP_SEARCH_MAX_TIME = 100;
1163
1180
  function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
1164
1181
  allText = allText.slice(0, TEXT_LIMIT);
1165
1182
  const patterns = [];
@@ -1177,31 +1194,6 @@
1177
1194
  }
1178
1195
  return { patterns, snippets: snippets2 };
1179
1196
  }
1180
- function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1181
- const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1182
- if (acceptedLevels.length === 0) {
1183
- return [];
1184
- }
1185
- const popups = getPotentialPopups(timeout);
1186
- const result = popups.reduce((acc, popup) => {
1187
- const popupText = popup.text?.trim();
1188
- if (popupText) {
1189
- if (isExcludedPopup(popupText)) {
1190
- return acc;
1191
- }
1192
- const { patterns } = checkHeuristicPatterns(popupText);
1193
- if (patterns.length > 0) {
1194
- classifyButtons(popup.buttons);
1195
- popup.regexClassification = classifyPopup(popup.buttons);
1196
- acc.push({
1197
- ...popup
1198
- });
1199
- }
1200
- }
1201
- return acc;
1202
- }, []);
1203
- return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1204
- }
1205
1197
  function classifyButtons(buttons) {
1206
1198
  for (const button of buttons) {
1207
1199
  button.regexClassification = classifyButtonTextRegex(button.text);
@@ -1272,6 +1264,35 @@
1272
1264
  }
1273
1265
  return "other";
1274
1266
  }
1267
+
1268
+ // lib/heuristics.ts
1269
+ var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
1270
+ var POPUP_SEARCH_MAX_TIME = 100;
1271
+ function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
1272
+ const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
1273
+ if (acceptedLevels.length === 0) {
1274
+ return [];
1275
+ }
1276
+ const popups = getPotentialPopups(timeout);
1277
+ const result = popups.reduce((acc, popup) => {
1278
+ const popupText = popup.text?.trim();
1279
+ if (popupText) {
1280
+ if (isExcludedPopup(popupText)) {
1281
+ return acc;
1282
+ }
1283
+ const { patterns } = checkHeuristicPatterns(popupText);
1284
+ if (patterns.length > 0) {
1285
+ classifyButtons(popup.buttons);
1286
+ popup.regexClassification = classifyPopup(popup.buttons);
1287
+ acc.push({
1288
+ ...popup
1289
+ });
1290
+ }
1291
+ }
1292
+ return acc;
1293
+ }, []);
1294
+ return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
1295
+ }
1275
1296
  function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
1276
1297
  const isFramed = !isTopFrame();
1277
1298
  if (isFramed && window.parent && window.parent !== window.top) {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Autoconsent",
4
- "version": "2026.10.8",
4
+ "version": "2026.10.10",
5
5
  "background": {
6
6
  "scripts": [
7
7
  "background.bundle.js"