@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.
- package/.agents/skills/optimize-button-patterns/SKILL.md +4 -4
- package/.github/workflows/release-labels.yml +2 -6
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +130 -0
- package/build.sh +2 -0
- package/data/labelled-button-texts.csv +36 -36
- package/dist/addon-firefox/background.bundle.js +4 -1
- package/dist/addon-firefox/compact-rules.json +1 -1
- package/dist/addon-firefox/content.bundle.js +67 -46
- package/dist/addon-firefox/manifest.json +1 -1
- package/dist/addon-firefox/rule-index.json +1 -1
- package/dist/addon-firefox/rules.json +1 -1
- package/dist/addon-mv3/background.bundle.js +4 -1
- package/dist/addon-mv3/compact-rules.json +1 -1
- package/dist/addon-mv3/content.bundle.js +67 -46
- package/dist/addon-mv3/manifest.json +1 -1
- package/dist/addon-mv3/rule-index.json +1 -1
- package/dist/addon-mv3/rules.json +1 -1
- package/dist/autoconsent.cjs.js +67 -46
- package/dist/autoconsent.esm.js +67 -46
- package/dist/autoconsent.playwright.js +68 -46
- package/dist/autoconsent.standalone.js +68 -47
- package/dist/heuristics.cjs.js +886 -0
- package/dist/heuristics.mjs +847 -0
- package/dist/types/eval-snippets.d.ts +2 -0
- package/dist/types/heuristic-classify.d.ts +16 -0
- package/dist/types/heuristics.d.ts +2 -9
- package/dist/types/types.d.ts +3 -5
- package/lib/eval-snippets.ts +4 -0
- package/lib/heuristic-classify.ts +136 -0
- package/lib/heuristic-patterns.ts +33 -16
- package/lib/heuristics.ts +3 -124
- package/lib/types.ts +3 -5
- package/lib/web.ts +1 -1
- package/package.json +7 -2
- package/playwright/content.ts +5 -0
- package/readme.md +12 -0
- package/rules/autoconsent/abcacupuncture1.json +34 -0
- package/rules/autoconsent/aceodds.json +13 -0
- package/rules/autoconsent/allabout-japan.json +42 -0
- package/rules/autoconsent/amazon-hiring.json +16 -0
- package/rules/autoconsent/avada-cookie-consent.json +43 -0
- package/rules/autoconsent/avvio.json +22 -0
- package/rules/autoconsent/axeptio.json +22 -6
- package/rules/autoconsent/bdirect-booking-engine.json +33 -0
- package/rules/autoconsent/berelax.com.json +33 -0
- package/rules/autoconsent/bigcrunch.json +39 -0
- package/rules/autoconsent/bigid.json +59 -0
- package/rules/autoconsent/bluepark.json +31 -0
- package/rules/autoconsent/bricklink.json +33 -0
- package/rules/autoconsent/burpee-com.json +5 -1
- package/rules/autoconsent/bynder.json +33 -0
- package/rules/autoconsent/ceneo.json +9 -0
- package/rules/autoconsent/cinemaplus.json +9 -0
- package/rules/autoconsent/columbia-privacy-notice.json +32 -0
- package/rules/autoconsent/complianz-notice.json +1 -1
- package/rules/autoconsent/conjointly.json +43 -0
- package/rules/autoconsent/cookieconsent2-legacy.json +44 -0
- package/rules/autoconsent/cookiesjsr.json +27 -0
- package/rules/autoconsent/copaamerica.json +29 -0
- package/rules/autoconsent/cornerstone-brands.json +51 -0
- package/rules/autoconsent/darkounity.com.json +35 -0
- package/rules/autoconsent/dhbbank.json +13 -0
- package/rules/autoconsent/duda-cookie-notification.json +41 -0
- package/rules/autoconsent/ee-consent-notice.json +40 -0
- package/rules/autoconsent/endocrine.org.json +35 -0
- package/rules/autoconsent/ezoic.json +2 -2
- package/rules/autoconsent/fera-cookies.json +67 -0
- package/rules/autoconsent/fis-data-exchange.json +13 -0
- package/rules/autoconsent/getproven.json +33 -0
- package/rules/autoconsent/givedirectly.json +36 -0
- package/rules/autoconsent/godaddy-website-builder-cosmetic.json +13 -0
- package/rules/autoconsent/godaddy-website-builder.json +9 -0
- package/rules/autoconsent/guesty.json +31 -0
- package/rules/autoconsent/gundam-base-entry.json +40 -0
- package/rules/autoconsent/hearst-us.json +1 -1
- package/rules/autoconsent/indy-systems.json +26 -0
- package/rules/autoconsent/ing-nl.json +54 -0
- package/rules/autoconsent/iubenda.json +25 -3
- package/rules/autoconsent/la7-cmp.json +30 -0
- package/rules/autoconsent/laravel-cookie-consent.json +45 -0
- package/rules/autoconsent/legislation-gov-uk.json +43 -0
- package/rules/autoconsent/lucrin.json +18 -0
- package/rules/autoconsent/mackeeper.json +34 -0
- package/rules/autoconsent/makitatools.json +41 -0
- package/rules/autoconsent/milestone-internet.json +32 -0
- package/rules/autoconsent/ndl-go-jp.json +35 -0
- package/rules/autoconsent/nhm-ac-uk.json +29 -0
- package/rules/autoconsent/npo-ccm.json +42 -0
- package/rules/autoconsent/opalcollection-com.json +12 -0
- package/rules/autoconsent/orw-cookie-banner.json +42 -0
- package/rules/autoconsent/osf-io.json +29 -0
- package/rules/autoconsent/palace-company.json +13 -0
- package/rules/autoconsent/paypal-us.json +3 -3
- package/rules/autoconsent/paypal.json +5 -2
- package/rules/autoconsent/paytronix.json +30 -0
- package/rules/autoconsent/pitt-edu.json +12 -0
- package/rules/autoconsent/pizzapilgrims.co.uk.json +49 -0
- package/rules/autoconsent/podimo.json +73 -0
- package/rules/autoconsent/publicmobile.json +16 -0
- package/rules/autoconsent/rakshaos.json +45 -0
- package/rules/autoconsent/rutjes.json +13 -0
- package/rules/autoconsent/saturdaysnyc.json +33 -0
- package/rules/autoconsent/serpstat-com.json +13 -0
- package/rules/autoconsent/shopquarters.json +41 -0
- package/rules/autoconsent/shopware.json +71 -0
- package/rules/autoconsent/simpleview-cookie-banner.json +27 -0
- package/rules/autoconsent/solvhealth-com.json +12 -0
- package/rules/autoconsent/spermidinelife-us.json +29 -0
- package/rules/autoconsent/squarespace-cookie-banner.json +1 -1
- package/rules/autoconsent/squarespace-cookie-notice.json +29 -0
- package/rules/autoconsent/store2000-fr.json +17 -0
- package/rules/autoconsent/tempest-cookie-notice.json +9 -0
- package/rules/autoconsent/termsfeed.json +4 -4
- package/rules/autoconsent/texas-instruments.json +17 -0
- package/rules/autoconsent/thegrandyork.json +46 -0
- package/rules/autoconsent/thenounproject.json +61 -0
- package/rules/autoconsent/therealest.json +42 -0
- package/rules/autoconsent/tineye.json +35 -0
- package/rules/autoconsent/tk-aerztefuehrer.de.json +18 -0
- package/rules/autoconsent/toyota.json +16 -5
- package/rules/autoconsent/tplink.json +57 -9
- package/rules/autoconsent/trust360.json +29 -0
- package/rules/autoconsent/uft-cookie-notice.json +15 -0
- package/rules/autoconsent/up-cookie-consent.json +53 -0
- package/rules/autoconsent/uw-madison-cookieconsent.json +10 -0
- package/rules/autoconsent/vowels.json +13 -0
- package/rules/autoconsent/wbd-legal-terms.json +32 -0
- package/rules/autoconsent/web-rewind.com.json +21 -0
- package/rules/autoconsent/wildling-com.json +29 -0
- package/rules/autoconsent/worldbank.json +30 -0
- package/rules/autoconsent/yuntrack.json +50 -0
- package/rules/compact-rules.json +1 -1
- package/rules/rule-index.json +1 -1
- package/rules/rules.json +1 -1
- package/scripts/benchmark-button-classification.ts +18 -3
- package/scripts/button-text-benchmark.ts +5 -5
- package/tests/abcacupuncture1.spec.ts +3 -0
- package/tests/aceodds.spec.ts +3 -0
- package/tests/allabout-japan.spec.ts +3 -0
- package/tests/amazon-hiring.spec.ts +3 -0
- package/tests/avada-cookie-consent.spec.ts +9 -0
- package/tests/avvio.spec.ts +8 -0
- package/tests/axeptio.spec.ts +11 -4
- package/tests/bdirect-booking-engine.spec.ts +9 -0
- package/tests/berelax.com.spec.ts +5 -0
- package/tests/bigcrunch.spec.ts +16 -0
- package/tests/bigid.spec.ts +8 -0
- package/tests/bluepark.spec.ts +8 -0
- package/tests/bricklink.spec.ts +3 -0
- package/tests/burpee-com.spec.ts +2 -0
- package/tests/bynder.spec.ts +3 -0
- package/tests/ceneo.spec.ts +3 -0
- package/tests/cinemaplus.spec.ts +8 -0
- package/tests/columbia-privacy-notice.spec.ts +8 -0
- package/tests/complianz-notice.spec.ts +7 -3
- package/tests/conjointly.spec.ts +3 -0
- package/tests/cookieconsent2-legacy.spec.ts +8 -0
- package/tests/cookiesjsr.spec.ts +9 -0
- package/tests/copaamerica.spec.ts +3 -0
- package/tests/cornerstone-brands.spec.ts +8 -0
- package/tests/darkounity.com.spec.ts +6 -0
- package/tests/dhbbank.spec.ts +6 -0
- package/tests/duda-cookie-notification.spec.ts +8 -0
- package/tests/ee-consent-notice.spec.ts +9 -0
- package/tests/endocrine.org.spec.ts +3 -0
- package/tests/ezoic.spec.ts +1 -1
- package/tests/fera-cookies.spec.ts +6 -0
- package/tests/fis-data-exchange.spec.ts +9 -0
- package/tests/getproven.spec.ts +5 -0
- package/tests/givedirectly.spec.ts +3 -0
- package/tests/godaddy-website-builder-cosmetic.spec.ts +7 -0
- package/tests/godaddy-website-builder.spec.ts +8 -0
- package/tests/guesty.spec.ts +7 -0
- package/tests/gundam-base-entry.spec.ts +3 -0
- package/tests/hearst-us.spec.ts +1 -0
- package/tests/indy-systems.spec.ts +8 -0
- package/tests/ing-nl.spec.ts +6 -0
- package/tests/iubenda.spec.ts +5 -0
- package/tests/la7-cmp.spec.ts +6 -0
- package/tests/laravel-cookie-consent.spec.ts +10 -0
- package/tests/legislation-gov-uk.spec.ts +3 -0
- package/tests/lucrin.spec.ts +3 -0
- package/tests/mackeeper.spec.ts +3 -0
- package/tests/makitatools.spec.ts +5 -0
- package/tests/milestone-internet.spec.ts +8 -0
- package/tests/ndl-go-jp.spec.ts +8 -0
- package/tests/nhm-ac-uk.spec.ts +3 -0
- package/tests/npo-ccm.spec.ts +17 -0
- package/tests/opalcollection-com.spec.ts +3 -0
- package/tests/orw-cookie-banner.spec.ts +5 -0
- package/tests/osf-io.spec.ts +3 -0
- package/tests/palace-company.spec.ts +8 -0
- package/tests/paypal-us.spec.ts +2 -3
- package/tests/paytronix.spec.ts +7 -0
- package/tests/pitt-edu.spec.ts +3 -0
- package/tests/pizzapilgrims.co.uk.spec.ts +3 -0
- package/tests/podimo.spec.ts +3 -0
- package/tests/publicmobile.spec.ts +3 -0
- package/tests/rakshaos.spec.ts +9 -0
- package/tests/rutjes.spec.ts +3 -0
- package/tests/saturdaysnyc.spec.ts +3 -0
- package/tests/serpstat-com.spec.ts +3 -0
- package/tests/shopquarters.spec.ts +5 -0
- package/tests/shopware.spec.ts +8 -0
- package/tests/simpleview-cookie-banner.spec.ts +10 -0
- package/tests/solvhealth-com.spec.ts +10 -0
- package/tests/spermidinelife-us.spec.ts +3 -0
- package/tests/squarespace-cookie-notice.spec.ts +9 -0
- package/tests/store2000-fr.spec.ts +5 -0
- package/tests/tempest-cookie-notice.spec.ts +7 -0
- package/tests/termsfeed.spec.ts +4 -0
- package/tests/texas-instruments.spec.ts +3 -0
- package/tests/thegrandyork.spec.ts +3 -0
- package/tests/thenounproject.spec.ts +3 -0
- package/tests/therealest.spec.ts +6 -0
- package/tests/tineye.spec.ts +3 -0
- package/tests/tk-aerztefuehrer.de.spec.ts +6 -0
- package/tests/tplink.spec.ts +11 -1
- package/tests/trust360.spec.ts +8 -0
- package/tests/uft-cookie-notice.spec.ts +3 -0
- package/tests/up-cookie-consent.spec.ts +9 -0
- package/tests/uw-madison-cookieconsent.spec.ts +7 -0
- package/tests/vowels.spec.ts +3 -0
- package/tests/wbd-legal-terms.spec.ts +18 -0
- package/tests/web-rewind.com.spec.ts +5 -0
- package/tests/wildling-com.spec.ts +3 -0
- package/tests/worldbank.spec.ts +7 -0
- package/tests/yuntrack.spec.ts +6 -0
- package/tests-wtr/heuristics/button-classification-accuracy.test.ts +9 -5
- package/tests-wtr/heuristics/get-potential-popups.test.ts +28 -0
- package/tests-wtr/heuristics/heuristics-utils.test.ts +57 -6
- package/tsconfig.build.json +1 -1
- package/tsconfig.heuristics.json +10 -0
- package/rules/autoconsent/paypal-cookieprefs.json +0 -29
- package/tests/paypal-cookieprefs.spec.ts +0 -7
package/dist/autoconsent.cjs.js
CHANGED
|
@@ -372,6 +372,8 @@ var snippets = {
|
|
|
372
372
|
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,
|
|
373
373
|
EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
|
|
374
374
|
EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
|
|
375
|
+
// turn the single-button form into a decline submission, same fields as the CMP's own decline form
|
|
376
|
+
EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
|
|
375
377
|
EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
|
|
376
378
|
toggle.checked = false;
|
|
377
379
|
}) || true,
|
|
@@ -458,7 +460,8 @@ var snippets = {
|
|
|
458
460
|
EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
|
|
459
461
|
EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
|
|
460
462
|
EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
|
|
461
|
-
EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
|
|
463
|
+
EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
|
|
464
|
+
EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
|
|
462
465
|
};
|
|
463
466
|
function getFunctionBody(snippetFunc) {
|
|
464
467
|
const snippetStr = snippetFunc.toString();
|
|
@@ -474,7 +477,8 @@ var DETECT_PATTERNS = [
|
|
|
474
477
|
// "only necessary" is probably too broad
|
|
475
478
|
/(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
|
|
476
479
|
/(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
|
|
477
|
-
|
|
480
|
+
// a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
|
|
481
|
+
/we (?:use|serve)(?: \w+)? cookies/gi,
|
|
478
482
|
/we are using cookies/gi,
|
|
479
483
|
/use of cookies/gi,
|
|
480
484
|
/website uses cookies to enhance your browsing experience/gi,
|
|
@@ -618,7 +622,10 @@ var DETECT_PATTERNS = [
|
|
|
618
622
|
// "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
|
|
619
623
|
/(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
|
|
620
624
|
// Italian (IT)
|
|
621
|
-
/usiamo.{0,20}cookie/gi
|
|
625
|
+
/usiamo.{0,20}cookie/gi,
|
|
626
|
+
// Japanese (JA)
|
|
627
|
+
// e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
|
|
628
|
+
/(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
|
|
622
629
|
];
|
|
623
630
|
var REJECT_PATTERNS_ENGLISH = [
|
|
624
631
|
// e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
|
|
@@ -634,8 +641,9 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
634
641
|
/^\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,
|
|
635
642
|
/^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
|
|
636
643
|
/^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
|
|
637
|
-
// e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
|
|
638
|
-
|
|
644
|
+
// e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
|
|
645
|
+
// "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
|
|
646
|
+
/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,
|
|
639
647
|
// e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
|
|
640
648
|
/^opt[ -]?out of /is,
|
|
641
649
|
// e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
|
|
@@ -646,7 +654,6 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
646
654
|
/^no,? thank(s| you)$/is,
|
|
647
655
|
/^opt[ -]out$/is,
|
|
648
656
|
"dont enable",
|
|
649
|
-
"withdraw consent",
|
|
650
657
|
"i do not agree"
|
|
651
658
|
];
|
|
652
659
|
var REJECT_PATTERNS_DUTCH = [
|
|
@@ -673,9 +680,10 @@ var REJECT_PATTERNS_DUTCH = [
|
|
|
673
680
|
var REJECT_PATTERNS_FRENCH = [
|
|
674
681
|
// refuser / rejeter / interdire / décliner (reject verbs, any position)
|
|
675
682
|
// "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
|
|
676
|
-
|
|
683
|
+
// skip English prose such as "cookies that you can refuse"
|
|
684
|
+
/^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
|
|
677
685
|
// only necessary / essential / technical / functional
|
|
678
|
-
|
|
686
|
+
/^(?=.*(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,
|
|
679
687
|
// continue/proceed without accepting; refuse everything; disable purposes
|
|
680
688
|
/(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
|
|
681
689
|
// "non" / "non, merci"
|
|
@@ -733,7 +741,7 @@ var REJECT_PATTERNS_SPANISH = [
|
|
|
733
741
|
// "solo/sólo/no, sólo ... necessary/essential"
|
|
734
742
|
/^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
|
|
735
743
|
// refusals / opt-outs
|
|
736
|
-
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|
|
|
744
|
+
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
|
|
737
745
|
"acceptar nom\xE9s les necess\xE0ries",
|
|
738
746
|
"nom\xE9s sutilitzen cookies quan \xE9s necessari",
|
|
739
747
|
"pulsa aqu\xED para desactivar las cookies opcionales"
|
|
@@ -782,6 +790,12 @@ var REJECT_PATTERNS_RUSSIAN = [
|
|
|
782
790
|
];
|
|
783
791
|
var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
|
|
784
792
|
var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
|
|
793
|
+
var REJECT_PATTERNS_JAPANESE = [
|
|
794
|
+
// e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
|
|
795
|
+
/^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
|
|
796
|
+
"\u540C\u610F\u3057\u306A\u3044",
|
|
797
|
+
"\u540C\u610F\u3057\u307E\u305B\u3093"
|
|
798
|
+
];
|
|
785
799
|
var REJECT_PATTERNS = [
|
|
786
800
|
...REJECT_PATTERNS_ENGLISH,
|
|
787
801
|
...REJECT_PATTERNS_DUTCH,
|
|
@@ -799,9 +813,13 @@ var REJECT_PATTERNS = [
|
|
|
799
813
|
...REJECT_PATTERNS_POLISH,
|
|
800
814
|
...REJECT_PATTERNS_RUSSIAN,
|
|
801
815
|
...REJECT_PATTERNS_TURKISH,
|
|
802
|
-
...REJECT_PATTERNS_INDONESIAN
|
|
816
|
+
...REJECT_PATTERNS_INDONESIAN,
|
|
817
|
+
...REJECT_PATTERNS_JAPANESE
|
|
803
818
|
];
|
|
804
819
|
var BUTTON_NEVER_MATCH_PATTERNS = [
|
|
820
|
+
// text of several concatenated buttons, or popup body text rather than a button
|
|
821
|
+
/accept all.*reject all|reject all.*accept all/is,
|
|
822
|
+
/^.{300,}$/s,
|
|
805
823
|
/pay|subscribe/is,
|
|
806
824
|
/abonneer/is,
|
|
807
825
|
/abonnier/is,
|
|
@@ -842,8 +860,10 @@ var SETTINGS_PATTERNS = [
|
|
|
842
860
|
// Multilingual "open customization" patterns: a customization verb next to a
|
|
843
861
|
// cookie/preference/settings/options/details/purposes noun (both word orders).
|
|
844
862
|
// The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
|
|
845
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
846
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
863
|
+
/^(?!.*\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,
|
|
864
|
+
/^(?!.*\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,
|
|
865
|
+
// settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
|
|
866
|
+
/^(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,
|
|
847
867
|
"settings",
|
|
848
868
|
"preferences",
|
|
849
869
|
/customi(s|z)e/is,
|
|
@@ -857,8 +877,8 @@ var SETTINGS_PATTERNS = [
|
|
|
857
877
|
"cookieconsent preferences",
|
|
858
878
|
/privacy choices/is,
|
|
859
879
|
/^(privacy|cookie|custom) settings$/is,
|
|
860
|
-
/^cookies? (settings|preferences|setting)
|
|
861
|
-
|
|
880
|
+
/^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
|
|
881
|
+
/^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
|
|
862
882
|
"cookie consent options",
|
|
863
883
|
"privacy controls",
|
|
864
884
|
// German
|
|
@@ -1029,7 +1049,7 @@ var ACCEPT_PATTERNS = [
|
|
|
1029
1049
|
"yes",
|
|
1030
1050
|
/accept all above/is,
|
|
1031
1051
|
"close and accept",
|
|
1032
|
-
/accept all$/is,
|
|
1052
|
+
/(^|\s)accept all$/is,
|
|
1033
1053
|
"im ok with that",
|
|
1034
1054
|
// Spanish (ES)
|
|
1035
1055
|
/^acept(ar|o)( cookies)?$/,
|
|
@@ -1055,6 +1075,8 @@ var ACCEPT_PATTERNS = [
|
|
|
1055
1075
|
"accepta",
|
|
1056
1076
|
"accepta totes les cookies",
|
|
1057
1077
|
"accepta-ho tot",
|
|
1078
|
+
// FR/CA "d'accord" / "d'acord"
|
|
1079
|
+
/^dac?cord( fermer)?$/is,
|
|
1058
1080
|
"accepta-les totes",
|
|
1059
1081
|
"acceptar galetes",
|
|
1060
1082
|
"acceptar i tancar",
|
|
@@ -1096,7 +1118,6 @@ var ACCEPT_PATTERNS = [
|
|
|
1096
1118
|
"akceptuj\u0119!",
|
|
1097
1119
|
"ok, zgadzam si\u0119",
|
|
1098
1120
|
"potwierdzam wszystkie",
|
|
1099
|
-
"przejd\u017A do serwisu",
|
|
1100
1121
|
"tak",
|
|
1101
1122
|
"tak, zgadzam si\u0119 na wszystkie pliki cookie",
|
|
1102
1123
|
"tak, zgadzam si\u0119",
|
|
@@ -1167,8 +1188,6 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1167
1188
|
"seguir",
|
|
1168
1189
|
"vale",
|
|
1169
1190
|
"\xA1vamos!",
|
|
1170
|
-
// Catalan (CA)
|
|
1171
|
-
"dacord",
|
|
1172
1191
|
// Polish (PL)
|
|
1173
1192
|
"kontynuuj",
|
|
1174
1193
|
"ok, zrozumia\u0142em",
|
|
@@ -1192,10 +1211,8 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1192
1211
|
"\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
|
|
1193
1212
|
];
|
|
1194
1213
|
|
|
1195
|
-
// lib/
|
|
1196
|
-
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1214
|
+
// lib/heuristic-classify.ts
|
|
1197
1215
|
var TEXT_LIMIT = 1e5;
|
|
1198
|
-
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1199
1216
|
function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
1200
1217
|
allText = allText.slice(0, TEXT_LIMIT);
|
|
1201
1218
|
const patterns = [];
|
|
@@ -1213,31 +1230,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
|
1213
1230
|
}
|
|
1214
1231
|
return { patterns, snippets: snippets2 };
|
|
1215
1232
|
}
|
|
1216
|
-
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1217
|
-
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1218
|
-
if (acceptedLevels.length === 0) {
|
|
1219
|
-
return [];
|
|
1220
|
-
}
|
|
1221
|
-
const popups = getPotentialPopups(timeout);
|
|
1222
|
-
const result = popups.reduce((acc, popup) => {
|
|
1223
|
-
const popupText = popup.text?.trim();
|
|
1224
|
-
if (popupText) {
|
|
1225
|
-
if (isExcludedPopup(popupText)) {
|
|
1226
|
-
return acc;
|
|
1227
|
-
}
|
|
1228
|
-
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1229
|
-
if (patterns.length > 0) {
|
|
1230
|
-
classifyButtons(popup.buttons);
|
|
1231
|
-
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1232
|
-
acc.push({
|
|
1233
|
-
...popup
|
|
1234
|
-
});
|
|
1235
|
-
}
|
|
1236
|
-
}
|
|
1237
|
-
return acc;
|
|
1238
|
-
}, []);
|
|
1239
|
-
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1240
|
-
}
|
|
1241
1233
|
function classifyButtons(buttons) {
|
|
1242
1234
|
for (const button of buttons) {
|
|
1243
1235
|
button.regexClassification = classifyButtonTextRegex(button.text);
|
|
@@ -1308,6 +1300,35 @@ function classifyButtonTextRegex(buttonText) {
|
|
|
1308
1300
|
}
|
|
1309
1301
|
return "other";
|
|
1310
1302
|
}
|
|
1303
|
+
|
|
1304
|
+
// lib/heuristics.ts
|
|
1305
|
+
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1306
|
+
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1307
|
+
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1308
|
+
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1309
|
+
if (acceptedLevels.length === 0) {
|
|
1310
|
+
return [];
|
|
1311
|
+
}
|
|
1312
|
+
const popups = getPotentialPopups(timeout);
|
|
1313
|
+
const result = popups.reduce((acc, popup) => {
|
|
1314
|
+
const popupText = popup.text?.trim();
|
|
1315
|
+
if (popupText) {
|
|
1316
|
+
if (isExcludedPopup(popupText)) {
|
|
1317
|
+
return acc;
|
|
1318
|
+
}
|
|
1319
|
+
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1320
|
+
if (patterns.length > 0) {
|
|
1321
|
+
classifyButtons(popup.buttons);
|
|
1322
|
+
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1323
|
+
acc.push({
|
|
1324
|
+
...popup
|
|
1325
|
+
});
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
return acc;
|
|
1329
|
+
}, []);
|
|
1330
|
+
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1331
|
+
}
|
|
1311
1332
|
function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1312
1333
|
const isFramed = !isTopFrame();
|
|
1313
1334
|
if (isFramed && window.parent && window.parent !== window.top) {
|
package/dist/autoconsent.esm.js
CHANGED
|
@@ -342,6 +342,8 @@ var snippets = {
|
|
|
342
342
|
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,
|
|
343
343
|
EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
|
|
344
344
|
EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
|
|
345
|
+
// turn the single-button form into a decline submission, same fields as the CMP's own decline form
|
|
346
|
+
EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
|
|
345
347
|
EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
|
|
346
348
|
toggle.checked = false;
|
|
347
349
|
}) || true,
|
|
@@ -428,7 +430,8 @@ var snippets = {
|
|
|
428
430
|
EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
|
|
429
431
|
EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
|
|
430
432
|
EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
|
|
431
|
-
EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
|
|
433
|
+
EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
|
|
434
|
+
EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
|
|
432
435
|
};
|
|
433
436
|
function getFunctionBody(snippetFunc) {
|
|
434
437
|
const snippetStr = snippetFunc.toString();
|
|
@@ -444,7 +447,8 @@ var DETECT_PATTERNS = [
|
|
|
444
447
|
// "only necessary" is probably too broad
|
|
445
448
|
/(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
|
|
446
449
|
/(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
|
|
447
|
-
|
|
450
|
+
// a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
|
|
451
|
+
/we (?:use|serve)(?: \w+)? cookies/gi,
|
|
448
452
|
/we are using cookies/gi,
|
|
449
453
|
/use of cookies/gi,
|
|
450
454
|
/website uses cookies to enhance your browsing experience/gi,
|
|
@@ -588,7 +592,10 @@ var DETECT_PATTERNS = [
|
|
|
588
592
|
// "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
|
|
589
593
|
/(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
|
|
590
594
|
// Italian (IT)
|
|
591
|
-
/usiamo.{0,20}cookie/gi
|
|
595
|
+
/usiamo.{0,20}cookie/gi,
|
|
596
|
+
// Japanese (JA)
|
|
597
|
+
// e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
|
|
598
|
+
/(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
|
|
592
599
|
];
|
|
593
600
|
var REJECT_PATTERNS_ENGLISH = [
|
|
594
601
|
// e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
|
|
@@ -604,8 +611,9 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
604
611
|
/^\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,
|
|
605
612
|
/^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
|
|
606
613
|
/^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
|
|
607
|
-
// e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
|
|
608
|
-
|
|
614
|
+
// e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
|
|
615
|
+
// "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
|
|
616
|
+
/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,
|
|
609
617
|
// e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
|
|
610
618
|
/^opt[ -]?out of /is,
|
|
611
619
|
// e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
|
|
@@ -616,7 +624,6 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
616
624
|
/^no,? thank(s| you)$/is,
|
|
617
625
|
/^opt[ -]out$/is,
|
|
618
626
|
"dont enable",
|
|
619
|
-
"withdraw consent",
|
|
620
627
|
"i do not agree"
|
|
621
628
|
];
|
|
622
629
|
var REJECT_PATTERNS_DUTCH = [
|
|
@@ -643,9 +650,10 @@ var REJECT_PATTERNS_DUTCH = [
|
|
|
643
650
|
var REJECT_PATTERNS_FRENCH = [
|
|
644
651
|
// refuser / rejeter / interdire / décliner (reject verbs, any position)
|
|
645
652
|
// "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
|
|
646
|
-
|
|
653
|
+
// skip English prose such as "cookies that you can refuse"
|
|
654
|
+
/^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
|
|
647
655
|
// only necessary / essential / technical / functional
|
|
648
|
-
|
|
656
|
+
/^(?=.*(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,
|
|
649
657
|
// continue/proceed without accepting; refuse everything; disable purposes
|
|
650
658
|
/(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
|
|
651
659
|
// "non" / "non, merci"
|
|
@@ -703,7 +711,7 @@ var REJECT_PATTERNS_SPANISH = [
|
|
|
703
711
|
// "solo/sólo/no, sólo ... necessary/essential"
|
|
704
712
|
/^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
|
|
705
713
|
// refusals / opt-outs
|
|
706
|
-
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|
|
|
714
|
+
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
|
|
707
715
|
"acceptar nom\xE9s les necess\xE0ries",
|
|
708
716
|
"nom\xE9s sutilitzen cookies quan \xE9s necessari",
|
|
709
717
|
"pulsa aqu\xED para desactivar las cookies opcionales"
|
|
@@ -752,6 +760,12 @@ var REJECT_PATTERNS_RUSSIAN = [
|
|
|
752
760
|
];
|
|
753
761
|
var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
|
|
754
762
|
var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
|
|
763
|
+
var REJECT_PATTERNS_JAPANESE = [
|
|
764
|
+
// e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
|
|
765
|
+
/^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
|
|
766
|
+
"\u540C\u610F\u3057\u306A\u3044",
|
|
767
|
+
"\u540C\u610F\u3057\u307E\u305B\u3093"
|
|
768
|
+
];
|
|
755
769
|
var REJECT_PATTERNS = [
|
|
756
770
|
...REJECT_PATTERNS_ENGLISH,
|
|
757
771
|
...REJECT_PATTERNS_DUTCH,
|
|
@@ -769,9 +783,13 @@ var REJECT_PATTERNS = [
|
|
|
769
783
|
...REJECT_PATTERNS_POLISH,
|
|
770
784
|
...REJECT_PATTERNS_RUSSIAN,
|
|
771
785
|
...REJECT_PATTERNS_TURKISH,
|
|
772
|
-
...REJECT_PATTERNS_INDONESIAN
|
|
786
|
+
...REJECT_PATTERNS_INDONESIAN,
|
|
787
|
+
...REJECT_PATTERNS_JAPANESE
|
|
773
788
|
];
|
|
774
789
|
var BUTTON_NEVER_MATCH_PATTERNS = [
|
|
790
|
+
// text of several concatenated buttons, or popup body text rather than a button
|
|
791
|
+
/accept all.*reject all|reject all.*accept all/is,
|
|
792
|
+
/^.{300,}$/s,
|
|
775
793
|
/pay|subscribe/is,
|
|
776
794
|
/abonneer/is,
|
|
777
795
|
/abonnier/is,
|
|
@@ -812,8 +830,10 @@ var SETTINGS_PATTERNS = [
|
|
|
812
830
|
// Multilingual "open customization" patterns: a customization verb next to a
|
|
813
831
|
// cookie/preference/settings/options/details/purposes noun (both word orders).
|
|
814
832
|
// The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
|
|
815
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
816
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
833
|
+
/^(?!.*\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,
|
|
834
|
+
/^(?!.*\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,
|
|
835
|
+
// settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
|
|
836
|
+
/^(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,
|
|
817
837
|
"settings",
|
|
818
838
|
"preferences",
|
|
819
839
|
/customi(s|z)e/is,
|
|
@@ -827,8 +847,8 @@ var SETTINGS_PATTERNS = [
|
|
|
827
847
|
"cookieconsent preferences",
|
|
828
848
|
/privacy choices/is,
|
|
829
849
|
/^(privacy|cookie|custom) settings$/is,
|
|
830
|
-
/^cookies? (settings|preferences|setting)
|
|
831
|
-
|
|
850
|
+
/^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
|
|
851
|
+
/^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
|
|
832
852
|
"cookie consent options",
|
|
833
853
|
"privacy controls",
|
|
834
854
|
// German
|
|
@@ -999,7 +1019,7 @@ var ACCEPT_PATTERNS = [
|
|
|
999
1019
|
"yes",
|
|
1000
1020
|
/accept all above/is,
|
|
1001
1021
|
"close and accept",
|
|
1002
|
-
/accept all$/is,
|
|
1022
|
+
/(^|\s)accept all$/is,
|
|
1003
1023
|
"im ok with that",
|
|
1004
1024
|
// Spanish (ES)
|
|
1005
1025
|
/^acept(ar|o)( cookies)?$/,
|
|
@@ -1025,6 +1045,8 @@ var ACCEPT_PATTERNS = [
|
|
|
1025
1045
|
"accepta",
|
|
1026
1046
|
"accepta totes les cookies",
|
|
1027
1047
|
"accepta-ho tot",
|
|
1048
|
+
// FR/CA "d'accord" / "d'acord"
|
|
1049
|
+
/^dac?cord( fermer)?$/is,
|
|
1028
1050
|
"accepta-les totes",
|
|
1029
1051
|
"acceptar galetes",
|
|
1030
1052
|
"acceptar i tancar",
|
|
@@ -1066,7 +1088,6 @@ var ACCEPT_PATTERNS = [
|
|
|
1066
1088
|
"akceptuj\u0119!",
|
|
1067
1089
|
"ok, zgadzam si\u0119",
|
|
1068
1090
|
"potwierdzam wszystkie",
|
|
1069
|
-
"przejd\u017A do serwisu",
|
|
1070
1091
|
"tak",
|
|
1071
1092
|
"tak, zgadzam si\u0119 na wszystkie pliki cookie",
|
|
1072
1093
|
"tak, zgadzam si\u0119",
|
|
@@ -1137,8 +1158,6 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1137
1158
|
"seguir",
|
|
1138
1159
|
"vale",
|
|
1139
1160
|
"\xA1vamos!",
|
|
1140
|
-
// Catalan (CA)
|
|
1141
|
-
"dacord",
|
|
1142
1161
|
// Polish (PL)
|
|
1143
1162
|
"kontynuuj",
|
|
1144
1163
|
"ok, zrozumia\u0142em",
|
|
@@ -1162,10 +1181,8 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1162
1181
|
"\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
|
|
1163
1182
|
];
|
|
1164
1183
|
|
|
1165
|
-
// lib/
|
|
1166
|
-
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1184
|
+
// lib/heuristic-classify.ts
|
|
1167
1185
|
var TEXT_LIMIT = 1e5;
|
|
1168
|
-
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1169
1186
|
function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
1170
1187
|
allText = allText.slice(0, TEXT_LIMIT);
|
|
1171
1188
|
const patterns = [];
|
|
@@ -1183,31 +1200,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
|
1183
1200
|
}
|
|
1184
1201
|
return { patterns, snippets: snippets2 };
|
|
1185
1202
|
}
|
|
1186
|
-
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1187
|
-
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1188
|
-
if (acceptedLevels.length === 0) {
|
|
1189
|
-
return [];
|
|
1190
|
-
}
|
|
1191
|
-
const popups = getPotentialPopups(timeout);
|
|
1192
|
-
const result = popups.reduce((acc, popup) => {
|
|
1193
|
-
const popupText = popup.text?.trim();
|
|
1194
|
-
if (popupText) {
|
|
1195
|
-
if (isExcludedPopup(popupText)) {
|
|
1196
|
-
return acc;
|
|
1197
|
-
}
|
|
1198
|
-
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1199
|
-
if (patterns.length > 0) {
|
|
1200
|
-
classifyButtons(popup.buttons);
|
|
1201
|
-
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1202
|
-
acc.push({
|
|
1203
|
-
...popup
|
|
1204
|
-
});
|
|
1205
|
-
}
|
|
1206
|
-
}
|
|
1207
|
-
return acc;
|
|
1208
|
-
}, []);
|
|
1209
|
-
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1210
|
-
}
|
|
1211
1203
|
function classifyButtons(buttons) {
|
|
1212
1204
|
for (const button of buttons) {
|
|
1213
1205
|
button.regexClassification = classifyButtonTextRegex(button.text);
|
|
@@ -1278,6 +1270,35 @@ function classifyButtonTextRegex(buttonText) {
|
|
|
1278
1270
|
}
|
|
1279
1271
|
return "other";
|
|
1280
1272
|
}
|
|
1273
|
+
|
|
1274
|
+
// lib/heuristics.ts
|
|
1275
|
+
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1276
|
+
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1277
|
+
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1278
|
+
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1279
|
+
if (acceptedLevels.length === 0) {
|
|
1280
|
+
return [];
|
|
1281
|
+
}
|
|
1282
|
+
const popups = getPotentialPopups(timeout);
|
|
1283
|
+
const result = popups.reduce((acc, popup) => {
|
|
1284
|
+
const popupText = popup.text?.trim();
|
|
1285
|
+
if (popupText) {
|
|
1286
|
+
if (isExcludedPopup(popupText)) {
|
|
1287
|
+
return acc;
|
|
1288
|
+
}
|
|
1289
|
+
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1290
|
+
if (patterns.length > 0) {
|
|
1291
|
+
classifyButtons(popup.buttons);
|
|
1292
|
+
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1293
|
+
acc.push({
|
|
1294
|
+
...popup
|
|
1295
|
+
});
|
|
1296
|
+
}
|
|
1297
|
+
}
|
|
1298
|
+
return acc;
|
|
1299
|
+
}, []);
|
|
1300
|
+
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1301
|
+
}
|
|
1281
1302
|
function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1282
1303
|
const isFramed = !isTopFrame();
|
|
1283
1304
|
if (isFramed && window.parent && window.parent !== window.top) {
|