Bug 1347108 - Reduce the amount of time to show up a WebExtensions DevTools panel.
MozReview-Commit-ID: LJl8VJNErnz
--- 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.
*/