diff options
Diffstat (limited to 'comm/mail/base/test/browser/browser_formPickers.js')
-rw-r--r-- | comm/mail/base/test/browser/browser_formPickers.js | 352 |
1 files changed, 352 insertions, 0 deletions
diff --git a/comm/mail/base/test/browser/browser_formPickers.js b/comm/mail/base/test/browser/browser_formPickers.js new file mode 100644 index 0000000000..1b98a0584a --- /dev/null +++ b/comm/mail/base/test/browser/browser_formPickers.js @@ -0,0 +1,352 @@ +/* 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/. */ + +/* eslint-env webextensions */ + +var { MailE10SUtils } = ChromeUtils.import( + "resource:///modules/MailE10SUtils.jsm" +); +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { MessageGenerator } = ChromeUtils.import( + "resource://testing-common/mailnews/MessageGenerator.jsm" +); + +const TEST_DOCUMENT_URL = + "http://mochi.test:8888/browser/comm/mail/base/test/browser/files/formContent.html"; + +let testFolder; + +async function checkABrowser(browser) { + if ( + browser.webProgress?.isLoadingDocument || + browser.currentURI?.spec == "about:blank" + ) { + await BrowserTestUtils.browserLoaded( + browser, + undefined, + url => url != "about:blank" + ); + } + + let win = browser.ownerGlobal; + let doc = browser.ownerDocument; + + // Date picker + + let picker = win.top.document.getElementById("DateTimePickerPanel"); + Assert.ok(picker, "date/time picker exists"); + + // Open the popup. + let shownPromise = BrowserTestUtils.waitForEvent(picker, "popupshown"); + await SpecialPowers.spawn(browser, [], function () { + content.document.notifyUserGestureActivation(); + content.document.querySelector(`input[type="date"]`).showPicker(); + }); + await shownPromise; + + // Allow the picker time to initialise. + await new Promise(r => win.setTimeout(r, 500)); + + // Click in the middle of the picker. This should always land on a date and + // close the picker. + let hiddenPromise = BrowserTestUtils.waitForEvent(picker, "popuphidden"); + let frame = picker.querySelector("#dateTimePopupFrame"); + EventUtils.synthesizeMouseAtCenter( + frame.contentDocument.querySelector(".days-view td"), + {}, + frame.contentWindow + ); + await hiddenPromise; + + // Check the date was assigned to the input. + await SpecialPowers.spawn(browser, [], () => { + Assert.ok(content.document.querySelector(`input[type="date"]`).value); + }); + + // Select drop-down + + let menulist = win.top.document.getElementById("ContentSelectDropdown"); + Assert.ok(menulist, "select menulist exists"); + let menupopup = menulist.menupopup; + + // Click on the select control to open the popup. + shownPromise = BrowserTestUtils.waitForEvent(menulist, "popupshown"); + await BrowserTestUtils.synthesizeMouseAtCenter("select", {}, browser); + await shownPromise; + + // Allow the menulist time to initialise. + await new Promise(r => win.setTimeout(r, 500)); + + Assert.equal(menulist.value, "0"); + Assert.equal(menupopup.childElementCount, 3); + // Item values do not match the content document, but are 0-indexed. + Assert.equal(menupopup.children[0].label, ""); + Assert.equal(menupopup.children[0].value, "0"); + Assert.equal(menupopup.children[1].label, "π"); + Assert.equal(menupopup.children[1].value, "1"); + Assert.equal(menupopup.children[2].label, "τ"); + Assert.equal(menupopup.children[2].value, "2"); + + // Click the second option. This sets the value and closes the menulist. + hiddenPromise = BrowserTestUtils.waitForEvent(menulist, "popuphidden"); + menupopup.activateItem(menupopup.children[1]); + await hiddenPromise; + + // Sometimes the next change doesn't happen soon enough. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + await new Promise(r => setTimeout(r, 1000)); + + // Check the value was assigned to the control. + await SpecialPowers.spawn(browser, [], () => { + Assert.equal(content.document.querySelector("select").value, "3.141592654"); + }); + + // Input auto-complete + + browser.focus(); + + let popup = doc.getElementById(browser.getAttribute("autocompletepopup")); + Assert.ok(popup, "auto-complete popup exists"); + + // Click on the input box and type some letters to open the popup. + shownPromise = BrowserTestUtils.waitForEvent(popup, "popupshown"); + await BrowserTestUtils.synthesizeMouseAtCenter( + `input[list="letters"]`, + {}, + browser + ); + await BrowserTestUtils.synthesizeKey("e", {}, browser); + await BrowserTestUtils.synthesizeKey("t", {}, browser); + await BrowserTestUtils.synthesizeKey("a", {}, browser); + await shownPromise; + + // Allow the popup time to initialise. + await new Promise(r => win.setTimeout(r, 500)); + + let list = popup.querySelector("richlistbox"); + Assert.ok(list, "list added to popup"); + Assert.equal(list.itemCount, 4); + Assert.equal(list.itemChildren[0].getAttribute("title"), "beta"); + Assert.equal(list.itemChildren[1].getAttribute("title"), "zeta"); + Assert.equal(list.itemChildren[2].getAttribute("title"), "eta"); + Assert.equal(list.itemChildren[3].getAttribute("title"), "theta"); + + // Click the second option. This sets the value and closes the popup. + hiddenPromise = BrowserTestUtils.waitForEvent(popup, "popuphidden"); + EventUtils.synthesizeMouseAtCenter(list.itemChildren[1], {}, win); + await hiddenPromise; + + // Check the value was assigned to the input. + await SpecialPowers.spawn(browser, [], () => { + Assert.equal( + content.document.querySelector(`input[list="letters"]`).value, + "zeta" + ); + }); +} + +add_setup(async function () { + MailServices.accounts.createLocalMailAccount(); + let account = MailServices.accounts.accounts[0]; + account.addIdentity(MailServices.accounts.createIdentity()); + let rootFolder = account.incomingServer.rootFolder; + rootFolder.createSubfolder("formPickerFolder", null); + testFolder = rootFolder + .getChildNamed("formPickerFolder") + .QueryInterface(Ci.nsIMsgLocalMailFolder); + let messages = new MessageGenerator().makeMessages({ count: 5 }); + let messageStrings = messages.map(message => message.toMboxString()); + testFolder.addMessageBatch(messageStrings); + + registerCleanupFunction(async () => { + MailServices.accounts.removeAccount(account, false); + }); +}); + +add_task(async function testMessagePane() { + let about3Pane = document.getElementById("tabmail").currentAbout3Pane; + about3Pane.restoreState({ + folderURI: testFolder.URI, + messagePaneVisible: true, + }); + + about3Pane.messagePane.displayWebPage(TEST_DOCUMENT_URL); + await checkABrowser(about3Pane.webBrowser); +}); + +add_task(async function testContentTab() { + let tab = window.openContentTab(TEST_DOCUMENT_URL); + await checkABrowser(tab.browser); + + let tabmail = document.getElementById("tabmail"); + tabmail.closeTab(tab); +}); + +add_task(async function testExtensionPopupWindow() { + let extension = ExtensionTestUtils.loadExtension({ + background: async () => { + await browser.windows.create({ + url: "formContent.html", + type: "popup", + width: 800, + height: 500, + }); + browser.test.notifyPass("ready"); + }, + files: { + "formContent.html": await fetch(TEST_DOCUMENT_URL).then(response => + response.text() + ), + }, + }); + + await extension.startup(); + await extension.awaitFinish("ready"); + + let extensionPopup = Services.wm.getMostRecentWindow("mail:extensionPopup"); + // extensionPopup.xhtml needs time to initialise properly. + await new Promise(resolve => extensionPopup.setTimeout(resolve, 500)); + await checkABrowser(extensionPopup.document.getElementById("requestFrame")); + await BrowserTestUtils.closeWindow(extensionPopup); + + await extension.unload(); +}); + +add_task(async function testExtensionBrowserAction() { + let extension = ExtensionTestUtils.loadExtension({ + files: { + "formContent.html": await fetch(TEST_DOCUMENT_URL).then(response => + response.text() + ), + }, + manifest: { + applications: { + gecko: { + id: "formpickers@mochi.test", + }, + }, + browser_action: { + default_popup: "formContent.html", + }, + }, + }); + + await extension.startup(); + + let { panel, browser } = await openExtensionPopup( + window, + "ext-formpickers\\@mochi.test" + ); + await checkABrowser(browser); + panel.hidePopup(); + + await extension.unload(); +}); + +add_task(async function testExtensionComposeAction() { + let extension = ExtensionTestUtils.loadExtension({ + files: { + "formContent.html": await fetch(TEST_DOCUMENT_URL).then(response => + response.text() + ), + }, + manifest: { + applications: { + gecko: { + id: "formpickers@mochi.test", + }, + }, + compose_action: { + default_popup: "formContent.html", + }, + }, + }); + + await extension.startup(); + + let params = Cc[ + "@mozilla.org/messengercompose/composeparams;1" + ].createInstance(Ci.nsIMsgComposeParams); + params.composeFields = Cc[ + "@mozilla.org/messengercompose/composefields;1" + ].createInstance(Ci.nsIMsgCompFields); + + let composeWindowPromise = BrowserTestUtils.domWindowOpened(); + MailServices.compose.OpenComposeWindowWithParams(null, params); + let composeWindow = await composeWindowPromise; + await BrowserTestUtils.waitForEvent(composeWindow, "load"); + + let { panel, browser } = await openExtensionPopup( + composeWindow, + "formpickers_mochi_test-composeAction-toolbarbutton" + ); + await checkABrowser(browser); + panel.hidePopup(); + + await extension.unload(); + await BrowserTestUtils.closeWindow(composeWindow); +}); + +add_task(async function testExtensionMessageDisplayAction() { + let extension = ExtensionTestUtils.loadExtension({ + files: { + "formContent.html": await fetch(TEST_DOCUMENT_URL).then(response => + response.text() + ), + }, + manifest: { + applications: { + gecko: { + id: "formpickers@mochi.test", + }, + }, + message_display_action: { + default_popup: "formContent.html", + }, + }, + }); + + await extension.startup(); + + let messageWindowPromise = BrowserTestUtils.domWindowOpened(); + window.MsgOpenNewWindowForMessage([...testFolder.messages][0]); + let messageWindow = await messageWindowPromise; + let { target: aboutMessage } = await BrowserTestUtils.waitForEvent( + messageWindow, + "aboutMessageLoaded" + ); + + let { panel, browser } = await openExtensionPopup( + aboutMessage, + "formpickers_mochi_test-messageDisplayAction-toolbarbutton" + ); + await checkABrowser(browser); + panel.hidePopup(); + + await extension.unload(); + await BrowserTestUtils.closeWindow(messageWindow); +}); + +add_task(async function testBrowserRequestWindow() { + let requestWindow = await new Promise(resolve => { + Services.ww.openWindow( + null, + "chrome://messenger/content/browserRequest.xhtml", + null, + "chrome,private,centerscreen,width=980,height=750", + { + url: TEST_DOCUMENT_URL, + cancelled() {}, + loaded(window, webProgress) { + resolve(window); + }, + } + ); + }); + + await checkABrowser(requestWindow.document.getElementById("requestFrame")); + await BrowserTestUtils.closeWindow(requestWindow); +}); |