From 1e2de503344b0501b09015e29741e522bd721d44 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philipp=20Cla=C3=9Fen?= Date: Fri, 2 Oct 2026 12:56:12 +0200 Subject: [PATCH] Share one safeSelf() cache between the scriptlets in a frame. Context: Each scriptlet has its own copy of safeSelf(). It saves the functions that it finds when it first runs, and those were often already the wrappers that earlier scriptlets had installed, not the browser's own functions. So each hook called all earlier hooks again. With six hooks on JSON.stringify (as on youtube.com), one JSON.stringify call from the page became 2^6=64 native calls. The extension gives each scriptlet its own copy of scriptletGlobals, so the first scriptlet in a frame (and world) now keeps the cache on globalThis, and the later scriptlets use it. The property is read-only, and its key has the uBO version, so other versions do not share it. This works for all injection paths (registered scripts and executeScript), without changes in the extension. refs https://github.com/ghostery/ghostery-extension/issues/3672 --- build.ts | 15 +- test.js | 53 ++++ ubo.js | 720 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 787 insertions(+), 1 deletion(-) diff --git a/build.ts b/build.ts index fd2b6e3..24fbbf5 100644 --- a/build.ts +++ b/build.ts @@ -18,6 +18,19 @@ for (const scriptlet of scriptlets) { } } +// uBO runs all scriptlets of a page in one scope, so they share one safeSelf() cache. Our scriptlets are separate functions, so they share it on globalThis. +// Else each hook captures the earlier hooks as natives, and calls grow as 2^n. The uBO version is in the key, so other versions do not share it. +const safeSelf = index.get('safe-self.fn').fn; +const shareSafeSelf = `try { + const key = Symbol.for('safeSelf.${tagName}'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} +`; + console.log(` /******************************************************************************* @@ -67,7 +80,7 @@ requiresTrust: ${scriptlet.requiresTrust || false}, func: function (scriptletGlobals = {}, ...args) { ${deps.map((dep) => dep.toString()).join('\n')} ${scriptlet.fn.toString()}; -${scriptlet.fn.name}(...args); +${deps.includes(safeSelf) ? shareSafeSelf : ''}${scriptlet.fn.name}(...args); }, }; `; diff --git a/test.js b/test.js index 2215796..41b6ecf 100644 --- a/test.js +++ b/test.js @@ -1,5 +1,6 @@ import { test, suite } from "node:test"; import assert from "node:assert"; +import vm from "node:vm"; import scriptlets from "./index.js"; test("default export is an object", () => { @@ -26,3 +27,55 @@ suite("uBO", () => { assert.strictEqual(scriptlets["set-constant.js"], scriptlets["set.js"]); }); }); + +suite("safeSelf() cache", () => { + // Each hook clones the argument with safe.JSON_parse(safe.JSON_stringify(obj)) + const func = scriptlets["trusted-edit-inbound-object.js"].func; + const HOOKS = 6; + // Same code as the extension makes for each scriptlet; the first argument is scriptletGlobals + const hooks = Array.from({ length: HOOKS }, (_, i) => + `(${func})(...${JSON.stringify([{}, "JSON.stringify", "0", `[?.hook${i}]+={"edited${i}":true}`])});` + ); + + // A fresh realm is the page; counters wrap the native JSON methods before the scriptlets run + function createPage() { + const page = vm.createContext({ EventTarget: class {}, Request: class {} }); + vm.runInContext( + ` + const { parse, stringify } = JSON; + globalThis.calls = { parse: 0, stringify: 0 }; + JSON.parse = function (...args) { calls.parse += 1; return parse.apply(JSON, args); }; + JSON.stringify = function (...args) { calls.stringify += 1; return stringify.apply(JSON, args); }; + `, + page + ); + return page; + } + + test("is shared in a realm, so stacked hooks stay linear", () => { + const page = createPage(); + for (const hook of hooks) { + vm.runInContext(hook, page); + } + + const result = vm.runInContext( + "calls.parse = 0; calls.stringify = 0; JSON.stringify({ hook0: true, hook5: true });", + page + ); + assert.deepStrictEqual(JSON.parse(result), { hook0: true, hook5: true, edited0: true, edited5: true }); + // One call from the page plus one clone per hook, not 2^n + assert.deepStrictEqual({ ...page.calls }, { parse: HOOKS, stringify: HOOKS + 1 }); + }); + + test("is read-only and not enumerable", () => { + const page = createPage(); + vm.runInContext(hooks.join("\n"), page); + + const keys = vm + .runInContext("Object.getOwnPropertySymbols(globalThis)", page) + .filter((key) => key.description.startsWith("safeSelf.")); + assert.strictEqual(keys.length, 1); + const { value, ...flags } = Object.getOwnPropertyDescriptor(page, keys[0]); + assert.deepStrictEqual(flags, { writable: false, enumerable: false, configurable: false }); + }); +}); diff --git a/ubo.js b/ubo.js index c4aed2d..a624943 100644 --- a/ubo.js +++ b/ubo.js @@ -368,6 +368,14 @@ function abortCurrentScript(...args) { abortCurrentScriptFn(...args); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} abortCurrentScript(...args); }, }; @@ -670,6 +678,14 @@ function setAttr( const options = safe.parseVarargs(varargs); setAttrFn(false, logPrefix, selector, attr, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setAttr(...args); }, }; @@ -962,6 +978,14 @@ function trustedSetAttr( const options = safe.parseVarargs(varargs); setAttrFn(true, logPrefix, selector, attr, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetAttr(...args); }, }; @@ -1281,6 +1305,14 @@ function removeAttr( }; runAt(( ) => { start(); }, safe.String_split.call(behavior, /\s+/)); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} removeAttr(...args); }, }; @@ -1577,6 +1609,14 @@ function trustedCreateHTML( }; runAt(start, extraArgs.runAt || 'loading'); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedCreateHTML(...args); }, }; @@ -1980,6 +2020,14 @@ function hrefSanitizer( }; runAt(( ) => { start(); }, 'interactive'); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} hrefSanitizer(...args); }, }; @@ -2860,6 +2908,14 @@ function editOutboundObjectFn( function editOutboundObject(propChain = '', jsonq = '') { editOutboundObjectFn(false, propChain, jsonq); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editOutboundObject(...args); }, }; @@ -3720,6 +3776,14 @@ function editOutboundObjectFn( function trustedEditOutboundObject(propChain = '', jsonq = '') { editOutboundObjectFn(true, propChain, jsonq); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditOutboundObject(...args); }, }; @@ -4579,6 +4643,14 @@ function jsonEditFn(trusted = false, jsonq = '', ...varargs) { function jsonEdit(jsonq = '', ...varargs) { jsonEditFn(false, jsonq, ...varargs); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonEdit(...args); }, }; @@ -5438,6 +5510,14 @@ function jsonEditFn(trusted = false, jsonq = '', ...varargs) { function trustedJsonEdit(jsonq = '', ...varargs) { jsonEditFn(true, jsonq, ...varargs); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonEdit(...args); }, }; @@ -6325,6 +6405,14 @@ function editInboundObjectFn( function editInboundObject(propChain = '', argPos = '', jsonq = '') { editInboundObjectFn(false, propChain, argPos, jsonq); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editInboundObject(...args); }, }; @@ -7212,6 +7300,14 @@ function editInboundObjectFn( function trustedEditInboundObject(propChain = '', argPos = '', jsonq = '') { editInboundObjectFn(true, propChain, argPos, jsonq); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditInboundObject(...args); }, }; @@ -8082,6 +8178,14 @@ function editThisObjectFn( function editThisObject(...args) { editThisObjectFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editThisObject(...args); }, }; @@ -8952,6 +9056,14 @@ function editThisObjectFn( function trustedEditThisObject(...args) { editThisObjectFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditThisObject(...args); }, }; @@ -9794,6 +9906,14 @@ function editObjectOnGetterFn( function editObjectOnGetter(...args) { editObjectOnGetterFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editObjectOnGetter(...args); }, }; @@ -10636,6 +10756,14 @@ function editObjectOnGetterFn( function trustedEditObjectOnGetter(...args) { editObjectOnGetterFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditObjectOnGetter(...args); }, }; @@ -11481,6 +11609,14 @@ function editObjectOnSetterFn( function editObjectOnSetter(...args) { editObjectOnSetterFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editObjectOnSetter(...args); }, }; @@ -12326,6 +12462,14 @@ function editObjectOnSetterFn( function trustedEditObjectOnSetter(...args) { editObjectOnSetterFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditObjectOnSetter(...args); }, }; @@ -13211,6 +13355,14 @@ async function editElementObjectFn( function editElementObject(...args) { editElementObjectFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} editElementObject(...args); }, }; @@ -14096,6 +14248,14 @@ async function editElementObjectFn( function trustedEditElementObject(...args) { editElementObjectFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedEditElementObject(...args); }, }; @@ -14937,6 +15097,14 @@ function jsonEditXhrResponseFn(trusted, jsonq = '', ...varargs) { function jsonEditXhrResponse(jsonq = '', ...args) { jsonEditXhrResponseFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonEditXhrResponse(...args); }, }; @@ -15778,6 +15946,14 @@ function jsonEditXhrResponseFn(trusted, jsonq = '', ...varargs) { function trustedJsonEditXhrResponse(jsonq = '', ...args) { jsonEditXhrResponseFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonEditXhrResponse(...args); }, }; @@ -16602,6 +16778,14 @@ function jsonEditXhrRequestFn(trusted, jsonq = '', ...varargs) { function jsonEditXhrRequest(jsonq = '', ...args) { jsonEditXhrRequestFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonEditXhrRequest(...args); }, }; @@ -17426,6 +17610,14 @@ function jsonEditXhrRequestFn(trusted, jsonq = '', ...varargs) { function trustedJsonEditXhrRequest(jsonq = '', ...args) { jsonEditXhrRequestFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonEditXhrRequest(...args); }, }; @@ -18384,6 +18576,14 @@ function jsonEditFetchResponseFn(trusted, jsonq = '', ...varargs) { function jsonEditFetchResponse(jsonq = '', ...args) { jsonEditFetchResponseFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonEditFetchResponse(...args); }, }; @@ -19342,6 +19542,14 @@ function jsonEditFetchResponseFn(trusted, jsonq = '', ...varargs) { function trustedJsonEditFetchResponse(jsonq = '', ...args) { jsonEditFetchResponseFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonEditFetchResponse(...args); }, }; @@ -20297,6 +20505,14 @@ function jsonEditFetchRequestFn(trusted, jsonq = '', ...varargs) { function jsonEditFetchRequest(jsonq = '', ...args) { jsonEditFetchRequestFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonEditFetchRequest(...args); }, }; @@ -21252,6 +21468,14 @@ function jsonEditFetchRequestFn(trusted, jsonq = '', ...varargs) { function trustedJsonEditFetchRequest(jsonq = '', ...args) { jsonEditFetchRequestFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonEditFetchRequest(...args); }, }; @@ -22121,6 +22345,14 @@ function jsonlEditXhrResponseFn(trusted, jsonq = '', ...varargs) { function jsonlEditXhrResponse(jsonq = '', ...args) { jsonlEditXhrResponseFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonlEditXhrResponse(...args); }, }; @@ -22990,6 +23222,14 @@ function jsonlEditXhrResponseFn(trusted, jsonq = '', ...varargs) { function trustedJsonlEditXhrResponse(jsonq = '', ...args) { jsonlEditXhrResponseFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonlEditXhrResponse(...args); }, }; @@ -23989,6 +24229,14 @@ function jsonlEditFetchResponseFn(trusted, jsonq = '', ...varargs) { function jsonlEditFetchResponse(jsonq = '', ...args) { jsonlEditFetchResponseFn(false, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonlEditFetchResponse(...args); }, }; @@ -24988,6 +25236,14 @@ function jsonlEditFetchResponseFn(trusted, jsonq = '', ...varargs) { function trustedJsonlEditFetchResponse(jsonq = '', ...args) { jsonlEditFetchResponseFn(true, jsonq, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedJsonlEditFetchResponse(...args); }, }; @@ -25286,6 +25542,14 @@ function abortOnStackTrace( const owner = window; makeProxy(owner, chain); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} abortOnStackTrace(...args); }, }; @@ -25703,6 +25967,14 @@ function trustedPruneInboundObject( }, }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedPruneInboundObject(...args); }, }; @@ -26172,6 +26444,14 @@ function trustedPruneOutboundObject( return objAfter || objBefore; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedPruneOutboundObject(...args); }, }; @@ -26649,6 +26929,14 @@ function jsonPrune( return objAfter; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonPrune(...args); }, }; @@ -27134,6 +27422,14 @@ function jsonPruneFetchResponse( apply: applyHandler }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonPruneFetchResponse(...args); }, }; @@ -27604,6 +27900,14 @@ function jsonPruneXhrResponse( } }; }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} jsonPruneXhrResponse(...args); }, }; @@ -28063,6 +28367,14 @@ function evaldataPrune( return after || before; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} evaldataPrune(...args); }, }; @@ -28365,6 +28677,14 @@ function noEvalIf( return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} noEvalIf(...args); }, }; @@ -28768,6 +29088,14 @@ function preventAddEventListener( } }, extraArgs.runAt); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventAddEventListener(...args); }, }; @@ -29113,6 +29441,14 @@ function preventBab() { return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventBab(...args); }, }; @@ -29517,6 +29853,14 @@ function preventClipboardWrite(matches = '', ...varargs) { }); }, 'interactive') }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventClipboardWrite(...args); }, }; @@ -29727,6 +30071,14 @@ function preventDialog( subtree: true, }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventDialog(...args); }, }; @@ -30231,6 +30583,14 @@ function preventFetchFn( function preventFetch(...args) { preventFetchFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventFetch(...args); }, }; @@ -30735,6 +31095,14 @@ function preventFetchFn( function trustedPreventFetch(...args) { preventFetchFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedPreventFetch(...args); }, }; @@ -30971,6 +31339,14 @@ function freezeElementProperty( }, }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} freezeElementProperty(...args); }, }; @@ -31213,6 +31589,14 @@ function preventInnerHTML( ) { freezeElementProperty('innerHTML', selector, pattern); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventInnerHTML(...args); }, }; @@ -31417,6 +31801,14 @@ function preventNavigation( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventNavigation(...args); }, }; @@ -31755,6 +32147,14 @@ function preventSetTimeout( return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventSetTimeout(...args); }, }; @@ -32093,6 +32493,14 @@ function preventSetInterval( return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventSetInterval(...args); }, }; @@ -32396,6 +32804,14 @@ function preventRequestAnimationFrame( return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventRequestAnimationFrame(...args); }, }; @@ -32814,6 +33230,14 @@ function setConstant( ) { setConstantFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setConstant(...args); }, }; @@ -33232,6 +33656,14 @@ function trustedSetConstant( ) { setConstantFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetConstant(...args); }, }; @@ -33743,6 +34175,14 @@ function trustedReplaceArgument( return context.reflect(); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedReplaceArgument(...args); }, }; @@ -34044,6 +34484,14 @@ function spoofCSS( }, }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} spoofCSS(...args); }, }; @@ -34600,6 +35048,14 @@ function preventXhrFn( function preventXhr(...args) { preventXhrFn(false, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventXhr(...args); }, }; @@ -35156,6 +35612,14 @@ function preventXhrFn( function trustedPreventXhr(...args) { preventXhrFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedPreventXhr(...args); }, }; @@ -35585,6 +36049,14 @@ function mpegdashPrune( return before; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} mpegdashPrune(...args); }, }; @@ -35906,6 +36378,14 @@ function setCookie( safe.uboLog(logPrefix, 'Done'); } }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setCookie(...args); }, }; @@ -36230,6 +36710,14 @@ function setCookie( function setCookieReload(name, value, path, ...args) { setCookie(name, value, path, 'reload', '1', ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setCookieReload(...args); }, }; @@ -36540,6 +37028,14 @@ function trustedSetCookie( safe.uboLog(logPrefix, 'Done'); } }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetCookie(...args); }, }; @@ -36853,6 +37349,14 @@ function trustedSetCookie( function trustedSetCookieReload(name, value, offsetExpiresSec, path, ...args) { trustedSetCookie(name, value, offsetExpiresSec, path, 'reload', '1', ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetCookieReload(...args); }, }; @@ -37109,6 +37613,14 @@ function removeCookie( }, { passive: true }); } }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} removeCookie(...args); }, }; @@ -37403,6 +37915,14 @@ function setLocalStorageItem(key = '', value = '', ...varargs) { const options = safe.parseVarargs(varargs) setLocalStorageItemFn('local', false, key, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setLocalStorageItem(...args); }, }; @@ -37697,6 +38217,14 @@ function setSessionStorageItem(key = '', value = '', ...varargs) { const options = safe.parseVarargs(varargs) setLocalStorageItemFn('session', false, key, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} setSessionStorageItem(...args); }, }; @@ -37991,6 +38519,14 @@ function trustedSetLocalStorageItem(key = '', value = '', ...varargs) { const options = safe.parseVarargs(varargs) setLocalStorageItemFn('local', true, key, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetLocalStorageItem(...args); }, }; @@ -38285,6 +38821,14 @@ function trustedSetSessionStorageItem(key = '', value = '', ...varargs) { const options = safe.parseVarargs(varargs) setLocalStorageItemFn('session', true, key, value, options); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSetSessionStorageItem(...args); }, }; @@ -38531,6 +39075,14 @@ function abortOnPropertyRead( const owner = window; makeProxy(owner, chain); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} abortOnPropertyRead(...args); }, }; @@ -38755,6 +39307,14 @@ function abortOnPropertyWrite( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} abortOnPropertyWrite(...args); }, }; @@ -38966,6 +39526,14 @@ function adjustSetInterval( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} adjustSetInterval(...args); }, }; @@ -39177,6 +39745,14 @@ function adjustSetTimeout( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} adjustSetTimeout(...args); }, }; @@ -39386,6 +39962,14 @@ function preventRefresh( }; self.addEventListener('load', defuse, { capture: true, once: true }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventRefresh(...args); }, }; @@ -39666,6 +40250,14 @@ function removeClass( start(); }, /\bcomplete\b/.test(behavior) ? 'idle' : 'loading'); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} removeClass(...args); }, }; @@ -39908,6 +40500,14 @@ function webrtcIf( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} webrtcIf(...args); }, }; @@ -40275,6 +40875,14 @@ function noWindowOpenIf( return popup; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} noWindowOpenIf(...args); }, }; @@ -40479,6 +41087,14 @@ function closeWindow( console.log(ex); } }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} closeWindow(...args); }, }; @@ -41045,6 +41661,14 @@ function xmlPrune( return before; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} xmlPrune(...args); }, }; @@ -41485,6 +42109,14 @@ function m3uPrune( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} m3uPrune(...args); }, }; @@ -41697,6 +42329,14 @@ function callNothrow( }, }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} callNothrow(...args); }, }; @@ -42035,6 +42675,14 @@ function removeNodeText( ) { replaceNodeTextFn(nodeName, '', '', 'includes', includes || '', ...extraArgs); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} removeNodeText(...args); }, }; @@ -42232,6 +42880,14 @@ function preventCanvas( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} preventCanvas(...args); }, }; @@ -42711,6 +43367,14 @@ function replaceNodeText( ) { replaceNodeTextFn(nodeName, pattern, replacement, ...extraArgs); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} replaceNodeText(...args); }, }; @@ -43030,6 +43694,14 @@ function replaceFetchResponseFn( function trustedReplaceFetchResponse(...args) { replaceFetchResponseFn(true, ...args); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedReplaceFetchResponse(...args); }, }; @@ -43323,6 +43995,14 @@ function trustedReplaceXhrResponse( } }; }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedReplaceXhrResponse(...args); }, }; @@ -43756,6 +44436,14 @@ function trustedClickElement( runAtHtmlElementFn(process); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedClickElement(...args); }, }; @@ -44079,6 +44767,14 @@ function trustedReplaceOutboundText( return encodedTextAfter; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedReplaceOutboundText(...args); }, }; @@ -44488,6 +45184,14 @@ function trustedSuppressNativeMethod( } }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedSuppressNativeMethod(...args); }, }; @@ -44810,6 +45514,14 @@ function trustedPreventDomBypass( return r; }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedPreventDomBypass(...args); }, }; @@ -45176,6 +45888,14 @@ function trustedOverrideElementMethod( return validateConstantFn(true, disposition, extraArgs); }); }; +try { + const key = Symbol.for('safeSelf.1.75.1b1'); + safeSelf.safe = globalThis[key]; + if ( safeSelf.safe === undefined ) { + Object.defineProperty(globalThis, key, { value: safeSelf() }); + } +} catch { +} trustedOverrideElementMethod(...args); }, };