From 6bf0a5cb5034a7e684dcc3500e841785237ce2dd Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 19:32:43 +0200 Subject: Adding upstream version 1:115.7.0. Signed-off-by: Daniel Baumann --- comm/mail/base/test/browser/browser_paneFocus.js | 375 +++++++++++++++++++++++ 1 file changed, 375 insertions(+) create mode 100644 comm/mail/base/test/browser/browser_paneFocus.js (limited to 'comm/mail/base/test/browser/browser_paneFocus.js') diff --git a/comm/mail/base/test/browser/browser_paneFocus.js b/comm/mail/base/test/browser/browser_paneFocus.js new file mode 100644 index 0000000000..9b85b4afe3 --- /dev/null +++ b/comm/mail/base/test/browser/browser_paneFocus.js @@ -0,0 +1,375 @@ +/* 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/. */ + +const { MessageGenerator } = ChromeUtils.import( + "resource://testing-common/mailnews/MessageGenerator.jsm" +); + +let mailButton = document.getElementById("mailButton"); +let globalSearch = document.querySelector("#unifiedToolbar global-search-bar"); +let addressBookButton = document.getElementById("addressBookButton"); +let calendarButton = document.getElementById("calendarButton"); +let tasksButton = document.getElementById("tasksButton"); +let tabmail = document.getElementById("tabmail"); + +let rootFolder, testFolder, testMessages, addressBook; + +add_setup(async function () { + let generator = new MessageGenerator(); + + MailServices.accounts.createLocalMailAccount(); + let account = MailServices.accounts.accounts[0]; + account.addIdentity(MailServices.accounts.createIdentity()); + rootFolder = account.incomingServer.rootFolder; + + // Quick Filter Bar needs to be toggled on for F6 focus shift to be accurate. + goDoCommand("cmd_showQuickFilterBar"); + + rootFolder.createSubfolder("paneFocus", null); + testFolder = rootFolder + .getChildNamed("paneFocus") + .QueryInterface(Ci.nsIMsgLocalMailFolder); + testFolder.addMessageBatch( + generator.makeMessages({ count: 5 }).map(message => message.toMboxString()) + ); + testMessages = [...testFolder.messages]; + + let prefName = MailServices.ab.newAddressBook( + "paneFocus", + null, + Ci.nsIAbManager.JS_DIRECTORY_TYPE + ); + addressBook = MailServices.ab.getDirectoryFromId(prefName); + let contact = Cc["@mozilla.org/addressbook/cardproperty;1"].createInstance( + Ci.nsIAbCard + ); + contact.displayName = "contact 1"; + contact.firstName = "contact"; + contact.lastName = "1"; + contact.primaryEmail = "contact.1@invalid"; + addressBook.addCard(contact); + + registerCleanupFunction(async () => { + MailServices.accounts.removeAccount(account, false); + let removePromise = TestUtils.topicObserved("addrbook-directory-deleted"); + MailServices.ab.deleteAddressBook(addressBook.URI); + await removePromise; + }); +}); + +add_task(async function testMail3PaneTab() { + document.body.focus(); + + let about3Pane = tabmail.currentAbout3Pane; + about3Pane.restoreState({ + folderPaneVisible: true, + messagePaneVisible: true, + }); + let { + folderTree, + threadTree, + webBrowser, + messageBrowser, + multiMessageBrowser, + accountCentralBrowser, + } = about3Pane; + + // Reset focus to accountCentralBrowser because QFB was toggled on. + accountCentralBrowser.focus(); + info("Displaying the root folder"); + about3Pane.displayFolder(rootFolder.URI); + cycle( + mailButton, + globalSearch, + folderTree, + accountCentralBrowser, + mailButton + ); + + info("Displaying the test folder"); + about3Pane.displayFolder(testFolder.URI); + threadTree.selectedIndex = 0; + cycle( + globalSearch, + folderTree, + threadTree.table.body, + messageBrowser.contentWindow.getMessagePaneBrowser(), + mailButton, + globalSearch + ); + + info("Hiding the folder pane"); + about3Pane.restoreState({ folderPaneVisible: false }); + cycle( + threadTree.table.body, + messageBrowser.contentWindow.getMessagePaneBrowser(), + mailButton, + globalSearch, + threadTree.table.body + ); + + info("Showing the folder pane, hiding the message pane"); + about3Pane.restoreState({ + folderPaneVisible: true, + messagePaneVisible: false, + }); + cycle( + mailButton, + globalSearch, + folderTree, + threadTree.table.body, + mailButton + ); + + info("Showing the message pane, selecting multiple messages"); + about3Pane.restoreState({ messagePaneVisible: true }); + threadTree.selectedIndices = [1, 2]; + cycle( + globalSearch, + folderTree, + threadTree.table.body, + multiMessageBrowser, + mailButton, + globalSearch + ); + + info("Showing a web page"); + about3Pane.messagePane.displayWebPage("https://example.com/"); + cycle( + folderTree, + threadTree.table.body, + webBrowser, + mailButton, + globalSearch, + folderTree + ); + + info("Testing focus from secondary focus targets"); + about3Pane.document.getElementById("folderPaneMoreButton").focus(); + EventUtils.synthesizeKey("KEY_F6", {}, about3Pane); + Assert.equal( + getActiveElement(), + folderTree, + "F6 moved the focus to the folder tree" + ); + + about3Pane.document.getElementById("folderPaneMoreButton").focus(); + EventUtils.synthesizeKey("KEY_F6", { shiftKey: true }, about3Pane); + Assert.equal( + getActiveElement().id, + globalSearch.id, + "Shift+F6 moved the focus to the toolbar" + ); + + about3Pane.document.getElementById("qfb-qs-textbox").focus(); + EventUtils.synthesizeKey("KEY_F6", {}, about3Pane); + Assert.equal( + getActiveElement(), + threadTree.table.body, + "F6 moved the focus to the threadTree" + ); + + about3Pane.document.getElementById("qfb-qs-textbox").focus(); + EventUtils.synthesizeKey("KEY_F6", { shiftKey: true }, about3Pane); + Assert.equal( + getActiveElement(), + folderTree, + "Shift+F6 moved the focus to the folder tree" + ); +}); + +add_task(async function testMailMessageTab() { + document.body.focus(); + + window.OpenMessageInNewTab(testMessages[0], { background: false }); + await BrowserTestUtils.waitForEvent( + tabmail.tabInfo[1].chromeBrowser, + "MsgLoaded" + ); + cycle(mailButton, globalSearch, tabmail.tabInfo[1].browser, mailButton); + + tabmail.closeOtherTabs(0); +}); + +add_task(async function testAddressBookTab() { + EventUtils.synthesizeMouseAtCenter(addressBookButton, {}); + await BrowserTestUtils.browserLoaded(tabmail.currentTabInfo.browser); + + let abWindow = tabmail.currentTabInfo.browser.contentWindow; + let abDocument = abWindow.document; + let booksList = abDocument.getElementById("books"); + let searchInput = abDocument.getElementById("searchInput"); + let cardsList = abDocument.getElementById("cards"); + let detailsPane = abDocument.getElementById("detailsPane"); + let editButton = abDocument.getElementById("editButton"); + + // Switch to the table view so the edit button isn't falling off the window. + abWindow.cardsPane.toggleLayout(true); + + // Check what happens with a contact selected. + let row = booksList.getRowForUID(addressBook.UID); + EventUtils.synthesizeMouseAtCenter(row.querySelector("span"), {}, abWindow); + + Assert.ok(BrowserTestUtils.is_hidden(detailsPane)); + // NOTE: When the "cards" element first receives focus it will select the + // first item, which causes the panel to be displayed. + cycle( + searchInput, + cardsList.table.body, + editButton, + addressBookButton, + globalSearch, + booksList, + searchInput + ); + Assert.ok(BrowserTestUtils.is_visible(detailsPane)); + + // Check with no selection. + EventUtils.synthesizeMouseAtCenter( + cardsList.getRowAtIndex(0), + { accelKey: true }, + abWindow + ); + Assert.equal(getActiveElement(), cardsList.table.body); + Assert.ok(BrowserTestUtils.is_hidden(detailsPane)); + cycle( + addressBookButton, + globalSearch, + booksList, + searchInput, + cardsList.table.body, + addressBookButton + ); + // Still hidden. + Assert.ok(BrowserTestUtils.is_hidden(detailsPane)); + + // Check what happens while editing. It should be nothing. + EventUtils.synthesizeMouseAtCenter(cardsList.getRowAtIndex(0), {}, abWindow); + Assert.equal(getActiveElement(), cardsList.table.body); + Assert.ok(BrowserTestUtils.is_visible(detailsPane)); + + editButton.scrollIntoView(); + EventUtils.synthesizeMouseAtCenter(editButton, {}, abWindow); + Assert.equal(abDocument.activeElement.id, "vcard-n-firstname"); + EventUtils.synthesizeKey("KEY_F6", {}, abWindow); + Assert.equal( + abDocument.activeElement.id, + "vcard-n-firstname", + "F6 did nothing" + ); + EventUtils.synthesizeKey("KEY_F6", { shiftKey: true }, abWindow); + Assert.equal( + abDocument.activeElement.id, + "vcard-n-firstname", + "Shift+F6 did nothing" + ); + + tabmail.closeOtherTabs(0); +}); + +add_task(async function testCalendarTab() { + EventUtils.synthesizeMouseAtCenter(calendarButton, {}); + + cycle(calendarButton, globalSearch, calendarButton); + + tabmail.closeOtherTabs(0); +}); + +add_task(async function testTasksTab() { + EventUtils.synthesizeMouseAtCenter(tasksButton, {}); + + cycle(tasksButton, globalSearch, tasksButton); + + tabmail.closeOtherTabs(0); +}); + +add_task(async function testContentTab() { + document.body.focus(); + + window.openTab("contentTab", { + url: "https://example.com/", + background: false, + }); + await BrowserTestUtils.browserLoaded( + tabmail.currentTabInfo.browser, + undefined, + "https://example.com/" + ); + cycle(mailButton, globalSearch, tabmail.currentTabInfo.browser, mailButton); + + document.body.focus(); + + window.openTab("contentTab", { url: "about:mozilla", background: false }); + await BrowserTestUtils.browserLoaded( + tabmail.currentTabInfo.browser, + undefined, + "about:mozilla" + ); + cycle( + globalSearch, + tabmail.currentTabInfo.browser.contentDocument.body, + mailButton, + globalSearch + ); + + tabmail.closeOtherTabs(0); +}); + +/** + * Gets the active element. If it is a browser, returns the browser in some + * special cases we're interested in, or the browser's active element. + * + * @returns {Element} + */ +function getActiveElement() { + let activeElement = document.activeElement; + if (globalSearch.contains(activeElement)) { + return globalSearch; + } + if (activeElement.localName == "browser" && !activeElement.isRemoteBrowser) { + activeElement = activeElement.contentDocument.activeElement; + } + if ( + activeElement.localName == "browser" && + activeElement.id == "messageBrowser" + ) { + activeElement = activeElement.contentDocument.activeElement; + } + return activeElement; +} + +/** + * Presses F6 for each element in `elements`, and checks the element has focus. + * Then presses Shift+F6 to go back through the elements. + * Note that the currently selected element should *not* be the first element. + * + * @param {Element[]} + */ +function cycle(...elements) { + let activeElement = getActiveElement(); + + for (let i = 0; i < elements.length; i++) { + EventUtils.synthesizeKey("KEY_F6", {}, activeElement.ownerGlobal); + activeElement = getActiveElement(); + Assert.equal( + activeElement.id || activeElement.localName, + elements[i].id || elements[i].localName, + "F6 moved the focus" + ); + } + + for (let i = elements.length - 2; i >= 0; i--) { + EventUtils.synthesizeKey( + "KEY_F6", + { shiftKey: true }, + activeElement.ownerGlobal + ); + activeElement = getActiveElement(); + Assert.equal( + activeElement.id || activeElement.localName, + elements[i].id || elements[i].localName, + "Shift+F6 moved the focus" + ); + } +} -- cgit v1.2.3