From 34d6abca6ddabdb2961336a92ddcb37e60e71932 Mon Sep 17 00:00:00 2001 From: Raymond Hill Date: Sun, 20 Apr 2025 16:58:16 -0400 Subject: [PATCH] Revert "[mv3] Programmatically inject content scripts on version change" This reverts commit d0e32a5f47809e417e8cddab57dbff5c2ae844f5. --- platform/mv3/extension/js/background.js | 7 +- platform/mv3/extension/js/ext.js | 6 -- .../mv3/extension/js/scripting-manager.js | 92 +------------------ 3 files changed, 9 insertions(+), 96 deletions(-) diff --git a/platform/mv3/extension/js/background.js b/platform/mv3/extension/js/background.js index 5afa975f2..6af564822 100644 --- a/platform/mv3/extension/js/background.js +++ b/platform/mv3/extension/js/background.js @@ -463,9 +463,10 @@ async function launch() { // Permissions may have been removed while the extension was disabled await syncWithBrowserPermissions(); - // Ensure that scriplets are registered. Force-execute them when a new - // version is detected. - registerInjectables(isNewVersion); + // Unsure whether the browser remembers correctly registered css/scripts + // after we quit the browser. For now uBOL will check unconditionally at + // launch time whether content css/scripts are properly registered. + registerInjectables(); // https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/declarativeNetRequest // Firefox API does not support `dnr.setExtensionActionOptions` diff --git a/platform/mv3/extension/js/ext.js b/platform/mv3/extension/js/ext.js index 1b95b11ec..ee735b21b 100644 --- a/platform/mv3/extension/js/ext.js +++ b/platform/mv3/extension/js/ext.js @@ -27,12 +27,6 @@ export const browser = webext; export const i18n = browser.i18n; export const runtime = browser.runtime; export const windows = browser.windows; -export const vendor = (( ) => { - const url = browser.runtime.getURL(''); - const pos = url.indexOf(':'); - if ( pos === -1 ) { return ''; } - return url.slice(0, pos); -})(); /******************************************************************************/ diff --git a/platform/mv3/extension/js/scripting-manager.js b/platform/mv3/extension/js/scripting-manager.js index 37c754e34..8ff9a5c36 100644 --- a/platform/mv3/extension/js/scripting-manager.js +++ b/platform/mv3/extension/js/scripting-manager.js @@ -21,7 +21,7 @@ import * as ut from './utils.js'; -import { browser, vendor } from './ext.js'; +import { browser } from './ext.js'; import { fetchJSON } from './fetch.js'; import { getEnabledRulesetsDetails } from './ruleset-manager.js'; import { getFilteringModeDetails } from './mode-manager.js'; @@ -168,7 +168,6 @@ function registerHighGeneric(context, genericDetails) { // update if ( - context.isNewVersion || arrayEq(registered.css, css, false) === false || arrayEq(registered.matches, matches) === false || arrayEq(registered.excludeMatches, excludeMatches) === false @@ -235,7 +234,6 @@ function registerGeneric(context, genericDetails) { arrayEq(registered.js, js, false) === false || arrayEq(registered.matches, directive.matches) === false ) { - context.isNewVersion || context.toRemove.push('css-generic-some'); context.toAdd.push(directive); } @@ -262,7 +260,6 @@ function registerGeneric(context, genericDetails) { arrayEq(registeredAll.js, js, false) === false || arrayEq(registeredAll.excludeMatches, directiveAll.excludeMatches) === false ) { - context.isNewVersion || context.toRemove.push('css-generic-all'); context.toAdd.push(directiveAll); } @@ -287,7 +284,6 @@ function registerGeneric(context, genericDetails) { arrayEq(registeredSome.js, js, false) === false || arrayEq(registeredSome.matches, directiveSome.matches) === false ) { - context.isNewVersion || context.toRemove.push('css-generic-some'); context.toAdd.push(directiveSome); } @@ -346,7 +342,6 @@ function registerProcedural(context) { // update if ( - context.isNewVersion || arrayEq(registered.js, js, false) === false || arrayEq(registered.matches, matches) === false || arrayEq(registered.excludeMatches, excludeMatches) === false @@ -409,7 +404,6 @@ function registerDeclarative(context) { // update if ( - context.isNewVersion || arrayEq(registered.js, js, false) === false || arrayEq(registered.matches, matches) === false || arrayEq(registered.excludeMatches, excludeMatches) === false @@ -472,7 +466,6 @@ function registerSpecific(context) { // update if ( - context.isNewVersion || arrayEq(registered.js, js, false) === false || arrayEq(registered.matches, matches) === false || arrayEq(registered.excludeMatches, excludeMatches) === false @@ -552,7 +545,6 @@ function registerScriptlet(context, scriptletDetails) { // update if ( - context.isNewVersion || arrayEq(registered.matches, matches) === false || arrayEq(registered.excludeMatches, excludeMatches) === false ) { @@ -565,77 +557,10 @@ function registerScriptlet(context, scriptletDetails) { /******************************************************************************/ -async function injectImmediately(tabId, info) { - try { - const results = await browser.scripting.executeScript({ - args: [ info.matches || [], info.excludeMatches || [] ], - func: injectImmediately.targetMatches, - target: { tabId }, - }); - if ( Array.isArray(results) === false ) { return; } - if ( results.length === 0 ) { return; } - const { frameId, result } = results[0] - if ( result !== true ) { return; } - if ( Array.isArray(info.js) && info.js.length !== 0 ) { - browser.scripting.executeScript({ - files: info.js, - injectImmediately: info.runAt === 'document_start', - world: info.world || 'ISOLATED', - target: { tabId, frameIds: [ frameId ] }, - }).catch(( ) => { }); - } else if ( Array.isArray(info.css) && info.css.length !== 0 ) { - browser.scripting.insertCSS({ - files: info.css, - origin: info.origin, - target: { tabId, frameIds: [ frameId ] }, - }).catch(( ) => { }); - } - } catch { - return; - } - return true; -} +// Issue: Safari appears to completely ignore excludeMatches +// https://github.com/radiolondra/ExcludeMatches-Test -injectImmediately.targetMatches = function(matches, excludeMatches) { - let matched = matches.includes(''); - if ( matched === false ) { - let hn = document.location.hostname; - for (;;) { - matched = matches.includes(`*://*.${hn}/*`); - if ( matched ) { break; } - const pos = hn.indexOf('.'); - if ( pos === -1 ) { break; } - hn = hn.slice(pos + 1); - } - if ( matched === false ) { return false; } - } - let hn = document.location.hostname; - for (;;) { - if ( excludeMatches.includes(`*://*.${hn}/*`) ) { return false; } - const pos = hn.indexOf('.'); - if ( pos === -1 ) { break; } - hn = hn.slice(pos + 1); - } - return true; -}; - -async function installContentScripts(toInject) { - const tabs = await browser.tabs.query({ discarded: false }); - const promises = []; - for ( const tab of tabs ) { - if ( tab.status === 'unloaded' ) { continue; } - for ( const info of toInject ) { - promises.push(injectImmediately(tab.id, info)); - } - } - const results = await Promise.all(promises); - const count = results.reduce((a, b) => b ? a+1 : a, 0); - ubolLog(`Injected ${count} scriptlets into already opened tabs`); -} - -/******************************************************************************/ - -async function registerInjectables(isNewVersion = false) { +async function registerInjectables() { if ( browser.scripting === undefined ) { return false; } if ( registerInjectables.barrier ) { return true; } @@ -661,7 +586,6 @@ async function registerInjectables(isNewVersion = false) { ); const toAdd = [], toRemove = []; const context = { - isNewVersion, filteringModeDetails, rulesetsDetails, before, @@ -687,13 +611,7 @@ async function registerInjectables(isNewVersion = false) { if ( toAdd.length !== 0 ) { ubolLog(`Registered ${toAdd.map(v => v.id)} content (css/js)`); await browser.scripting.registerContentScripts(toAdd) - .catch(reason => { ubolLog(reason); }); - // Chromium-based browsers do not inject newly registered scripts into - // already opened tabs, so we do this manually. - // https://github.com/w3c/webextensions/issues/617 - if ( isNewVersion && vendor === 'chrome-extension' ) { - installContentScripts(toAdd); - } + .catch(reason => { console.info(reason); }); } registerInjectables.barrier = false;