Skip to content

Commit 74b6142

Browse files
Release build 4.37.0 [ci release]
1 parent 4b6c64f commit 74b6142

File tree

26 files changed

+1378
-601
lines changed

26 files changed

+1378
-601
lines changed

Sources/ContentScopeScripts/dist/contentScope.js

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1561,7 +1561,7 @@
15611561
* @return {Promise<any>}
15621562
*/
15631563
request(name, data = {}) {
1564-
const id = name + ".response";
1564+
const id = globalThis?.crypto?.randomUUID() || name + ".response";
15651565
const message = new RequestMessage({
15661566
context: this.messagingContext.context,
15671567
featureName: this.messagingContext.featureName,
@@ -5140,22 +5140,23 @@
51405140
let adLabelStrings = [];
51415141
const parser = new DOMParser();
51425142
let hiddenElements = /* @__PURE__ */ new WeakMap();
5143+
let modifiedElements = /* @__PURE__ */ new WeakMap();
51435144
let appliedRules = /* @__PURE__ */ new Set();
51445145
let shouldInjectStyleTag = false;
51455146
let mediaAndFormSelectors = "video,canvas,embed,object,audio,map,form,input,textarea,select,option,button";
5146-
let hideTimeouts = [0, 100, 200, 300, 400, 500, 1e3, 1500, 2e3, 2500, 3e3, 5e3, 1e4];
5147-
let unhideTimeouts = [750, 1500, 2250, 3e3, 4500, 6e3, 12e3];
5147+
let hideTimeouts = [0, 100, 300, 500, 1e3, 2e3, 3e3];
5148+
let unhideTimeouts = [1250, 2250, 3e3];
51485149
let featureInstance;
51495150
function collapseDomNode(element, rule, previousElement) {
51505151
if (!element) {
51515152
return;
51525153
}
51535154
const type = rule.type;
51545155
const alreadyHidden = hiddenElements.has(element);
5155-
if (alreadyHidden) {
5156+
const alreadyModified = modifiedElements.has(element) && modifiedElements.get(element) === rule.type;
5157+
if (alreadyHidden || alreadyModified) {
51565158
return;
51575159
}
5158-
featureInstance.addDebugFlag();
51595160
switch (type) {
51605161
case "hide":
51615162
hideNode(element);
@@ -5174,6 +5175,12 @@
51745175
appliedRules.add(rule);
51755176
}
51765177
break;
5178+
case "modify-attr":
5179+
modifyAttribute(element, rule.values);
5180+
break;
5181+
case "modify-style":
5182+
modifyStyle(element, rule.values);
5183+
break;
51775184
}
51785185
}
51795186
function expandNonEmptyDomNode(element, rule) {
@@ -5206,6 +5213,7 @@
52065213
element.style.setProperty("min-height", "0px", "important");
52075214
element.style.setProperty("height", "0px", "important");
52085215
element.hidden = true;
5216+
featureInstance.addDebugFlag();
52095217
}
52105218
function unhideNode(element) {
52115219
const cachedDisplayProperties = hiddenElements.get(element);
@@ -5241,6 +5249,18 @@
52415249
}
52425250
return false;
52435251
}
5252+
function modifyAttribute(element, values) {
5253+
values.forEach((item) => {
5254+
element.setAttribute(item.property, item.value);
5255+
});
5256+
modifiedElements.set(element, "modify-attr");
5257+
}
5258+
function modifyStyle(element, values) {
5259+
values.forEach((item) => {
5260+
element.style.setProperty(item.property, item.value, "important");
5261+
});
5262+
modifiedElements.set(element, "modify-style");
5263+
}
52445264
function extractTimeoutRules(rules) {
52455265
if (!shouldInjectStyleTag) {
52465266
return rules;
@@ -5258,21 +5278,23 @@
52585278
return timeoutRules;
52595279
}
52605280
function injectStyleTag(rules) {
5261-
let styleTagContents = "";
5281+
let selector = "";
52625282
rules.forEach((rule, i) => {
52635283
if (i !== rules.length - 1) {
5264-
styleTagContents = styleTagContents.concat(rule.selector, ",");
5284+
selector = selector.concat(rule.selector, ",");
52655285
} else {
5266-
styleTagContents = styleTagContents.concat(rule.selector);
5286+
selector = selector.concat(rule.selector);
52675287
}
52685288
});
5269-
styleTagContents = styleTagContents.concat("{display:none!important;min-height:0!important;height:0!important;}");
5289+
const styleTagProperties = "{display:none!important;min-height:0!important;height:0!important;}";
5290+
const styleTagContents = `${forgivingSelector(selector)} {${styleTagProperties}}`;
52705291
injectGlobalStyles(styleTagContents);
52715292
}
52725293
function hideAdNodes(rules) {
52735294
const document2 = globalThis.document;
52745295
rules.forEach((rule) => {
5275-
const matchingElementArray = [...document2.querySelectorAll(rule.selector)];
5296+
const selector = forgivingSelector(rule.selector);
5297+
const matchingElementArray = [...document2.querySelectorAll(selector)];
52765298
matchingElementArray.forEach((element) => {
52775299
collapseDomNode(element, rule);
52785300
});
@@ -5281,18 +5303,23 @@
52815303
function unhideLoadedAds() {
52825304
const document2 = globalThis.document;
52835305
appliedRules.forEach((rule) => {
5284-
const matchingElementArray = [...document2.querySelectorAll(rule.selector)];
5306+
const selector = forgivingSelector(rule.selector);
5307+
const matchingElementArray = [...document2.querySelectorAll(selector)];
52855308
matchingElementArray.forEach((element) => {
52865309
expandNonEmptyDomNode(element, rule);
52875310
});
52885311
});
52895312
}
5313+
function forgivingSelector(selector) {
5314+
return `:is(${selector})`;
5315+
}
52905316
class ElementHiding extends ContentFeature {
52915317
init() {
52925318
featureInstance = this;
52935319
if (isBeingFramed()) {
52945320
return;
52955321
}
5322+
let activeRules;
52965323
const globalRules = this.getFeatureSetting("rules");
52975324
adLabelStrings = this.getFeatureSetting("adLabelStrings");
52985325
shouldInjectStyleTag = this.getFeatureSetting("useStrictHideStyleTag");
@@ -5306,7 +5333,16 @@
53065333
const overrideRules = activeDomainRules.filter((rule) => {
53075334
return rule.type === "override";
53085335
});
5309-
let activeRules = activeDomainRules.concat(globalRules);
5336+
const disableDefault = activeDomainRules.some((rule) => {
5337+
return rule.type === "disable-default";
5338+
});
5339+
if (disableDefault) {
5340+
activeRules = activeDomainRules.filter((rule) => {
5341+
return rule.type !== "disable-default";
5342+
});
5343+
} else {
5344+
activeRules = activeDomainRules.concat(globalRules);
5345+
}
53105346
overrideRules.forEach((override) => {
53115347
activeRules = activeRules.filter((rule) => {
53125348
return rule.selector !== override.selector;
@@ -5339,6 +5375,7 @@
53395375
*/
53405376
applyRules(rules) {
53415377
const timeoutRules = extractTimeoutRules(rules);
5378+
const clearCacheTimer = unhideTimeouts.concat(hideTimeouts).reduce((a, b) => Math.max(a, b), 0) + 100;
53425379
hideTimeouts.forEach((timeout) => {
53435380
setTimeout(() => {
53445381
hideAdNodes(timeoutRules);
@@ -5352,7 +5389,8 @@
53525389
setTimeout(() => {
53535390
appliedRules = /* @__PURE__ */ new Set();
53545391
hiddenElements = /* @__PURE__ */ new WeakMap();
5355-
}, 3100);
5392+
modifiedElements = /* @__PURE__ */ new WeakMap();
5393+
}, clearCacheTimer);
53565394
}
53575395
}
53585396
class ExceptionHandler extends ContentFeature {
@@ -5387,20 +5425,15 @@
53875425
ddg_feature_elementHiding: ElementHiding,
53885426
ddg_feature_exceptionHandler: ExceptionHandler
53895427
};
5390-
function shouldRun() {
5391-
if (document instanceof HTMLDocument === false && (document instanceof XMLDocument === false || document.createElement("div") instanceof HTMLDivElement === false)) {
5392-
return false;
5393-
}
5394-
return true;
5395-
}
53965428
let initArgs = null;
53975429
const updates = [];
53985430
const features = [];
53995431
const alwaysInitFeatures = /* @__PURE__ */ new Set(["cookie"]);
54005432
const performanceMonitor = new PerformanceMonitor();
5433+
const isHTMLDocument = document instanceof HTMLDocument || document instanceof XMLDocument && document.createElement("div") instanceof HTMLDivElement;
54015434
function load(args) {
54025435
const mark = performanceMonitor.mark("load");
5403-
if (!shouldRun()) {
5436+
if (!isHTMLDocument) {
54045437
return;
54055438
}
54065439
const featureNames = platformSupport["apple"];
@@ -5415,7 +5448,7 @@
54155448
async function init(args) {
54165449
const mark = performanceMonitor.mark("init");
54175450
initArgs = args;
5418-
if (!shouldRun()) {
5451+
if (!isHTMLDocument) {
54195452
return;
54205453
}
54215454
registerMessageSecret(args.messageSecret);

Sources/ContentScopeScripts/dist/contentScopeIsolated.js

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1952,7 +1952,7 @@
19521952
* @return {Promise<any>}
19531953
*/
19541954
request (name, data = {}) {
1955-
const id = name + '.response';
1955+
const id = globalThis?.crypto?.randomUUID() || name + '.response';
19561956
const message = new RequestMessage({
19571957
context: this.messagingContext.context,
19581958
featureName: this.messagingContext.featureName,
@@ -4483,25 +4483,25 @@
44834483

44844484
/* global false */
44854485

4486-
function shouldRun () {
4487-
// don't inject into non-HTML documents (such as XML documents)
4488-
// but do inject into XHTML documents
4489-
// Should check HTMLDocument as Document is an alias for XMLDocument also.
4490-
if (document instanceof HTMLDocument === false && (
4491-
document instanceof XMLDocument === false ||
4492-
document.createElement('div') instanceof HTMLDivElement === false
4493-
)) {
4494-
return false
4495-
}
4496-
return true
4497-
}
4498-
44994486
let initArgs = null;
45004487
const updates = [];
45014488
const features = [];
45024489
const alwaysInitFeatures = new Set(['cookie']);
45034490
const performanceMonitor = new PerformanceMonitor();
45044491

4492+
// It's important to avoid enabling the features for non-HTML documents (such as
4493+
// XML documents that aren't XHTML). Note that it's necessary to check the
4494+
// document type in advance, to minimise the risk of a website breaking the
4495+
// checks by altering document.__proto__. In the future, it might be worth
4496+
// running the checks even earlier (and in the "isolated world" for the Chrome
4497+
// extension), to further reduce that risk.
4498+
const isHTMLDocument = (
4499+
document instanceof HTMLDocument || (
4500+
document instanceof XMLDocument &&
4501+
document.createElement('div') instanceof HTMLDivElement
4502+
)
4503+
);
4504+
45054505
/**
45064506
* @typedef {object} LoadArgs
45074507
* @property {import('./content-feature').Site} site
@@ -4517,7 +4517,7 @@
45174517
*/
45184518
function load (args) {
45194519
const mark = performanceMonitor.mark('load');
4520-
if (!shouldRun()) {
4520+
if (!isHTMLDocument) {
45214521
return
45224522
}
45234523

@@ -4536,7 +4536,7 @@
45364536
async function init (args) {
45374537
const mark = performanceMonitor.mark('init');
45384538
initArgs = args;
4539-
if (!shouldRun()) {
4539+
if (!isHTMLDocument) {
45404540
return
45414541
}
45424542
registerMessageSecret(args.messageSecret);

Sources/ContentScopeScripts/dist/pages/duckplayer/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -928,7 +928,7 @@
928928
* @return {Promise<any>}
929929
*/
930930
request(name, data = {}) {
931-
const id = name + ".response";
931+
const id = globalThis?.crypto?.randomUUID() || name + ".response";
932932
const message = new RequestMessage({
933933
context: this.messagingContext.context,
934934
featureName: this.messagingContext.featureName,

Sources/ContentScopeScripts/dist/pages/duckplayer/js/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -614,7 +614,7 @@
614614
* @return {Promise<any>}
615615
*/
616616
request(name, data = {}) {
617-
const id = name + ".response";
617+
const id = globalThis?.crypto?.randomUUID() || name + ".response";
618618
const message = new RequestMessage({
619619
context: this.messagingContext.context,
620620
featureName: this.messagingContext.featureName,

0 commit comments

Comments
 (0)