diff --git a/ext/bg/js/backend.js b/ext/bg/js/backend.js index 59a3de45..5ca84cab 100644 --- a/ext/bg/js/backend.js +++ b/ext/bg/js/backend.js @@ -78,10 +78,10 @@ class Backend { this._isPrepared = false; this._prepareError = false; this._preparePromise = null; - this._prepareCompletePromise = new Promise((resolve, reject) => { - this._prepareCompleteResolve = resolve; - this._prepareCompleteReject = reject; - }); + const {promise, resolve, reject} = deferPromise(); + this._prepareCompletePromise = promise; + this._prepareCompleteResolve = resolve; + this._prepareCompleteReject = reject; this._defaultBrowserActionTitle = null; this._badgePrepareDelayTimer = null; @@ -1269,8 +1269,7 @@ class Backend { static async _findTab(timeout, checkUrl) { // This function works around the need to have the "tabs" permission to access tab.url. const tabs = await new Promise((resolve) => chrome.tabs.query({}, resolve)); - let matchPromiseResolve = null; - const matchPromise = new Promise((resolve) => { matchPromiseResolve = resolve; }); + const {promise: matchPromise, resolve: matchPromiseResolve} = deferPromise(); const checkTabUrl = ({tab, url}) => { if (checkUrl(url, tab)) { diff --git a/ext/fg/js/popup.js b/ext/fg/js/popup.js index 5ee62c9b..931813de 100644 --- a/ext/fg/js/popup.js +++ b/ext/fg/js/popup.js @@ -229,12 +229,11 @@ class Popup { return new Promise((resolve, reject) => { const tokenMap = new Map(); let timer = null; - let frameLoadedResolve = null; - let frameLoadedReject = null; - const frameLoaded = new Promise((resolve2, reject2) => { - frameLoadedResolve = resolve2; - frameLoadedReject = reject2; - }); + let { + promise: frameLoadedPromise, + resolve: frameLoadedResolve, + reject: frameLoadedReject + } = deferPromise(); const postMessage = (action, params) => { const contentWindow = frame.contentWindow; @@ -261,7 +260,7 @@ class Popup { if (!isObject(message)) { return; } const {action, params} = message; if (!isObject(params)) { return; } - await frameLoaded; + await frameLoadedPromise; if (timer === null) { return; } // Done switch (action) { @@ -331,7 +330,7 @@ class Popup { frame.addEventListener('load', onLoad); // Prevent unhandled rejections - frameLoaded.catch(() => {}); // NOP + frameLoadedPromise.catch(() => {}); // NOP setupFrame(frame); }); diff --git a/ext/mixed/js/api.js b/ext/mixed/js/api.js index 5c17d50e..1e421147 100644 --- a/ext/mixed/js/api.js +++ b/ext/mixed/js/api.js @@ -212,12 +212,11 @@ const api = (() => { _createActionPort(timeout=5000) { return new Promise((resolve, reject) => { let timer = null; - let portNameResolve; - let portNameReject; - const portNamePromise = new Promise((resolve2, reject2) => { - portNameResolve = resolve2; - portNameReject = reject2; - }); + const { + promise: portNamePromise, + resolve: portNameResolve, + reject: portNameReject + } = deferPromise(); const onConnect = async (port) => { try { diff --git a/ext/mixed/js/core.js b/ext/mixed/js/core.js index e22be33d..fec26a0e 100644 --- a/ext/mixed/js/core.js +++ b/ext/mixed/js/core.js @@ -197,6 +197,16 @@ const clone = (() => { * Async utilities */ +function deferPromise() { + let resolve; + let reject; + const promise = new Promise((resolve2, reject2) => { + resolve = resolve2; + reject = reject2; + }); + return {promise, resolve, reject}; +} + function promiseTimeout(delay, resolveValue) { if (delay <= 0) { const promise = Promise.resolve(resolveValue); @@ -206,8 +216,7 @@ function promiseTimeout(delay, resolveValue) { } let timer = null; - let promiseResolve = null; - let promiseReject = null; + let {promise, resolve, reject} = deferPromise(); const complete = (callback, value) => { if (callback === null) { return; } @@ -215,39 +224,25 @@ function promiseTimeout(delay, resolveValue) { clearTimeout(timer); timer = null; } - promiseResolve = null; - promiseReject = null; + resolve = null; + reject = null; callback(value); }; - const resolve = (value) => complete(promiseResolve, value); - const reject = (value) => complete(promiseReject, value); + const resolveWrapper = (value) => complete(resolve, value); + const rejectWrapper = (value) => complete(reject, value); - const promise = new Promise((resolve2, reject2) => { - promiseResolve = resolve2; - promiseReject = reject2; - }); timer = setTimeout(() => { timer = null; - resolve(resolveValue); + resolveWrapper(resolveValue); }, delay); - promise.resolve = resolve; - promise.reject = reject; + promise.resolve = resolveWrapper; + promise.reject = rejectWrapper; return promise; } -function deferPromise() { - let resolve; - let reject; - const promise = new Promise((resolve2, reject2) => { - resolve = resolve2; - reject = reject2; - }); - return {promise, resolve, reject}; -} - /* * Common events