diff options
Diffstat (limited to 'comm/mail/base/test/browser/browser_menulist.js')
-rw-r--r-- | comm/mail/base/test/browser/browser_menulist.js | 183 |
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); +}); |