@duckduckgo/autoconsent 16.50.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/AGENTS.md +1 -1
- package/CHANGELOG.md +89 -0
- package/build.sh +2 -0
- package/data/labelled-button-texts.csv +36 -36
- package/dist/addon-firefox/compact-rules.json +1 -1
- package/dist/addon-firefox/content.bundle.js +48 -41
- 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/compact-rules.json +1 -1
- package/dist/addon-mv3/content.bundle.js +48 -41
- 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 +48 -41
- package/dist/autoconsent.esm.js +48 -41
- package/dist/autoconsent.playwright.js +49 -41
- package/dist/autoconsent.standalone.js +49 -42
- package/dist/heuristics.cjs.js +886 -0
- package/dist/heuristics.mjs +847 -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/heuristic-classify.ts +136 -0
- package/lib/heuristic-patterns.ts +18 -14
- 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/avvio.json +22 -0
- package/rules/autoconsent/axeptio.json +5 -2
- package/rules/autoconsent/bdirect-booking-engine.json +33 -0
- package/rules/autoconsent/berelax.com.json +33 -0
- package/rules/autoconsent/bigid.json +59 -0
- package/rules/autoconsent/bluepark.json +31 -0
- package/rules/autoconsent/burpee-com.json +5 -1
- package/rules/autoconsent/bynder.json +33 -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/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/duda-cookie-notification.json +41 -0
- package/rules/autoconsent/endocrine.org.json +35 -0
- package/rules/autoconsent/ezoic.json +2 -2
- 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/lucrin.json +18 -0
- package/rules/autoconsent/makitatools.json +41 -0
- package/rules/autoconsent/milestone-internet.json +32 -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/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/therealest.json +42 -0
- package/rules/autoconsent/tineye.json +35 -0
- package/rules/autoconsent/tk-aerztefuehrer.de.json +18 -0
- package/rules/autoconsent/tplink.json +57 -9
- package/rules/autoconsent/trust360.json +29 -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/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/avvio.spec.ts +8 -0
- package/tests/axeptio.spec.ts +3 -0
- package/tests/bdirect-booking-engine.spec.ts +9 -0
- package/tests/berelax.com.spec.ts +5 -0
- package/tests/bigid.spec.ts +8 -0
- package/tests/bluepark.spec.ts +8 -0
- package/tests/burpee-com.spec.ts +2 -0
- package/tests/bynder.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/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/duda-cookie-notification.spec.ts +8 -0
- package/tests/endocrine.org.spec.ts +3 -0
- package/tests/ezoic.spec.ts +1 -1
- 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/lucrin.spec.ts +3 -0
- package/tests/makitatools.spec.ts +5 -0
- package/tests/milestone-internet.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/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/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/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/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 +2 -6
- package/tsconfig.build.json +1 -1
- package/tsconfig.heuristics.json +10 -0
package/dist/autoconsent.cjs.js
CHANGED
|
@@ -642,7 +642,8 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
642
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,
|
|
643
643
|
/^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
|
|
644
644
|
// e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
|
|
645
|
-
|
|
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,
|
|
646
647
|
// e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
|
|
647
648
|
/^opt[ -]?out of /is,
|
|
648
649
|
// e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
|
|
@@ -653,7 +654,6 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
653
654
|
/^no,? thank(s| you)$/is,
|
|
654
655
|
/^opt[ -]out$/is,
|
|
655
656
|
"dont enable",
|
|
656
|
-
"withdraw consent",
|
|
657
657
|
"i do not agree"
|
|
658
658
|
];
|
|
659
659
|
var REJECT_PATTERNS_DUTCH = [
|
|
@@ -680,9 +680,10 @@ var REJECT_PATTERNS_DUTCH = [
|
|
|
680
680
|
var REJECT_PATTERNS_FRENCH = [
|
|
681
681
|
// refuser / rejeter / interdire / décliner (reject verbs, any position)
|
|
682
682
|
// "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
|
|
683
|
-
|
|
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,
|
|
684
685
|
// only necessary / essential / technical / functional
|
|
685
|
-
|
|
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,
|
|
686
687
|
// continue/proceed without accepting; refuse everything; disable purposes
|
|
687
688
|
/(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
|
|
688
689
|
// "non" / "non, merci"
|
|
@@ -740,7 +741,7 @@ var REJECT_PATTERNS_SPANISH = [
|
|
|
740
741
|
// "solo/sólo/no, sólo ... necessary/essential"
|
|
741
742
|
/^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
|
|
742
743
|
// refusals / opt-outs
|
|
743
|
-
/^(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,
|
|
744
745
|
"acceptar nom\xE9s les necess\xE0ries",
|
|
745
746
|
"nom\xE9s sutilitzen cookies quan \xE9s necessari",
|
|
746
747
|
"pulsa aqu\xED para desactivar las cookies opcionales"
|
|
@@ -816,6 +817,9 @@ var REJECT_PATTERNS = [
|
|
|
816
817
|
...REJECT_PATTERNS_JAPANESE
|
|
817
818
|
];
|
|
818
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,
|
|
819
823
|
/pay|subscribe/is,
|
|
820
824
|
/abonneer/is,
|
|
821
825
|
/abonnier/is,
|
|
@@ -856,8 +860,10 @@ var SETTINGS_PATTERNS = [
|
|
|
856
860
|
// Multilingual "open customization" patterns: a customization verb next to a
|
|
857
861
|
// cookie/preference/settings/options/details/purposes noun (both word orders).
|
|
858
862
|
// The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
|
|
859
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
860
|
-
/^(?!.*\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,
|
|
861
867
|
"settings",
|
|
862
868
|
"preferences",
|
|
863
869
|
/customi(s|z)e/is,
|
|
@@ -871,8 +877,8 @@ var SETTINGS_PATTERNS = [
|
|
|
871
877
|
"cookieconsent preferences",
|
|
872
878
|
/privacy choices/is,
|
|
873
879
|
/^(privacy|cookie|custom) settings$/is,
|
|
874
|
-
/^cookies? (settings|preferences|setting)
|
|
875
|
-
|
|
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,
|
|
876
882
|
"cookie consent options",
|
|
877
883
|
"privacy controls",
|
|
878
884
|
// German
|
|
@@ -1043,7 +1049,7 @@ var ACCEPT_PATTERNS = [
|
|
|
1043
1049
|
"yes",
|
|
1044
1050
|
/accept all above/is,
|
|
1045
1051
|
"close and accept",
|
|
1046
|
-
/accept all$/is,
|
|
1052
|
+
/(^|\s)accept all$/is,
|
|
1047
1053
|
"im ok with that",
|
|
1048
1054
|
// Spanish (ES)
|
|
1049
1055
|
/^acept(ar|o)( cookies)?$/,
|
|
@@ -1069,6 +1075,8 @@ var ACCEPT_PATTERNS = [
|
|
|
1069
1075
|
"accepta",
|
|
1070
1076
|
"accepta totes les cookies",
|
|
1071
1077
|
"accepta-ho tot",
|
|
1078
|
+
// FR/CA "d'accord" / "d'acord"
|
|
1079
|
+
/^dac?cord( fermer)?$/is,
|
|
1072
1080
|
"accepta-les totes",
|
|
1073
1081
|
"acceptar galetes",
|
|
1074
1082
|
"acceptar i tancar",
|
|
@@ -1110,7 +1118,6 @@ var ACCEPT_PATTERNS = [
|
|
|
1110
1118
|
"akceptuj\u0119!",
|
|
1111
1119
|
"ok, zgadzam si\u0119",
|
|
1112
1120
|
"potwierdzam wszystkie",
|
|
1113
|
-
"przejd\u017A do serwisu",
|
|
1114
1121
|
"tak",
|
|
1115
1122
|
"tak, zgadzam si\u0119 na wszystkie pliki cookie",
|
|
1116
1123
|
"tak, zgadzam si\u0119",
|
|
@@ -1181,8 +1188,6 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1181
1188
|
"seguir",
|
|
1182
1189
|
"vale",
|
|
1183
1190
|
"\xA1vamos!",
|
|
1184
|
-
// Catalan (CA)
|
|
1185
|
-
"dacord",
|
|
1186
1191
|
// Polish (PL)
|
|
1187
1192
|
"kontynuuj",
|
|
1188
1193
|
"ok, zrozumia\u0142em",
|
|
@@ -1206,10 +1211,8 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1206
1211
|
"\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
|
|
1207
1212
|
];
|
|
1208
1213
|
|
|
1209
|
-
// lib/
|
|
1210
|
-
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1214
|
+
// lib/heuristic-classify.ts
|
|
1211
1215
|
var TEXT_LIMIT = 1e5;
|
|
1212
|
-
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1213
1216
|
function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
1214
1217
|
allText = allText.slice(0, TEXT_LIMIT);
|
|
1215
1218
|
const patterns = [];
|
|
@@ -1227,31 +1230,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
|
1227
1230
|
}
|
|
1228
1231
|
return { patterns, snippets: snippets2 };
|
|
1229
1232
|
}
|
|
1230
|
-
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1231
|
-
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1232
|
-
if (acceptedLevels.length === 0) {
|
|
1233
|
-
return [];
|
|
1234
|
-
}
|
|
1235
|
-
const popups = getPotentialPopups(timeout);
|
|
1236
|
-
const result = popups.reduce((acc, popup) => {
|
|
1237
|
-
const popupText = popup.text?.trim();
|
|
1238
|
-
if (popupText) {
|
|
1239
|
-
if (isExcludedPopup(popupText)) {
|
|
1240
|
-
return acc;
|
|
1241
|
-
}
|
|
1242
|
-
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1243
|
-
if (patterns.length > 0) {
|
|
1244
|
-
classifyButtons(popup.buttons);
|
|
1245
|
-
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1246
|
-
acc.push({
|
|
1247
|
-
...popup
|
|
1248
|
-
});
|
|
1249
|
-
}
|
|
1250
|
-
}
|
|
1251
|
-
return acc;
|
|
1252
|
-
}, []);
|
|
1253
|
-
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1254
|
-
}
|
|
1255
1233
|
function classifyButtons(buttons) {
|
|
1256
1234
|
for (const button of buttons) {
|
|
1257
1235
|
button.regexClassification = classifyButtonTextRegex(button.text);
|
|
@@ -1322,6 +1300,35 @@ function classifyButtonTextRegex(buttonText) {
|
|
|
1322
1300
|
}
|
|
1323
1301
|
return "other";
|
|
1324
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
|
+
}
|
|
1325
1332
|
function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1326
1333
|
const isFramed = !isTopFrame();
|
|
1327
1334
|
if (isFramed && window.parent && window.parent !== window.top) {
|
package/dist/autoconsent.esm.js
CHANGED
|
@@ -612,7 +612,8 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
612
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,
|
|
613
613
|
/^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
|
|
614
614
|
// e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
|
|
615
|
-
|
|
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,
|
|
616
617
|
// e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
|
|
617
618
|
/^opt[ -]?out of /is,
|
|
618
619
|
// e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
|
|
@@ -623,7 +624,6 @@ var REJECT_PATTERNS_ENGLISH = [
|
|
|
623
624
|
/^no,? thank(s| you)$/is,
|
|
624
625
|
/^opt[ -]out$/is,
|
|
625
626
|
"dont enable",
|
|
626
|
-
"withdraw consent",
|
|
627
627
|
"i do not agree"
|
|
628
628
|
];
|
|
629
629
|
var REJECT_PATTERNS_DUTCH = [
|
|
@@ -650,9 +650,10 @@ var REJECT_PATTERNS_DUTCH = [
|
|
|
650
650
|
var REJECT_PATTERNS_FRENCH = [
|
|
651
651
|
// refuser / rejeter / interdire / décliner (reject verbs, any position)
|
|
652
652
|
// "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
|
|
653
|
-
|
|
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,
|
|
654
655
|
// only necessary / essential / technical / functional
|
|
655
|
-
|
|
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,
|
|
656
657
|
// continue/proceed without accepting; refuse everything; disable purposes
|
|
657
658
|
/(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
|
|
658
659
|
// "non" / "non, merci"
|
|
@@ -710,7 +711,7 @@ var REJECT_PATTERNS_SPANISH = [
|
|
|
710
711
|
// "solo/sólo/no, sólo ... necessary/essential"
|
|
711
712
|
/^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
|
|
712
713
|
// refusals / opt-outs
|
|
713
|
-
/^(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,
|
|
714
715
|
"acceptar nom\xE9s les necess\xE0ries",
|
|
715
716
|
"nom\xE9s sutilitzen cookies quan \xE9s necessari",
|
|
716
717
|
"pulsa aqu\xED para desactivar las cookies opcionales"
|
|
@@ -786,6 +787,9 @@ var REJECT_PATTERNS = [
|
|
|
786
787
|
...REJECT_PATTERNS_JAPANESE
|
|
787
788
|
];
|
|
788
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,
|
|
789
793
|
/pay|subscribe/is,
|
|
790
794
|
/abonneer/is,
|
|
791
795
|
/abonnier/is,
|
|
@@ -826,8 +830,10 @@ var SETTINGS_PATTERNS = [
|
|
|
826
830
|
// Multilingual "open customization" patterns: a customization verb next to a
|
|
827
831
|
// cookie/preference/settings/options/details/purposes noun (both word orders).
|
|
828
832
|
// The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
|
|
829
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
830
|
-
/^(?!.*\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,
|
|
831
837
|
"settings",
|
|
832
838
|
"preferences",
|
|
833
839
|
/customi(s|z)e/is,
|
|
@@ -841,8 +847,8 @@ var SETTINGS_PATTERNS = [
|
|
|
841
847
|
"cookieconsent preferences",
|
|
842
848
|
/privacy choices/is,
|
|
843
849
|
/^(privacy|cookie|custom) settings$/is,
|
|
844
|
-
/^cookies? (settings|preferences|setting)
|
|
845
|
-
|
|
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,
|
|
846
852
|
"cookie consent options",
|
|
847
853
|
"privacy controls",
|
|
848
854
|
// German
|
|
@@ -1013,7 +1019,7 @@ var ACCEPT_PATTERNS = [
|
|
|
1013
1019
|
"yes",
|
|
1014
1020
|
/accept all above/is,
|
|
1015
1021
|
"close and accept",
|
|
1016
|
-
/accept all$/is,
|
|
1022
|
+
/(^|\s)accept all$/is,
|
|
1017
1023
|
"im ok with that",
|
|
1018
1024
|
// Spanish (ES)
|
|
1019
1025
|
/^acept(ar|o)( cookies)?$/,
|
|
@@ -1039,6 +1045,8 @@ var ACCEPT_PATTERNS = [
|
|
|
1039
1045
|
"accepta",
|
|
1040
1046
|
"accepta totes les cookies",
|
|
1041
1047
|
"accepta-ho tot",
|
|
1048
|
+
// FR/CA "d'accord" / "d'acord"
|
|
1049
|
+
/^dac?cord( fermer)?$/is,
|
|
1042
1050
|
"accepta-les totes",
|
|
1043
1051
|
"acceptar galetes",
|
|
1044
1052
|
"acceptar i tancar",
|
|
@@ -1080,7 +1088,6 @@ var ACCEPT_PATTERNS = [
|
|
|
1080
1088
|
"akceptuj\u0119!",
|
|
1081
1089
|
"ok, zgadzam si\u0119",
|
|
1082
1090
|
"potwierdzam wszystkie",
|
|
1083
|
-
"przejd\u017A do serwisu",
|
|
1084
1091
|
"tak",
|
|
1085
1092
|
"tak, zgadzam si\u0119 na wszystkie pliki cookie",
|
|
1086
1093
|
"tak, zgadzam si\u0119",
|
|
@@ -1151,8 +1158,6 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1151
1158
|
"seguir",
|
|
1152
1159
|
"vale",
|
|
1153
1160
|
"\xA1vamos!",
|
|
1154
|
-
// Catalan (CA)
|
|
1155
|
-
"dacord",
|
|
1156
1161
|
// Polish (PL)
|
|
1157
1162
|
"kontynuuj",
|
|
1158
1163
|
"ok, zrozumia\u0142em",
|
|
@@ -1176,10 +1181,8 @@ var ACKNOWLEDGE_PATTERNS = [
|
|
|
1176
1181
|
"\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
|
|
1177
1182
|
];
|
|
1178
1183
|
|
|
1179
|
-
// lib/
|
|
1180
|
-
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1184
|
+
// lib/heuristic-classify.ts
|
|
1181
1185
|
var TEXT_LIMIT = 1e5;
|
|
1182
|
-
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1183
1186
|
function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
1184
1187
|
allText = allText.slice(0, TEXT_LIMIT);
|
|
1185
1188
|
const patterns = [];
|
|
@@ -1197,31 +1200,6 @@ function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
|
1197
1200
|
}
|
|
1198
1201
|
return { patterns, snippets: snippets2 };
|
|
1199
1202
|
}
|
|
1200
|
-
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1201
|
-
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1202
|
-
if (acceptedLevels.length === 0) {
|
|
1203
|
-
return [];
|
|
1204
|
-
}
|
|
1205
|
-
const popups = getPotentialPopups(timeout);
|
|
1206
|
-
const result = popups.reduce((acc, popup) => {
|
|
1207
|
-
const popupText = popup.text?.trim();
|
|
1208
|
-
if (popupText) {
|
|
1209
|
-
if (isExcludedPopup(popupText)) {
|
|
1210
|
-
return acc;
|
|
1211
|
-
}
|
|
1212
|
-
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1213
|
-
if (patterns.length > 0) {
|
|
1214
|
-
classifyButtons(popup.buttons);
|
|
1215
|
-
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1216
|
-
acc.push({
|
|
1217
|
-
...popup
|
|
1218
|
-
});
|
|
1219
|
-
}
|
|
1220
|
-
}
|
|
1221
|
-
return acc;
|
|
1222
|
-
}, []);
|
|
1223
|
-
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1224
|
-
}
|
|
1225
1203
|
function classifyButtons(buttons) {
|
|
1226
1204
|
for (const button of buttons) {
|
|
1227
1205
|
button.regexClassification = classifyButtonTextRegex(button.text);
|
|
@@ -1292,6 +1270,35 @@ function classifyButtonTextRegex(buttonText) {
|
|
|
1292
1270
|
}
|
|
1293
1271
|
return "other";
|
|
1294
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
|
+
}
|
|
1295
1302
|
function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1296
1303
|
const isFramed = !isTopFrame();
|
|
1297
1304
|
if (isFramed && window.parent && window.parent !== window.top) {
|
|
@@ -614,7 +614,8 @@
|
|
|
614
614
|
/^\s*(i\s+)?(want\s+to\s+)?only\s+(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s*(cookies)?\s*(continue|only)?\s*$/is,
|
|
615
615
|
/^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
|
|
616
616
|
// e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
|
|
617
|
-
|
|
617
|
+
// "do not sell page" is a link; "do not sellcookie settings" is two concatenated buttons
|
|
618
|
+
/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,
|
|
618
619
|
// e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
|
|
619
620
|
/^opt[ -]?out of /is,
|
|
620
621
|
// e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
|
|
@@ -625,7 +626,6 @@
|
|
|
625
626
|
/^no,? thank(s| you)$/is,
|
|
626
627
|
/^opt[ -]out$/is,
|
|
627
628
|
"dont enable",
|
|
628
|
-
"withdraw consent",
|
|
629
629
|
"i do not agree"
|
|
630
630
|
];
|
|
631
631
|
var REJECT_PATTERNS_DUTCH = [
|
|
@@ -652,9 +652,10 @@
|
|
|
652
652
|
var REJECT_PATTERNS_FRENCH = [
|
|
653
653
|
// refuser / rejeter / interdire / décliner (reject verbs, any position)
|
|
654
654
|
// "refuser et s'abonner" / "refuser et payer" are excluded via BUTTON_NEVER_MATCH_PATTERNS
|
|
655
|
-
|
|
655
|
+
// skip English prose such as "cookies that you can refuse"
|
|
656
|
+
/^(?!.*\bcan refuse\b)(.*\s)?(refus|rejet|rejeter|interdire|interdis|déclin|declin)/is,
|
|
656
657
|
// only necessary / essential / technical / functional
|
|
657
|
-
|
|
658
|
+
/^(?=.*(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,
|
|
658
659
|
// continue/proceed without accepting; refuse everything; disable purposes
|
|
659
660
|
/(sans accepter|ne pas accepter|je naccepte rien|je désactive)/is,
|
|
660
661
|
// "non" / "non, merci"
|
|
@@ -712,7 +713,7 @@
|
|
|
712
713
|
// "solo/sólo/no, sólo ... necessary/essential"
|
|
713
714
|
/^(no,?\s+)?(solo|sólo|només)\s+(usar\s+|las?\s+|los\s+|lo\s+)?.{0,20}(necesari|esencial|estrictamente)/is,
|
|
714
715
|
// refusals / opt-outs
|
|
715
|
-
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|
|
|
716
|
+
/^(no acept|no consentir|no permitir|no estoy de acuerdo|no,? gracias|sin consentimiento|continuar sin aceptar|prefiero rechazarlas|descartar todas)/is,
|
|
716
717
|
"acceptar nom\xE9s les necess\xE0ries",
|
|
717
718
|
"nom\xE9s sutilitzen cookies quan \xE9s necessari",
|
|
718
719
|
"pulsa aqu\xED para desactivar las cookies opcionales"
|
|
@@ -788,6 +789,9 @@
|
|
|
788
789
|
...REJECT_PATTERNS_JAPANESE
|
|
789
790
|
];
|
|
790
791
|
var BUTTON_NEVER_MATCH_PATTERNS = [
|
|
792
|
+
// text of several concatenated buttons, or popup body text rather than a button
|
|
793
|
+
/accept all.*reject all|reject all.*accept all/is,
|
|
794
|
+
/^.{300,}$/s,
|
|
791
795
|
/pay|subscribe/is,
|
|
792
796
|
/abonneer/is,
|
|
793
797
|
/abonnier/is,
|
|
@@ -828,8 +832,10 @@
|
|
|
828
832
|
// Multilingual "open customization" patterns: a customization verb next to a
|
|
829
833
|
// cookie/preference/settings/options/details/purposes noun (both word orders).
|
|
830
834
|
// The negative lookahead avoids policy links and save/confirm/accept phrases (those are accept/acknowledge/other).
|
|
831
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
832
|
-
/^(?!.*\b(policy|policies|notice|statement|impressum
|
|
835
|
+
/^(?!.*\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,
|
|
836
|
+
/^(?!.*\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,
|
|
837
|
+
// settings noun + cookies, e.g. "paramètres des cookies", "ajustes de cookies", "instellingen voor cookies en diensten"
|
|
838
|
+
/^(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,
|
|
833
839
|
"settings",
|
|
834
840
|
"preferences",
|
|
835
841
|
/customi(s|z)e/is,
|
|
@@ -843,8 +849,8 @@
|
|
|
843
849
|
"cookieconsent preferences",
|
|
844
850
|
/privacy choices/is,
|
|
845
851
|
/^(privacy|cookie|custom) settings$/is,
|
|
846
|
-
/^cookies? (settings|preferences|setting)
|
|
847
|
-
|
|
852
|
+
/^cookies? (settings|preferences|setting)(?!.*\bdo not\b)/is,
|
|
853
|
+
/^(?!.*\bpolic(y|ies)\b).*(manage|customize|customise|opt-out|edit).*(cookies|preferences|settings|options)/is,
|
|
848
854
|
"cookie consent options",
|
|
849
855
|
"privacy controls",
|
|
850
856
|
// German
|
|
@@ -1015,7 +1021,7 @@
|
|
|
1015
1021
|
"yes",
|
|
1016
1022
|
/accept all above/is,
|
|
1017
1023
|
"close and accept",
|
|
1018
|
-
/accept all$/is,
|
|
1024
|
+
/(^|\s)accept all$/is,
|
|
1019
1025
|
"im ok with that",
|
|
1020
1026
|
// Spanish (ES)
|
|
1021
1027
|
/^acept(ar|o)( cookies)?$/,
|
|
@@ -1041,6 +1047,8 @@
|
|
|
1041
1047
|
"accepta",
|
|
1042
1048
|
"accepta totes les cookies",
|
|
1043
1049
|
"accepta-ho tot",
|
|
1050
|
+
// FR/CA "d'accord" / "d'acord"
|
|
1051
|
+
/^dac?cord( fermer)?$/is,
|
|
1044
1052
|
"accepta-les totes",
|
|
1045
1053
|
"acceptar galetes",
|
|
1046
1054
|
"acceptar i tancar",
|
|
@@ -1082,7 +1090,6 @@
|
|
|
1082
1090
|
"akceptuj\u0119!",
|
|
1083
1091
|
"ok, zgadzam si\u0119",
|
|
1084
1092
|
"potwierdzam wszystkie",
|
|
1085
|
-
"przejd\u017A do serwisu",
|
|
1086
1093
|
"tak",
|
|
1087
1094
|
"tak, zgadzam si\u0119 na wszystkie pliki cookie",
|
|
1088
1095
|
"tak, zgadzam si\u0119",
|
|
@@ -1153,8 +1160,6 @@
|
|
|
1153
1160
|
"seguir",
|
|
1154
1161
|
"vale",
|
|
1155
1162
|
"\xA1vamos!",
|
|
1156
|
-
// Catalan (CA)
|
|
1157
|
-
"dacord",
|
|
1158
1163
|
// Polish (PL)
|
|
1159
1164
|
"kontynuuj",
|
|
1160
1165
|
"ok, zrozumia\u0142em",
|
|
@@ -1178,10 +1183,8 @@
|
|
|
1178
1183
|
"\u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0438\u0442\u044C"
|
|
1179
1184
|
];
|
|
1180
1185
|
|
|
1181
|
-
// lib/
|
|
1182
|
-
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1186
|
+
// lib/heuristic-classify.ts
|
|
1183
1187
|
var TEXT_LIMIT = 1e5;
|
|
1184
|
-
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1185
1188
|
function checkHeuristicPatterns(allText, detectPatterns = DETECT_PATTERNS) {
|
|
1186
1189
|
allText = allText.slice(0, TEXT_LIMIT);
|
|
1187
1190
|
const patterns = [];
|
|
@@ -1199,31 +1202,6 @@
|
|
|
1199
1202
|
}
|
|
1200
1203
|
return { patterns, snippets: snippets2 };
|
|
1201
1204
|
}
|
|
1202
|
-
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1203
|
-
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1204
|
-
if (acceptedLevels.length === 0) {
|
|
1205
|
-
return [];
|
|
1206
|
-
}
|
|
1207
|
-
const popups = getPotentialPopups(timeout);
|
|
1208
|
-
const result = popups.reduce((acc, popup) => {
|
|
1209
|
-
const popupText = popup.text?.trim();
|
|
1210
|
-
if (popupText) {
|
|
1211
|
-
if (isExcludedPopup(popupText)) {
|
|
1212
|
-
return acc;
|
|
1213
|
-
}
|
|
1214
|
-
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1215
|
-
if (patterns.length > 0) {
|
|
1216
|
-
classifyButtons(popup.buttons);
|
|
1217
|
-
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1218
|
-
acc.push({
|
|
1219
|
-
...popup
|
|
1220
|
-
});
|
|
1221
|
-
}
|
|
1222
|
-
}
|
|
1223
|
-
return acc;
|
|
1224
|
-
}, []);
|
|
1225
|
-
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1226
|
-
}
|
|
1227
1205
|
function classifyButtons(buttons) {
|
|
1228
1206
|
for (const button of buttons) {
|
|
1229
1207
|
button.regexClassification = classifyButtonTextRegex(button.text);
|
|
@@ -1294,6 +1272,35 @@
|
|
|
1294
1272
|
}
|
|
1295
1273
|
return "other";
|
|
1296
1274
|
}
|
|
1275
|
+
|
|
1276
|
+
// lib/heuristics.ts
|
|
1277
|
+
var BUTTON_LIKE_ELEMENT_SELECTOR = 'button, input[type="button"], input[type="submit"], a, [role="button"], [class*="button"]';
|
|
1278
|
+
var POPUP_SEARCH_MAX_TIME = 100;
|
|
1279
|
+
function getActionablePopups(mode = "reject", timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1280
|
+
const acceptedLevels = mode === "tier2" ? ["reject", "tier1", "tier2"] : mode === "tier1" ? ["reject", "tier1"] : ["reject"];
|
|
1281
|
+
if (acceptedLevels.length === 0) {
|
|
1282
|
+
return [];
|
|
1283
|
+
}
|
|
1284
|
+
const popups = getPotentialPopups(timeout);
|
|
1285
|
+
const result = popups.reduce((acc, popup) => {
|
|
1286
|
+
const popupText = popup.text?.trim();
|
|
1287
|
+
if (popupText) {
|
|
1288
|
+
if (isExcludedPopup(popupText)) {
|
|
1289
|
+
return acc;
|
|
1290
|
+
}
|
|
1291
|
+
const { patterns } = checkHeuristicPatterns(popupText);
|
|
1292
|
+
if (patterns.length > 0) {
|
|
1293
|
+
classifyButtons(popup.buttons);
|
|
1294
|
+
popup.regexClassification = classifyPopup(popup.buttons);
|
|
1295
|
+
acc.push({
|
|
1296
|
+
...popup
|
|
1297
|
+
});
|
|
1298
|
+
}
|
|
1299
|
+
}
|
|
1300
|
+
return acc;
|
|
1301
|
+
}, []);
|
|
1302
|
+
return result.filter((popup) => popup.regexClassification !== void 0 && acceptedLevels.includes(popup.regexClassification)).sort((a, b) => (a.regexClassification ?? "") > (b.regexClassification ?? "") ? 1 : -1);
|
|
1303
|
+
}
|
|
1297
1304
|
function getPotentialPopups(timeout = POPUP_SEARCH_MAX_TIME) {
|
|
1298
1305
|
const isFramed = !isTopFrame();
|
|
1299
1306
|
if (isFramed && window.parent && window.parent !== window.top) {
|
|
@@ -3408,6 +3415,7 @@
|
|
|
3408
3415
|
_config = new WeakMap();
|
|
3409
3416
|
|
|
3410
3417
|
// playwright/content.ts
|
|
3418
|
+
window.autoconsentHeuristics = { getPotentialPopups, getButtonData };
|
|
3411
3419
|
if (!window.autoconsentReceiveMessage) {
|
|
3412
3420
|
const consent = new AutoConsent(window.autoconsentSendMessage, null, { autoconsent: [] });
|
|
3413
3421
|
window.autoconsentReceiveMessage = (message) => {
|