Bug 1406212 - Remove the code that handles extensions for e10s{,-multi}. r=Felipe draft
authorBlake Kaplan <mrbkap@gmail.com>
Thu, 28 Sep 2017 16:09:20 -0700
changeset 682783 0cb0382764395cc4bbcc8ceb4b07573ffb51874d
parent 682782 c2be59944626d4cd3d9a1cb08de2449ce1463277
child 682784 a3ec50b87308edd02bfd370b7b41f804c8594c0c
push id85144
push userbmo:mrbkap@mozilla.com
push dateWed, 18 Oct 2017 18:39:48 +0000
reviewersFelipe
bugs1406212
milestone58.0a1
Bug 1406212 - Remove the code that handles extensions for e10s{,-multi}. r=Felipe MozReview-Commit-ID: ElPZIBmOYHR
toolkit/mozapps/extensions/internal/E10SAddonsRollout.jsm
toolkit/mozapps/extensions/internal/XPIProvider.jsm
toolkit/mozapps/extensions/internal/XPIProviderUtils.js
toolkit/mozapps/extensions/internal/moz.build
toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js
toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
tools/lint/eslint/modules.json
deleted file mode 100644
--- 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;
-  },
-});
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -28,17 +28,16 @@ XPCOMUtils.defineLazyModuleGetters(this,
   FileUtils: "resource://gre/modules/FileUtils.jsm",
   ZipUtils: "resource://gre/modules/ZipUtils.jsm",
   NetUtil: "resource://gre/modules/NetUtil.jsm",
   PermissionsUtils: "resource://gre/modules/PermissionsUtils.jsm",
   OS: "resource://gre/modules/osfile.jsm",
   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",
   clearTimeout: "resource://gre/modules/Timer.jsm",
 
   DownloadAddonInstall: "resource://gre/modules/addons/XPIInstall.jsm",
   LocalAddonInstall: "resource://gre/modules/addons/XPIInstall.jsm",
   StagedAddonInstall: "resource://gre/modules/addons/XPIInstall.jsm",
@@ -84,20 +83,16 @@ const PREF_XPI_SIGNATURES_REQUIRED    = 
 const PREF_XPI_SIGNATURES_DEV_ROOT    = "xpinstall.signatures.dev-root";
 const PREF_XPI_PERMISSIONS_BRANCH     = "xpinstall.";
 const PREF_INSTALL_REQUIRESECUREORIGIN = "extensions.install.requireSecureOrigin";
 const PREF_INSTALL_DISTRO_ADDONS      = "extensions.installDistroAddons";
 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";
 
 const PREF_EM_MIN_COMPAT_APP_VERSION      = "extensions.minCompatibleAppVersion";
 const PREF_EM_MIN_COMPAT_PLATFORM_VERSION = "extensions.minCompatiblePlatformVersion";
 
 const PREF_EM_HOTFIX_ID               = "extensions.hotfix.id";
 const PREF_EM_LAST_APP_BUILD_ID       = "extensions.lastAppBuildId";
@@ -2170,18 +2165,16 @@ this.XPIProvider = {
 
       this.minCompatibleAppVersion = Services.prefs.getStringPref(PREF_EM_MIN_COMPAT_APP_VERSION,
                                                                   null);
       this.minCompatiblePlatformVersion = Services.prefs.getStringPref(PREF_EM_MIN_COMPAT_PLATFORM_VERSION,
                                                                        null);
 
       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);
       Services.prefs.addObserver(PREF_ALLOW_NON_MPC, this);
       Services.obs.addObserver(this, NOTIFICATION_FLUSH_PERMISSIONS);
       Services.obs.addObserver(this, NOTIFICATION_TOOLBOX_CONNECTION_CHANGE);
 
 
@@ -4018,108 +4011,18 @@ this.XPIProvider = {
                                                                          null);
         this.updateAddonAppDisabledStates();
         break;
       case PREF_XPI_SIGNATURES_REQUIRED:
       case PREF_ALLOW_LEGACY:
       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.
    *
    * @param  aAddon
    *         The add-on to test
    * @return true if the operation requires a restart
@@ -4148,19 +4051,16 @@ this.XPIProvider = {
       }
 
       // If the theme is already the theme in use then no restart is necessary.
       // This covers the case where the default theme is in use but a
       // lightweight theme is considered active.
       return aAddon.internalName != this.currentSkin;
     }
 
-    if (this.e10sBlocksEnabling(aAddon))
-      return true;
-
     return !aAddon.bootstrap;
   },
 
   /**
    * Tests whether disabling an add-on will require a restart.
    *
    * @param  aAddon
    *         The add-on to test
@@ -4236,19 +4136,16 @@ this.XPIProvider = {
         return true;
     }
 
     // If the add-on is not going to be active after installation then it
     // doesn't require a restart to install.
     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
     return aAddon.type == "theme" || !aAddon.bootstrap;
   },
 
   /**
    * Tests whether uninstalling an add-on will require a restart.
--- a/toolkit/mozapps/extensions/internal/XPIProviderUtils.js
+++ b/toolkit/mozapps/extensions/internal/XPIProviderUtils.js
@@ -45,19 +45,16 @@ var logger = Log.repository.getLogger(LO
 const KEY_PROFILEDIR                  = "ProfD";
 const FILE_JSON_DB                    = "extensions.json";
 
 // The last version of DB_SCHEMA implemented in SQLITE
 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";
 const KEY_APP_GLOBAL                  = "app-global";
 const KEY_APP_TEMPORARY               = "app-temporary";
 
 // Properties to save in JSON file
 const PROP_JSON_FIELDS = ["id", "syncGUID", "location", "version", "type",
@@ -311,18 +308,16 @@ this.XPIDatabase = {
     }
 
     if (!this._deferredSave) {
       this._deferredSave = new DeferredSave(this.jsonFile.path,
                                             () => JSON.stringify(this),
                                             ASYNC_SAVE_DELAY_MS);
     }
 
-    this.updateAddonsBlockingE10s();
-    this.updateAddonsBlockingE10sMulti();
     let promise = this._deferredSave.saveChanges();
     if (!this._schemaVersionSet) {
       this._schemaVersionSet = true;
       promise = promise.then(
         count => {
           // Update the XPIDB schema version preference the first time we successfully
           // save the database.
           logger.debug("XPI Database saved, setting schema version preference to " + DB_SCHEMA);
@@ -1072,54 +1067,16 @@ this.XPIDatabase = {
    */
   updateAddonActive(aAddon, aActive) {
     logger.debug("Updating active state for add-on " + aAddon.id + " to " + aActive);
 
     aAddon.active = aActive;
     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.
    */
   updateActiveAddons() {
     if (!this.addonDB) {
       logger.warn("updateActiveAddons called when DB isn't loaded");
       // force the DB to load
       AddonManagerPrivate.recordSimpleMeasure("XPIDB_lateOpen_updateActive",
--- a/toolkit/mozapps/extensions/internal/moz.build
+++ b/toolkit/mozapps/extensions/internal/moz.build
@@ -6,17 +6,16 @@
 
 EXTRA_JS_MODULES.addons += [
     'AddonRepository.jsm',
     'AddonRepository_SQLiteMigrator.jsm',
     'AddonSettings.jsm',
     'AddonUpdateChecker.jsm',
     'APIExtensionBootstrap.js',
     'Content.js',
-    'E10SAddonsRollout.jsm',
     'GMPProvider.jsm',
     'LightweightThemeImageOptimizer.jsm',
     'ProductAddonChecker.jsm',
     'SpellCheckDictionaryBootstrap.js',
     'XPIInstall.jsm',
     'XPIProvider.jsm',
     'XPIProviderUtils.js',
 ]
deleted file mode 100644
--- 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();
-});
--- a/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
+++ b/toolkit/mozapps/extensions/test/xpcshell/xpcshell-shared.ini
@@ -334,17 +334,16 @@ tags = webextensions
 [test_webextension_install_syntax_error.js]
 skip-if = appname == "thunderbird"
 tags = webextensions
 [test_bootstrap_globals.js]
 [test_bug1180901_2.js]
 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
 [test_softblocked.js]
 tags = blocklist
 [test_ext_management.js]
 skip-if = appname == "thunderbird"
 tags = webextensions
--- a/tools/lint/eslint/modules.json
+++ b/tools/lint/eslint/modules.json
@@ -50,17 +50,16 @@
   "dispatcher.js": ["dispatcher"],
   "distribution.js": ["DistributionCustomizer"],
   "DNSTypes.jsm": ["DNS_QUERY_RESPONSE_CODES", "DNS_AUTHORITATIVE_ANSWER_CODES", "DNS_CLASS_CODES", "DNS_RECORD_TYPES"],
   "doctor.js": ["Doctor"],
   "dom.js": ["getAttributes"],
   "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"],
   "errors.js": ["BaseError", "ApplicationQuitError", "AssertionError", "TimeoutError"],
   "evaluate.js": ["evaluate", "sandbox", "Sandboxes"],
   "event-emitter.js": ["EventEmitter"],
   "EventUtils.js": ["disableNonTestMouseEvents", "sendMouseEvent", "sendChar", "sendString", "sendKey", "synthesizeMouse", "synthesizeTouch", "synthesizeMouseAtPoint", "synthesizeTouchAtPoint", "synthesizeMouseAtCenter", "synthesizeTouchAtCenter", "synthesizeWheel", "synthesizeKey", "synthesizeMouseExpectEvent", "synthesizeKeyExpectEvent", "synthesizeText", "synthesizeComposition", "synthesizeQuerySelectedText"],
   "Extension.jsm": ["Extension", "ExtensionData"],