@duckduckgo/autoconsent 10.3.1 → 10.4.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.
@@ -1217,7 +1217,7 @@
1217
1217
  this.ccpaNotice = false;
1218
1218
  this.ccpaPopup = false;
1219
1219
  this.runContext = {
1220
- main: false,
1220
+ main: true,
1221
1221
  frame: true
1222
1222
  };
1223
1223
  }
@@ -1757,6 +1757,63 @@
1757
1757
  }
1758
1758
  };
1759
1759
 
1760
+ // lib/cmps/tumblr-com.ts
1761
+ var Tumblr = class extends AutoConsentCMPBase {
1762
+ constructor() {
1763
+ super(...arguments);
1764
+ this.name = "tumblr-com";
1765
+ this.runContext = {
1766
+ "urlPattern": "^https://(www\\.)?tumblr\\.com/"
1767
+ };
1768
+ }
1769
+ get hasSelfTest() {
1770
+ return false;
1771
+ }
1772
+ get isIntermediate() {
1773
+ return false;
1774
+ }
1775
+ get isCosmetic() {
1776
+ return false;
1777
+ }
1778
+ get prehideSelectors() {
1779
+ return ["#cmp-app-container"];
1780
+ }
1781
+ async detectCmp() {
1782
+ return this.elementExists("#cmp-app-container");
1783
+ }
1784
+ async detectPopup() {
1785
+ return this.elementVisible("#cmp-app-container", "any");
1786
+ }
1787
+ async optOut() {
1788
+ let iframe = document.querySelector("#cmp-app-container iframe");
1789
+ let settingsButton = iframe.contentDocument?.querySelector(".cmp-components-button.is-secondary");
1790
+ if (!settingsButton) {
1791
+ return false;
1792
+ }
1793
+ settingsButton.click();
1794
+ await waitFor(() => {
1795
+ const iframe2 = document.querySelector("#cmp-app-container iframe");
1796
+ return !!iframe2.contentDocument?.querySelector(".cmp__dialog input");
1797
+ }, 5, 500);
1798
+ iframe = document.querySelector("#cmp-app-container iframe");
1799
+ settingsButton = iframe.contentDocument?.querySelector(".cmp-components-button.is-secondary");
1800
+ if (!settingsButton) {
1801
+ return false;
1802
+ }
1803
+ settingsButton.click();
1804
+ return true;
1805
+ }
1806
+ async optIn() {
1807
+ const iframe = document.querySelector("#cmp-app-container iframe");
1808
+ const acceptButton = iframe.contentDocument.querySelector(".cmp-components-button.is-primary");
1809
+ if (acceptButton) {
1810
+ acceptButton.click();
1811
+ return true;
1812
+ }
1813
+ return false;
1814
+ }
1815
+ };
1816
+
1760
1817
  // lib/cmps/all.ts
1761
1818
  var dynamicCMPs = [
1762
1819
  TrustArcTop,
@@ -1770,7 +1827,8 @@
1770
1827
  Uniconsent,
1771
1828
  Conversant,
1772
1829
  Tiktok,
1773
- Airbnb
1830
+ Airbnb,
1831
+ Tumblr
1774
1832
  ];
1775
1833
 
1776
1834
  // lib/dom-actions.ts
@@ -2245,12 +2303,7 @@
2245
2303
  const globalHidden = [
2246
2304
  "#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium"
2247
2305
  ];
2248
- const selectors = this.rules.reduce((selectorList, rule) => {
2249
- if (rule.prehideSelectors) {
2250
- return [...selectorList, ...rule.prehideSelectors];
2251
- }
2252
- return selectorList;
2253
- }, globalHidden);
2306
+ const selectors = this.rules.filter((rule) => rule.prehideSelectors && rule.checkRunContext()).reduce((selectorList, rule) => [...selectorList, ...rule.prehideSelectors], globalHidden);
2254
2307
  this.updateState({ prehideOn: true });
2255
2308
  setTimeout(() => {
2256
2309
  if (this.config.enablePrehide && this.state.prehideOn && !["runningOptOut", "runningOptIn"].includes(this.state.lifecycle)) {
@@ -3276,10 +3329,13 @@
3276
3329
  click: 'div[role="dialog"] button:nth-child(2)'
3277
3330
  },
3278
3331
  {
3279
- waitFor: 'div[role="dialog"] a[data-anchor-id="privacy-policy"]'
3332
+ waitFor: 'div[role="dialog"] a[data-anchor-id="cookie-policy"]'
3280
3333
  },
3281
3334
  {
3282
- click: 'div[role="dialog"] button:nth-child(2)'
3335
+ waitFor: 'div[role="dialog"] button[role=switch]'
3336
+ },
3337
+ {
3338
+ click: 'div[role="dialog"] button:nth-child(2):not([role])'
3283
3339
  },
3284
3340
  {
3285
3341
  click: 'div[role="dialog"] div:last-child button:only-child'
@@ -4047,7 +4103,28 @@
4047
4103
  ],
4048
4104
  optOut: [
4049
4105
  {
4050
- click: "#cookiescript_reject"
4106
+ if: {
4107
+ exists: "#cookiescript_reject"
4108
+ },
4109
+ then: [
4110
+ {
4111
+ wait: 100
4112
+ },
4113
+ {
4114
+ click: "#cookiescript_reject"
4115
+ }
4116
+ ],
4117
+ else: [
4118
+ {
4119
+ click: "#cookiescript_manage"
4120
+ },
4121
+ {
4122
+ waitForVisible: ".cookiescript_fsd_main"
4123
+ },
4124
+ {
4125
+ waitForThenClick: "#cookiescript_reject"
4126
+ }
4127
+ ]
4051
4128
  }
4052
4129
  ],
4053
4130
  optIn: [
@@ -4417,7 +4494,7 @@
4417
4494
  {
4418
4495
  name: "csu-landtag-de",
4419
4496
  runContext: {
4420
- urlPattern: "^https://(www|)?\\.csu-landtag\\.de"
4497
+ urlPattern: "^https://(www\\.|)?csu-landtag\\.de"
4421
4498
  },
4422
4499
  prehideSelectors: [
4423
4500
  "#cookie-disclaimer"
@@ -6644,6 +6721,9 @@
6644
6721
  },
6645
6722
  {
6646
6723
  name: "onlyFans.com",
6724
+ runContext: {
6725
+ urlPattern: "^https://onlyfans\\.com/"
6726
+ },
6647
6727
  prehideSelectors: [
6648
6728
  "div.b-cookies-informer"
6649
6729
  ],
@@ -6667,10 +6747,18 @@
6667
6747
  click: "div.b-cookies-informer__nav > button:nth-child(1)"
6668
6748
  },
6669
6749
  {
6670
- click: 'div.b-cookies-informer__switchers > div:nth-child(2) > div[at-attr="checkbox"] > span.b-input-radio__container > input[type="checkbox"]'
6671
- },
6672
- {
6673
- click: "div.b-cookies-informer__nav > button"
6750
+ if: {
6751
+ exists: "div.b-cookies-informer__switchers"
6752
+ },
6753
+ then: [
6754
+ {
6755
+ click: "div.b-cookies-informer__switchers input:not([disabled])",
6756
+ all: true
6757
+ },
6758
+ {
6759
+ click: "div.b-cookies-informer__nav > button"
6760
+ }
6761
+ ]
6674
6762
  }
6675
6763
  ]
6676
6764
  },
@@ -7604,33 +7692,32 @@
7604
7692
  {
7605
7693
  name: "strato.de",
7606
7694
  prehideSelectors: [
7607
- "#cookie_initial_modal",
7608
- ".modal-backdrop"
7695
+ ".consent__wrapper"
7609
7696
  ],
7610
7697
  runContext: {
7611
7698
  urlPattern: "^https://www\\.strato\\.de/"
7612
7699
  },
7613
7700
  detectCmp: [
7614
7701
  {
7615
- exists: "#cookie_initial_modal"
7702
+ exists: ".consent"
7616
7703
  }
7617
7704
  ],
7618
7705
  detectPopup: [
7619
7706
  {
7620
- visible: "#cookie_initial_modal"
7707
+ visible: ".consent"
7621
7708
  }
7622
7709
  ],
7623
7710
  optIn: [
7624
7711
  {
7625
- click: "button#jss_consent_all_initial_modal"
7712
+ click: "button.consentAgree"
7626
7713
  }
7627
7714
  ],
7628
7715
  optOut: [
7629
7716
  {
7630
- click: "button#jss_open_settings_modal"
7717
+ click: "button.consentSettings"
7631
7718
  },
7632
7719
  {
7633
- click: "button#jss_consent_checked"
7720
+ waitForThenClick: "button#consentSubmit"
7634
7721
  }
7635
7722
  ]
7636
7723
  },
@@ -8414,33 +8501,6 @@
8414
8501
  }
8415
8502
  ]
8416
8503
  },
8417
- {
8418
- name: "tumblr-com",
8419
- cosmetic: true,
8420
- prehideSelectors: [
8421
- "#cmp-app-container"
8422
- ],
8423
- detectCmp: [
8424
- {
8425
- exists: "#cmp-app-container"
8426
- }
8427
- ],
8428
- detectPopup: [
8429
- {
8430
- visible: "#cmp-app-container"
8431
- }
8432
- ],
8433
- optIn: [
8434
- {
8435
- click: "#tumblr #cmp-app-container div.components-modal__frame > iframe > html body > div > div > div.cmp__dialog-footer > div > button.components-button.white-space-normal.is-primary"
8436
- }
8437
- ],
8438
- optOut: [
8439
- {
8440
- hide: "#cmp-app-container"
8441
- }
8442
- ]
8443
- },
8444
8504
  {
8445
8505
  name: "twitch-mobile",
8446
8506
  vendorUrl: "https://m.twitch.tv/",
package/lib/cmps/all.ts CHANGED
@@ -10,7 +10,7 @@ import Uniconsent from './uniconsent';
10
10
  import Conversant from './conversant';
11
11
  import Tiktok from './tiktok';
12
12
  import Airbnb from './airbnb';
13
-
13
+ import Tumblr from './tumblr-com';
14
14
 
15
15
  export const dynamicCMPs = [
16
16
  TrustArcTop,
@@ -25,4 +25,5 @@ export const dynamicCMPs = [
25
25
  Conversant,
26
26
  Tiktok,
27
27
  Airbnb,
28
+ Tumblr,
28
29
  ];
@@ -10,7 +10,7 @@ export default class SourcePoint extends AutoConsentCMPBase {
10
10
  ccpaPopup = false;
11
11
 
12
12
  runContext: RunContext = {
13
- main: false,
13
+ main: true,
14
14
  frame: true,
15
15
  }
16
16
 
@@ -0,0 +1,65 @@
1
+ import { waitFor } from "../utils";
2
+ import AutoConsentCMPBase from "./base";
3
+
4
+ export default class Tumblr extends AutoConsentCMPBase {
5
+ name = "tumblr-com";
6
+ runContext = {
7
+ "urlPattern": "^https://(www\\.)?tumblr\\.com/"
8
+ }
9
+
10
+ get hasSelfTest(): boolean {
11
+ return false;
12
+ }
13
+
14
+ get isIntermediate(): boolean {
15
+ return false;
16
+ }
17
+
18
+ get isCosmetic(): boolean {
19
+ return false;
20
+ }
21
+
22
+ get prehideSelectors(): string[] {
23
+ return ["#cmp-app-container"];
24
+ }
25
+
26
+ async detectCmp() {
27
+ return this.elementExists("#cmp-app-container");
28
+ }
29
+
30
+ async detectPopup() {
31
+ return this.elementVisible("#cmp-app-container", 'any');
32
+ }
33
+
34
+ async optOut() {
35
+ let iframe: HTMLIFrameElement = document.querySelector('#cmp-app-container iframe');
36
+ let settingsButton: HTMLButtonElement = iframe.contentDocument?.querySelector(".cmp-components-button.is-secondary");
37
+ if (!settingsButton) {
38
+ return false;
39
+ }
40
+ settingsButton.click();
41
+ await waitFor(() => {
42
+ const iframe: HTMLIFrameElement = document.querySelector('#cmp-app-container iframe');
43
+ return !!iframe.contentDocument?.querySelector(".cmp__dialog input");
44
+ }, 5, 500);
45
+
46
+ // it's a different button now
47
+ iframe = document.querySelector('#cmp-app-container iframe');
48
+ settingsButton = iframe.contentDocument?.querySelector(".cmp-components-button.is-secondary");
49
+ if (!settingsButton) {
50
+ return false;
51
+ }
52
+ settingsButton.click();
53
+ return true;
54
+ }
55
+
56
+ async optIn() {
57
+ const iframe: HTMLIFrameElement = document.querySelector('#cmp-app-container iframe');
58
+ const acceptButton: HTMLButtonElement = iframe.contentDocument.querySelector(".cmp-components-button.is-primary");
59
+ if (acceptButton) {
60
+ acceptButton.click();
61
+ return true;
62
+ }
63
+ return false;
64
+ }
65
+ }
package/lib/web.ts CHANGED
@@ -411,12 +411,10 @@ export default class AutoConsent {
411
411
  "#didomi-popup,.didomi-popup-container,.didomi-popup-notice,.didomi-consent-popup-preferences,#didomi-notice,.didomi-popup-backdrop,.didomi-screen-medium",
412
412
  ]
413
413
 
414
- const selectors = this.rules.reduce((selectorList, rule) => {
415
- if (rule.prehideSelectors) {
416
- return [...selectorList, ...rule.prehideSelectors];
417
- }
418
- return selectorList;
419
- }, globalHidden);
414
+ const selectors = this.rules
415
+ .filter(rule => rule.prehideSelectors && rule.checkRunContext())
416
+ .reduce((selectorList, rule) =>
417
+ [...selectorList, ...rule.prehideSelectors], globalHidden);
420
418
 
421
419
  this.updateState({ prehideOn: true })
422
420
  setTimeout(() => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@duckduckgo/autoconsent",
3
- "version": "10.3.1",
3
+ "version": "10.4.0",
4
4
  "description": "",
5
5
  "main": "dist/autoconsent.cjs.js",
6
6
  "module": "dist/autoconsent.esm.js",
@@ -12,8 +12,9 @@
12
12
  "then": [{ "click": "div[role=\"dialog\"] button:nth-child(2)" }],
13
13
  "else": [
14
14
  { "click": "div[role=\"dialog\"] button:nth-child(2)" },
15
- { "waitFor": "div[role=\"dialog\"] a[data-anchor-id=\"privacy-policy\"]" },
16
- { "click": "div[role=\"dialog\"] button:nth-child(2)" },
15
+ { "waitFor": "div[role=\"dialog\"] a[data-anchor-id=\"cookie-policy\"]" },
16
+ { "waitFor": "div[role=\"dialog\"] button[role=switch]" },
17
+ { "click": "div[role=\"dialog\"] button:nth-child(2):not([role])" },
17
18
  { "click": "div[role=\"dialog\"] div:last-child button:only-child" }
18
19
  ]
19
20
  }
@@ -4,6 +4,19 @@
4
4
  "prehideSelectors": ["#cookiescript_injected"],
5
5
  "detectCmp": [{"exists": "#cookiescript_injected"}],
6
6
  "detectPopup": [{"visible": "#cookiescript_injected"}],
7
- "optOut": [{"click": "#cookiescript_reject"}],
7
+ "optOut": [
8
+ {
9
+ "if": { "exists": "#cookiescript_reject" },
10
+ "then": [
11
+ { "wait": 100 },
12
+ {"click": "#cookiescript_reject" }
13
+ ],
14
+ "else": [
15
+ { "click": "#cookiescript_manage" },
16
+ { "waitForVisible": ".cookiescript_fsd_main" },
17
+ { "waitForThenClick": "#cookiescript_reject" }
18
+ ]
19
+ }
20
+ ],
8
21
  "optIn": [{"click": "#cookiescript_accept"}]
9
22
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "csu-landtag-de",
3
3
  "runContext": {
4
- "urlPattern": "^https://(www|)?\\.csu-landtag\\.de"
4
+ "urlPattern": "^https://(www\\.|)?csu-landtag\\.de"
5
5
  },
6
6
  "prehideSelectors": ["#cookie-disclaimer"],
7
7
  "detectCmp": [
@@ -1,5 +1,8 @@
1
1
  {
2
2
  "name": "onlyFans.com",
3
+ "runContext": {
4
+ "urlPattern": "^https://onlyfans\\.com/"
5
+ },
3
6
  "prehideSelectors": ["div.b-cookies-informer"],
4
7
  "detectCmp": [{ "exists": "div.b-cookies-informer" }],
5
8
  "detectPopup": [{ "exists": "div.b-cookies-informer" }],
@@ -11,8 +14,14 @@
11
14
  "click": "div.b-cookies-informer__nav > button:nth-child(1)"
12
15
  },
13
16
  {
14
- "click": "div.b-cookies-informer__switchers > div:nth-child(2) > div[at-attr=\"checkbox\"] > span.b-input-radio__container > input[type=\"checkbox\"]"
15
- },
16
- { "click": "div.b-cookies-informer__nav > button"}
17
+ "if": {"exists": "div.b-cookies-informer__switchers"},
18
+ "then": [
19
+ {
20
+ "click": "div.b-cookies-informer__switchers input:not([disabled])",
21
+ "all": true
22
+ },
23
+ { "click": "div.b-cookies-informer__nav > button"}
24
+ ]
25
+ }
17
26
  ]
18
27
  }
@@ -1,20 +1,20 @@
1
1
  {
2
2
  "name": "strato.de",
3
- "prehideSelectors": ["#cookie_initial_modal", ".modal-backdrop"],
3
+ "prehideSelectors": [".consent__wrapper"],
4
4
  "runContext": {
5
5
  "urlPattern": "^https://www\\.strato\\.de/"
6
6
  },
7
- "detectCmp": [{ "exists": "#cookie_initial_modal" }],
8
- "detectPopup": [{ "visible": "#cookie_initial_modal" }],
7
+ "detectCmp": [{ "exists": ".consent" }],
8
+ "detectPopup": [{ "visible": ".consent" }],
9
9
  "optIn": [{
10
- "click": "button#jss_consent_all_initial_modal"
10
+ "click": "button.consentAgree"
11
11
  }],
12
12
  "optOut": [
13
13
  {
14
- "click": "button#jss_open_settings_modal"
14
+ "click": "button.consentSettings"
15
15
  },
16
16
  {
17
- "click": "button#jss_consent_checked"
17
+ "waitForThenClick": "button#consentSubmit"
18
18
  }
19
19
  ]
20
20
  }
package/rules/rules.json CHANGED
@@ -969,10 +969,13 @@
969
969
  "click": "div[role=\"dialog\"] button:nth-child(2)"
970
970
  },
971
971
  {
972
- "waitFor": "div[role=\"dialog\"] a[data-anchor-id=\"privacy-policy\"]"
972
+ "waitFor": "div[role=\"dialog\"] a[data-anchor-id=\"cookie-policy\"]"
973
973
  },
974
974
  {
975
- "click": "div[role=\"dialog\"] button:nth-child(2)"
975
+ "waitFor": "div[role=\"dialog\"] button[role=switch]"
976
+ },
977
+ {
978
+ "click": "div[role=\"dialog\"] button:nth-child(2):not([role])"
976
979
  },
977
980
  {
978
981
  "click": "div[role=\"dialog\"] div:last-child button:only-child"
@@ -1740,7 +1743,28 @@
1740
1743
  ],
1741
1744
  "optOut": [
1742
1745
  {
1743
- "click": "#cookiescript_reject"
1746
+ "if": {
1747
+ "exists": "#cookiescript_reject"
1748
+ },
1749
+ "then": [
1750
+ {
1751
+ "wait": 100
1752
+ },
1753
+ {
1754
+ "click": "#cookiescript_reject"
1755
+ }
1756
+ ],
1757
+ "else": [
1758
+ {
1759
+ "click": "#cookiescript_manage"
1760
+ },
1761
+ {
1762
+ "waitForVisible": ".cookiescript_fsd_main"
1763
+ },
1764
+ {
1765
+ "waitForThenClick": "#cookiescript_reject"
1766
+ }
1767
+ ]
1744
1768
  }
1745
1769
  ],
1746
1770
  "optIn": [
@@ -2110,7 +2134,7 @@
2110
2134
  {
2111
2135
  "name": "csu-landtag-de",
2112
2136
  "runContext": {
2113
- "urlPattern": "^https://(www|)?\\.csu-landtag\\.de"
2137
+ "urlPattern": "^https://(www\\.|)?csu-landtag\\.de"
2114
2138
  },
2115
2139
  "prehideSelectors": [
2116
2140
  "#cookie-disclaimer"
@@ -4337,6 +4361,9 @@
4337
4361
  },
4338
4362
  {
4339
4363
  "name": "onlyFans.com",
4364
+ "runContext": {
4365
+ "urlPattern": "^https://onlyfans\\.com/"
4366
+ },
4340
4367
  "prehideSelectors": [
4341
4368
  "div.b-cookies-informer"
4342
4369
  ],
@@ -4360,10 +4387,18 @@
4360
4387
  "click": "div.b-cookies-informer__nav > button:nth-child(1)"
4361
4388
  },
4362
4389
  {
4363
- "click": "div.b-cookies-informer__switchers > div:nth-child(2) > div[at-attr=\"checkbox\"] > span.b-input-radio__container > input[type=\"checkbox\"]"
4364
- },
4365
- {
4366
- "click": "div.b-cookies-informer__nav > button"
4390
+ "if": {
4391
+ "exists": "div.b-cookies-informer__switchers"
4392
+ },
4393
+ "then": [
4394
+ {
4395
+ "click": "div.b-cookies-informer__switchers input:not([disabled])",
4396
+ "all": true
4397
+ },
4398
+ {
4399
+ "click": "div.b-cookies-informer__nav > button"
4400
+ }
4401
+ ]
4367
4402
  }
4368
4403
  ]
4369
4404
  },
@@ -5297,33 +5332,32 @@
5297
5332
  {
5298
5333
  "name": "strato.de",
5299
5334
  "prehideSelectors": [
5300
- "#cookie_initial_modal",
5301
- ".modal-backdrop"
5335
+ ".consent__wrapper"
5302
5336
  ],
5303
5337
  "runContext": {
5304
5338
  "urlPattern": "^https://www\\.strato\\.de/"
5305
5339
  },
5306
5340
  "detectCmp": [
5307
5341
  {
5308
- "exists": "#cookie_initial_modal"
5342
+ "exists": ".consent"
5309
5343
  }
5310
5344
  ],
5311
5345
  "detectPopup": [
5312
5346
  {
5313
- "visible": "#cookie_initial_modal"
5347
+ "visible": ".consent"
5314
5348
  }
5315
5349
  ],
5316
5350
  "optIn": [
5317
5351
  {
5318
- "click": "button#jss_consent_all_initial_modal"
5352
+ "click": "button.consentAgree"
5319
5353
  }
5320
5354
  ],
5321
5355
  "optOut": [
5322
5356
  {
5323
- "click": "button#jss_open_settings_modal"
5357
+ "click": "button.consentSettings"
5324
5358
  },
5325
5359
  {
5326
- "click": "button#jss_consent_checked"
5360
+ "waitForThenClick": "button#consentSubmit"
5327
5361
  }
5328
5362
  ]
5329
5363
  },
@@ -6107,33 +6141,6 @@
6107
6141
  }
6108
6142
  ]
6109
6143
  },
6110
- {
6111
- "name": "tumblr-com",
6112
- "cosmetic": true,
6113
- "prehideSelectors": [
6114
- "#cmp-app-container"
6115
- ],
6116
- "detectCmp": [
6117
- {
6118
- "exists": "#cmp-app-container"
6119
- }
6120
- ],
6121
- "detectPopup": [
6122
- {
6123
- "visible": "#cmp-app-container"
6124
- }
6125
- ],
6126
- "optIn": [
6127
- {
6128
- "click": "#tumblr #cmp-app-container div.components-modal__frame > iframe > html body > div > div > div.cmp__dialog-footer > div > button.components-button.white-space-normal.is-primary"
6129
- }
6130
- ],
6131
- "optOut": [
6132
- {
6133
- "hide": "#cmp-app-container"
6134
- }
6135
- ]
6136
- },
6137
6144
  {
6138
6145
  "name": "twitch-mobile",
6139
6146
  "vendorUrl": "https://m.twitch.tv/",
@@ -1,10 +0,0 @@
1
- {
2
- "name": "tumblr-com",
3
- "cosmetic": true,
4
- "prehideSelectors": ["#cmp-app-container"],
5
- "detectCmp": [{ "exists": "#cmp-app-container" }],
6
- "detectPopup": [{ "visible": "#cmp-app-container" }],
7
- "optIn":
8
- [{"click": "#tumblr #cmp-app-container div.components-modal__frame > iframe > html body > div > div > div.cmp__dialog-footer > div > button.components-button.white-space-normal.is-primary" }],
9
- "optOut": [{ "hide": "#cmp-app-container" }]
10
- }