--- a/browser/components/extensions/ext-browserAction.js
+++ b/browser/components/extensions/ext-browserAction.js
@@ -201,16 +201,18 @@ this.browserAction = class extends Exten
event.preventDefault();
}
} else {
TelemetryStopwatch.cancel(POPUP_OPEN_MS_HISTOGRAM, this);
// This isn't not a hack, but it seems to provide the correct behavior
// with the fewest complications.
event.preventDefault();
this.emit("click", tabbrowser.selectedBrowser);
+ // Ensure we close any popups this node was in:
+ CustomizableUI.hidePanelForNode(event.target);
}
},
});
this.tabContext.on("tab-select", // eslint-disable-line mozilla/balanced-listeners
(evt, tab) => { this.updateWindow(tab.ownerGlobal); });
this.widget = widget;
--- a/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
+++ b/browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
@@ -63,17 +63,18 @@ async function testInArea(area) {
sendClick({expectEvent: false, expectPopup: "a"});
},
() => {
browser.test.log(`Click browser action again, expect popup "a".`);
sendClick({expectEvent: false, expectPopup: "a"});
},
() => {
browser.test.log(`Call triggerAction, expect popup "a" again. Leave popup open.`);
- sendClick({expectEvent: false, expectPopup: "a", closePopup: false}, "trigger-action");
+ sendClick({expectEvent: false, expectPopup: "a",
+ closePopup: false, containingPopupShouldClose: false}, "trigger-action");
},
() => {
browser.test.log(`Call triggerAction again. Expect remaining popup closed.`);
sendClick({expectEvent: false, expectPopup: null}, "trigger-action");
browser.test.sendMessage("next-test", {waitUntilClosed: true});
},
() => {
browser.test.log(`Call triggerAction again. Expect popup "a" again.`);
@@ -104,31 +105,37 @@ async function testInArea(area) {
},
() => {
browser.test.log(`Call triggerAction. Expect click event.`);
sendClick({expectEvent: true, expectPopup: null}, "trigger-action");
},
() => {
browser.test.log(`Set popup to "a" and click browser action. Expect popup "a", and leave open.`);
browser.browserAction.setPopup({popup: "/popup-a.html"});
- sendClick({expectEvent: false, expectPopup: "a", closePopup: false});
+ sendClick({expectEvent: false, expectPopup: "a", closePopup: false,
+ containingPopupShouldClose: false});
},
() => {
browser.test.log(`Tell popup "a" to call window.close(). Expect popup closed.`);
browser.test.sendMessage("next-test", {closePopupUsingWindow: true});
},
];
let expect = {};
- sendClick = ({expectEvent, expectPopup, runNextTest, waitUntilClosed, closePopup}, message = "send-click") => {
+ sendClick = ({expectEvent, expectPopup, runNextTest, waitUntilClosed,
+ closePopup, containingPopupShouldClose = true},
+ message = "send-click") => {
if (closePopup == undefined) {
closePopup = !expectEvent;
}
- expect = {event: expectEvent, popup: expectPopup, runNextTest, waitUntilClosed, closePopup};
+ expect = {
+ event: expectEvent, popup: expectPopup, runNextTest,
+ waitUntilClosed, closePopup, containingPopupShouldClose,
+ };
browser.test.sendMessage(message);
};
browser.runtime.onMessage.addListener(msg => {
if (msg == "close-popup-using-window.close") {
return;
} else if (expect.popup) {
browser.test.assertEq(msg, `from-popup-${expect.popup}`,
@@ -211,16 +218,24 @@ async function testInArea(area) {
info("Waiting for panel");
await awaitExtensionPanel(extension);
}
info("Closing for panel");
await closeBrowserAction(extension);
}
+ if (area == getCustomizableUIPanelID() && expecting.containingPopupShouldClose) {
+ let {node} = getBrowserActionWidget(extension).forWindow(window);
+ let panel = node.closest("panel");
+ info(`State of panel ${panel.id} is: ${panel.state}`);
+ ok(!["open", "showing"].includes(panel.state),
+ "Panel containing the action should be closed");
+ }
+
info("Starting next test");
extension.sendMessage("next-test");
});
await Promise.all([extension.startup(), extension.awaitFinish("browseraction-tests-done")]);
await extension.unload();