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:
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: