Bug 1340529 - Fix shown/hidden events for a devtools_panel toggled from toolbox preferences. r=kmag

MozReview-Commit-ID: H81qwCEoaf9

--HG--
extra : rebase_source : 8376f43d40739be337f983c34a9527137fb1c1c5
This commit is contained in:
Luca Greco 2017-02-16 04:07:49 +01:00
Родитель 0db343d655
Коммит f30c630e4d
3 изменённых файлов: 65 добавлений и 1 удалений

Просмотреть файл

@ -44,6 +44,13 @@ class ChildDevToolsPanel extends EventEmitter {
if (view.viewType === "devtools_panel" &&
view.devtoolsToolboxInfo.toolboxPanelId === this.id) {
this._panelContext = view;
// Reset the cached _panelContext property when the view is closed.
view.callOnClose({
close: () => {
this._panelContext = null;
},
});
return view;
}
}

Просмотреть файл

@ -170,6 +170,12 @@ class ParentDevToolsPanel {
unwatchExtensionProxyContextLoad();
browser.remove();
toolbox.off("select", this.onToolboxPanelSelect);
// 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;
});
};
}
@ -184,7 +190,6 @@ class ParentDevToolsPanel {
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(() => {
@ -218,6 +223,8 @@ class ParentDevToolsPanel {
this.context = null;
this.toolbox = null;
this.waitTopLevelContext = null;
this._resolveTopLevelContext = null;
}
}

Просмотреть файл

@ -135,6 +135,56 @@ add_task(function* test_devtools_page_panels_create() {
is(secondCycleResults.panelShown, 2, "panel.onShown listener has been called twice");
is(secondCycleResults.panelHidden, 2, "panel.onHidden listener has been called twice");
// Turn off the addon devtools panel using the visibilityswitch.
const waitToolVisibilityOff = new Promise(resolve => {
toolbox.once("tool-unregistered", resolve);
});
Services.prefs.setBoolPref(`devtools.webext-${panelId}.enabled`, false);
gDevTools.emit("tool-unregistered", panelId);
yield waitToolVisibilityOff;
ok(toolbox.hasAdditionalTool(panelId),
"The tool has not been removed on visibilityswitch set to false");
is(toolbox.visibleAdditionalTools.filter(tool => tool.id == panelId).length, 0,
"The tool is not visible on visibilityswitch set to false");
// Turn on the addon devtools panel using the visibilityswitch.
const waitToolVisibilityOn = new Promise(resolve => {
toolbox.once("tool-registered", resolve);
});
Services.prefs.setBoolPref(`devtools.webext-${panelId}.enabled`, true);
gDevTools.emit("tool-registered", panelId);
yield waitToolVisibilityOn;
ok(toolbox.hasAdditionalTool(panelId),
"The tool has been added on visibilityswitch set to true");
is(toolbox.visibleAdditionalTools.filter(toolId => toolId == panelId).length, 1,
"The tool is visible on visibilityswitch set to true");
// Test devtools panel is loaded correctly after being toggled and
// devtools panel events has been fired as expected.
yield gDevTools.showToolbox(target, panelId);
yield extension.awaitMessage("devtools_panel_shown");
info("Addon Devtools Panel shown - after visibilityswitch toggled");
info("Wait until the Addon Devtools Panel has been loaded - after visibilityswitch toggled");
const panelTabIdAfterToggle = yield extension.awaitMessage("devtools_panel_inspectedWindow_tabId");
is(panelTabIdAfterToggle, devtoolsPageTabId,
"Got the same devtools.inspectedWindow.tabId from devtools panel after visibility toggled");
yield gDevTools.showToolbox(target, "webconsole");
const toolToggledResults = yield extension.awaitMessage("devtools_panel_hidden");
info("Addon Devtools Panel hidden - after visibilityswitch toggled");
is(toolToggledResults.panelCreated, 1, "devtools.panel.create callback has been called once");
is(toolToggledResults.panelShown, 3, "panel.onShown listener has been called three times");
is(toolToggledResults.panelHidden, 3, "panel.onHidden listener has been called three times");
yield gDevTools.closeToolbox(target);
yield target.destroy();