diff --git a/toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm b/toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm deleted file mode 100644 index 8dec3d4c936c..000000000000 --- a/toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm +++ /dev/null @@ -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; - }, -}); diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm index 7b33609cd3f0..48b1d8b8a9c4 100644 --- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm +++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm @@ -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 diff --git a/toolkit/mozapps/extensions/internal/XPIProviderUtils.js b/toolkit/mozapps/extensions/internal/XPIProviderUtils.js index 0db4e1de218e..b071dbdce0b3 100644 --- a/toolkit/mozapps/extensions/internal/XPIProviderUtils.js +++ b/toolkit/mozapps/extensions/internal/XPIProviderUtils.js @@ -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. */ diff --git a/toolkit/mozapps/extensions/internal/moz.build b/toolkit/mozapps/extensions/internal/moz.build index 8564f46ef63b..89407089b0c4 100644 --- a/toolkit/mozapps/extensions/internal/moz.build +++ b/toolkit/mozapps/extensions/internal/moz.build @@ -11,7 +11,6 @@ EXTRA_JS_MODULES.addons += [ 'AddonUpdateChecker.jsm', 'APIExtensionBootstrap.js', 'Content.js', - 'E10SAddonsRollout.jsm', 'GMPProvider.jsm', 'LightweightThemeImageOptimizer.jsm', 'ProductAddonChecker.jsm', diff --git a/toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js b/toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js deleted file mode 100644 index 1badd4c4cb22..000000000000 --- a/toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js +++ /dev/null @@ -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(); -}); diff --git a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini index f69c37ac845d..5d51609ea5ef 100644 --- a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini +++ b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini @@ -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 diff --git a/tools/lint/eslint/modules.json b/tools/lint/eslint/modules.json index f358527395f7..f5fa179f5d06 100644 --- a/tools/lint/eslint/modules.json +++ b/tools/lint/eslint/modules.json @@ -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"],