@duckduckgo/autoconsent 16.49.0 → 16.50.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/.github/workflows/release-labels.yml +2 -6
  2. package/CHANGELOG.md +41 -0
  3. package/dist/addon-firefox/background.bundle.js +4 -1
  4. package/dist/addon-firefox/compact-rules.json +1 -1
  5. package/dist/addon-firefox/content.bundle.js +20 -6
  6. package/dist/addon-firefox/manifest.json +1 -1
  7. package/dist/addon-firefox/rule-index.json +1 -1
  8. package/dist/addon-firefox/rules.json +1 -1
  9. package/dist/addon-mv3/background.bundle.js +4 -1
  10. package/dist/addon-mv3/compact-rules.json +1 -1
  11. package/dist/addon-mv3/content.bundle.js +20 -6
  12. package/dist/addon-mv3/manifest.json +1 -1
  13. package/dist/addon-mv3/rule-index.json +1 -1
  14. package/dist/addon-mv3/rules.json +1 -1
  15. package/dist/autoconsent.cjs.js +20 -6
  16. package/dist/autoconsent.esm.js +20 -6
  17. package/dist/autoconsent.playwright.js +20 -6
  18. package/dist/autoconsent.standalone.js +21 -7
  19. package/dist/types/eval-snippets.d.ts +2 -0
  20. package/lib/eval-snippets.ts +4 -0
  21. package/lib/heuristic-patterns.ts +16 -3
  22. package/package.json +1 -1
  23. package/rules/autoconsent/amazon-hiring.json +16 -0
  24. package/rules/autoconsent/avada-cookie-consent.json +43 -0
  25. package/rules/autoconsent/axeptio.json +17 -4
  26. package/rules/autoconsent/bigcrunch.json +39 -0
  27. package/rules/autoconsent/bricklink.json +33 -0
  28. package/rules/autoconsent/ceneo.json +9 -0
  29. package/rules/autoconsent/conjointly.json +43 -0
  30. package/rules/autoconsent/dhbbank.json +13 -0
  31. package/rules/autoconsent/ee-consent-notice.json +40 -0
  32. package/rules/autoconsent/fera-cookies.json +67 -0
  33. package/rules/autoconsent/la7-cmp.json +30 -0
  34. package/rules/autoconsent/laravel-cookie-consent.json +45 -0
  35. package/rules/autoconsent/legislation-gov-uk.json +43 -0
  36. package/rules/autoconsent/mackeeper.json +34 -0
  37. package/rules/autoconsent/ndl-go-jp.json +35 -0
  38. package/rules/autoconsent/paypal-us.json +3 -3
  39. package/rules/autoconsent/paypal.json +5 -2
  40. package/rules/autoconsent/texas-instruments.json +17 -0
  41. package/rules/autoconsent/thegrandyork.json +46 -0
  42. package/rules/autoconsent/thenounproject.json +61 -0
  43. package/rules/autoconsent/toyota.json +16 -5
  44. package/rules/autoconsent/uft-cookie-notice.json +15 -0
  45. package/rules/autoconsent/wbd-legal-terms.json +32 -0
  46. package/rules/compact-rules.json +1 -1
  47. package/rules/rule-index.json +1 -1
  48. package/rules/rules.json +1 -1
  49. package/tests/amazon-hiring.spec.ts +3 -0
  50. package/tests/avada-cookie-consent.spec.ts +9 -0
  51. package/tests/axeptio.spec.ts +8 -4
  52. package/tests/bigcrunch.spec.ts +16 -0
  53. package/tests/bricklink.spec.ts +3 -0
  54. package/tests/ceneo.spec.ts +3 -0
  55. package/tests/conjointly.spec.ts +3 -0
  56. package/tests/dhbbank.spec.ts +6 -0
  57. package/tests/ee-consent-notice.spec.ts +9 -0
  58. package/tests/fera-cookies.spec.ts +6 -0
  59. package/tests/la7-cmp.spec.ts +6 -0
  60. package/tests/laravel-cookie-consent.spec.ts +10 -0
  61. package/tests/legislation-gov-uk.spec.ts +3 -0
  62. package/tests/mackeeper.spec.ts +3 -0
  63. package/tests/ndl-go-jp.spec.ts +8 -0
  64. package/tests/paypal-us.spec.ts +2 -3
  65. package/tests/texas-instruments.spec.ts +3 -0
  66. package/tests/thegrandyork.spec.ts +3 -0
  67. package/tests/thenounproject.spec.ts +3 -0
  68. package/tests/uft-cookie-notice.spec.ts +3 -0
  69. package/tests/wbd-legal-terms.spec.ts +18 -0
  70. package/tests-wtr/heuristics/heuristics-utils.test.ts +55 -0
  71. package/rules/autoconsent/paypal-cookieprefs.json +0 -29
  72. package/tests/paypal-cookieprefs.spec.ts +0 -7
@@ -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
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
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,8 @@ 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
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
644
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
645
+ /do\s+not\s+sell|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
639
646
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
640
647
  /^opt[ -]?out of /is,
641
648
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -782,6 +789,12 @@ var REJECT_PATTERNS_RUSSIAN = [
782
789
  ];
783
790
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
784
791
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
792
+ var REJECT_PATTERNS_JAPANESE = [
793
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
794
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
795
+ "\u540C\u610F\u3057\u306A\u3044",
796
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
797
+ ];
785
798
  var REJECT_PATTERNS = [
786
799
  ...REJECT_PATTERNS_ENGLISH,
787
800
  ...REJECT_PATTERNS_DUTCH,
@@ -799,7 +812,8 @@ var REJECT_PATTERNS = [
799
812
  ...REJECT_PATTERNS_POLISH,
800
813
  ...REJECT_PATTERNS_RUSSIAN,
801
814
  ...REJECT_PATTERNS_TURKISH,
802
- ...REJECT_PATTERNS_INDONESIAN
815
+ ...REJECT_PATTERNS_INDONESIAN,
816
+ ...REJECT_PATTERNS_JAPANESE
803
817
  ];
804
818
  var BUTTON_NEVER_MATCH_PATTERNS = [
805
819
  /pay|subscribe/is,
@@ -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
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
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,8 @@ 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
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
614
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
615
+ /do\s+not\s+sell|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
609
616
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
610
617
  /^opt[ -]?out of /is,
611
618
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -752,6 +759,12 @@ var REJECT_PATTERNS_RUSSIAN = [
752
759
  ];
753
760
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
754
761
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
762
+ var REJECT_PATTERNS_JAPANESE = [
763
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
764
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
765
+ "\u540C\u610F\u3057\u306A\u3044",
766
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
767
+ ];
755
768
  var REJECT_PATTERNS = [
756
769
  ...REJECT_PATTERNS_ENGLISH,
757
770
  ...REJECT_PATTERNS_DUTCH,
@@ -769,7 +782,8 @@ var REJECT_PATTERNS = [
769
782
  ...REJECT_PATTERNS_POLISH,
770
783
  ...REJECT_PATTERNS_RUSSIAN,
771
784
  ...REJECT_PATTERNS_TURKISH,
772
- ...REJECT_PATTERNS_INDONESIAN
785
+ ...REJECT_PATTERNS_INDONESIAN,
786
+ ...REJECT_PATTERNS_JAPANESE
773
787
  ];
774
788
  var BUTTON_NEVER_MATCH_PATTERNS = [
775
789
  /pay|subscribe/is,
@@ -344,6 +344,8 @@
344
344
  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,
345
345
  EVAL_COOKIEINFORMATION_0: () => CookieInformation.declineAllCategories() || true,
346
346
  EVAL_COOKIEINFORMATION_1: () => CookieInformation.submitAllCategories() || true,
347
+ // turn the single-button form into a decline submission, same fields as the CMP's own decline form
348
+ EVAL_EE_CONSENT_DECLINE_0: () => document.querySelectorAll('#cookieConsentFormAccept input[name^="ee:cookies_"]').forEach((i) => i.value = "n") || true,
347
349
  EVAL_ETSY_0: () => document.querySelectorAll(".gdpr-overlay-body input").forEach((toggle) => {
348
350
  toggle.checked = false;
349
351
  }) || true,
@@ -430,7 +432,8 @@
430
432
  EVAL_USERCENTRICS_API_5: () => UC_UI.areAllConsentsAccepted() === true,
431
433
  EVAL_USERCENTRICS_API_6: () => UC_UI.areAllConsentsAccepted() === false,
432
434
  EVAL_USERCENTRICS_BUTTON_0: () => JSON.parse(localStorage.getItem("usercentrics")).consents.every((c) => c.isEssential || !c.consentStatus),
433
- EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true
435
+ EVAL_WAITROSE_0: () => Array.from(document.querySelectorAll("label[id$=cookies-deny-label]")).forEach((e) => e.click()) || true,
436
+ EVAL_WBD_LTP_CLOSE: () => document.querySelector("dialog#ltp-dialog").close() || true
434
437
  };
435
438
  function getFunctionBody(snippetFunc) {
436
439
  const snippetStr = snippetFunc.toString();
@@ -446,7 +449,8 @@
446
449
  // "only necessary" is probably too broad
447
450
  /(?:by continuing.{0,100}cookie)|(?:cookie.{0,100}by continuing)/gi,
448
451
  /(?:by continuing.{0,100}privacy)|(?:privacy.{0,100}by continuing)/gi,
449
- /we (?:use|serve)(?: optional| essential)? cookies/gi,
452
+ // a single qualifier is common: "optional", "essential", "necessary", "analytics", ...
453
+ /we (?:use|serve)(?: \w+)? cookies/gi,
450
454
  /we are using cookies/gi,
451
455
  /use of cookies/gi,
452
456
  /website uses cookies to enhance your browsing experience/gi,
@@ -590,7 +594,10 @@
590
594
  // "файлы cookie" / "cookie-файлы" / "куки-файлы" in any phrasing
591
595
  /(?:файл[а-яё]*[\s-]+(?:cookie|куки)|(?:cookie|куки)[\s-]+файл[а-яё]*)/gi,
592
596
  // Italian (IT)
593
- /usiamo.{0,20}cookie/gi
597
+ /usiamo.{0,20}cookie/gi,
598
+ // Japanese (JA)
599
+ // e.g. "当サイトはCookieを使用しています", "クッキー(Cookie)を利用しています"
600
+ /(?:cookie|クッキー).{0,10}を(?:使用|利用)/gi
594
601
  ];
595
602
  var REJECT_PATTERNS_ENGLISH = [
596
603
  // e.g. "reject", "reject all", "reject all cookies", "deny all", "refuse cookies", "decline",
@@ -606,8 +613,8 @@
606
613
  /^\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,
607
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,
608
615
  /^\s*(strictly\s+)?(necessary|essential|essentials|functional|required|minimal)\s+((cookies\s+)?only|only\s+cookies)\s*$/is,
609
- // e.g. "do not sell or share my personal information", "opt out of sale ..." (CCPA)
610
- /do\s+not\s+sell|opt\s+out\s+of\s+sale/is,
616
+ // e.g. "do not sell or share my personal information", "do not share my personal information", "opt out of sale ..." (CCPA)
617
+ /do\s+not\s+sell|do\s+not\s+share\s+my\s+(personal\s+)?(information|info|data)|opt\s+out\s+of\s+sale/is,
611
618
  // e.g. "opt-out of sale/share or targeted advertising", "opt-out of advertising/social media cookies"
612
619
  /^opt[ -]?out of /is,
613
620
  // e.g. "reject all except strictly necessary", "reject all (except necessary cookies)"
@@ -754,6 +761,12 @@
754
761
  ];
755
762
  var REJECT_PATTERNS_TURKISH = ["reddet", "\xE7erezleri reddet"];
756
763
  var REJECT_PATTERNS_INDONESIAN = ["tolak cookie"];
764
+ var REJECT_PATTERNS_JAPANESE = [
765
+ // e.g. "拒否", "すべて拒否", "全て拒否する", "cookieを拒否"
766
+ /^(すべて|全て)?\s?(の)?(cookie|クッキー)?\s?(を)?拒否(する)?$/i,
767
+ "\u540C\u610F\u3057\u306A\u3044",
768
+ "\u540C\u610F\u3057\u307E\u305B\u3093"
769
+ ];
757
770
  var REJECT_PATTERNS = [
758
771
  ...REJECT_PATTERNS_ENGLISH,
759
772
  ...REJECT_PATTERNS_DUTCH,
@@ -771,7 +784,8 @@
771
784
  ...REJECT_PATTERNS_POLISH,
772
785
  ...REJECT_PATTERNS_RUSSIAN,
773
786
  ...REJECT_PATTERNS_TURKISH,
774
- ...REJECT_PATTERNS_INDONESIAN
787
+ ...REJECT_PATTERNS_INDONESIAN,
788
+ ...REJECT_PATTERNS_JAPANESE
775
789
  ];
776
790
  var BUTTON_NEVER_MATCH_PATTERNS = [
777
791
  /pay|subscribe/is,