зеркало из https://github.com/mozilla/gecko-dev.git
Backed out changeset 8771fccb94fa (bug 1853013) for causing security related mochitest failures. CLOSED TREE
This commit is contained in:
Родитель
13ad764dd2
Коммит
964fcbf6d9
|
@ -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",
|
||||||
|
|
Загрузка…
Ссылка в новой задаче