summaryrefslogtreecommitdiffstats
path: root/browser/base/content/test/touch/browser_menu_touch.js
diff options
context:
space:
mode:
Diffstat (limited to 'browser/base/content/test/touch/browser_menu_touch.js')
-rw-r--r--browser/base/content/test/touch/browser_menu_touch.js198
1 files changed, 198 insertions, 0 deletions
diff --git a/browser/base/content/test/touch/browser_menu_touch.js b/browser/base/content/test/touch/browser_menu_touch.js
new file mode 100644
index 0000000000..3dc5c5193c
--- /dev/null
+++ b/browser/base/content/test/touch/browser_menu_touch.js
@@ -0,0 +1,198 @@
+/* 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/. */
+
+/* This test checks that toolbar menus are in touchmode
+ * when opened through a touch event. */
+
+async function openAndCheckMenu(menu, target) {
+ is(menu.state, "closed", `Menu panel (${menu.id}) is initally closed.`);
+
+ let popupshown = BrowserTestUtils.waitForEvent(menu, "popupshown");
+ EventUtils.synthesizeNativeTapAtCenter(target);
+ await popupshown;
+
+ is(menu.state, "open", `Menu panel (${menu.id}) is open.`);
+ is(
+ menu.getAttribute("touchmode"),
+ "true",
+ `Menu panel (${menu.id}) is in touchmode.`
+ );
+
+ menu.hidePopup();
+
+ popupshown = BrowserTestUtils.waitForEvent(menu, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(target, {});
+ await popupshown;
+
+ is(menu.state, "open", `Menu panel (${menu.id}) is open.`);
+ ok(
+ !menu.hasAttribute("touchmode"),
+ `Menu panel (${menu.id}) is not in touchmode.`
+ );
+
+ menu.hidePopup();
+}
+
+async function openAndCheckLazyMenu(id, target) {
+ let menu = document.getElementById(id);
+
+ EventUtils.synthesizeNativeTapAtCenter(target);
+ let ev = await BrowserTestUtils.waitForEvent(
+ window,
+ "popupshown",
+ true,
+ e => e.target.id == id
+ );
+ menu = ev.target;
+
+ is(menu.state, "open", `Menu panel (${menu.id}) is open.`);
+ is(
+ menu.getAttribute("touchmode"),
+ "true",
+ `Menu panel (${menu.id}) is in touchmode.`
+ );
+
+ menu.hidePopup();
+
+ let popupshown = BrowserTestUtils.waitForEvent(menu, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(target, {});
+ await popupshown;
+
+ is(menu.state, "open", `Menu panel (${menu.id}) is open.`);
+ ok(
+ !menu.hasAttribute("touchmode"),
+ `Menu panel (${menu.id}) is not in touchmode.`
+ );
+
+ menu.hidePopup();
+}
+
+// The customization UI menu is not attached to the document when it is
+// closed and hence requires special attention.
+async function openAndCheckCustomizationUIMenu(target) {
+ EventUtils.synthesizeNativeTapAtCenter(target);
+
+ await BrowserTestUtils.waitForCondition(
+ () => document.getElementById("customizationui-widget-panel") != null
+ );
+ let menu = document.getElementById("customizationui-widget-panel");
+
+ if (menu.state != "open") {
+ await BrowserTestUtils.waitForEvent(menu, "popupshown");
+ is(menu.state, "open", `Menu for ${target.id} is open`);
+ }
+
+ is(
+ menu.getAttribute("touchmode"),
+ "true",
+ `Menu for ${target.id} is in touchmode.`
+ );
+
+ menu.hidePopup();
+
+ EventUtils.synthesizeMouseAtCenter(target, {});
+
+ await BrowserTestUtils.waitForCondition(
+ () => document.getElementById("customizationui-widget-panel") != null
+ );
+ menu = document.getElementById("customizationui-widget-panel");
+
+ if (menu.state != "open") {
+ await BrowserTestUtils.waitForEvent(menu, "popupshown");
+ is(menu.state, "open", `Menu for ${target.id} is open`);
+ }
+
+ ok(
+ !menu.hasAttribute("touchmode"),
+ `Menu for ${target.id} is not in touchmode.`
+ );
+
+ menu.hidePopup();
+}
+
+// Ensure that we can run touch events properly for windows [10]
+add_setup(async function() {
+ let isWindows = AppConstants.isPlatformAndVersionAtLeast("win", "10.0");
+ await SpecialPowers.pushPrefEnv({
+ set: [["apz.test.fails_with_native_injection", isWindows]],
+ });
+});
+
+// Test main ("hamburger") menu.
+add_task(async function test_main_menu_touch() {
+ let mainMenu = document.getElementById("appMenu-popup");
+ let target = document.getElementById("PanelUI-menu-button");
+ await openAndCheckMenu(mainMenu, target);
+});
+
+// Test the page action menu.
+add_task(async function test_page_action_panel_touch() {
+ // The page action menu only appears on a web page.
+ await BrowserTestUtils.withNewTab("https://example.com", async function() {
+ // The page actions button is not normally visible, so we must
+ // unhide it.
+ BrowserPageActions.mainButtonNode.style.visibility = "visible";
+ registerCleanupFunction(() => {
+ BrowserPageActions.mainButtonNode.style.removeProperty("visibility");
+ });
+ let target = document.getElementById("pageActionButton");
+ await openAndCheckLazyMenu("pageActionPanel", target);
+ });
+});
+
+// Test the customizationUI panel, which is used for various menus
+// such as library, history, sync, developer and encoding.
+add_task(async function test_customizationui_panel_touch() {
+ CustomizableUI.addWidgetToArea("library-button", CustomizableUI.AREA_NAVBAR);
+ CustomizableUI.addWidgetToArea(
+ "history-panelmenu",
+ CustomizableUI.AREA_NAVBAR
+ );
+
+ await BrowserTestUtils.waitForCondition(
+ () =>
+ CustomizableUI.getPlacementOfWidget("library-button").area == "nav-bar"
+ );
+
+ let target = document.getElementById("library-button");
+ await openAndCheckCustomizationUIMenu(target);
+
+ target = document.getElementById("history-panelmenu");
+ await openAndCheckCustomizationUIMenu(target);
+
+ CustomizableUI.reset();
+});
+
+// Test the overflow menu panel.
+add_task(async function test_overflow_panel_touch() {
+ // Move something in the overflow menu to make the button appear.
+ CustomizableUI.addWidgetToArea(
+ "library-button",
+ CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
+ );
+ await BrowserTestUtils.waitForCondition(
+ () =>
+ CustomizableUI.getPlacementOfWidget("library-button").area ==
+ CustomizableUI.AREA_FIXED_OVERFLOW_PANEL
+ );
+
+ let overflowPanel = document.getElementById("widget-overflow");
+ let target = document.getElementById("nav-bar-overflow-button");
+ await openAndCheckMenu(overflowPanel, target);
+
+ CustomizableUI.reset();
+});
+
+// Test the list all tabs menu.
+add_task(async function test_list_all_tabs_touch() {
+ // Force the menu button to be shown.
+ let tabs = document.getElementById("tabbrowser-tabs");
+ if (!tabs.hasAttribute("overflow")) {
+ tabs.setAttribute("overflow", true);
+ registerCleanupFunction(() => tabs.removeAttribute("overflow"));
+ }
+
+ let target = document.getElementById("alltabs-button");
+ await openAndCheckCustomizationUIMenu(target);
+});