Backed out changeset 8771fccb94fa (bug 1853013) for causing security related mochitest failures. CLOSED TREE

This commit is contained in:
Cosmin Sabou 2023-09-13 23:05:19 +03:00
Родитель 13ad764dd2
Коммит 964fcbf6d9
10 изменённых файлов: 40 добавлений и 133 удалений

Просмотреть файл

@ -2,14 +2,21 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this * License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
"use strict";
var EXPORTED_SYMBOLS = ["AboutCompat"];
const Services =
globalThis.Services ||
ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
const addonID = "webcompat@mozilla.org"; const addonID = "webcompat@mozilla.org";
const addonPageRelativeURL = "/about-compat/aboutCompat.html"; const addonPageRelativeURL = "/about-compat/aboutCompat.html";
export function AboutCompat() { function AboutCompat() {
this.chromeURL = this.chromeURL =
WebExtensionPolicy.getByID(addonID).getURL(addonPageRelativeURL); WebExtensionPolicy.getByID(addonID).getURL(addonPageRelativeURL);
} }
AboutCompat.prototype = { AboutCompat.prototype = {
QueryInterface: ChromeUtils.generateQI(["nsIAboutModule"]), QueryInterface: ChromeUtils.generateQI(["nsIAboutModule"]),
getURIFlags() { getURIFlags() {

Просмотреть файл

@ -4,7 +4,11 @@
"use strict"; "use strict";
/* global ExtensionAPI, XPCOMUtils, Services */ /* global ExtensionAPI, XPCOMUtils */
const Services =
globalThis.Services ||
ChromeUtils.import("resource://gre/modules/Services.jsm").Services;
XPCOMUtils.defineLazyServiceGetter( XPCOMUtils.defineLazyServiceGetter(
this, this,

Просмотреть файл

@ -19,8 +19,8 @@ if (!Cm.isCIDRegistered(classID)) {
); );
const factory = ComponentUtils.generateSingletonFactory(function () { const factory = ComponentUtils.generateSingletonFactory(function () {
const { AboutCompat } = ChromeUtils.importESModule( const { AboutCompat } = ChromeUtils.import(
"resource://webcompat/AboutCompat.sys.mjs" "resource://webcompat/AboutCompat.jsm"
); );
return new AboutCompat(); return new AboutCompat();
}); });

Просмотреть файл

@ -11,7 +11,7 @@ Classes = [
{ {
'cid': '{97bf9550-2a7b-11e9-b56e-0800200c9a66}', 'cid': '{97bf9550-2a7b-11e9-b56e-0800200c9a66}',
'contract_ids': ['@mozilla.org/network/protocol/about;1?what=compat'], 'contract_ids': ['@mozilla.org/network/protocol/about;1?what=compat'],
'esModule': 'resource://webcompat/AboutCompat.sys.mjs', 'jsm': 'resource://webcompat/AboutCompat.jsm',
'constructor': 'AboutCompat', 'constructor': 'AboutCompat',
}, },
] ]

Просмотреть файл

@ -589,6 +589,7 @@ const AVAILABLE_SHIMS = [
], ],
contentScripts: [ contentScripts: [
{ {
cookieStoreId: "firefox-private",
js: "firebase.js", js: "firebase.js",
runAt: "document_start", runAt: "document_start",
matches: [ matches: [

Просмотреть файл

@ -486,7 +486,7 @@ const AVAILABLE_UA_OVERRIDES = [
domain: "granbluefantasy.jp", domain: "granbluefantasy.jp",
bug: "1722954", bug: "1722954",
config: { config: {
matches: ["*://*.granbluefantasy.jp/*", "*://*.gbf.game.mbga.jp/*"], matches: ["*://*.granbluefantasy.jp/*"],
uaTransformer: originalUA => { uaTransformer: originalUA => {
return originalUA + " iPhone OS 12_0 like Mac OS X"; return originalUA + " iPhone OS 12_0 like Mac OS X";
}, },

Просмотреть файл

@ -13,7 +13,7 @@ class Injections {
this._injectionsEnabled = true; this._injectionsEnabled = true;
this._availableInjections = availableInjections; this._availableInjections = availableInjections;
this._activeInjections = new Set(); this._activeInjections = new Map();
this._customFunctions = customFunctions; this._customFunctions = customFunctions;
} }
@ -48,33 +48,6 @@ class Injections {
return this._injectionsEnabled; return this._injectionsEnabled;
} }
async getPromiseRegisteredScriptIds(scriptIds) {
let registeredScriptIds = [];
// Try to avoid re-registering scripts already registered
// (e.g. if the webcompat background page is restarted
// after an extension process crash, after having registered
// the content scripts already once), but do not prevent
// to try registering them again if the getRegisteredContentScripts
// method returns an unexpected rejection.
try {
const registeredScripts =
await browser.scripting.getRegisteredContentScripts({
// By default only look for script ids that belongs to Injections
// (and ignore the ones that may belong to Shims).
ids: scriptIds ?? this._availableInjections.map(inj => inj.id),
});
registeredScriptIds = registeredScripts.map(script => script.id);
} catch (ex) {
console.error(
"Retrieve WebCompat GoFaster registered content scripts failed: ",
ex
);
}
return registeredScriptIds;
}
async registerContentScripts() { async registerContentScripts() {
const platformInfo = await browser.runtime.getPlatformInfo(); const platformInfo = await browser.runtime.getPlatformInfo();
const platformMatches = [ const platformMatches = [
@ -82,13 +55,10 @@ class Injections {
platformInfo.os, platformInfo.os,
platformInfo.os == "android" ? "android" : "desktop", platformInfo.os == "android" ? "android" : "desktop",
]; ];
let registeredScriptIds = await this.getPromiseRegisteredScriptIds();
for (const injection of this._availableInjections) { for (const injection of this._availableInjections) {
if (platformMatches.includes(injection.platform)) { if (platformMatches.includes(injection.platform)) {
injection.availableOnPlatform = true; injection.availableOnPlatform = true;
await this.enableInjection(injection, registeredScriptIds); await this.enableInjection(injection);
} }
} }
@ -100,39 +70,17 @@ class Injections {
}); });
} }
buildContentScriptRegistrations(contentScripts) { assignContentScriptDefaults(contentScripts) {
let finalConfig = Object.assign({}, contentScripts); let finalConfig = Object.assign({}, contentScripts);
// Don't persist the content scripts across browser restarts
// (at least not yet, we would need to apply some more changes
// to adjust webcompat for accounting for the scripts to be
// already registered).
//
// NOTE: scripting API has been introduced in Gecko 102,
// prior to Gecko 105 persistAcrossSessions option was required
// and only accepted false persistAcrossSessions, after Gecko 105
// is optional and defaults to true.
finalConfig.persistAcrossSessions = false;
if (!finalConfig.runAt) { if (!finalConfig.runAt) {
finalConfig.runAt = "document_start"; finalConfig.runAt = "document_start";
} }
// Convert js/css from contentScripts.register API method
// format to scripting.registerContentScripts API method
// format.
if (Array.isArray(finalConfig.js)) {
finalConfig.js = finalConfig.js.map(e => e.file);
}
if (Array.isArray(finalConfig.css)) {
finalConfig.css = finalConfig.css.map(e => e.file);
}
return finalConfig; return finalConfig;
} }
async enableInjection(injection, registeredScriptIds) { async enableInjection(injection) {
if (injection.active) { if (injection.active) {
return undefined; return undefined;
} }
@ -141,7 +89,7 @@ class Injections {
return this.enableCustomInjection(injection); return this.enableCustomInjection(injection);
} }
return this.enableContentScripts(injection, registeredScriptIds); return this.enableContentScripts(injection);
} }
enableCustomInjection(injection) { enableCustomInjection(injection) {
@ -155,31 +103,16 @@ class Injections {
} }
} }
async enableContentScripts(injection, registeredScriptIds) { async enableContentScripts(injection) {
let injectProps;
try { try {
const { id } = injection; const handle = await browser.contentScripts.register(
// enableContentScripts receives a registeredScriptIds already this.assignContentScriptDefaults(injection.contentScripts)
// pre-computed once from registerContentScripts to register all
// the injection, whereas it does not expect to receive one when
// it is called from the AboutCompatBroker to re-enable one specific
// injection.
let activeScriptIds = Array.isArray(registeredScriptIds)
? registeredScriptIds
: await this.getPromiseRegisteredScriptIds([id]);
injectProps = this.buildContentScriptRegistrations(
injection.contentScripts
); );
injectProps.id = id; this._activeInjections.set(injection, handle);
if (!activeScriptIds.includes(id)) {
await browser.scripting.registerContentScripts([injectProps]);
}
this._activeInjections.add(id);
injection.active = true; injection.active = true;
} catch (ex) { } catch (ex) {
console.error( console.error(
"Registering WebCompat GoFaster content scripts failed: ", "Registering WebCompat GoFaster content scripts failed: ",
{ injection, injectProps },
ex ex
); );
} }
@ -222,10 +155,9 @@ class Injections {
} }
async disableContentScripts(injection) { async disableContentScripts(injection) {
if (this._activeInjections.has(injection.id)) { const contentScript = this._activeInjections.get(injection);
await browser.scripting.unregisterContentScripts({ ids: [injection.id] }); await contentScript.unregister();
this._activeInjections.delete(injection); this._activeInjections.delete(injection);
}
injection.active = false; injection.active = false;
} }
} }

Просмотреть файл

@ -80,10 +80,10 @@ class Shim {
this.contentScripts = contentScripts || []; this.contentScripts = contentScripts || [];
for (const script of this.contentScripts) { for (const script of this.contentScripts) {
if (typeof script.css === "string") { if (typeof script.css === "string") {
script.css = [`/shims/${script.css}`]; script.css = [{ file: `/shims/${script.css}` }];
} }
if (typeof script.js === "string") { if (typeof script.js === "string") {
script.js = [`/shims/${script.js}`]; script.js = [{ file: `/shims/${script.js}` }];
} }
} }
@ -244,47 +244,10 @@ class Shim {
!this._contentScriptRegistrations.length !this._contentScriptRegistrations.length
) { ) {
const matches = []; const matches = [];
let idx = 0;
for (const options of this.contentScripts) { for (const options of this.contentScripts) {
matches.push(options.matches); matches.push(options.matches);
// Some shims includes more than one script (e.g. Blogger one contains const reg = await browser.contentScripts.register(options);
// a content script to be run on document_start and one to be run this._contentScriptRegistrations.push(reg);
// on document_end.
options.id = `shim-${this.id}-${idx++}`;
options.persistAcrossSessions = false;
// Having to call getRegisteredContentScripts each time we are going to
// register a Shim content script is suboptimal, but avoiding that
// may require a bit more changes (e.g. rework both Injections, Shim and Shims
// classes to more easily register all content scripts with a single
// call to the scripting API methods when the background script page is loading
// and one per injection or shim being enabled from the AboutCompatBroker).
// In the short term we call getRegisteredContentScripts and restrict it to
// the script id we are about to register.
let isAlreadyRegistered = false;
try {
const registeredScripts =
await browser.scripting.getRegisteredContentScripts({
ids: [options.id],
});
isAlreadyRegistered = !!registeredScripts.length;
} catch (ex) {
console.error(
"Retrieve WebCompat GoFaster registered content scripts failed: ",
ex
);
}
try {
if (!isAlreadyRegistered) {
await browser.scripting.registerContentScripts([options]);
}
this._contentScriptRegistrations.push(options.id);
} catch (ex) {
console.error(
"Registering WebCompat Shim content scripts failed: ",
options,
ex
);
}
} }
const urls = Array.from(new Set(matches.flat())); const urls = Array.from(new Set(matches.flat()));
debug("Enabling content scripts for these URLs:", urls); debug("Enabling content scripts for these URLs:", urls);
@ -292,8 +255,9 @@ class Shim {
} }
async _unregisterContentScripts() { async _unregisterContentScripts() {
const ids = this._contentScriptRegistrations; for (const registration of this._contentScriptRegistrations) {
await browser.scripting.unregisterContentScripts({ ids }); registration.unregister();
}
this._contentScriptRegistrations = []; this._contentScriptRegistrations = [];
} }

Просмотреть файл

@ -2,7 +2,7 @@
"manifest_version": 2, "manifest_version": 2,
"name": "Web Compatibility Interventions", "name": "Web Compatibility Interventions",
"description": "Urgent post-release fixes for web compatibility.", "description": "Urgent post-release fixes for web compatibility.",
"version": "118.2.0", "version": "118.1.0",
"browser_specific_settings": { "browser_specific_settings": {
"gecko": { "gecko": {
"id": "webcompat@mozilla.org", "id": "webcompat@mozilla.org",
@ -65,7 +65,6 @@
"permissions": [ "permissions": [
"mozillaAddons", "mozillaAddons",
"scripting",
"tabs", "tabs",
"webNavigation", "webNavigation",
"webRequest", "webRequest",

Просмотреть файл

@ -16,7 +16,7 @@ FINAL_TARGET_FILES.features["webcompat@mozilla.org"]["about-compat"] += [
"about-compat/aboutCompat.css", "about-compat/aboutCompat.css",
"about-compat/aboutCompat.html", "about-compat/aboutCompat.html",
"about-compat/aboutCompat.js", "about-compat/aboutCompat.js",
"about-compat/AboutCompat.sys.mjs", "about-compat/AboutCompat.jsm",
"about-compat/aboutPage.js", "about-compat/aboutPage.js",
"about-compat/aboutPage.json", "about-compat/aboutPage.json",
"about-compat/aboutPageProcessScript.js", "about-compat/aboutPageProcessScript.js",