tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

commit 463e3f6013bcd29acd5f36e6cb116df4e360ba7d
parent 316685cef67b05ddb400b8ec64b2eb0cf3a8c74e
Author: Atila Butkovits <abutkovits@mozilla.com>
Date:   Wed, 19 Nov 2025 01:33:33 +0200

Revert "Bug 1999763 - use the child process in the webcompat addon to read prefs (which also lets us read then synchronously to simplify the code); r=denschub,webcompat-reviewers" for causing failures at browser_custom_functions.js.

This reverts commit 36eb24d7e02783511c18ebd19d19c6d094521423.

Diffstat:
Mbrowser/extensions/webcompat/experiment-apis/aboutConfigPrefs.js | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
Mbrowser/extensions/webcompat/experiment-apis/aboutConfigPrefs.json | 39++++++++++++++++++++++++++++-----------
Mbrowser/extensions/webcompat/experiment-apis/aboutConfigPrefsChild.js | 68++++++++++----------------------------------------------------------
Mbrowser/extensions/webcompat/lib/intervention_helpers.js | 2+-
Mbrowser/extensions/webcompat/lib/interventions.js | 32++++++++++++++++++++------------
Mbrowser/extensions/webcompat/lib/shims.js | 99+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Mbrowser/extensions/webcompat/manifest.json | 2+-
Mbrowser/extensions/webcompat/tests/browser/browser_interventions.js | 3+--
Mbrowser/extensions/webcompat/tests/browser/browser_pref_check.js | 3+--
Mbrowser/extensions/webcompat/tests/browser/head.js | 8++------
Mtesting/webcompat/fixtures.py | 6++++--
11 files changed, 178 insertions(+), 149 deletions(-)

diff --git a/browser/extensions/webcompat/experiment-apis/aboutConfigPrefs.js b/browser/extensions/webcompat/experiment-apis/aboutConfigPrefs.js @@ -6,24 +6,77 @@ /* global ExtensionAPI, ExtensionCommon, Services */ -this.aboutConfigPrefs = class extends ExtensionAPI { +this.aboutConfigPrefs = class AboutConfigPrefsAPI extends ExtensionAPI { + static ALLOWED_GLOBAL_PREFS = Object.freeze( + [ + "layout.css.prefixes.transforms", + "layout.css.webkit-fill-available.enabled", + "timer.auto_increase_timer_resolution", + ].concat( + Cu.isInAutomation ? ["webcompat.test.pref1", "webcompat.test.pref2"] : [] + ) + ); + getAPI(context) { + const EventManager = ExtensionCommon.EventManager; const extensionIDBase = context.extension.id.split("@")[0]; const extensionPrefNameBase = `extensions.${extensionIDBase}.`; + function getSafePref(name) { + if (AboutConfigPrefsAPI.ALLOWED_GLOBAL_PREFS.includes(name)) { + return name; + } + return `${extensionPrefNameBase}${name}`; + } + return { aboutConfigPrefs: { - async setPref(name, value) { - const fullName = `${extensionPrefNameBase}${name}`; + onPrefChange: new EventManager({ + context, + name: "aboutConfigPrefs.onUAOverridesPrefChange", + register: (fire, name) => { + const prefName = getSafePref(name); + const callback = () => { + fire.async(name).catch(() => {}); // ignore Message Manager disconnects + }; + Services.prefs.addObserver(prefName, callback); + return () => { + Services.prefs.removeObserver(prefName, callback); + }; + }, + }).api(), + async getBranch(branchName) { + const branch = `${extensionPrefNameBase}${branchName}.`; + return Services.prefs.getChildList(branch).map(pref => { + const name = pref.replace(branch, ""); + return { name, value: Services.prefs.getBoolPref(pref) }; + }); + }, + async getPref(_name) { + const name = getSafePref(_name); + try { + switch (Services.prefs.getPrefType(name)) { + case Ci.nsIPrefBranch.PREF_BOOL: + return Services.prefs.getBoolPref(name); + case Ci.nsIPrefBranch.PREF_INT: + return Services.prefs.getIntPref(name); + case Ci.nsIPrefBranch.PREF_STRING: + return Services.prefs.getStringPref(name); + } + } catch (_) {} + return undefined; + }, + async setPref(_name, value) { + const name = getSafePref(_name); switch (typeof value) { case "boolean": - Services.prefs.setBoolPref(fullName, value); + Services.prefs.setBoolPref(name, value); break; case "number": - Services.prefs.setIntPref(fullName, value); + Services.prefs.setIntPref(name, value); break; case "string": - Services.prefs.setStringPref(fullName, value); + Services.prefs.setStringPref(name, value); break; } }, diff --git a/browser/extensions/webcompat/experiment-apis/aboutConfigPrefs.json b/browser/extensions/webcompat/experiment-apis/aboutConfigPrefs.json @@ -24,14 +24,17 @@ ], "functions": [ { - "name": "getCheckableGlobalPrefs", + "name": "getBranch", "type": "function", - "description": "Lists the global prefs the addon may read", - "parameters": [], - "returns": { - "type": "array", - "description": "the list of pref names." - } + "description": "Get all child prefs for a branch", + "parameters": [ + { + "name": "branchName", + "type": "string", + "description": "The branch name" + } + ], + "async": true }, { "name": "getPref", @@ -42,17 +45,30 @@ "name": "name", "type": "string", "description": "The preference name" + } + ], + "async": true + }, + { + "name": "getBoolPrefSync", + "type": "function", + "description": "Get a webcompat preference's boolean value synchronously", + "parameters": [ + { + "name": "name", + "type": "string", + "description": "The preference name" }, { "name": "defaultValue", "type": "boolean", "optional": true, - "description": "Default value to return if the pref is not set" + "description": "Default value to return if the pref is not set (defaults to false if omitted)" } ], "returns": { - "type": "object", - "description": "returns the value of a pref." + "type": "boolean", + "description": "returns the value of a boolean pref." } }, { @@ -70,7 +86,8 @@ "type": "any", "description": "The new value" } - ] + ], + "async": true } ] } diff --git a/browser/extensions/webcompat/experiment-apis/aboutConfigPrefsChild.js b/browser/extensions/webcompat/experiment-apis/aboutConfigPrefsChild.js @@ -4,72 +4,24 @@ "use strict"; -/* global ExtensionAPI, ExtensionCommon, Services */ - -this.aboutConfigPrefs = class AboutConfigPrefsChildAPI extends ExtensionAPI { - static ALLOWED_GLOBAL_PREFS = Object.freeze( - [ - "layout.css.prefixes.transforms", - "layout.css.webkit-fill-available.enabled", - "timer.auto_increase_timer_resolution", - ].concat( - Cu.isInAutomation ? ["webcompat.test.pref1", "webcompat.test.pref2"] : [] - ) - ); +/* global ExtensionAPI, Services, XPCOMUtils */ +this.aboutConfigPrefs = class extends ExtensionAPI { getAPI(context) { - const EventManager = ExtensionCommon.EventManager; const extensionIDBase = context.extension.id.split("@")[0]; const extensionPrefNameBase = `extensions.${extensionIDBase}.`; - function getSafePref(name) { - if (AboutConfigPrefsChildAPI.ALLOWED_GLOBAL_PREFS.includes(name)) { - return name; - } - return `${extensionPrefNameBase}${name}`; - } - return { aboutConfigPrefs: { - onPrefChange: new EventManager({ - context, - name: "aboutConfigPrefs.onUAOverridesPrefChange", - register: (fire, name) => { - const prefName = getSafePref(name); - const callback = () => { - fire.async(name).catch(() => {}); // ignore Message Manager disconnects - }; - Services.prefs.addObserver(prefName, callback); - return () => { - Services.prefs.removeObserver(prefName, callback); - }; - }, - }).api(), - getCheckableGlobalPrefs() { - return AboutConfigPrefsChildAPI.ALLOWED_GLOBAL_PREFS; - }, - getPref(_name, defaultValue) { - const name = getSafePref(_name); + getBoolPrefSync(prefName, defaultValue = false) { try { - switch (Services.prefs.getPrefType(name)) { - case Ci.nsIPrefBranch.PREF_BOOL: - return Services.prefs.getBoolPref( - name, - defaultValue ?? undefined - ); - case Ci.nsIPrefBranch.PREF_INT: - return Services.prefs.getIntPref( - name, - defaultValue ?? undefined - ); - case Ci.nsIPrefBranch.PREF_STRING: - return Services.prefs.getStringPref( - name, - defaultValue ?? undefined - ); - } - } catch (_) {} - return defaultValue ?? undefined; + return Services.prefs.getBoolPref( + `${extensionPrefNameBase}${prefName}`, + defaultValue + ); + } catch (_) { + return defaultValue; + } }, }, }; diff --git a/browser/extensions/webcompat/lib/intervention_helpers.js b/browser/extensions/webcompat/lib/intervention_helpers.js @@ -390,7 +390,7 @@ var InterventionHelpers = { async getOS() { const os = - browser.aboutConfigPrefs.getPref("platform_override") ?? + (await browser.aboutConfigPrefs.getPref("platform_override")) ?? (await browser.runtime.getPlatformInfo()).os; if (os === "win") { return "windows"; diff --git a/browser/extensions/webcompat/lib/interventions.js b/browser/extensions/webcompat/lib/interventions.js @@ -6,11 +6,11 @@ /* globals browser, InterventionHelpers */ -const debugLoggingPrefValue = browser.aboutConfigPrefs.getPref( +const debugLoggingPrefPromise = browser.aboutConfigPrefs.getPref( "disable_debug_logging" ); -let debugLog = function () { - if (debugLoggingPrefValue !== true) { +let debugLog = async function () { + if ((await debugLoggingPrefPromise) !== true) { console.debug.apply(this, arguments); } }; @@ -19,7 +19,7 @@ class Interventions { constructor(availableInterventions, customFunctions) { this._originalInterventions = availableInterventions; - this.INTERVENTION_PREF = "enable_interventions"; + this.INTERVENTION_PREF = "perform_injections"; this._interventionsEnabled = true; @@ -94,7 +94,9 @@ class Interventions { checkInterventionPref() { navigator.locks.request("pref_check_lock", async () => { - const value = browser.aboutConfigPrefs.getPref(this.INTERVENTION_PREF); + const value = await browser.aboutConfigPrefs.getPref( + this.INTERVENTION_PREF + ); if (value === undefined) { await browser.aboutConfigPrefs.setPref(this.INTERVENTION_PREF, true); } else if (value === false) { @@ -159,7 +161,7 @@ class Interventions { }); } - _check_for_needed_prefs(intervention) { + async _check_for_needed_prefs(intervention) { if (!intervention.pref_check) { return true; } @@ -167,14 +169,14 @@ class Interventions { if (!this.#checkedPrefListeners.has(pref)) { const listener = () => this.onCheckedPrefChanged(pref); this.#checkedPrefListeners.set(pref, listener); - browser.aboutConfigPrefs.onPrefChange.addListener(listener, pref); + await browser.aboutConfigPrefs.onPrefChange.addListener(listener, pref); } } for (const [pref, value] of Object.entries(intervention.pref_check ?? {})) { if (!this.#checkedPrefCache.has(pref)) { this.#checkedPrefCache.set( pref, - browser.aboutConfigPrefs.getPref(pref) + await browser.aboutConfigPrefs.getPref(pref) ); } if (value !== this.#checkedPrefCache.get(pref)) { @@ -212,7 +214,9 @@ class Interventions { config.DISABLING_PREF = `disabled_interventions.${config.id}`; const disabledPrefListener = () => { navigator.locks.request("pref_check_lock", async () => { - const value = browser.aboutConfigPrefs.getPref(config.DISABLING_PREF); + const value = await browser.aboutConfigPrefs.getPref( + config.DISABLING_PREF + ); if (value === true) { await this.disableIntervention(config); debugLog( @@ -236,17 +240,21 @@ class Interventions { config.DISABLING_PREF ); - const disablingPrefValue = browser.aboutConfigPrefs.getPref( + const disablingPrefValue = browser.aboutConfigPrefs.getBoolPrefSync( config.DISABLING_PREF ); for (const intervention of config.interventions) { intervention.enabled = false; - if (!this._check_for_needed_prefs(intervention)) { + if (!(await this._check_for_needed_prefs(intervention))) { continue; } if ( - InterventionHelpers.shouldSkip(intervention, cleanVersion, channel) + await InterventionHelpers.shouldSkip( + intervention, + cleanVersion, + channel + ) ) { continue; } diff --git a/browser/extensions/webcompat/lib/shims.js b/browser/extensions/webcompat/lib/shims.js @@ -12,7 +12,7 @@ // on tabs where a shim using a given logo happens to be active). const LogosBaseURL = "https://smartblock.firefox.etp/"; -const loggingPrefValue = browser.aboutConfigPrefs.getPref( +const loggingPrefPromise = browser.aboutConfigPrefs.getPref( "disable_debug_logging" ); @@ -24,7 +24,7 @@ const platformPromise = browser.runtime.getPlatformInfo().then(info => { let debug = async function () { if ( - loggingPrefValue !== true && + (await loggingPrefPromise) !== true && (await releaseBranchPromise) !== "release_or_beta" ) { console.debug.apply(this, arguments); @@ -69,10 +69,8 @@ class Shim { this.runFirst = opts.runFirst; this.unblocksOnOptIn = unblocksOnOptIn; this.requestStorageAccessForRedirect = opts.requestStorageAccessForRedirect; - this.shouldUseScriptingAPI = browser.aboutConfigPrefs.getPref( - "useScriptingAPI", - false - ); + this.shouldUseScriptingAPI = + browser.aboutConfigPrefs.getBoolPrefSync("useScriptingAPI"); this.isSmartblockEmbedShim = opts.isSmartblockEmbedShim || false; debug( `WebCompat Shim ${this.id} will be injected using ${ @@ -132,33 +130,36 @@ class Shim { } browser.aboutConfigPrefs.onPrefChange.addListener(async () => { - const value = browser.aboutConfigPrefs.getPref(pref); + const value = await browser.aboutConfigPrefs.getPref(pref); this._disabledPrefValue = value; this._onEnabledStateChanged({ alsoClearResourceCache: true }); }, pref); - this._disabledPrefValue = browser.aboutConfigPrefs.getPref(pref); - this.ready = Promise.all([platformPromise, releaseBranchPromise]).then( - ([platform, branch]) => { - this._disabledByPlatform = - this.platform !== "all" && this.platform !== platform; - - this._disabledByReleaseBranch = false; - for (const supportedBranchAndPlatform of this.branches || []) { - const [supportedBranch, supportedPlatform] = - supportedBranchAndPlatform.split(":"); - if ( - (!supportedPlatform || supportedPlatform == platform) && - supportedBranch != branch - ) { - this._disabledByReleaseBranch = true; - } - } + this.ready = Promise.all([ + browser.aboutConfigPrefs.getPref(pref), + platformPromise, + releaseBranchPromise, + ]).then(([disabledPrefValue, platform, branch]) => { + this._disabledPrefValue = disabledPrefValue; - this._preprocessOptions(platform, branch); - this._onEnabledStateChanged(); + this._disabledByPlatform = + this.platform !== "all" && this.platform !== platform; + + this._disabledByReleaseBranch = false; + for (const supportedBranchAndPlatform of this.branches || []) { + const [supportedBranch, supportedPlatform] = + supportedBranchAndPlatform.split(":"); + if ( + (!supportedPlatform || supportedPlatform == platform) && + supportedBranch != branch + ) { + this._disabledByReleaseBranch = true; + } } - ); + + this._preprocessOptions(platform, branch); + this._onEnabledStateChanged(); + }); } _preprocessOptions(platform, branch) { @@ -873,14 +874,15 @@ class Shims { } async _checkEnabledPref() { - const value = browser.aboutConfigPrefs.getPref(this.ENABLED_PREF); - if (value === undefined) { - await browser.aboutConfigPrefs.setPref(this.ENABLED_PREF, true); - } else if (value === false) { - this.enabled = false; - } else { - this.enabled = true; - } + await browser.aboutConfigPrefs.getPref(this.ENABLED_PREF).then(value => { + if (value === undefined) { + browser.aboutConfigPrefs.setPref(this.ENABLED_PREF, true); + } else if (value === false) { + this.enabled = false; + } else { + this.enabled = true; + } + }); } get enabled() { @@ -907,19 +909,20 @@ class Shims { } async _checkSmartblockEmbedsEnabledPref() { - const value = browser.aboutConfigPrefs.getPref( - this.SMARTBLOCK_EMBEDS_ENABLED_PREF - ); - if (value === undefined) { - await browser.aboutConfigPrefs.setPref( - this.SMARTBLOCK_EMBEDS_ENABLED_PREF, - true - ); - } else if (value === false) { - this.smartblockEmbedsEnabled = false; - } else { - this.smartblockEmbedsEnabled = true; - } + await browser.aboutConfigPrefs + .getPref(this.SMARTBLOCK_EMBEDS_ENABLED_PREF) + .then(value => { + if (value === undefined) { + browser.aboutConfigPrefs.setPref( + this.SMARTBLOCK_EMBEDS_ENABLED_PREF, + true + ); + } else if (value === false) { + this.smartblockEmbedsEnabled = false; + } else { + this.smartblockEmbedsEnabled = true; + } + }); } get smartblockEmbedsEnabled() { diff --git a/browser/extensions/webcompat/manifest.json b/browser/extensions/webcompat/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Web Compatibility Interventions", "description": "Urgent post-release fixes for web compatibility.", - "version": "147.4.0", + "version": "147.3.0", "browser_specific_settings": { "gecko": { "id": "webcompat@mozilla.org", diff --git a/browser/extensions/webcompat/tests/browser/browser_interventions.js b/browser/extensions/webcompat/tests/browser/browser_interventions.js @@ -63,8 +63,7 @@ function check_valid_array(a, key, id) { add_task(async function test_json_data() { const addon = await AddonManager.getAddonByID("webcompat@mozilla.org"); const addonURI = addon.getResourceURI(); - const checkableGlobalPrefs = - await WebCompatExtension.getCheckableGlobalPrefs(); + const checkableGlobalPrefs = WebCompatExtension.getCheckableGlobalPrefs(); const exports = {}; Services.scriptloader.loadSubScript( diff --git a/browser/extensions/webcompat/tests/browser/browser_pref_check.js b/browser/extensions/webcompat/tests/browser/browser_pref_check.js @@ -29,8 +29,7 @@ async function setupTestIntervention(interventions) { add_task(async function test_pref_check() { await WebCompatExtension.started(); - const checkableGlobalPrefs = - await WebCompatExtension.getCheckableGlobalPrefs(); + const checkableGlobalPrefs = WebCompatExtension.getCheckableGlobalPrefs(); ok( checkableGlobalPrefs.includes("webcompat.test.pref1"), "allowed to access pref webcompat.test.pref1" diff --git a/browser/extensions/webcompat/tests/browser/head.js b/browser/extensions/webcompat/tests/browser/head.js @@ -128,9 +128,8 @@ const WebCompatExtension = new (class WebCompatExtension { } getCheckableGlobalPrefs() { - return this.#run(async function () { - return content.wrappedJSObject.browser.aboutConfigPrefs.getCheckableGlobalPrefs(); - }); + return this.extension.experimentAPIManager.global.aboutConfigPrefs + .ALLOWED_GLOBAL_PREFS; } async updateShims(_shims) { @@ -493,7 +492,4 @@ async function generateTestShims() { unblocksOnOptIn: ["*://itisatracker.org/*"], }, ]); - registerCleanupFunction(async () => { - await WebCompatExtension.resetInterventionsAndShimsToDefaults(); - }); } diff --git a/testing/webcompat/fixtures.py b/testing/webcompat/fixtures.py @@ -23,12 +23,13 @@ except ImportError: CB_PBM_PREF = "network.cookie.cookieBehavior.pbmode" CB_PREF = "network.cookie.cookieBehavior" -INTERVENTIONS_PREF = "extensions.webcompat.enable_interventions" +INJECTIONS_PREF = "extensions.webcompat.perform_injections" NOTIFICATIONS_PERMISSIONS_PREF = "permissions.default.desktop-notification" PBM_PREF = "browser.privatebrowsing.autostart" PIP_OVERRIDES_PREF = "extensions.webcompat.enable_picture_in_picture_overrides" SHIMS_PREF = "extensions.webcompat.enable_shims" STRICT_ETP_PREF = "privacy.trackingprotection.enabled" +UA_OVERRIDES_PREF = "extensions.webcompat.perform_ua_overrides" SYSTEM_ADDON_UPDATES_PREF = "extensions.systemAddon.update.enabled" DOWNLOAD_TO_TEMP_PREF = "browser.download.start_downloads_in_tmp_dir" DELETE_DOWNLOADS_PREF = "browser.helperApps.deleteTempFileOnExit" @@ -88,7 +89,8 @@ class FirefoxWebDriver(WebDriver): if "use_interventions" in test_config: value = test_config["use_interventions"] - prefs[INTERVENTIONS_PREF] = value + prefs[INJECTIONS_PREF] = value + prefs[UA_OVERRIDES_PREF] = value prefs[PIP_OVERRIDES_PREF] = value if "use_pbm" in test_config: