Bug 1370967 - close containing popup when clicking a non-popup browser action, r?mixedpuppy draft
authorGijs Kruitbosch <gijskruitbosch@gmail.com>
Mon, 03 Jul 2017 17:14:58 +0100
changeset 604820 6be381793d3dd5207fd01bdd4b6d1d4ab7265b6f
parent 604819 4bd7db49d22847111dff9c1dd63ed573903faa5b
child 636297 86db59246919d829c27cdf9135ec0ddc1cc18b35
push id67194
push userbmo:gijskruitbosch+bugs@gmail.com
push dateThu, 06 Jul 2017 13:26:47 +0000
reviewersmixedpuppy
bugs1370967
milestone56.0a1
Bug 1370967 - close containing popup when clicking a non-popup browser action, r?mixedpuppy MozReview-Commit-ID: HkdV5FUPnDV
browser/components/extensions/ext-browserAction.js
browser/components/extensions/test/browser/browser_ext_browserAction_popup.js
--- 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();