Bug 1394750 - Fix selected devtools panel when an Extension DevTools panel is unloaded.
MozReview-Commit-ID: 25erR7FJEsY
--- a/devtools/client/framework/toolbox.js
+++ b/devtools/client/framework/toolbox.js
@@ -1643,18 +1643,16 @@ Toolbox.prototype = {
}
if (!this.hasAdditionalTool(toolId)) {
throw new Error("Tool definition not registered to this toolbox: " +
toolId);
}
this.additionalToolDefinitions.delete(toolId);
- this.visibleAdditionalTools = this.visibleAdditionalTools
- .filter(id => id !== toolId);
this.unloadTool(toolId);
},
/**
* Ensure the tool with the given id is loaded.
*
* @param {string} id
* The id of the tool to load.
@@ -2469,31 +2467,61 @@ Toolbox.prototype = {
// Select another tool.
if (this.currentToolId == toolId) {
let index = this.panelDefinitions.findIndex(({id}) => id === toolId);
let nextTool = this.panelDefinitions[index + 1];
let previousTool = this.panelDefinitions[index - 1];
let toolNameToSelect;
+ // If the toolId can't be found in the globally registered panel definitions
+ // Check if the tool was actually part of the additional tools created by
+ // a WebExtension.
+ if (index === -1) {
+ let additionalNextTool;
+ let additionalPrevtool;
+
+ let additionalToolIndex = this.visibleAdditionalTools
+ .findIndex(id => id === toolId);
+
+ if (additionalToolIndex >= 0) {
+ additionalNextTool = this.visibleAdditionalTools[additionalToolIndex + 1];
+ additionalPrevtool = this.visibleAdditionalTools[additionalToolIndex - 1];
+
+ if (!additionalPrevtool) {
+ previousTool = this.panelDefinitions[this.panelDefinitions.length - 1];
+ }
+ }
+
+ if (additionalNextTool) {
+ nextTool = additionalNextTool;
+ }
+
+ if (additionalPrevtool) {
+ previousTool = additionalPrevtool;
+ }
+ }
+
if (nextTool) {
toolNameToSelect = nextTool.id;
}
if (previousTool) {
toolNameToSelect = previousTool.id;
}
+
if (toolNameToSelect) {
this.selectTool(toolNameToSelect);
}
}
// Remove this tool from the current panel definitions.
- this.panelDefinitions = this.panelDefinitions.filter(({id}) => id !== toolId);
this.visibleAdditionalTools = this.visibleAdditionalTools
.filter(id => id !== toolId);
+ this.panelDefinitions = this.panelDefinitions.filter(({id}) => id !== toolId);
+
this._combineAndSortPanelDefinitions();
if (panel) {
panel.remove();
}
if (this.hostType == Toolbox.HostType.WINDOW) {
let doc = this.win.parent.document;