diff --git a/src/plugins/adblocker/injectors/inject.js b/src/plugins/adblocker/injectors/inject.js index f45c1bff..f5c8a420 100644 --- a/src/plugins/adblocker/injectors/inject.js +++ b/src/plugins/adblocker/injectors/inject.js @@ -52,9 +52,26 @@ export const inject = (contextBridge) => { })); } - (function () { - let cValue = 'undefined'; - const chain = 'playerResponse.adPlacements'; + const chains = [ + { + chain: 'playerResponse.adPlacements', + cValue: 'undefined', + }, + { + chain: 'ytInitialPlayerResponse.playerAds', + cValue: 'undefined', + }, + { + chain: 'ytInitialPlayerResponse.adPlacements', + cValue: 'undefined', + }, + { + chain: 'ytInitialPlayerResponse.adSlots', + cValue: 'undefined', + } + ]; + + chains.forEach(function ({ chain, cValue }) { const thisScript = document.currentScript; // switch (cValue) { @@ -248,203 +265,5 @@ export const inject = (contextBridge) => { // trapChain(window, chain); - })(); - - (function () { - let cValue = 'undefined'; - const thisScript = document.currentScript; - const chain = 'ytInitialPlayerResponse.adPlacements'; - // - switch (cValue) { - case 'null': { - cValue = null; - break; - } - - case "''": { - cValue = ''; - break; - } - - case 'true': { - cValue = true; - break; - } - - case 'false': { - cValue = false; - break; - } - - case 'undefined': { - cValue = undefined; - break; - } - - case 'noopFunc': { - cValue = function () {}; - - break; - } - - case 'trueFunc': { - cValue = function () { - return true; - }; - - break; - } - - case 'falseFunc': { - cValue = function () { - return false; - }; - - break; - } - - default: { - if (/^\d+$/.test(cValue)) { - cValue = Number.parseFloat(cValue); - // - if (isNaN(cValue)) { - return; - } - - if (Math.abs(cValue) > 0x7f_ff) { - return; - } - } else { - return; - } - } - } - - // - let aborted = false; - const mustAbort = function (v) { - if (aborted) { - return true; - } - - aborted = - v !== undefined && - v !== null && - cValue !== undefined && - cValue !== null && - typeof v !== typeof cValue; - return aborted; - }; - - /* - Support multiple trappers for the same property: - https://github.com/uBlockOrigin/uBlock-issues/issues/156 - */ - - const trapProp = function (owner, prop, configurable, handler) { - if (handler.init(owner[prop]) === false) { - return; - } - - // - const odesc = Object.getOwnPropertyDescriptor(owner, prop); - let previousGetter; - let previousSetter; - if (odesc instanceof Object) { - if (odesc.configurable === false) { - return; - } - - if (odesc.get instanceof Function) { - previousGetter = odesc.get; - } - - if (odesc.set instanceof Function) { - previousSetter = odesc.set; - } - } - - // - Object.defineProperty(owner, prop, { - configurable, - get() { - if (previousGetter !== undefined) { - previousGetter(); - } - - // - return handler.getter(); - }, - set(a) { - if (previousSetter !== undefined) { - previousSetter(a); - } - - // - handler.setter(a); - }, - }); - }; - - const trapChain = function (owner, chain) { - const pos = chain.indexOf('.'); - if (pos === -1) { - trapProp(owner, chain, false, { - v: undefined, - getter() { - return document.currentScript === thisScript ? this.v : cValue; - }, - setter(a) { - if (mustAbort(a) === false) { - return; - } - - cValue = a; - }, - init(v) { - if (mustAbort(v)) { - return false; - } - - // - this.v = v; - return true; - }, - }); - // - return; - } - - // - const prop = chain.slice(0, pos); - const v = owner[prop]; - // - chain = chain.slice(pos + 1); - if (v instanceof Object || (typeof v === 'object' && v !== null)) { - trapChain(v, chain); - return; - } - - // - trapProp(owner, prop, true, { - v: undefined, - getter() { - return this.v; - }, - setter(a) { - this.v = a; - if (a instanceof Object) { - trapChain(a, chain); - } - }, - init(v) { - this.v = v; - return true; - }, - }); - }; - - // - trapChain(window, chain); - })(); + }); };