summaryrefslogtreecommitdiffstats
path: root/comm/mail/base/test/browser/browser_menulist.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/base/test/browser/browser_menulist.js')
-rw-r--r--comm/mail/base/test/browser/browser_menulist.js183
1 files changed, 183 insertions, 0 deletions
diff --git a/comm/mail/base/test/browser/browser_menulist.js b/comm/mail/base/test/browser/browser_menulist.js
new file mode 100644
index 0000000000..39a6a840d2
--- /dev/null
+++ b/comm/mail/base/test/browser/browser_menulist.js
@@ -0,0 +1,183 @@
+/* import-globals-from ../../content/utilityOverlay.js */
+
+add_task(async () => {
+ let TEST_DOCUMENT_URL = getRootDirectory(gTestPath) + "files/menulist.xhtml";
+ let testDocument = await new Promise(resolve => {
+ Services.obs.addObserver(function documentLoaded(subject) {
+ if (subject.URL == TEST_DOCUMENT_URL) {
+ Services.obs.removeObserver(documentLoaded, "chrome-document-loaded");
+ resolve(subject);
+ }
+ }, "chrome-document-loaded");
+ openContentTab(TEST_DOCUMENT_URL);
+ });
+ ok(testDocument.URL == TEST_DOCUMENT_URL);
+ let testWindow = testDocument.ownerGlobal;
+ let MENULIST_CLASS = testWindow.customElements.get("menulist");
+ let MENULIST_EDITABLE_CLASS =
+ testWindow.customElements.get("menulist-editable");
+
+ let menulists = testDocument.querySelectorAll("menulist");
+ is(menulists.length, 3);
+
+ // Menulist 0 is an ordinary, non-editable menulist.
+ ok(menulists[0] instanceof MENULIST_CLASS);
+ ok(!(menulists[0] instanceof MENULIST_EDITABLE_CLASS));
+ ok(!("editable" in menulists[0]));
+
+ // Menulist 1 is an editable menulist, but not in editing mode.
+ ok(menulists[1] instanceof MENULIST_CLASS);
+ ok(menulists[1] instanceof MENULIST_EDITABLE_CLASS);
+ ok("editable" in menulists[1]);
+ ok(!menulists[1].editable);
+
+ // Menulist 2 is an editable menulist, in editing mode.
+ ok(menulists[2] instanceof MENULIST_CLASS);
+ ok(menulists[2] instanceof MENULIST_EDITABLE_CLASS);
+ ok("editable" in menulists[2]);
+ ok(menulists[2].editable);
+
+ // Okay, let's check the focus order.
+ let testBrowser = document.getElementById("tabmail").currentTabInfo.browser;
+ EventUtils.synthesizeMouseAtCenter(testBrowser, { clickCount: 1 });
+ await new Promise(resolve => setTimeout(resolve));
+
+ let beforeButton = testDocument.querySelector("button#before");
+ beforeButton.focus();
+ is(testDocument.activeElement, beforeButton);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ is(testDocument.activeElement, menulists[0]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ is(testDocument.activeElement, menulists[1]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ is(testDocument.activeElement, menulists[2]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ is(testDocument.activeElement, menulists[2]);
+ is(menulists[2].shadowRoot.activeElement, menulists[2]._inputField);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ is(testDocument.activeElement, testDocument.querySelector("button#after"));
+
+ // Now go back again.
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }, testWindow);
+ is(testDocument.activeElement, menulists[2]);
+ is(menulists[2].shadowRoot.activeElement, menulists[2]._inputField);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }, testWindow);
+ is(testDocument.activeElement, menulists[2]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }, testWindow);
+ is(testDocument.activeElement, menulists[1]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }, testWindow);
+ is(testDocument.activeElement, menulists[0]);
+
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: true }, testWindow);
+ is(testDocument.activeElement, beforeButton, "focus back to the start");
+
+ let popup = menulists[2].menupopup;
+ // The dropmarker should open and close the popup.
+ let openEvent = BrowserTestUtils.waitForEvent(popup, "popupshown");
+ EventUtils.synthesizeMouseAtCenter(
+ menulists[2]._dropmarker,
+ { clickCount: 1 },
+ testWindow
+ );
+ await openEvent;
+ ok(menulists[2].hasAttribute("open"), "popup open");
+
+ let hiddenEvent = BrowserTestUtils.waitForEvent(popup, "popuphidden");
+ popup.hidePopup();
+ await hiddenEvent;
+ ok(!menulists[2].hasAttribute("open"), "closed again");
+
+ // Open the popup and choose an item.
+ EventUtils.synthesizeMouseAtCenter(
+ menulists[2]._dropmarker,
+ { clickCount: 1 },
+ testWindow
+ );
+ await BrowserTestUtils.waitForEvent(popup, "popupshown");
+ ok(menulists[2].hasAttribute("open"), "open for item click");
+
+ await new Promise(resolve => {
+ menulists[2].addEventListener("select", () => setTimeout(resolve), {
+ once: true,
+ });
+ popup.activateItem(menulists[2].querySelectorAll("menuitem")[0]);
+ });
+ ok(!menulists[2].hasAttribute("open"));
+ is(testDocument.activeElement, menulists[2]);
+ is(menulists[2].shadowRoot.activeElement, menulists[2]._inputField);
+ is(menulists[2]._inputField.value, "foo");
+ is(menulists[2].value, "foo");
+ is(menulists[2].getAttribute("value"), "foo");
+
+ // Again.
+ EventUtils.synthesizeMouseAtCenter(
+ menulists[2]._dropmarker,
+ { clickCount: 1 },
+ testWindow
+ );
+ await BrowserTestUtils.waitForEvent(popup, "popupshown");
+ ok(menulists[2].hasAttribute("open"));
+
+ await new Promise(resolve => {
+ menulists[2].addEventListener("select", () => setTimeout(resolve), {
+ once: true,
+ });
+ popup.activateItem(menulists[2].querySelectorAll("menuitem")[1]);
+ });
+ ok(!menulists[2].hasAttribute("open"));
+ is(testDocument.activeElement, menulists[2]);
+ is(menulists[2].shadowRoot.activeElement, menulists[2]._inputField);
+ is(menulists[2]._inputField.value, "bar");
+ is(menulists[2].value, "bar");
+ is(menulists[2].getAttribute("value"), "bar");
+
+ // Type in a value.
+ is(menulists[2]._inputField.selectionStart, 0);
+ is(menulists[2]._inputField.selectionEnd, 3);
+ EventUtils.sendString("quux", testWindow);
+ await new Promise(resolve => {
+ menulists[2].addEventListener(
+ "change",
+ event => {
+ is(event.target, menulists[2]);
+ resolve();
+ },
+ { once: true }
+ );
+ EventUtils.synthesizeKey("VK_TAB", { shiftKey: false }, testWindow);
+ });
+ is(menulists[2].value, "quux");
+ is(menulists[2].getAttribute("value"), "quux");
+
+ // Open the popup and choose an item.
+ EventUtils.synthesizeMouseAtCenter(
+ menulists[2]._dropmarker,
+ { clickCount: 1 },
+ testWindow
+ );
+ await BrowserTestUtils.waitForEvent(popup, "popupshown");
+ ok(menulists[2].hasAttribute("open"));
+
+ await new Promise(resolve => {
+ menulists[2].addEventListener("select", () => setTimeout(resolve), {
+ once: true,
+ });
+ popup.activateItem(menulists[2].querySelectorAll("menuitem")[0]);
+ });
+ ok(!menulists[2].hasAttribute("open"));
+ is(testDocument.activeElement, menulists[2]);
+ is(menulists[2].shadowRoot.activeElement, menulists[2]._inputField);
+ is(menulists[2]._inputField.value, "foo");
+ is(menulists[2].value, "foo");
+ is(menulists[2].getAttribute("value"), "foo");
+
+ document.getElementById("tabmail").closeOtherTabs(0);
+});