From 780518ed1d9b05e6b31c4067d4db29927779abf3 Mon Sep 17 00:00:00 2001 From: Federico Brigante Date: Wed, 19 Jan 2022 04:12:53 +0800 Subject: [PATCH] fix: enable webextension-polyfill usage via webpack ProvidePlugin (#351) * Enable usage via `ProvidePlugin` * Use `globalThis` * Update lint to forbid `browser` global usage --- .eslintrc | 1 + src/.eslintrc | 5 ++++- src/browser-polyfill.js | 12 ++++++------ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/.eslintrc b/.eslintrc index 08b2811b..b19f0c63 100644 --- a/.eslintrc +++ b/.eslintrc @@ -13,6 +13,7 @@ }, "globals": { + "globalThis": true, }, "rules": { diff --git a/src/.eslintrc b/src/.eslintrc index bc39b257..e008c08f 100644 --- a/src/.eslintrc +++ b/src/.eslintrc @@ -2,10 +2,13 @@ "env": { "browser": true, "node": false, - "webextensions": true, + // Don't use `webextensions` because it enables the browser global. + // We want to use globalThis.browser instead: + // https://github.com/mozilla/webextension-polyfill/pull/351 }, "globals": { // Allow the `module` global, but not the `require(…)` function "module": false, + "chrome": true, }, } diff --git a/src/browser-polyfill.js b/src/browser-polyfill.js index 3ece6274..ca65b3b8 100644 --- a/src/browser-polyfill.js +++ b/src/browser-polyfill.js @@ -6,7 +6,11 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; -if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object.prototype) { +if (typeof globalThis != "object" || typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) { + throw new Error("This script should only be loaded in a browser extension."); +} + +if (typeof globalThis.browser === "undefined" || Object.getPrototypeOf(globalThis.browser) !== Object.prototype) { const CHROME_SEND_MESSAGE_CALLBACK_NO_RESPONSE_MESSAGE = "The message port closed before a response was received."; const SEND_RESPONSE_DEPRECATION_WARNING = "Returning a Promise is the preferred way to send a reply from an onMessage/onMessageExternal listener, as the sendResponse will be removed from the specs (See https://developer.mozilla.org/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage)"; @@ -540,13 +544,9 @@ if (typeof browser === "undefined" || Object.getPrototypeOf(browser) !== Object. return wrapObject(extensionAPIs, staticWrappers, apiMetadata); }; - if (typeof chrome != "object" || !chrome || !chrome.runtime || !chrome.runtime.id) { - throw new Error("This script should only be loaded in a browser extension."); - } - // The build process adds a UMD wrapper around this file, which makes the // `module` variable available. module.exports = wrapAPIs(chrome); } else { - module.exports = browser; + module.exports = globalThis.browser; }