Bug 1333201: Don't import gDevTools.jsm before necessary. r?rpl
MozReview-Commit-ID: 9bNA3ZEEYD3
--- a/browser/components/extensions/ext-devtools.js
+++ b/browser/components/extensions/ext-devtools.js
@@ -19,16 +19,18 @@ Cu.import("resource://gre/modules/Extens
const {
HiddenExtensionPage,
watchExtensionProxyContextLoad,
} = ExtensionParent;
// Map[extension -> DevToolsPageDefinition]
let devtoolsPageDefinitionMap = new Map();
+let initDevTools;
+
/**
* Retrieve the devtools target for the devtools extension proxy context
* (lazily cloned from the target of the toolbox associated to the context
* the first time that it is accessed).
*
* @param {DevToolsExtensionPageContextParent} context
* A devtools extension proxy context.
*
@@ -100,16 +102,18 @@ global.getTargetTabIdForToolbox = (toolb
* The path to the devtools page html page relative to the extension base URL.
* @param {DevToolsPageDefinition} options.devToolsPageDefinition
* The instance of the devToolsPageDefinition class related to this DevToolsPage.
*/
class DevToolsPage extends HiddenExtensionPage {
constructor(extension, options) {
super(extension, "devtools_page");
+ initDevTools();
+
this.url = extension.baseURI.resolve(options.url);
this.toolbox = options.toolbox;
this.devToolsPageDefinition = options.devToolsPageDefinition;
this.unwatchExtensionProxyContextLoad = null;
this.waitForTopLevelContext = new Promise(resolve => {
this.resolveTopLevelContext = resolve;
@@ -241,51 +245,60 @@ class DevToolsPageDefinition {
`Leaked ${this.devtoolsPageForTarget.size} DevToolsPage instances in devtoolsPageForTarget Map`
);
}
}
}
/* eslint-disable mozilla/balanced-listeners */
-// Create a devtools page context for a new opened toolbox,
-// based on the registered devtools_page definitions.
-gDevTools.on("toolbox-created", (evt, toolbox) => {
- if (!toolbox.target.isLocalTab) {
- // Only local tabs are currently supported (See Bug 1304378 for additional details
- // related to remote targets support).
- let msg = `Ignoring DevTools Toolbox for target "${toolbox.target.toString()}": ` +
- `"${toolbox.target.name}" ("${toolbox.target.url}"). ` +
- "Only local tab are currently supported by the WebExtensions DevTools API.";
- let scriptError = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError);
- scriptError.init(msg, null, null, null, null, Ci.nsIScriptError.warningFlag, "content javascript");
- let consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
- consoleService.logMessage(scriptError);
-
+let devToolsInitialized = false;
+initDevTools = function() {
+ if (devToolsInitialized) {
return;
}
- for (let devtoolsPage of devtoolsPageDefinitionMap.values()) {
- devtoolsPage.buildForToolbox(toolbox);
- }
-});
+ // Create a devtools page context for a new opened toolbox,
+ // based on the registered devtools_page definitions.
+ gDevTools.on("toolbox-created", (evt, toolbox) => {
+ if (!toolbox.target.isLocalTab) {
+ // Only local tabs are currently supported (See Bug 1304378 for additional details
+ // related to remote targets support).
+ let msg = `Ignoring DevTools Toolbox for target "${toolbox.target.toString()}": ` +
+ `"${toolbox.target.name}" ("${toolbox.target.url}"). ` +
+ "Only local tab are currently supported by the WebExtensions DevTools API.";
+ let scriptError = Cc["@mozilla.org/scripterror;1"].createInstance(Ci.nsIScriptError);
+ scriptError.init(msg, null, null, null, null, Ci.nsIScriptError.warningFlag, "content javascript");
+ let consoleService = Cc["@mozilla.org/consoleservice;1"].getService(Ci.nsIConsoleService);
+ consoleService.logMessage(scriptError);
+
+ return;
+ }
-// Destroy a devtools page context for a destroyed toolbox,
-// based on the registered devtools_page definitions.
-gDevTools.on("toolbox-destroy", (evt, target) => {
- if (!target.isLocalTab) {
- // Only local tabs are currently supported (See Bug 1304378 for additional details
- // related to remote targets support).
- return;
- }
+ for (let devtoolsPage of devtoolsPageDefinitionMap.values()) {
+ devtoolsPage.buildForToolbox(toolbox);
+ }
+ });
- for (let devtoolsPageDefinition of devtoolsPageDefinitionMap.values()) {
- devtoolsPageDefinition.shutdownForTarget(target);
- }
-});
+ // Destroy a devtools page context for a destroyed toolbox,
+ // based on the registered devtools_page definitions.
+ gDevTools.on("toolbox-destroy", (evt, target) => {
+ if (!target.isLocalTab) {
+ // Only local tabs are currently supported (See Bug 1304378 for additional details
+ // related to remote targets support).
+ return;
+ }
+
+ for (let devtoolsPageDefinition of devtoolsPageDefinitionMap.values()) {
+ devtoolsPageDefinition.shutdownForTarget(target);
+ }
+ });
+
+ devToolsInitialized = true;
+};
// Create and register a new devtools_page definition as specified in the
// "devtools_page" property in the extension manifest.
extensions.on("manifest_devtools_page", (type, directive, extension, manifest) => {
let devtoolsPageDefinition = new DevToolsPageDefinition(extension, manifest[directive]);
devtoolsPageDefinitionMap.set(extension, devtoolsPageDefinition);
});