fix: Throw error when loaded in non-extension contexts (#190)
Fixes #186
This commit is contained in:
parent
10bc37b342
commit
ad207a84b9
|
@ -508,6 +508,10 @@ 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);
|
||||
|
|
|
@ -37,6 +37,17 @@ function setupTestDOMWindow(chromeObject, browserObject = undefined) {
|
|||
return new Promise((resolve, reject) => {
|
||||
const window = testDOMWindow;
|
||||
|
||||
// Ensure that "chrome.runtime.id" is set, because the polyfill is only
|
||||
// loaded in extension environments.
|
||||
if (chromeObject) {
|
||||
if (!chromeObject.runtime) {
|
||||
chromeObject.runtime = {};
|
||||
}
|
||||
if (!chromeObject.runtime.id) {
|
||||
chromeObject.runtime.id = "some-test-id-from-test-setup";
|
||||
}
|
||||
}
|
||||
|
||||
// Inject the fake chrome object used as a fixture for the particular
|
||||
// browser-polyfill test scenario.
|
||||
window.chrome = chromeObject;
|
||||
|
|
|
@ -5,6 +5,17 @@ const {deepEqual, equal, ok} = require("chai").assert;
|
|||
const {setupTestDOMWindow} = require("./setup");
|
||||
|
||||
describe("browser-polyfill", () => {
|
||||
it("throws an error in a non-extension environment", async () => {
|
||||
try {
|
||||
await setupTestDOMWindow(null);
|
||||
ok(false, "The polyfill script should have failed to load.");
|
||||
} catch (e) {
|
||||
equal(e.message,
|
||||
"This script should only be loaded in a browser extension.",
|
||||
"Expected script to not load in a non-extension environment");
|
||||
}
|
||||
});
|
||||
|
||||
it("wraps the global chrome namespace with a global browser namespace", () => {
|
||||
const fakeChrome = {};
|
||||
return setupTestDOMWindow(fakeChrome).then(window => {
|
||||
|
|
|
@ -159,9 +159,16 @@ describe("browser-polyfill", () => {
|
|||
Object.defineProperty(this, "runtime", {value});
|
||||
return value;
|
||||
},
|
||||
get tabs() {
|
||||
ok(false, "chrome.tabs should not lazily be initialized without explicit API call");
|
||||
},
|
||||
};
|
||||
return setupTestDOMWindow(fakeChrome).then(window => {
|
||||
equal(lazyInitCount, 0, "chrome.runtime should not be initialized without explicit API call");
|
||||
// This used to be equal(lazyInitCount, 0, ...), but was changed to
|
||||
// accomodate a change in the implementation of the polyfill.
|
||||
// To verify that APIs are not unnecessarily initialized, the fakeChrome
|
||||
// object has a "tabs" getter that fails the test upon access.
|
||||
equal(lazyInitCount, 1, "chrome.runtime should be initialized because chrome.runtime.id is accessed during polyfill initialization");
|
||||
|
||||
window.browser.runtime.onMessage.addListener(() => {});
|
||||
equal(lazyInitCount, 1, "chrome.runtime should be initialized upon accessing browser.runtime");
|
||||
|
|
Loading…
Reference in New Issue