@duckduckgo/autoconsent 14.82.0 → 14.84.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.
@@ -693,6 +693,7 @@
693
693
  enableGeneratedRules: true,
694
694
  enableHeuristicDetection: false,
695
695
  enableHeuristicAction: false,
696
+ enablePopupMutationObserver: false,
696
697
  detectRetries: 20,
697
698
  isMainWorld: false,
698
699
  prehideTimeout: 2e3,
@@ -3695,16 +3696,29 @@
3695
3696
  this.updateState({ selfTest: selfTestResult });
3696
3697
  return selfTestResult;
3697
3698
  }
3698
- // TODO: use MutationObserver like in findCmp()
3699
3699
  async waitForPopup(cmp, retries = 10, interval = 500) {
3700
3700
  const logsConfig = this.config.logs;
3701
3701
  logsConfig.lifecycle && console.log("checking if popup is open...", cmp.name);
3702
+ let mutationObserver = null;
3703
+ if (this.config.enablePopupMutationObserver) {
3704
+ mutationObserver = this.domActions.waitForMutation("html", 1e4);
3705
+ mutationObserver.catch(() => {
3706
+ });
3707
+ }
3702
3708
  const isOpen = await cmp.detectPopup().catch((e) => {
3703
3709
  logsConfig.errors && console.warn(`error detecting popup for ${cmp.name}`, e);
3704
3710
  return false;
3705
3711
  });
3706
3712
  if (!isOpen && retries > 0) {
3707
- await this.domActions.wait(interval);
3713
+ if (mutationObserver) {
3714
+ try {
3715
+ await Promise.all([this.domActions.wait(interval), mutationObserver]);
3716
+ } catch (e) {
3717
+ logsConfig.lifecycle && console.log(cmp.name, "popup detection timed out waiting for DOM mutation");
3718
+ }
3719
+ } else {
3720
+ await this.domActions.wait(interval);
3721
+ }
3708
3722
  return this.waitForPopup(cmp, retries - 1, interval);
3709
3723
  }
3710
3724
  logsConfig.lifecycle && console.log(cmp.name, `popup is ${isOpen ? "open" : "not open"}`);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "manifest_version": 3,
3
3
  "name": "Autoconsent",
4
- "version": "2026.5.14",
4
+ "version": "2026.5.16",
5
5
  "background": {
6
6
  "scripts": [
7
7
  "background.bundle.js"
@@ -524,6 +524,7 @@
524
524
  enableGeneratedRules: true,
525
525
  enableHeuristicDetection: false,
526
526
  enableHeuristicAction: false,
527
+ enablePopupMutationObserver: false,
527
528
  detectRetries: 20,
528
529
  isMainWorld: false,
529
530
  prehideTimeout: 2e3,
@@ -553,6 +554,12 @@
553
554
  if (!storedConfig.enableHeuristicDetection) {
554
555
  storedConfig.enableHeuristicDetection = true;
555
556
  }
557
+ if (storedConfig.enablePopupMutationObserver === void 0) {
558
+ storedConfig.enablePopupMutationObserver = true;
559
+ }
560
+ if (storedConfig.enableHeuristicAction === void 0) {
561
+ storedConfig.enableHeuristicAction = true;
562
+ }
556
563
  if (!storedConfig.logs) {
557
564
  storedConfig.logs = {
558
565
  lifecycle: true,
@@ -654,6 +661,8 @@
654
661
  const heuristicActionOffRadio = document.querySelector("input#heuristic-action-off");
655
662
  const visualTestOnRadio = document.querySelector("input#visual-test-on");
656
663
  const visualTestOffRadio = document.querySelector("input#visual-test-off");
664
+ const popupMutationOnRadio = document.querySelector("input#popup-mutation-on");
665
+ const popupMutationOffRadio = document.querySelector("input#popup-mutation-off");
657
666
  const retriesInput = document.querySelector("input#retries");
658
667
  const logsLifecycleCheckbox = document.querySelector("input#logs-lifecycle");
659
668
  const logsRulestepsCheckbox = document.querySelector("input#logs-rulesteps");
@@ -739,6 +748,11 @@
739
748
  } else {
740
749
  visualTestOffRadio.checked = true;
741
750
  }
751
+ if (autoconsentConfig.enablePopupMutationObserver) {
752
+ popupMutationOnRadio.checked = true;
753
+ } else {
754
+ popupMutationOffRadio.checked = true;
755
+ }
742
756
  enabledCheckbox.addEventListener("change", async () => {
743
757
  await setIsEnabledForDomain(currentDomain, enabledCheckbox.checked);
744
758
  });
@@ -789,6 +803,12 @@
789
803
  }
790
804
  visualTestOnRadio.addEventListener("change", visualTestChange);
791
805
  visualTestOffRadio.addEventListener("change", visualTestChange);
806
+ function popupMutationChange() {
807
+ autoconsentConfig.enablePopupMutationObserver = popupMutationOnRadio.checked;
808
+ storageSet({ config: autoconsentConfig });
809
+ }
810
+ popupMutationOnRadio.addEventListener("change", popupMutationChange);
811
+ popupMutationOffRadio.addEventListener("change", popupMutationChange);
792
812
  function updateLogsConfig() {
793
813
  autoconsentConfig.logs = {
794
814
  lifecycle: logsLifecycleCheckbox.checked,
@@ -123,6 +123,20 @@
123
123
  </div>
124
124
  </fieldset>
125
125
 
126
+ <fieldset>
127
+ <legend>Popup mutation observer</legend>
128
+
129
+ <div>
130
+ <input type="radio" id="popup-mutation-on" name="popup-mutation" value="true" />
131
+ <label for="popup-mutation-on">On</label>
132
+ </div>
133
+
134
+ <div>
135
+ <input type="radio" id="popup-mutation-off" name="popup-mutation" value="false" checked />
136
+ <label for="popup-mutation-off">Off</label>
137
+ </div>
138
+ </fieldset>
139
+
126
140
  <fieldset>
127
141
  <legend>Debug logging</legend>
128
142
  <div>