diff --git a/toolkit/components/extensions/Extension.jsm b/toolkit/components/extensions/Extension.jsm index cbf63d48c479..9c7122a173e8 100644 --- a/toolkit/components/extensions/Extension.jsm +++ b/toolkit/components/extensions/Extension.jsm @@ -724,9 +724,6 @@ GlobalManager = { let uri = document.documentURIObject; let context = new ExtensionContext(extension, {viewType, contentWindow, uri, docShell}); - if (viewType == "background") { - this._initializeBackgroundPage(contentWindow); - } let innerWindowID = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor) .getInterface(Ci.nsIDOMWindowUtils).currentInnerWindowID; @@ -740,28 +737,6 @@ GlobalManager = { }; Services.obs.addObserver(onUnload, "inner-window-destroyed", false); }, - - _initializeBackgroundPage(contentWindow) { - // Override the `alert()` method inside background windows; - // we alias it to console.log(). - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1203394 - let alertDisplayedWarning = false; - let alertOverwrite = text => { - if (!alertDisplayedWarning) { - require("devtools/client/framework/devtools-browser"); - - let hudservice = require("devtools/client/webconsole/hudservice"); - hudservice.openBrowserConsoleOrFocus(); - - contentWindow.console.warn("alert() is not supported in background windows; please use console.log instead."); - - alertDisplayedWarning = true; - } - - contentWindow.console.log(text); - }; - Cu.exportFunction(alertOverwrite, contentWindow, {defineAs: "alert"}); - }, }; // Represents the data contained in an extension, contained either diff --git a/toolkit/components/extensions/ExtensionChild.jsm b/toolkit/components/extensions/ExtensionChild.jsm index e35558a27b66..7e8e23aacffa 100644 --- a/toolkit/components/extensions/ExtensionChild.jsm +++ b/toolkit/components/extensions/ExtensionChild.jsm @@ -178,6 +178,10 @@ this.ExtensionContext = class extends BaseContext { Schemas.inject(browserObj, this.childManager); Schemas.inject(chromeObj, chromeApiWrapper); + if (viewType == "background") { + apiManager.global.initializeBackgroundPage(contentWindow); + } + if (this.externallyVisible) { this.extension.views.add(this); } diff --git a/toolkit/components/extensions/ext-backgroundPage.js b/toolkit/components/extensions/ext-backgroundPage.js index 8052c8db4053..02b03292d3fd 100644 --- a/toolkit/components/extensions/ext-backgroundPage.js +++ b/toolkit/components/extensions/ext-backgroundPage.js @@ -143,20 +143,3 @@ extensions.on("shutdown", (type, extension) => { } }); /* eslint-enable mozilla/balanced-listeners */ - -extensions.registerSchemaAPI("extension", "addon_parent", context => { - let {extension} = context; - return { - extension: { - getBackgroundPage: function() { - return backgroundPagesMap.get(extension).contentWindow; - }, - }, - - runtime: { - getBackgroundPage() { - return context.cloneScope.Promise.resolve(backgroundPagesMap.get(extension).contentWindow); - }, - }, - }; -}); diff --git a/toolkit/components/extensions/ext-c-backgroundPage.js b/toolkit/components/extensions/ext-c-backgroundPage.js new file mode 100644 index 000000000000..f9fbdc7fcd73 --- /dev/null +++ b/toolkit/components/extensions/ext-c-backgroundPage.js @@ -0,0 +1,44 @@ +"use strict"; + +global.initializeBackgroundPage = (contentWindow) => { + // Override the `alert()` method inside background windows; + // we alias it to console.log(). + // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1203394 + let alertDisplayedWarning = false; + let alertOverwrite = text => { + if (!alertDisplayedWarning) { + require("devtools/client/framework/devtools-browser"); + + let hudservice = require("devtools/client/webconsole/hudservice"); + hudservice.openBrowserConsoleOrFocus(); + + contentWindow.console.warn("alert() is not supported in background windows; please use console.log instead."); + + alertDisplayedWarning = true; + } + + contentWindow.console.log(text); + }; + Cu.exportFunction(alertOverwrite, contentWindow, {defineAs: "alert"}); +}; + +extensions.registerSchemaAPI("extension", "addon_child", context => { + function getBackgroundPage() { + for (let view of context.extension.views) { + if (view.viewType == "background") { + return view.contentWindow; + } + } + } + return { + extension: { + getBackgroundPage, + }, + + runtime: { + getBackgroundPage() { + return context.cloneScope.Promise.resolve(getBackgroundPage()); + }, + }, + }; +}); diff --git a/toolkit/components/extensions/extensions-toolkit.manifest b/toolkit/components/extensions/extensions-toolkit.manifest index cdf3338c3468..03979519e857 100644 --- a/toolkit/components/extensions/extensions-toolkit.manifest +++ b/toolkit/components/extensions/extensions-toolkit.manifest @@ -23,6 +23,7 @@ category webextension-scripts-content test chrome://extensions/content/ext-c-tes category webextension-scripts-content storage chrome://extensions/content/ext-c-storage.js # scripts that must run in the same process as addon code. +category webextension-scripts-addon backgroundPage chrome://extensions/content/ext-c-backgroundPage.js category webextension-scripts-addon extension chrome://extensions/content/ext-c-extension.js category webextension-scripts-addon i18n chrome://extensions/content/ext-i18n.js category webextension-scripts-addon runtime chrome://extensions/content/ext-c-runtime.js diff --git a/toolkit/components/extensions/jar.mn b/toolkit/components/extensions/jar.mn index 29aa4ea197d6..97d335a8dd70 100644 --- a/toolkit/components/extensions/jar.mn +++ b/toolkit/components/extensions/jar.mn @@ -20,6 +20,7 @@ toolkit.jar: content/extensions/ext-storage.js content/extensions/ext-test.js content/extensions/ext-topSites.js + content/extensions/ext-c-backgroundPage.js content/extensions/ext-c-extension.js content/extensions/ext-c-runtime.js content/extensions/ext-c-storage.js