Bug 987512: Part 4 - Remove manual AddonManager promise wrappers from test code. r?rhelmer draft
authorKris Maglione <maglione.k@gmail.com>
Thu, 15 Dec 2016 11:48:39 -1000
changeset 450039 0a7a85c2d95ebc63b8465224e8b6289bb52c5339
parent 450038 ff77a4cd1bb0a493714b31852170fe4cb9d241db
child 450040 8ea0998add6cc258afee979c667fed9764ef2f5b
push id38748
push usermaglione.k@gmail.com
push dateThu, 15 Dec 2016 22:03:52 +0000
reviewersrhelmer
bugs987512
milestone53.0a1
Bug 987512: Part 4 - Remove manual AddonManager promise wrappers from test code. r?rhelmer MozReview-Commit-ID: LoBxNMfOT83
toolkit/mozapps/extensions/internal/AddonTestUtils.jsm
toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js
toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js
toolkit/mozapps/extensions/test/xpcshell/test_multiprocessCompatible.js
toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_shutdown.js
toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_startup.js
toolkit/mozapps/extensions/test/xpcshell/test_proxies.js
toolkit/mozapps/extensions/test/xpcshell/test_seen.js
toolkit/mozapps/extensions/test/xpcshell/test_signed_install.js
toolkit/mozapps/extensions/test/xpcshell/test_signed_long.js
toolkit/mozapps/extensions/test/xpcshell/test_signed_multi.js
toolkit/mozapps/extensions/test/xpcshell/test_switch_os.js
toolkit/mozapps/extensions/test/xpcshell/test_update.js
toolkit/mozapps/extensions/test/xpcshell/test_update_strictcompat.js
toolkit/mozapps/extensions/test/xpcshell/test_update_webextensions.js
toolkit/mozapps/extensions/test/xpcshell/test_webextension.js
toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js
--- a/toolkit/mozapps/extensions/internal/AddonTestUtils.jsm
+++ b/toolkit/mozapps/extensions/internal/AddonTestUtils.jsm
@@ -1009,17 +1009,17 @@ var AddonTestUtils = {
     });
   },
 
   /**
    * A helper method to install AddonInstall and wait for completion.
    *
    * @param {AddonInstall} install
    *        The add-on to install.
-   * @returns {Promise}
+   * @returns {Promise<AddonInstall>}
    *        Resolves when the install completes, either successfully or
    *        in failure.
    */
   promiseCompleteInstall(install) {
     let listener;
     return new Promise(resolve => {
       listener = {
         onDownloadFailed: resolve,
@@ -1029,16 +1029,17 @@ var AddonTestUtils = {
         onInstallEnded: resolve,
         onInstallPostponed: resolve,
       };
 
       install.addListener(listener);
       install.install();
     }).then(() => {
       install.removeListener(listener);
+      return install;
     });
   },
 
   /**
    * A helper method to install a file.
    *
    * @param {nsIFile} file
    *        The file to install
--- a/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_XPIStates.js
@@ -193,29 +193,20 @@ add_task(function* uninstall_bootstrap()
 });
 
 /*
  * Installing a restartless add-on should immediately add it to XPIState
  */
 add_task(function* install_bootstrap() {
   let XS = getXS();
 
-  let installer = yield new Promise((resolve, reject) =>
-    AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
+  let installer = yield promiseInstallFile(
+    do_get_addon("test_bootstrap1_1"));
 
-  let promiseInstalled = new Promise((resolve, reject) => {
-    AddonManager.addInstallListener({
-      onInstallFailed: reject,
-      onInstallEnded: (install, newAddon) => resolve(newAddon)
-    });
-  });
-
-  installer.install();
-
-  let newAddon = yield promiseInstalled;
+  let newAddon = installer.addon;
   let xState = XS.getAddon("app-profile", newAddon.id);
   do_check_true(!!xState);
   do_check_true(xState.enabled);
   do_check_eq(xState.scanTime, newAddon.updateDate.getTime());
   newAddon.uninstall();
 });
 
 /*
@@ -223,29 +214,20 @@ add_task(function* install_bootstrap() {
  * until after the restart; disable and enable happen immediately so that
  * the next restart won't / will scan as necessary on the next restart,
  * uninstalling it marks XPIState as disabled immediately
  * and removes XPIState after restart.
  */
 add_task(function* install_restart() {
   let XS = getXS();
 
-  let installer = yield new Promise((resolve, reject) =>
-    AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_4"), resolve));
+  let installer = yield promiseInstallFile(
+    do_get_addon("test_bootstrap1_4"));
 
-  let promiseInstalled = new Promise((resolve, reject) => {
-    AddonManager.addInstallListener({
-      onInstallFailed: reject,
-      onInstallEnded: (install, newAddon) => resolve(newAddon)
-    });
-  });
-
-  installer.install();
-
-  let newAddon = yield promiseInstalled;
+  let newAddon = installer.addon;
   let newID = newAddon.id;
   let xState = XS.getAddon("app-profile", newID);
   do_check_false(xState);
 
   // Now we restart the add-on manager, and we need to get the XPIState again
   // because the add-on manager reloads it.
   XS = null;
   newAddon = null;
--- a/toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_cache_certdb.js
@@ -72,11 +72,11 @@ function overrideCertDB() {
 add_task(function*() {
   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
   startupManager();
 
   // Once the application is started we shouldn't be able to replace the
   // certificate database
   overrideCertDB();
 
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
+  let install = yield AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"));
   do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
 });
--- a/toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_e10s_restartless.js
@@ -15,18 +15,17 @@ function getStartupReason(id) {
 
 BootstrapMonitor.init();
 
 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
 
 startupManager();
 
 function* check_normal() {
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield 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 = yield promiseAddonByID(ID);
   do_check_eq(addon, install.addon);
@@ -75,18 +74,17 @@ add_task(function*() {
   yield check_normal();
 });
 
 // Pref and e10s blocks install
 add_task(function*() {
   gAppInfo.browserTabsRemoteAutostart = true;
   Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
 
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield 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));
 
   let addon = yield promiseAddonByID(ID);
   do_check_eq(addon, null);
 
   yield promiseRestartManager();
 
@@ -124,18 +122,17 @@ add_task(function*() {
 
   yield promiseRestartManager();
 });
 
 add_task(function*() {
   gAppInfo.browserTabsRemoteAutostart = true;
   Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
 
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield 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));
 
   let addon = yield promiseAddonByID(ID);
   do_check_eq(addon, null);
 
   yield promiseRestartManager();
 
@@ -197,19 +194,21 @@ add_task(function*() {
 
   restartManager();
 });
 
 add_task(function*() {
   gAppInfo.browserTabsRemoteAutostart = true;
   Services.prefs.setBoolPref("extensions.e10sBlocksEnabling", true);
 
-  let install1 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  let install2 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap2_1"), resolve));
-  yield promiseCompleteAllInstalls([install1, install2]);
+  let [install1, install2] = yield 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 = yield promiseAddonByID(ID);
   let addon2 = yield promiseAddonByID(ID2);
 
@@ -307,19 +306,20 @@ add_task(function*() {
   Services.prefs.setCharPref("extensions.e10s.rollout.policy", "xpcshell-test");
 
   // Both 'bootstrap1' and 'bootstrap2' addons are listed in the allowed policy
   // set, so they should install and start normally.
   yield check_normal();
 
   // Check that the two add-ons can be installed together correctly as
   // check_normal() only perform checks on bootstrap1.
-  let install1 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  let install2 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap2_1"), resolve));
-  yield promiseCompleteAllInstalls([install1, install2]);
+  let [install1, install2] = yield 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 = yield promiseAddonByID(ID);
   let addon2 = yield promiseAddonByID(ID2);
@@ -369,19 +369,20 @@ add_task(function*() {
   // The bootstrap1 add-on should install and start correctly, but bootstrap2 should not.
   addon = yield promiseAddonByID(ID);
   addon.uninstall();
   BootstrapMonitor.checkAddonNotStarted(ID);
   BootstrapMonitor.checkAddonNotInstalled(ID);
 
   yield promiseRestartManager();
 
-  install1 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  install2 = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap2_1"), resolve));
-  yield promiseCompleteAllInstalls([install1, install2]);
+  [install1, install2] = yield 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 = yield promiseAddonByID(ID);
   addon2 = yield promiseAddonByID(ID2);
--- a/toolkit/mozapps/extensions/test/xpcshell/test_multiprocessCompatible.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_multiprocessCompatible.js
@@ -47,17 +47,17 @@ function build_test(multiprocessCompatib
       response.write(createUpdateRDF(updateData));
     });
 
     let expectedMPC = updateMultiprocessCompatible === undefined ?
                       multiprocessCompatible :
                       updateMultiprocessCompatible;
 
     let xpifile = createTempXPIFile(addonData);
-    let install = yield new Promise(resolve => AddonManager.getInstallForFile(xpifile, resolve));
+    let install = yield AddonManager.getInstallForFile(xpifile);
     do_check_eq(install.addon.multiprocessCompatible, !!multiprocessCompatible);
     do_check_eq(install.addon.mpcOptedOut, multiprocessCompatible === false)
     yield promiseCompleteAllInstalls([install]);
 
     if (!bootstrap) {
       yield promiseRestartManager();
       do_check_true(isExtensionInAddonsList(profileDir, addonData.id));
       do_check_eq(isItemMarkedMPIncompatible(addonData.id), !multiprocessCompatible);
--- a/toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_shutdown.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_shutdown.js
@@ -42,21 +42,18 @@ add_task(function* unsafeProviderShutdow
   let secondProvider = mockAddonProvider("Mock2");
   AddonManagerPrivate.registerProvider(secondProvider);
 
   startupManager();
 
   let shutdownPromise = null;
   yield new Promise(resolve => {
     secondProvider.shutdownCallback = function() {
-      return new Promise(shutdownResolve => {
-        AddonManager.getAddonByID("does-not-exist", () => {
-          shutdownResolve();
-          resolve();
-        });
+      return AddonManager.getAddonByID("does-not-exist").then(() => {
+        resolve();
       });
     };
 
     shutdownPromise = promiseShutdownManager();
   });
   yield shutdownPromise;
 
   equal(shutdownOrder.join(","), ["Mock1", "Mock2"].join(","), "Mock providers should have shutdown in expected order");
--- a/toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_startup.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_provider_unsafe_access_startup.js
@@ -35,17 +35,17 @@ function run_test() {
 }
 
 add_task(function* unsafeProviderStartup() {
   let secondProvider = null;
 
   yield new Promise(resolve => {
     let firstProvider = mockAddonProvider("Mock1");
     firstProvider.startupCallback = function() {
-      AddonManager.getAddonByID("does-not-exist", resolve);
+      resolve(AddonManager.getAddonByID("does-not-exist"));
     };
     AddonManagerPrivate.registerProvider(firstProvider);
 
     secondProvider = mockAddonProvider("Mock2");
     AddonManagerPrivate.registerProvider(secondProvider);
 
     startupManager();
   });
--- a/toolkit/mozapps/extensions/test/xpcshell/test_proxies.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_proxies.js
@@ -113,19 +113,17 @@ function* run_proxy_tests() {
   }
 
   startupManager();
 
   // Check that all add-ons original sources still exist after invalid
   // add-ons have been removed at startup.
   checkAddonsExist();
 
-  return new Promise(resolve => {
-    AddonManager.getAddonsByIDs(ADDONS.map(addon => addon.id), resolve);
-  }).then(addons => {
+  return AddonManager.getAddonsByIDs(ADDONS.map(addon => addon.id)).then(addons => {
     try {
       for (let [i, addon] of addons.entries()) {
         // Ensure that valid proxied add-ons were installed properly on
         // platforms that support the installation method.
         print(ADDONS[i].id,
               ADDONS[i].dirId,
               ADDONS[i].dirId != null,
               ADDONS[i].type == "symlink");
@@ -208,19 +206,17 @@ function* run_symlink_tests() {
   // Make sure that the symlink was created properly.
   let file = symlink.clone();
   file.append(tempFile.leafName);
   file.normalize();
   do_check_eq(file.path.replace(/^\/private\//, "/"), tempFile.path);
 
   startupManager();
 
-  return new Promise(resolve => {
-    AddonManager.getAddonByID(METADATA.id, resolve);
-  }).then(addon => {
+  return AddonManager.getAddonByID(METADATA.id).then(addon => {
     do_check_neq(addon, null);
 
     addon.uninstall();
 
     restartManager();
     shutdownManager();
 
     // Check that the install directory is gone.
--- a/toolkit/mozapps/extensions/test/xpcshell/test_seen.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_seen.js
@@ -10,35 +10,33 @@ profileDir.append("extensions");
 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
 startupManager();
 
 // By default disable add-ons from the profile
 Services.prefs.setIntPref("extensions.autoDisableScopes", AddonManager.SCOPE_PROFILE);
 
 // Installing an add-on through the API should mark it as seen
 add_task(function*() {
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield 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));
 
   let addon = install.addon;
   do_check_eq(addon.version, "1.0");
   do_check_false(addon.foreignInstall);
   do_check_true(addon.seen);
 
   yield promiseRestartManager();
 
   addon = yield promiseAddonByID(ID);
   do_check_false(addon.foreignInstall);
   do_check_true(addon.seen);
 
   // Installing an update should retain that
-  install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  install = yield promiseInstallFile(do_get_addon("test_bootstrap1_2"));
   do_check_eq(install.state, AddonManager.STATE_INSTALLED);
   do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
 
   addon = install.addon;
   do_check_eq(addon.version, "2.0");
   do_check_false(addon.foreignInstall);
   do_check_true(addon.seen);
 
@@ -104,18 +102,17 @@ add_task(function*() {
 
   yield promiseRestartManager();
 
   addon = yield promiseAddonByID(ID);
   do_check_true(addon.foreignInstall);
   do_check_false(addon.seen);
 
   // Updating through the API shouldn't change the state
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield promiseInstallFile(do_get_addon("test_bootstrap1_2"));
   do_check_eq(install.state, AddonManager.STATE_INSTALLED);
   do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
 
   addon = install.addon;
   do_check_true(addon.foreignInstall);
   do_check_false(addon.seen);
 
   yield promiseRestartManager();
@@ -185,18 +182,17 @@ add_task(function*() {
 
   yield promiseRestartManager();
 
   addon = yield promiseAddonByID(ID);
   do_check_true(addon.foreignInstall);
   do_check_true(addon.seen);
 
   // Updating through the API shouldn't change the state
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_2"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  let install = yield promiseInstallFile(do_get_addon("test_bootstrap1_2"));
   do_check_eq(install.state, AddonManager.STATE_INSTALLED);
   do_check_false(hasFlag(install.addon.pendingOperations, AddonManager.PENDING_INSTALL));
 
   addon = install.addon;
   do_check_true(addon.foreignInstall);
   do_check_true(addon.seen);
 
   yield promiseRestartManager();
--- a/toolkit/mozapps/extensions/test/xpcshell/test_signed_install.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_signed_install.js
@@ -70,19 +70,17 @@ function createBrokenAddonRemove(file) {
   zipW.open(brokenFile, FileUtils.MODE_RDWR | FileUtils.MODE_APPEND);
   zipW.removeEntry("test.txt", false);
   zipW.close();
 
   return brokenFile;
 }
 
 function createInstall(url) {
-  return new Promise(resolve => {
-    AddonManager.getInstallForURL(url, resolve, "application/x-xpinstall");
-  });
+  return AddonManager.getInstallForURL(url, null, "application/x-xpinstall");
 }
 
 function serveUpdateRDF(leafName) {
   gServer.registerPathHandler("/update.rdf", function(request, response) {
     let updateData = {};
     updateData[ID] = [{
       version: "2.0",
       targetApplications: [{
--- a/toolkit/mozapps/extensions/test/xpcshell/test_signed_long.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_signed_long.js
@@ -29,21 +29,17 @@ add_task(function* test_working() {
     do_check_true(addon.signedState > AddonManager.SIGNEDSTATE_MISSING);
 
     addon.uninstall();
   }
 });
 
 // Checks the cases that should be broken
 add_task(function* test_broken() {
-  function promiseInstallForFile(file) {
-    return new Promise(resolve => AddonManager.getInstallForFile(file, resolve));
-  }
-
-  let promises = [promiseInstallForFile(do_get_file(DATA + "long_63_hash.xpi")),
-                  promiseInstallForFile(do_get_file(DATA + "long_64_hash.xpi"))];
+  let promises = [AddonManager.getInstallForFile(do_get_file(DATA + "long_63_hash.xpi")),
+                  AddonManager.getInstallForFile(do_get_file(DATA + "long_64_hash.xpi"))];
   let installs = yield Promise.all(promises);
 
   for (let install of installs) {
     do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
     do_check_eq(install.error, AddonManager.ERROR_CORRUPT_FILE);
   }
 });
--- a/toolkit/mozapps/extensions/test/xpcshell/test_signed_multi.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_signed_multi.js
@@ -10,19 +10,17 @@ const DATA = "data/signing_checks/";
 const ADDONS = {
   "multi_signed.xpi": 0,
   "multi_badid.xpi": AddonManager.ERROR_CORRUPT_FILE,
   "multi_broken.xpi": AddonManager.ERROR_CORRUPT_FILE,
   "multi_unsigned.xpi": AddonManager.ERROR_SIGNEDSTATE_REQUIRED,
 };
 
 function createInstall(filename) {
-  return new Promise(resolve => {
-    AddonManager.getInstallForFile(do_get_file(DATA + filename), resolve, "application/x-xpinstall");
-  });
+  return AddonManager.getInstallForFile(do_get_file(DATA + filename), null, "application/x-xpinstall");
 }
 
 function run_test() {
   createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "4", "4");
   startupManager();
 
   run_next_test();
 }
--- a/toolkit/mozapps/extensions/test/xpcshell/test_switch_os.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_switch_os.js
@@ -11,18 +11,17 @@ BootstrapMonitor.init();
 const profileDir = gProfD.clone();
 profileDir.append("extensions");
 
 createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
 
 add_task(function*() {
   startupManager();
 
-  let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
-  yield promiseCompleteAllInstalls([install]);
+  yield promiseInstallFile(do_get_addon("test_bootstrap1_1"));
 
   let addon = yield promiseAddonByID(ID);
   do_check_neq(addon, null);
 
   BootstrapMonitor.checkAddonStarted(ID);
   do_check_false(addon.userDisabled);
   do_check_true(addon.isActive);
 
--- a/toolkit/mozapps/extensions/test/xpcshell/test_update.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_update.js
@@ -1172,19 +1172,17 @@ for (let test of testParams) {
       do_execute_soon(() => {
         restartManager();
         run_next_test()
       });
     });
   }
 
   add_task(function* cleanup() {
-    let addons = yield new Promise(resolve => {
-      AddonManager.getAddonsByTypes(["extension"], resolve);
-    });
+    let addons = yield AddonManager.getAddonsByTypes(["extension"]);
 
     for (let addon of addons)
       addon.uninstall();
 
     yield promiseRestartManager();
 
     shutdownManager();
 
--- a/toolkit/mozapps/extensions/test/xpcshell/test_update_strictcompat.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_update_strictcompat.js
@@ -1018,19 +1018,17 @@ for (let test of testParams) {
         onUpdateFinished: function() {
           run_next_test();
         }
       }, AddonManager.UPDATE_WHEN_USER_REQUESTED);
     });
   });
 
   add_task(function* cleanup() {
-    let addons = yield new Promise(resolve => {
-      AddonManager.getAddonsByTypes(["extension"], resolve);
-    });
+    let addons = yield AddonManager.getAddonsByTypes(["extension"]);
 
     for (let addon of addons)
       addon.uninstall();
 
     yield promiseRestartManager();
 
     shutdownManager();
 
--- a/toolkit/mozapps/extensions/test/xpcshell/test_update_webextensions.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_update_webextensions.js
@@ -222,27 +222,24 @@ add_task(function* checkUpdateToRDF() {
 add_task(function* checkIllegalUpdateURL() {
   const URLS = ["chrome://browser/content/",
                 "data:text/json,...",
                 "javascript:;",
                 "/"];
 
   for (let url of URLS) {
     let { messages } = yield promiseConsoleOutput(() => {
-      return new Promise((resolve, reject) => {
-        let addonFile = createTempWebExtensionFile({
-          manifest: { applications: { gecko: { update_url: url } } },
-        });
+      let addonFile = createTempWebExtensionFile({
+        manifest: { applications: { gecko: { update_url: url } } },
+      });
 
-        AddonManager.getInstallForFile(addonFile, install => {
-          Services.obs.notifyObservers(addonFile, "flush-cache-entry", null);
+      return AddonManager.getInstallForFile(addonFile).then(install => {
+        Services.obs.notifyObservers(addonFile, "flush-cache-entry", null);
 
-          if (install && install.state == AddonManager.STATE_DOWNLOAD_FAILED)
-            resolve();
-          reject(new Error("Unexpected state: " + (install && install.state)))
-        });
+        if (!install || install.state != AddonManager.STATE_DOWNLOAD_FAILED)
+          throw new Error("Unexpected state: " + (install && install.state));
       });
     });
 
     ok(messages.some(msg => /Access denied for URL|may not load or link to|is not a valid URL/.test(msg)),
        "Got checkLoadURI error");
   }
 });
--- a/toolkit/mozapps/extensions/test/xpcshell/test_webextension.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_webextension.js
@@ -312,17 +312,17 @@ add_task(function* test_experiments_depe
     manifest: {
       applications: {gecko: {id: "meh@experiment"}},
       "permissions": ["experiments.meh"],
     },
   });
 
   yield promiseInstallAllFiles([addonFile]);
 
-  let addon = yield new Promise(resolve => AddonManager.getAddonByID("meh@experiment", resolve));
+  let addon = yield AddonManager.getAddonByID("meh@experiment");
 
   deepEqual(addon.dependencies, ["meh@experiments.addons.mozilla.org"],
             "Addon should have the expected dependencies");
 
   equal(addon.appDisabled, true, "Add-on should be app disabled due to missing dependencies");
 
   addon.uninstall();
 });
@@ -339,21 +339,21 @@ add_task(function* test_experiments_api(
     id: extensionId,
     type: 256,
     version: "0.1",
     name: "Meh API",
   });
 
   yield promiseInstallAllFiles([addonFile]);
 
-  let addons = yield new Promise(resolve => AddonManager.getAddonsByTypes(["apiextension"], resolve));
+  let addons = yield AddonManager.getAddonsByTypes(["apiextension"]);
   let addon = addons.pop();
   equal(addon.id, extensionId, "Add-on should be installed as an API extension");
 
-  addons = yield new Promise(resolve => AddonManager.getAddonsByTypes(["extension"], resolve));
+  addons = yield AddonManager.getAddonsByTypes(["extension"]);
   equal(addons.pop().id, extensionId, "Add-on type should be aliased to extension");
 
   addon.uninstall();
 });
 
 add_task(function* developerShouldOverride() {
   let addon = yield promiseInstallWebExtension({
     manifest: {
--- a/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/test_webextension_install.js
@@ -117,19 +117,18 @@ add_task(function* test_multiple_no_id_e
 
   let extension2 = ExtensionTestUtils.loadExtension({
     manifest: manifest,
     useAddonManager: "temporary",
   });
 
   yield Promise.all([extension1.startup(), extension2.startup()]);
 
-  const allAddons = yield new Promise(resolve => {
-    AddonManager.getAllAddons(addons => resolve(addons));
-  });
+  const allAddons = yield AddonManager.getAllAddons();
+
   do_print(`Found these add-ons: ${allAddons.map(a => a.name).join(", ")}`);
   const filtered = allAddons.filter(addon => addon.name === manifest.name);
   // Make sure we have two add-ons by the same name.
   equal(filtered.length, 2, "Two add-ons are installed with the same name");
 
   yield extension1.unload();
   yield extension2.unload();
   AddonTestUtils.useRealCertChecks = false;
@@ -485,19 +484,17 @@ add_task(function* test_permissions() {
     manifest_version: 2,
     version: "1.0",
 
     permissions: ["tabs", "storage", "https://*.example.com/*", "<all_urls>", "experiments.test"],
   };
 
   let xpi = ExtensionTestCommon.generateXPI({manifest});
 
-  let install = yield new Promise(resolve => {
-    AddonManager.getInstallForFile(xpi, resolve);
-  });
+  let install = yield AddonManager.getInstallForFile(xpi);
 
   let perminfo;
   install._permHandler = info => {
     perminfo = info;
     return Promise.resolve();
   };
 
   yield promiseCompleteInstall(install);
@@ -525,19 +522,17 @@ add_task(function* test_permissions() {
     manifest_version: 2,
     version: "1.0",
 
     permissions: ["webRequestBlocking"],
   };
 
   let xpi = ExtensionTestCommon.generateXPI({manifest});
 
-  let install = yield new Promise(resolve => {
-    AddonManager.getInstallForFile(xpi, resolve);
-  });
+  let install = yield AddonManager.getInstallForFile(xpi);
 
   let perminfo;
   install._permHandler = info => {
     perminfo = info;
     return Promise.reject();
   };
 
   yield promiseCompleteInstall(install);