summaryrefslogtreecommitdiffstats
path: root/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js')
-rw-r--r--browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js134
1 files changed, 134 insertions, 0 deletions
diff --git a/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js b/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
new file mode 100644
index 0000000000..38a50d6c24
--- /dev/null
+++ b/browser/components/customizableui/test/browser_940307_panel_click_closure_handling.js
@@ -0,0 +1,134 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+"use strict";
+
+var button, menuButton;
+/* Clicking a button should close the panel */
+add_task(async function plain_button() {
+ button = document.createXULElement("toolbarbutton");
+ button.id = "browser_940307_button";
+ button.setAttribute("label", "Button");
+ gNavToolbox.palette.appendChild(button);
+ CustomizableUI.addWidgetToArea(
+ button.id,
+ CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
+ );
+
+ await waitForOverflowButtonShown();
+
+ await document.getElementById("nav-bar").overflowable.show();
+ let hiddenAgain = promiseOverflowHidden(window);
+ EventUtils.synthesizeMouseAtCenter(button, {});
+ await hiddenAgain;
+ CustomizableUI.removeWidgetFromArea(button.id);
+ button.remove();
+});
+
+add_task(async function searchbar_in_panel() {
+ CustomizableUI.addWidgetToArea(
+ "search-container",
+ CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
+ );
+
+ await waitForOverflowButtonShown();
+
+ await document.getElementById("nav-bar").overflowable.show();
+
+ let searchbar = document.getElementById("searchbar");
+ await TestUtils.waitForCondition(
+ () => "value" in searchbar && searchbar.value === ""
+ );
+
+ // Focusing a non-empty searchbox will cause us to open the
+ // autocomplete panel and search for suggestions, which would
+ // trigger network requests. Temporarily disable suggestions.
+ await SpecialPowers.pushPrefEnv({
+ set: [["browser.search.suggest.enabled", false]],
+ });
+ let dontShowPopup = e => e.preventDefault();
+ let searchbarPopup = searchbar.textbox.popup;
+ searchbarPopup.addEventListener("popupshowing", dontShowPopup);
+
+ searchbar.value = "foo";
+ searchbar.focus();
+
+ // Can't use promisePanelElementShown() here since the search bar
+ // creates its context menu lazily the first time it is opened.
+ let contextMenuShown = new Promise(resolve => {
+ let listener = event => {
+ if (searchbar._menupopup && event.target == searchbar._menupopup) {
+ window.removeEventListener("popupshown", listener);
+ resolve(searchbar._menupopup);
+ }
+ };
+ window.addEventListener("popupshown", listener);
+ });
+ EventUtils.synthesizeMouseAtCenter(searchbar, {
+ type: "contextmenu",
+ button: 2,
+ });
+ let contextmenu = await contextMenuShown;
+
+ ok(isOverflowOpen(), "Panel should still be open");
+
+ let selectAll = contextmenu.querySelector("[cmd='cmd_selectAll']");
+ let contextMenuHidden = promisePanelElementHidden(window, contextmenu);
+ contextmenu.activateItem(selectAll);
+ await contextMenuHidden;
+
+ ok(isOverflowOpen(), "Panel should still be open");
+
+ let hiddenPanelPromise = promiseOverflowHidden(window);
+ EventUtils.synthesizeKey("KEY_Escape");
+ await hiddenPanelPromise;
+ ok(!isOverflowOpen(), "Panel should no longer be open");
+
+ // Allow search bar popup to show again.
+ searchbarPopup.removeEventListener("popupshowing", dontShowPopup);
+
+ // We focused the search bar earlier - ensure we don't keep doing that.
+ gURLBar.select();
+
+ CustomizableUI.reset();
+});
+
+add_task(async function disabled_button_in_panel() {
+ button = document.createXULElement("toolbarbutton");
+ button.id = "browser_946166_button_disabled";
+ button.setAttribute("disabled", "true");
+ button.setAttribute("label", "Button");
+ gNavToolbox.palette.appendChild(button);
+ CustomizableUI.addWidgetToArea(
+ button.id,
+ CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
+ );
+
+ await waitForOverflowButtonShown();
+
+ await document.getElementById("nav-bar").overflowable.show();
+ EventUtils.synthesizeMouseAtCenter(button, {});
+ is(PanelUI.overflowPanel.state, "open", "Popup stays open");
+ button.removeAttribute("disabled");
+ let hiddenAgain = promiseOverflowHidden(window);
+ EventUtils.synthesizeMouseAtCenter(button, {});
+ await hiddenAgain;
+ button.remove();
+});
+
+registerCleanupFunction(function () {
+ if (button && button.parentNode) {
+ button.remove();
+ }
+ if (menuButton && menuButton.parentNode) {
+ menuButton.remove();
+ }
+ // Sadly this isn't task.jsm-enabled, so we can't wait for this to happen. But we should
+ // definitely close it here and hope it won't interfere with other tests.
+ // Of course, all the tests are meant to do this themselves, but if they fail...
+ if (isOverflowOpen()) {
+ PanelUI.overflowPanel.hidePopup();
+ }
+ CustomizableUI.reset();
+});