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:
Blake Kaplan 2017-09-28 16:09:20 -07:00
parent 8d6920fb11
commit 4c3264d49f
7 changed files with 0 additions and 766 deletions

View File

@ -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;
},
});

View File

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

View File

@ -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.
*/

View File

@ -11,7 +11,6 @@ EXTRA_JS_MODULES.addons += [
'AddonUpdateChecker.jsm',
'APIExtensionBootstrap.js',
'Content.js',
'E10SAddonsRollout.jsm',
'GMPProvider.jsm',
'LightweightThemeImageOptimizer.jsm',
'ProductAddonChecker.jsm',

View File

@ -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();
});

View File

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

View File

@ -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"],