Bug 1347108 - Reduce the amount of time to show up a WebExtensions DevTools panel. draft
authorLuca Greco <lgreco@mozilla.com>
Thu, 08 Jun 2017 17:10:07 +0200
changeset 595684 4297a0c5cae04e930c92ef3c48dae44724568f55
parent 590997 6491fb29e7fcc9e02cc179ae2856f426a3552385
child 633773 7ba7ed8eaf57b8d5a0138c72eb01f9aa10a87b68
push id64411
push userluca.greco@alcacoop.it
push dateFri, 16 Jun 2017 17:08:44 +0000
bugs1347108
milestone55.0a1
Bug 1347108 - Reduce the amount of time to show up a WebExtensions DevTools panel. MozReview-Commit-ID: LJl8VJNErnz
browser/components/extensions/ext-devtools-panels.js
devtools/client/framework/toolbox.js
--- a/browser/components/extensions/ext-devtools-panels.js
+++ b/browser/components/extensions/ext-devtools-panels.js
@@ -52,25 +52,19 @@ class ParentDevToolsPanel {
 
     this.panelOptions = panelOptions;
 
     this.context.callOnClose(this);
 
     this.id = this.panelOptions.id;
 
     this.onToolboxPanelSelect = this.onToolboxPanelSelect.bind(this);
-    this.onToolboxReady = this.onToolboxReady.bind(this);
 
     this.panelAdded = false;
-
-    if (this.toolbox.isReady) {
-      this.onToolboxReady();
-    } else {
-      this.toolbox.once("ready", this.onToolboxReady);
-    }
+    this.addPanel();
 
     this.waitTopLevelContext = new Promise(resolve => {
       this._resolveTopLevelContext = resolve;
     });
   }
 
   addPanel() {
     const {icon, title} = this.panelOptions;
@@ -90,16 +84,18 @@ class ParentDevToolsPanel {
           throw new Error("Unexpected toolbox received on addAdditionalTool build property");
         }
 
         const destroy = this.buildPanel(window, toolbox);
 
         return {toolbox, destroy};
       },
     });
+
+    this.panelAdded = true;
   }
 
   buildPanel(window, toolbox) {
     const {url} = this.panelOptions;
     const {document} = window;
 
     const browser = document.createElementNS(XUL_NS, "browser");
     browser.setAttribute("type", "content");
@@ -171,23 +167,16 @@ class ParentDevToolsPanel {
       // If the panel has been disabled from the toolbox preferences,
       // we need to re-initialize the waitTopLevelContext Promise.
       this.waitTopLevelContext = new Promise(resolve => {
         this._resolveTopLevelContext = resolve;
       });
     };
   }
 
-  onToolboxReady() {
-    if (!this.panelAdded) {
-      this.panelAdded = true;
-      this.addPanel();
-    }
-  }
-
   onToolboxPanelSelect(what, id) {
     if (!this.waitTopLevelContext || !this.panelAdded) {
       return;
     }
     if (!this.visible && id === this.id) {
       // Wait that the panel is fully loaded and emit show.
       this.waitTopLevelContext.then(() => {
         this.visible = true;
@@ -205,21 +194,19 @@ class ParentDevToolsPanel {
 
   close() {
     const {toolbox} = this;
 
     if (!toolbox) {
       throw new Error("Unable to destroy a closed devtools panel");
     }
 
-    toolbox.off("ready", this.onToolboxReady);
-
     // Explicitly remove the panel if it is registered and the toolbox is not
     // closing itself.
-    if (toolbox.isToolRegistered(this.id) && !toolbox._destroyer) {
+    if (this.panelAdded && toolbox.isToolRegistered(this.id) && !toolbox._destroyer) {
       toolbox.removeAdditionalTool(this.id);
     }
 
     this.context = null;
     this.toolbox = null;
     this.waitTopLevelContext = null;
     this._resolveTopLevelContext = null;
   }
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -214,17 +214,19 @@ Toolbox.prototype = {
       this._visibleAdditionalTools = [];
     }
 
     return this._visibleAdditionalTools;
   },
 
   set visibleAdditionalTools(tools) {
     this._visibleAdditionalTools = tools;
-    this._combineAndSortPanelDefinitions();
+    if (this.isReady) {
+      this._combineAndSortPanelDefinitions();
+    }
   },
 
   /**
    * Combines the built-in panel definitions and the additional tool definitions that
    * can be set by add-ons.
    */
   _combineAndSortPanelDefinitions() {
     const definitions = [...this._panelDefinitions, ...this.getVisibleAdditionalTools()];
@@ -1378,21 +1380,27 @@ Toolbox.prototype = {
     if (!definition.id) {
       throw new Error("Tool definition id is missing");
     }
 
     if (this.isToolRegistered(definition.id)) {
       throw new Error("Tool definition already registered: " +
                       definition.id);
     }
+
     this.additionalToolDefinitions.set(definition.id, definition);
     this.visibleAdditionalTools = [...this.visibleAdditionalTools, definition.id];
 
-    this._combineAndSortPanelDefinitions();
-    this._buildPanelForTool(definition);
+    const buildPanel = () => this._buildPanelForTool(definition);
+
+    if (this.isReady) {
+      buildPanel();
+    } else {
+      this.once("ready", buildPanel);
+    }
   },
 
   /**
    * Unregister and unload an additional tool from this particular toolbox.
    *
    * @param {string} toolId
    *        the id of the additional tool to unregister and remove.
    */