Bug 1333201: Don't import gDevTools.jsm before necessary. r?rpl draft
authorKris Maglione <maglione.k@gmail.com>
Mon, 23 Jan 2017 13:22:10 -0800
changeset 465148 aa36042c5a3171dcde98c253dd9adbeae11fec12
parent 465147 c670ed5a35ac9f4d1a8ad3d374b4547ac8b4548e
child 543106 26a7dfcaac28d7b585a356ea5ef831f320aaa9f1
push id42553
push usermaglione.k@gmail.com
push dateMon, 23 Jan 2017 21:23:20 +0000
reviewersrpl
bugs1333201
milestone53.0a1
Bug 1333201: Don't import gDevTools.jsm before necessary. r?rpl MozReview-Commit-ID: 9bNA3ZEEYD3
browser/components/extensions/ext-devtools.js
--- 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);
 });