forked from mirrors/gecko-dev
MozReview-Commit-ID: CqpWgFGmJAt --HG-- extra : rebase_source : 4efafc7a529316c7986e372c71527b3d9844997a
91 lines
2.7 KiB
JavaScript
91 lines
2.7 KiB
JavaScript
"use strict";
|
|
|
|
var {interfaces: Ci, utils: Cu} = Components;
|
|
|
|
Cu.import("resource://gre/modules/Services.jsm");
|
|
Cu.import("resource://gre/modules/Task.jsm");
|
|
|
|
XPCOMUtils.defineLazyModuleGetter(this, "AddonManager",
|
|
"resource://gre/modules/AddonManager.jsm");
|
|
|
|
Cu.import("resource://gre/modules/ExtensionParent.jsm");
|
|
const {
|
|
HiddenExtensionPage,
|
|
promiseExtensionViewLoaded,
|
|
} = ExtensionParent;
|
|
|
|
// WeakMap[Extension -> BackgroundPage]
|
|
var backgroundPagesMap = new WeakMap();
|
|
|
|
// Responsible for the background_page section of the manifest.
|
|
class BackgroundPage extends HiddenExtensionPage {
|
|
constructor(extension, options) {
|
|
super(extension, "background");
|
|
|
|
this.page = options.page || null;
|
|
this.isGenerated = !!options.scripts;
|
|
this.webNav = null;
|
|
|
|
if (this.page) {
|
|
this.url = this.extension.baseURI.resolve(this.page);
|
|
} else if (this.isGenerated) {
|
|
this.url = this.extension.baseURI.resolve("_generated_background_page.html");
|
|
}
|
|
|
|
if (!this.extension.isExtensionURL(this.url)) {
|
|
this.extension.manifestError("Background page must be a file within the extension");
|
|
this.url = this.extension.baseURI.resolve("_blank.html");
|
|
}
|
|
}
|
|
|
|
build() {
|
|
return Task.spawn(function* () {
|
|
yield this.createBrowserElement();
|
|
|
|
extensions.emit("extension-browser-inserted", this.browser);
|
|
|
|
this.browser.loadURI(this.url);
|
|
|
|
yield promiseExtensionViewLoaded(this.browser);
|
|
|
|
if (this.browser.docShell) {
|
|
this.webNav = this.browser.docShell.QueryInterface(Ci.nsIWebNavigation);
|
|
let window = this.webNav.document.defaultView;
|
|
|
|
// Set the add-on's main debugger global, for use in the debugger
|
|
// console.
|
|
if (this.extension.addonData.instanceID) {
|
|
AddonManager.getAddonByInstanceID(this.extension.addonData.instanceID)
|
|
.then(addon => addon.setDebugGlobal(window));
|
|
}
|
|
}
|
|
|
|
this.extension.emit("startup");
|
|
}.bind(this));
|
|
}
|
|
|
|
shutdown() {
|
|
if (this.extension.addonData.instanceID) {
|
|
AddonManager.getAddonByInstanceID(this.extension.addonData.instanceID)
|
|
.then(addon => addon.setDebugGlobal(null));
|
|
}
|
|
|
|
super.shutdown();
|
|
}
|
|
}
|
|
|
|
/* eslint-disable mozilla/balanced-listeners */
|
|
extensions.on("manifest_background", (type, directive, extension, manifest) => {
|
|
let bgPage = new BackgroundPage(extension, manifest.background);
|
|
|
|
backgroundPagesMap.set(extension, bgPage);
|
|
return bgPage.build();
|
|
});
|
|
|
|
extensions.on("shutdown", (type, extension) => {
|
|
if (backgroundPagesMap.has(extension)) {
|
|
backgroundPagesMap.get(extension).shutdown();
|
|
backgroundPagesMap.delete(extension);
|
|
}
|
|
});
|
|
/* eslint-enable mozilla/balanced-listeners */
|