From e075d5cd6eea3d0c6f719125f9f667798af28bdd Mon Sep 17 00:00:00 2001 From: Mark Banner Date: Tue, 17 Sep 2019 13:03:24 +0000 Subject: [PATCH] Bug 1579420 - Fix ESLint no-async-promise-executor issues in extensions code. r=rpl Differential Revision: https://phabricator.services.mozilla.com/D45009 --HG-- extra : moz-landing-system : lando --- .../extensions/ExtensionControlledPopup.jsm | 79 +++++++++++-------- .../browser/browser_ext_devtools_network.js | 6 +- .../test/browser/browser_ext_tabs_zoom.js | 1 + .../extensions/ExtensionShortcuts.jsm | 6 +- .../extensions/ExtensionTestCommon.jsm | 6 +- .../browser_ext_themes_dynamic_getCurrent.js | 1 + .../browser/browser_ext_themes_warnings.js | 1 + .../test/browser/browser_CTP_plugins.js | 2 +- .../mozapps/extensions/test/browser/head.js | 6 +- 9 files changed, 60 insertions(+), 48 deletions(-) diff --git a/browser/components/extensions/ExtensionControlledPopup.jsm b/browser/components/extensions/ExtensionControlledPopup.jsm index 703213e01d4e..c470a22f4cc9 100644 --- a/browser/components/extensions/ExtensionControlledPopup.jsm +++ b/browser/components/extensions/ExtensionControlledPopup.jsm @@ -358,40 +358,40 @@ class ExtensionControlledPopup { description.appendChild(link); } - _ensureWindowReady(win) { + async _ensureWindowReady(win) { + if (win.closed) { + throw new Error("window is closed"); + } + let promises = []; + let listenersToRemove = []; + function promiseEvent(type) { + promises.push( + new Promise(resolve => { + let listener = () => { + win.removeEventListener(type, listener); + resolve(); + }; + win.addEventListener(type, listener); + listenersToRemove.push([type, listener]); + }) + ); + } + let { focusedWindow, activeWindow } = Services.focus; + if (activeWindow != win) { + promiseEvent("activate"); + } + if (focusedWindow) { + // We may have focused a non-remote child window, find the browser window: + let { rootTreeItem } = focusedWindow.docShell; + rootTreeItem.QueryInterface(Ci.nsIDocShell); + focusedWindow = rootTreeItem.contentViewer.DOMDocument.defaultView; + } + if (focusedWindow != win) { + promiseEvent("focus"); + } + let unloadListener; + // eslint-disable-next-line no-async-promise-executor return new Promise(async (resolve, reject) => { - if (win.closed) { - reject(); - return; - } - let promises = []; - let listenersToRemove = []; - function promiseEvent(type) { - promises.push( - new Promise(resolve => { - let listener = () => { - win.removeEventListener(type, listener); - resolve(); - }; - win.addEventListener(type, listener); - listenersToRemove.push([type, listener]); - }) - ); - } - let { focusedWindow, activeWindow } = Services.focus; - if (activeWindow != win) { - promiseEvent("activate"); - } - if (focusedWindow) { - // We may have focused a non-remote child window, find the browser window: - let { rootTreeItem } = focusedWindow.docShell; - rootTreeItem.QueryInterface(Ci.nsIDocShell); - focusedWindow = rootTreeItem.contentViewer.DOMDocument.defaultView; - } - if (focusedWindow != win) { - promiseEvent("focus"); - } - let unloadListener; if (promises.length) { unloadListener = () => { for (let [type, listener] of listenersToRemove) { @@ -401,11 +401,20 @@ class ExtensionControlledPopup { }; win.addEventListener("unload", unloadListener, { once: true }); } - await Promise.all(promises); + let error; + try { + await Promise.all(promises); + } catch (ex) { + error = ex; + } if (unloadListener) { win.removeEventListener("unload", unloadListener); } - resolve(); + if (error) { + reject(new Error("window unloaded")); + } else { + resolve(); + } }); } } diff --git a/browser/components/extensions/test/browser/browser_ext_devtools_network.js b/browser/components/extensions/test/browser/browser_ext_devtools_network.js index 18ed1c519db7..7e0b918fe1b8 100644 --- a/browser/components/extensions/test/browser/browser_ext_devtools_network.js +++ b/browser/components/extensions/test/browser/browser_ext_devtools_network.js @@ -115,9 +115,9 @@ let extData = { }, }; -function waitForRequestAdded(toolbox) { - return new Promise(async resolve => { - let netPanel = await toolbox.getNetMonitorAPI(); +async function waitForRequestAdded(toolbox) { + let netPanel = await toolbox.getNetMonitorAPI(); + return new Promise(resolve => { netPanel.once("NetMonitor:RequestAdded", () => { resolve(); }); diff --git a/browser/components/extensions/test/browser/browser_ext_tabs_zoom.js b/browser/components/extensions/test/browser/browser_ext_tabs_zoom.js index 4ea1ee963a42..0a496429894a 100644 --- a/browser/components/extensions/test/browser/browser_ext_tabs_zoom.js +++ b/browser/components/extensions/test/browser/browser_ext_tabs_zoom.js @@ -60,6 +60,7 @@ add_task(async function test_zoom_api() { let awaitZoom = async (tabId, newValue) => { let listener; + // eslint-disable-next-line no-async-promise-executor await new Promise(async resolve => { listener = info => { if (info.tabId == tabId && info.newZoomFactor == newValue) { diff --git a/toolkit/components/extensions/ExtensionShortcuts.jsm b/toolkit/components/extensions/ExtensionShortcuts.jsm index 54824900c771..c87d5bc3e40b 100644 --- a/toolkit/components/extensions/ExtensionShortcuts.jsm +++ b/toolkit/components/extensions/ExtensionShortcuts.jsm @@ -168,7 +168,7 @@ class ExtensionShortcuts { // Map[{String} commandName -> {Object} commandProperties] this.manifestCommands = this.loadCommandsFromManifest(extension.manifest); - this.commands = new Promise(async resolve => { + this.commands = (async () => { // Deep copy the manifest commands to commands so we can keep the original // manifest commands and update commands as needed. let commands = new Map(); @@ -187,8 +187,8 @@ class ExtensionShortcuts { } }); - resolve(commands); - }); + return commands; + })(); } registerKeys(commands) { diff --git a/toolkit/components/extensions/ExtensionTestCommon.jsm b/toolkit/components/extensions/ExtensionTestCommon.jsm index 68d334fcd191..034bf8d7605e 100644 --- a/toolkit/components/extensions/ExtensionTestCommon.jsm +++ b/toolkit/components/extensions/ExtensionTestCommon.jsm @@ -155,7 +155,7 @@ class MockExtension { }); } - startup() { + async startup() { if (this.installType == "temporary") { return AddonManager.installTemporaryAddon(this.file).then(async addon => { this.addon = addon; @@ -167,8 +167,8 @@ class MockExtension { this.addonPromise = new Promise(resolve => { this.resolveAddon = resolve; }); - return new Promise(async (resolve, reject) => { - let install = await AddonManager.getInstallForFile(this.file); + let install = await AddonManager.getInstallForFile(this.file); + return new Promise((resolve, reject) => { let listener = { onInstallFailed: reject, onInstallEnded: async (install, newAddon) => { diff --git a/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js b/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js index 3cba4ed3b2de..e02ba3717bf2 100644 --- a/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js +++ b/toolkit/components/extensions/test/browser/browser_ext_themes_dynamic_getCurrent.js @@ -41,6 +41,7 @@ add_task(async function test_get_current() { function ensureWindowFocused(winId) { browser.test.log("Waiting for focused window to be " + winId); + // eslint-disable-next-line no-async-promise-executor return new Promise(async resolve => { let listener = windowId => { if (windowId === winId) { diff --git a/toolkit/components/extensions/test/browser/browser_ext_themes_warnings.js b/toolkit/components/extensions/test/browser/browser_ext_themes_warnings.js index c126d3a2f344..8ffca894b074 100644 --- a/toolkit/components/extensions/test/browser/browser_ext_themes_warnings.js +++ b/toolkit/components/extensions/test/browser/browser_ext_themes_warnings.js @@ -3,6 +3,7 @@ // This test checks that theme warnings are properly emitted. function waitForConsole(task, message) { + // eslint-disable-next-line no-async-promise-executor return new Promise(async resolve => { SimpleTest.monitorConsole(resolve, [ { diff --git a/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js b/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js index a4949ab4408e..a4ab3168e69d 100644 --- a/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js +++ b/toolkit/mozapps/extensions/test/browser/browser_CTP_plugins.js @@ -238,7 +238,7 @@ add_task(async function test_blocklisted_plugin_disabled() { }); // Causes appDisabled to be set. - await new Promise(async resolve => { + await new Promise(resolve => { // Ensure to reset the blocklist if this test exits earlier because // of a failure. registerCleanupFunction(ensurePluginEnabled); diff --git a/toolkit/mozapps/extensions/test/browser/head.js b/toolkit/mozapps/extensions/test/browser/head.js index 0a25c811e11a..d35f2c678346 100644 --- a/toolkit/mozapps/extensions/test/browser/head.js +++ b/toolkit/mozapps/extensions/test/browser/head.js @@ -553,9 +553,9 @@ function promiseAddonsByIDs(aIDs) { * * The callback will receive the Addon for the installed add-on. */ -function install_addon(path, cb, pathPrefix = TESTROOT) { - let p = new Promise(async (resolve, reject) => { - let install = await AddonManager.getInstallForURL(pathPrefix + path); +async function install_addon(path, cb, pathPrefix = TESTROOT) { + let install = await AddonManager.getInstallForURL(pathPrefix + path); + let p = new Promise((resolve, reject) => { install.addListener({ onInstallEnded: () => resolve(install.addon), });