diff --git a/src/plugins/adblocker/index.ts b/src/plugins/adblocker/index.ts index ba45ef361..612f1797c 100644 --- a/src/plugins/adblocker/index.ts +++ b/src/plugins/adblocker/index.ts @@ -1,3 +1,5 @@ +import { contextBridge, webFrame } from 'electron'; + import { blockers } from './types'; import { createPlugin } from '@/utils'; import { @@ -107,31 +109,25 @@ export default createPlugin({ }, }, preload: { + script: 'window.JSON = window._proxyJson; window._proxyJson = undefined; window.Response = window._proxyResponse; window._proxyResponse = undefined; 0', async start({ getConfig }) { const config = await getConfig(); if (config.blocker === blockers.WithBlocklists) { // Preload adblocker to inject scripts/styles await injectCliqzPreload(); + } else if (config.blocker === blockers.InPlayer && !isInjected()) { + inject(contextBridge); + await webFrame.executeJavaScript(this.script); } }, async onConfigChange(newConfig) { if (newConfig.blocker === blockers.WithBlocklists) { await injectCliqzPreload(); + } else if (newConfig.blocker === blockers.InPlayer && !isInjected()) { + inject(contextBridge); + await webFrame.executeJavaScript(this.script); } }, }, - renderer: { - async start({ getConfig }) { - const config = await getConfig(); - if (config.blocker === blockers.InPlayer && !isInjected()) { - inject(); - } - }, - onConfigChange(newConfig) { - if (newConfig.blocker === blockers.InPlayer && !isInjected()) { - inject(); - } - }, - } }); diff --git a/src/plugins/adblocker/injectors/inject.d.ts b/src/plugins/adblocker/injectors/inject.d.ts index 8078bbf0e..10062acc3 100644 --- a/src/plugins/adblocker/injectors/inject.d.ts +++ b/src/plugins/adblocker/injectors/inject.d.ts @@ -1,3 +1,5 @@ -export const inject: () => void; +import type { ContextBridge } from 'electron'; + +export const inject: (contextBridge: ContextBridge) => void; export const isInjected: () => boolean; diff --git a/src/plugins/adblocker/injectors/inject.js b/src/plugins/adblocker/injectors/inject.js index 26b0c2b46..c3e6e87c7 100644 --- a/src/plugins/adblocker/injectors/inject.js +++ b/src/plugins/adblocker/injectors/inject.js @@ -12,7 +12,11 @@ let injected = false; export const isInjected = () => injected; -export const inject = () => { +/** + * @param {Electron.ContextBridge} contextBridge + * @returns {*} + */ +export const inject = (contextBridge) => { injected = true; { const pruner = function (o) { @@ -28,17 +32,37 @@ export const inject = () => { return o; }; - JSON.parse = new Proxy(JSON.parse, { - apply() { - return pruner(Reflect.apply(...arguments)); - }, + contextBridge.exposeInMainWorld('_proxyJson', { + parse: new Proxy(JSON.parse, { + apply() { + return pruner(Reflect.apply(...arguments)); + }, + }), + stringify: JSON.stringify, + [Symbol.toStringTag]: JSON[Symbol.toStringTag], }); + const withPrototype = (obj) => { + const protos = Object.getPrototypeOf(obj); + for (const [key, value] of Object.entries(protos)) { + if (Object.prototype.hasOwnProperty.call(obj, key)) continue; + if (typeof value === 'function') { + obj[key] = function (...args) { + return value.call(obj, ...args); + } + } else { + obj[key] = value; + } + } + return obj; + }; + Response.prototype.json = new Proxy(Response.prototype.json, { apply() { return Reflect.apply(...arguments).then((o) => pruner(o)); }, }); + contextBridge.exposeInMainWorld('_proxyResponse', withPrototype(Response)); } (function () {