mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 21:05:36 +00:00
Bug 1406212 - Remove the code that handles extensions for e10s{,-multi}. r=Felipe
MozReview-Commit-ID: ElPZIBmOYHR --HG-- extra : rebase_source : 967287969f7d8c52c7522f449de55e8f36dd3f35
This commit is contained in:
parent
8d6920fb11
commit
4c3264d49f
@ -1,65 +0,0 @@
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
"use strict";
|
||||
|
||||
this.EXPORTED_SYMBOLS = [ "isAddonPartOfE10SRollout" ];
|
||||
|
||||
const Cu = Components.utils;
|
||||
Cu.import("resource://gre/modules/Services.jsm");
|
||||
|
||||
const PREF_E10S_ADDON_BLOCKLIST = "extensions.e10s.rollout.blocklist";
|
||||
const PREF_E10S_ADDON_POLICY = "extensions.e10s.rollout.policy";
|
||||
|
||||
// NOTE: Do not modify policies after they have already been
|
||||
// published to users. They must remain unchanged to provide valid data.
|
||||
|
||||
// We use these named policies to correlate the telemetry
|
||||
// data with them, in order to understand how each set
|
||||
// is behaving in the wild.
|
||||
const RolloutPolicy = {
|
||||
// Beta testing on 50
|
||||
"50allmpc": { webextensions: true, mpc: true },
|
||||
|
||||
// ESR
|
||||
"esrA": { mpc: true, webextensions: true },
|
||||
"esrB": { mpc: true, webextensions: false },
|
||||
"esrC": { mpc: false, webextensions: true },
|
||||
|
||||
"xpcshell-test": { mpc: true, webextensions: false },
|
||||
};
|
||||
|
||||
Object.defineProperty(this, "isAddonPartOfE10SRollout", {
|
||||
configurable: false,
|
||||
enumerable: false,
|
||||
writable: false,
|
||||
value: function isAddonPartOfE10SRollout(aAddon) {
|
||||
let blocklist = Services.prefs.getStringPref(PREF_E10S_ADDON_BLOCKLIST, "");
|
||||
let policyId = Services.prefs.getStringPref(PREF_E10S_ADDON_POLICY, "");
|
||||
|
||||
if (!policyId || !RolloutPolicy.hasOwnProperty(policyId)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (blocklist && blocklist.indexOf(aAddon.id) > -1) {
|
||||
return false;
|
||||
}
|
||||
|
||||
let policy = RolloutPolicy[policyId];
|
||||
|
||||
if (aAddon.mpcOptedOut == true) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (policy.webextensions && (aAddon.type == "webextension" || aAddon.type == "webextension-theme")) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (policy.mpc && aAddon.multiprocessCompatible) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
},
|
||||
});
|
@ -33,7 +33,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
|
||||
ConsoleAPI: "resource://gre/modules/Console.jsm",
|
||||
ProductAddonChecker: "resource://gre/modules/addons/ProductAddonChecker.jsm",
|
||||
UpdateUtils: "resource://gre/modules/UpdateUtils.jsm",
|
||||
isAddonPartOfE10SRollout: "resource://gre/modules/addons/E10SAddonsRollout.jsm",
|
||||
JSONFile: "resource://gre/modules/JSONFile.jsm",
|
||||
LegacyExtensionsUtils: "resource://gre/modules/LegacyExtensionsUtils.jsm",
|
||||
setTimeout: "resource://gre/modules/Timer.jsm",
|
||||
@ -89,10 +88,6 @@ const PREF_BRANCH_INSTALLED_ADDON = "extensions.installedDistroAddon.";
|
||||
const PREF_INTERPOSITION_ENABLED = "extensions.interposition.enabled";
|
||||
const PREF_SYSTEM_ADDON_SET = "extensions.systemAddonSet";
|
||||
const PREF_SYSTEM_ADDON_UPDATE_URL = "extensions.systemAddon.update.url";
|
||||
const PREF_E10S_BLOCK_ENABLE = "extensions.e10sBlocksEnabling";
|
||||
const PREF_E10S_ADDON_BLOCKLIST = "extensions.e10s.rollout.blocklist";
|
||||
const PREF_E10S_ADDON_POLICY = "extensions.e10s.rollout.policy";
|
||||
const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon";
|
||||
const PREF_ALLOW_LEGACY = "extensions.legacy.enabled";
|
||||
const PREF_ALLOW_NON_MPC = "extensions.allow-non-mpc-extensions";
|
||||
|
||||
@ -2175,8 +2170,6 @@ this.XPIProvider = {
|
||||
|
||||
Services.prefs.addObserver(PREF_EM_MIN_COMPAT_APP_VERSION, this);
|
||||
Services.prefs.addObserver(PREF_EM_MIN_COMPAT_PLATFORM_VERSION, this);
|
||||
Services.prefs.addObserver(PREF_E10S_ADDON_BLOCKLIST, this);
|
||||
Services.prefs.addObserver(PREF_E10S_ADDON_POLICY, this);
|
||||
if (!AppConstants.MOZ_REQUIRE_SIGNING || Cu.isInAutomation)
|
||||
Services.prefs.addObserver(PREF_XPI_SIGNATURES_REQUIRED, this);
|
||||
Services.prefs.addObserver(PREF_ALLOW_LEGACY, this);
|
||||
@ -4023,100 +4016,10 @@ this.XPIProvider = {
|
||||
case PREF_ALLOW_NON_MPC:
|
||||
this.updateAddonAppDisabledStates();
|
||||
break;
|
||||
|
||||
case PREF_E10S_ADDON_BLOCKLIST:
|
||||
case PREF_E10S_ADDON_POLICY:
|
||||
XPIDatabase.updateAddonsBlockingE10s();
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Determine if an add-on should be blocking e10s if enabled.
|
||||
*
|
||||
* @param aAddon
|
||||
* The add-on to test
|
||||
* @return true if enabling the add-on should block e10s
|
||||
*/
|
||||
isBlockingE10s(aAddon) {
|
||||
if (aAddon.type != "extension" &&
|
||||
aAddon.type != "theme" &&
|
||||
aAddon.type != "webextension" &&
|
||||
aAddon.type != "webextension-theme")
|
||||
return false;
|
||||
|
||||
// The hotfix is exempt
|
||||
let hotfixID = Services.prefs.getStringPref(PREF_EM_HOTFIX_ID, undefined);
|
||||
if (hotfixID && hotfixID == aAddon.id)
|
||||
return false;
|
||||
|
||||
// The default theme is exempt
|
||||
if (aAddon.type == "theme" &&
|
||||
aAddon.internalName == XPIProvider.defaultSkin)
|
||||
return false;
|
||||
|
||||
// System add-ons are exempt
|
||||
let loc = aAddon._installLocation;
|
||||
if (loc && loc.isSystem)
|
||||
return false;
|
||||
|
||||
if (isAddonPartOfE10SRollout(aAddon)) {
|
||||
Services.prefs.setBoolPref(PREF_E10S_HAS_NONEXEMPT_ADDON, true);
|
||||
return false;
|
||||
}
|
||||
|
||||
logger.debug("Add-on " + aAddon.id + " blocks e10s rollout.");
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* Determine if an add-on should be blocking multiple content processes.
|
||||
*
|
||||
* @param aAddon
|
||||
* The add-on to test
|
||||
* @return true if enabling the add-on should block multiple content processes.
|
||||
*/
|
||||
isBlockingE10sMulti(aAddon) {
|
||||
// WebExtensions have type = "webextension" or type="webextension-theme",
|
||||
// so they won't block multi.
|
||||
if (aAddon.type != "extension")
|
||||
return false;
|
||||
|
||||
// The hotfix is exempt
|
||||
let hotfixID = Services.prefs.getStringPref(PREF_EM_HOTFIX_ID, undefined);
|
||||
if (hotfixID && hotfixID == aAddon.id)
|
||||
return false;
|
||||
|
||||
// System add-ons are exempt
|
||||
let loc = aAddon._installLocation;
|
||||
if (loc && loc.isSystem)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
/**
|
||||
* In some cases having add-ons active blocks e10s but turning off e10s
|
||||
* requires a restart so some add-ons that are normally restartless will
|
||||
* require a restart to install or enable.
|
||||
*
|
||||
* @param aAddon
|
||||
* The add-on to test
|
||||
* @return true if enabling the add-on requires a restart
|
||||
*/
|
||||
e10sBlocksEnabling(aAddon) {
|
||||
// If the preference isn't set then don't block anything
|
||||
if (!Services.prefs.getBoolPref(PREF_E10S_BLOCK_ENABLE, false))
|
||||
return false;
|
||||
|
||||
// If e10s isn't active then don't block anything
|
||||
if (!Services.appinfo.browserTabsRemoteAutostart)
|
||||
return false;
|
||||
|
||||
return this.isBlockingE10s(aAddon);
|
||||
},
|
||||
|
||||
/**
|
||||
* Tests whether enabling an add-on will require a restart.
|
||||
*
|
||||
@ -4153,9 +4056,6 @@ this.XPIProvider = {
|
||||
return aAddon.internalName != this.currentSkin;
|
||||
}
|
||||
|
||||
if (this.e10sBlocksEnabling(aAddon))
|
||||
return true;
|
||||
|
||||
return !aAddon.bootstrap;
|
||||
},
|
||||
|
||||
@ -4241,9 +4141,6 @@ this.XPIProvider = {
|
||||
if (aAddon.disabled)
|
||||
return false;
|
||||
|
||||
if (this.e10sBlocksEnabling(aAddon))
|
||||
return true;
|
||||
|
||||
// Themes will require a restart (even if dynamic switching is enabled due
|
||||
// to some caching issues) and non-bootstrapped add-ons will require a
|
||||
// restart
|
||||
|
@ -50,9 +50,6 @@ const LAST_SQLITE_DB_SCHEMA = 14;
|
||||
const PREF_DB_SCHEMA = "extensions.databaseSchema";
|
||||
const PREF_PENDING_OPERATIONS = "extensions.pendingOperations";
|
||||
const PREF_EM_AUTO_DISABLED_SCOPES = "extensions.autoDisableScopes";
|
||||
const PREF_E10S_BLOCKED_BY_ADDONS = "extensions.e10sBlockedByAddons";
|
||||
const PREF_E10S_MULTI_BLOCKED_BY_ADDONS = "extensions.e10sMultiBlockedByAddons";
|
||||
const PREF_E10S_HAS_NONEXEMPT_ADDON = "extensions.e10s.rollout.hasAddon";
|
||||
|
||||
const KEY_APP_SYSTEM_ADDONS = "app-system-addons";
|
||||
const KEY_APP_SYSTEM_DEFAULTS = "app-system-defaults";
|
||||
@ -316,8 +313,6 @@ this.XPIDatabase = {
|
||||
ASYNC_SAVE_DELAY_MS);
|
||||
}
|
||||
|
||||
this.updateAddonsBlockingE10s();
|
||||
this.updateAddonsBlockingE10sMulti();
|
||||
let promise = this._deferredSave.saveChanges();
|
||||
if (!this._schemaVersionSet) {
|
||||
this._schemaVersionSet = true;
|
||||
@ -1077,44 +1072,6 @@ this.XPIDatabase = {
|
||||
this.saveChanges();
|
||||
},
|
||||
|
||||
updateAddonsBlockingE10s() {
|
||||
if (!this.addonDB) {
|
||||
// jank-tastic! Must synchronously load DB if the theme switches from
|
||||
// an XPI theme to a lightweight theme before the DB has loaded,
|
||||
// because we're called from sync XPIProvider.addonChanged
|
||||
logger.warn("Synchronous load of XPI database due to updateAddonsBlockingE10s()");
|
||||
AddonManagerPrivate.recordSimpleMeasure("XPIDB_lateOpen_byType", XPIProvider.runPhase);
|
||||
this.syncLoadDB(true);
|
||||
}
|
||||
|
||||
let blockE10s = false;
|
||||
|
||||
Services.prefs.setBoolPref(PREF_E10S_HAS_NONEXEMPT_ADDON, false);
|
||||
for (let [, addon] of this.addonDB) {
|
||||
let active = (addon.visible && !addon.disabled && !addon.pendingUninstall);
|
||||
|
||||
if (active && XPIProvider.isBlockingE10s(addon)) {
|
||||
blockE10s = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Services.prefs.setBoolPref(PREF_E10S_BLOCKED_BY_ADDONS, blockE10s);
|
||||
},
|
||||
|
||||
updateAddonsBlockingE10sMulti() {
|
||||
let blockMulti = false;
|
||||
|
||||
for (let [, addon] of this.addonDB) {
|
||||
let active = (addon.visible && !addon.disabled && !addon.pendingUninstall);
|
||||
|
||||
if (active && XPIProvider.isBlockingE10sMulti(addon)) {
|
||||
blockMulti = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
Services.prefs.setBoolPref(PREF_E10S_MULTI_BLOCKED_BY_ADDONS, blockMulti);
|
||||
},
|
||||
|
||||
/**
|
||||
* Synchronously calculates and updates all the active flags in the database.
|
||||
*/
|
||||
|
@ -11,7 +11,6 @@ EXTRA_JS_MODULES.addons += [
|
||||
'AddonUpdateChecker.jsm',
|
||||
'APIExtensionBootstrap.js',
|
||||
'Content.js',
|
||||
'E10SAddonsRollout.jsm',
|
||||
'GMPProvider.jsm',
|
||||
'LightweightThemeImageOptimizer.jsm',
|
||||
'ProductAddonChecker.jsm',
|
||||
|
@ -1,552 +0,0 @@
|
||||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
const ID = "bootstrap1@tests.mozilla.org";
|
||||
const ID2 = "bootstrap2@tests.mozilla.org";
|
||||
const ID3 = "bootstrap3@tests.mozilla.org";
|
||||
|
||||
const APP_STARTUP = 1;
|
||||
const ADDON_INSTALL = 5;
|
||||
|
||||
function getStartupReason(id) {
|
||||
let info = BootstrapMonitor.started.get(id);
|
||||
return info ? info.reason : undefined;
|
||||
}
|
||||
|
||||
BootstrapMonitor.init();
|
||||
|
||||
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
|
||||
|
||||
startupManager();
|
||||
|
||||
function check_multi_disabled() {
|
||||
return Services.prefs.getBoolPref("extensions.e10sMultiBlockedByAddons", false);
|
||||
}
|
||||
|
||||
async function check_normal(checkMultiDisabled) {
|
||||
let install = await promiseInstallFile(do_get_addon("test_bootstrap1_1"));
|
||||
do_check_eq(install.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
|
||||
let addon = await promiseAddonByID(ID);
|
||||
do_check_eq(addon, install.addon);
|
||||
|
||||
if (checkMultiDisabled) {
|
||||
do_check_false(check_multi_disabled());
|
||||
}
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_DISABLE));
|
||||
addon.userDisabled = true;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_false(hasFlag(addon.pendingOperations, AddonManager.PENDING_DISABLE));
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE));
|
||||
addon.userDisabled = false;
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
do_check_true(addon.isActive);
|
||||
do_check_false(hasFlag(addon.pendingOperations, AddonManager.PENDING_ENABLE));
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL));
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
}
|
||||
|
||||
// Installing the add-on normally doesn't require a restart
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = false;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", false);
|
||||
|
||||
await check_normal();
|
||||
});
|
||||
|
||||
// Enabling the pref doesn't change anything
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = false;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
|
||||
await check_normal();
|
||||
});
|
||||
|
||||
// Default e10s doesn't change anything
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", false);
|
||||
|
||||
await check_normal();
|
||||
});
|
||||
|
||||
// Pref and e10s blocks install
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
|
||||
let install = await promiseInstallFile(do_get_addon("test_bootstrap1_1"));
|
||||
do_check_eq(install.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_true(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
let addon = await promiseAddonByID(ID);
|
||||
do_check_eq(addon, null);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
do_check_eq(getStartupReason(ID), ADDON_INSTALL);
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_DISABLE));
|
||||
addon.userDisabled = true;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_false(hasFlag(addon.pendingOperations, AddonManager.PENDING_DISABLE));
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
do_check_true(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE));
|
||||
addon.userDisabled = false;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_true(addon.isActive);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL));
|
||||
do_check_true(check_multi_disabled());
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
|
||||
let install = await promiseInstallFile(do_get_addon("test_bootstrap1_1"));
|
||||
do_check_eq(install.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_true(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
let addon = await promiseAddonByID(ID);
|
||||
do_check_eq(addon, null);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After install and restart we should block.
|
||||
let blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
do_check_eq(getStartupReason(ID), ADDON_INSTALL);
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_DISABLE));
|
||||
addon.userDisabled = true;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_false(hasFlag(addon.pendingOperations, AddonManager.PENDING_DISABLE));
|
||||
do_check_true(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After disable and restart we should not block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
addon.userDisabled = false;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After re-enable and restart we should block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_true(addon.isActive);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
// This should probably be ADDON_ENABLE, but its not easy to make
|
||||
// that happen. See bug 1304392 for discussion.
|
||||
do_check_eq(getStartupReason(ID), APP_STARTUP);
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL));
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After uninstall and restart we should not block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
restartManager();
|
||||
});
|
||||
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
|
||||
let [install1, install2] = await Promise.all([
|
||||
promiseInstallFile(do_get_addon("test_bootstrap1_1")),
|
||||
promiseInstallFile(do_get_addon("test_bootstrap2_1")),
|
||||
]);
|
||||
|
||||
do_check_eq(install1.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_eq(install2.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_true(hasFlag(install1.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
do_check_true(hasFlag(install2.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
|
||||
let addon = await promiseAddonByID(ID);
|
||||
let addon2 = await promiseAddonByID(ID2);
|
||||
|
||||
do_check_eq(addon, null);
|
||||
do_check_eq(addon2, null);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After install and restart we should block.
|
||||
let blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
do_check_eq(getStartupReason(ID), ADDON_INSTALL);
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID2);
|
||||
BootstrapMonitor.checkAddonStarted(ID2);
|
||||
do_check_eq(getStartupReason(ID2), ADDON_INSTALL);
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
do_check_neq(addon2, null);
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_DISABLE));
|
||||
addon.userDisabled = true;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_false(hasFlag(addon.pendingOperations, AddonManager.PENDING_DISABLE));
|
||||
do_check_true(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After disable one addon and restart we should block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
|
||||
do_check_false(hasFlag(addon2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_DISABLE));
|
||||
addon2.userDisabled = true;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID2);
|
||||
do_check_false(addon2.isActive);
|
||||
do_check_false(hasFlag(addon2.pendingOperations, AddonManager.PENDING_DISABLE));
|
||||
do_check_true(hasFlag(addon2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After disable both addons and restart we should not block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
addon.userDisabled = false;
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
do_check_false(addon.isActive);
|
||||
do_check_true(hasFlag(addon.pendingOperations, AddonManager.PENDING_ENABLE));
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After re-enable one addon and restart we should block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_true(addon.isActive);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
// Bug 1304392 again (see comment above)
|
||||
do_check_eq(getStartupReason(ID), APP_STARTUP);
|
||||
|
||||
do_check_false(hasFlag(addon.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL));
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After uninstall the only enabled addon and restart we should not block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
addon2.uninstall();
|
||||
|
||||
restartManager();
|
||||
});
|
||||
|
||||
// Check that the rollout policy sets work as expected
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
Services.prefs.setCharPref("extensions.e10s.rollout.policy", "xpcshell-test");
|
||||
|
||||
// Both 'bootstrap1' and 'bootstrap2' addons are part of the allowed policy
|
||||
// set, because they are marked as mpc=true.
|
||||
await check_normal();
|
||||
|
||||
// Check that the two add-ons can be installed together correctly as
|
||||
// check_normal() only perform checks on bootstrap1.
|
||||
let [install1, install2] = await Promise.all([
|
||||
promiseInstallFile(do_get_addon("test_bootstrap1_1")),
|
||||
promiseInstallFile(do_get_addon("test_bootstrap2_1")),
|
||||
]);
|
||||
|
||||
do_check_eq(install1.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_eq(install2.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_false(hasFlag(install1.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
do_check_false(hasFlag(install2.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
|
||||
let addon = await promiseAddonByID(ID);
|
||||
let addon2 = await promiseAddonByID(ID2);
|
||||
|
||||
do_check_neq(addon, null);
|
||||
do_check_neq(addon2, null);
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID2);
|
||||
BootstrapMonitor.checkAddonStarted(ID2);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After install and restart e10s should not be blocked.
|
||||
let blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
|
||||
// Check that adding bootstrap2 to the blocklist will trigger a disable of e10s.
|
||||
Services.prefs.setCharPref("extensions.e10s.rollout.blocklist", ID2);
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// Check that after restarting, e10s continues to be blocked.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
|
||||
// Check that uninstalling bootstrap2 (which is in the blocklist) will
|
||||
// cause e10s to be re-enabled.
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
do_check_false(hasFlag(addon2.operationsRequiringRestart, AddonManager.OP_NEEDS_RESTART_UNINSTALL));
|
||||
addon2.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID2);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID2);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
// After uninstall the blocklisted addon and restart we should not block.
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_false(blocked);
|
||||
|
||||
|
||||
// Let's perform similar checks again, now that bootstrap2 is in the blocklist.
|
||||
// The bootstrap1 add-on should install and start correctly, but bootstrap2 should not.
|
||||
addon = await promiseAddonByID(ID);
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
[install1, install2] = await Promise.all([
|
||||
promiseInstallFile(do_get_addon("test_bootstrap1_1")),
|
||||
promiseInstallFile(do_get_addon("test_bootstrap2_1")),
|
||||
]);
|
||||
|
||||
do_check_eq(install1.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_eq(install2.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_false(hasFlag(install1.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
do_check_true(hasFlag(install2.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
|
||||
addon = await promiseAddonByID(ID);
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
|
||||
do_check_neq(addon, null);
|
||||
do_check_eq(addon2, null);
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(ID);
|
||||
BootstrapMonitor.checkAddonStarted(ID);
|
||||
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID2);
|
||||
BootstrapMonitor.checkAddonNotStarted(ID2);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
|
||||
// Now let's test that an add-on that is not mpc=true doesn't get installed,
|
||||
// since the rollout policy is restricted to only mpc=true addons.
|
||||
let install3 = await promiseInstallFile(do_get_addon("test_bootstrap3_1"));
|
||||
|
||||
do_check_eq(install3.state, AddonManager.STATE_INSTALLED);
|
||||
do_check_true(hasFlag(install3.addon.pendingOperations, AddonManager.PENDING_INSTALL));
|
||||
|
||||
let addon3 = await promiseAddonByID(ID3);
|
||||
|
||||
do_check_eq(addon3, null);
|
||||
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID3);
|
||||
BootstrapMonitor.checkAddonNotStarted(ID3);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
blocked = Services.prefs.getBoolPref("extensions.e10sBlockedByAddons");
|
||||
do_check_true(blocked);
|
||||
|
||||
// Clean-up
|
||||
addon = await promiseAddonByID(ID);
|
||||
addon2 = await promiseAddonByID(ID2);
|
||||
addon3 = await promiseAddonByID(ID3);
|
||||
|
||||
addon.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID);
|
||||
|
||||
addon2.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID2);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID2);
|
||||
|
||||
addon3.uninstall();
|
||||
BootstrapMonitor.checkAddonNotStarted(ID3);
|
||||
BootstrapMonitor.checkAddonNotInstalled(ID3);
|
||||
|
||||
Services.prefs.clearUserPref("extensions.e10s.rollout.policy");
|
||||
Services.prefs.clearUserPref("extensions.e10s.rollout.blocklist");
|
||||
|
||||
await promiseRestartManager();
|
||||
});
|
||||
|
||||
// The hotfix is unaffected
|
||||
add_task(async function() {
|
||||
gAppInfo.browserTabsRemoteAutostart = true;
|
||||
Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
|
||||
Services.prefs.setCharPref("extensions.hotfix.id", ID);
|
||||
Services.prefs.setBoolPref("extensions.hotfix.cert.checkAttributes", false);
|
||||
|
||||
await check_normal(true);
|
||||
});
|
||||
|
||||
// Test non-restarless add-on should block multi
|
||||
add_task(async function() {
|
||||
await promiseInstallAllFiles([do_get_addon("test_install1")], true);
|
||||
|
||||
let non_restartless_ID = "addon1@tests.mozilla.org";
|
||||
let addon = await promiseAddonByID(non_restartless_ID);
|
||||
|
||||
// non-restartless add-on is installed and started
|
||||
do_check_eq(addon, null);
|
||||
|
||||
await promiseRestartManager();
|
||||
|
||||
do_check_true(check_multi_disabled());
|
||||
|
||||
addon = await promiseAddonByID(non_restartless_ID);
|
||||
addon.uninstall();
|
||||
|
||||
BootstrapMonitor.checkAddonNotInstalled(non_restartless_ID);
|
||||
BootstrapMonitor.checkAddonNotStarted(non_restartless_ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
});
|
||||
|
||||
// Test experiment add-on should not block multi
|
||||
add_task(async function() {
|
||||
await promiseInstallAllFiles([do_get_addon("test_experiment1")], true);
|
||||
|
||||
let experiment_ID = "experiment1@tests.mozilla.org";
|
||||
|
||||
BootstrapMonitor.checkAddonInstalled(experiment_ID, "1.0");
|
||||
BootstrapMonitor.checkAddonNotStarted(experiment_ID);
|
||||
|
||||
let addon = await promiseAddonByID(experiment_ID);
|
||||
|
||||
// non-restartless add-on is installed and started
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
addon.uninstall();
|
||||
|
||||
BootstrapMonitor.checkAddonNotInstalled(experiment_ID);
|
||||
BootstrapMonitor.checkAddonNotStarted(experiment_ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
});
|
||||
|
||||
const { GlobalManager } = Components.utils.import("resource://gre/modules/Extension.jsm", {});
|
||||
|
||||
// Test web extension add-on's should not block multi
|
||||
add_task(async function() {
|
||||
|
||||
await promiseInstallAllFiles([do_get_addon("webextension_1")], true),
|
||||
|
||||
restartManager();
|
||||
|
||||
await promiseWebExtensionStartup();
|
||||
|
||||
let we_ID = "webextension1@tests.mozilla.org";
|
||||
|
||||
do_check_eq(GlobalManager.extensionMap.size, 1);
|
||||
|
||||
let addon = await promiseAddonByID(we_ID);
|
||||
|
||||
do_check_neq(addon, null);
|
||||
|
||||
do_check_false(check_multi_disabled());
|
||||
|
||||
addon.uninstall();
|
||||
|
||||
BootstrapMonitor.checkAddonNotInstalled(we_ID);
|
||||
BootstrapMonitor.checkAddonNotStarted(we_ID);
|
||||
|
||||
await promiseRestartManager();
|
||||
});
|
@ -339,7 +339,6 @@ tags = webextensions
|
||||
skip-if = os != "win"
|
||||
[test_bug1180901.js]
|
||||
skip-if = os != "win"
|
||||
[test_e10s_restartless.js]
|
||||
[test_switch_os.js]
|
||||
# Bug 1246231
|
||||
skip-if = os == "mac" && debug
|
||||
|
@ -55,7 +55,6 @@
|
||||
"DOMRequestHelper.jsm": ["DOMRequestIpcHelper"],
|
||||
"DownloadCore.jsm": ["Download", "DownloadSource", "DownloadTarget", "DownloadError", "DownloadSaver", "DownloadCopySaver", "DownloadLegacySaver", "DownloadPDFSaver"],
|
||||
"DownloadList.jsm": ["DownloadList", "DownloadCombinedList", "DownloadSummary"],
|
||||
"E10SAddonsRollout.jsm": ["isAddonPartOfE10SRollout"],
|
||||
"elementslib.js": ["ID", "Link", "XPath", "Selector", "Name", "Anon", "AnonXPath", "Lookup", "_byID", "_byName", "_byAttrib", "_byAnonAttrib"],
|
||||
"engines.js": ["EngineManager", "Engine", "SyncEngine", "Tracker", "Store", "Changeset"],
|
||||
"enginesync.js": ["EngineSynchronizer"],
|
||||
|
Loading…
Reference in New Issue
Block a user