diff options
Diffstat (limited to 'comm/mail/test/browser/tabmail/browser_tabSwitch.js')
-rw-r--r-- | comm/mail/test/browser/tabmail/browser_tabSwitch.js | 344 |
1 files changed, 344 insertions, 0 deletions
diff --git a/comm/mail/test/browser/tabmail/browser_tabSwitch.js b/comm/mail/test/browser/tabmail/browser_tabSwitch.js new file mode 100644 index 0000000000..38a158a66d --- /dev/null +++ b/comm/mail/test/browser/tabmail/browser_tabSwitch.js @@ -0,0 +1,344 @@ +/* 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/. */ + +add_task(async function () { + // Helper functions. + + function assertSelected(element, name) { + Assert.ok( + element.hasAttribute("selected"), + `${name} has selected attribute` + ); + } + function assertNotSelected(element, name) { + Assert.ok( + !element.hasAttribute("selected"), + `${name} does NOT have selected attribute` + ); + } + function getTabElements() { + return [...tabmail.tabContainer.querySelectorAll("tab")]; + } + function checkTabElements(expectedCount, expectedSelection) { + let tabElements = getTabElements(); + Assert.equal( + tabElements.length, + expectedCount, + `${expectedCount} tab elements exist` + ); + + for (let i = 0; i < expectedCount; i++) { + if (i == expectedSelection) { + assertSelected(tabElements[i], `tab element ${i}`); + } else { + assertNotSelected(tabElements[i], `tab element ${i}`); + } + } + } + async function switchTab(index) { + let tabElement = getTabElements()[index]; + eventPromise = BrowserTestUtils.waitForEvent( + tabmail.tabContainer, + "TabSelect" + ); + EventUtils.synthesizeMouseAtCenter(tabElement, {}); + event = await eventPromise; + Assert.equal( + event.target, + tabElement, + `TabSelect event fired from tab ${index}` + ); + } + async function closeTab(index) { + let tabElement = getTabElements()[index]; + eventPromise = BrowserTestUtils.waitForEvent( + tabmail.tabContainer, + "TabClose" + ); + EventUtils.synthesizeMouseAtCenter( + tabElement.querySelector(".tab-close-button"), + {} + ); + event = await eventPromise; + Assert.equal( + event.target, + tabElement, + `TabClose event fired from tab ${index}` + ); + } + + // Collect some elements. + + let tabmail = document.getElementById("tabmail"); + let calendarTabButton = document.getElementById("calendarButton"); + + let mailTabPanel = document.getElementById("mail3PaneTab1"); + let mailTabBrowser = document.getElementById("mail3PaneTabBrowser1"); + let folderTree = mailTabBrowser.contentDocument.getElementById("folderTree"); + let calendarTabPanel = document.getElementById("calendarTabPanel"); + let contentTab; + let contentTabPanel; + + let calendarList = document.getElementById("calendar-list"); + + let eventPromise; + let event; + + // Check we're in a good state to start with. + + Assert.equal(tabmail.tabInfo.length, 1, "only one tab is open"); + checkTabElements(1, 0); + assertSelected(mailTabPanel, "mail tab's panel"); + + // Set the focus on the mail tab. + + folderTree.focus(); + Assert.equal( + document.activeElement, + mailTabBrowser, + "mail tab's browser has focus" + ); + Assert.equal( + mailTabBrowser.contentDocument.activeElement, + folderTree, + "folder tree has focus" + ); + + // Switch to the calendar tab. + + eventPromise = BrowserTestUtils.waitForEvent(tabmail.tabContainer, "TabOpen"); + EventUtils.synthesizeMouseAtCenter(calendarTabButton, {}); + event = await eventPromise; + Assert.equal( + event.target, + getTabElements()[1], + "TabOpen event fired from tab 1" + ); + + checkTabElements(2, 1); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal( + document.activeElement, + document.body, + "mail tab's browser does NOT have focus" + ); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[1].lastActiveElement, + "calendar tab's last active element should not be stored yet" + ); + + // Set the focus on the calendar list. + + EventUtils.synthesizeMouseAtCenter(calendarList, {}); + Assert.equal(document.activeElement, calendarList, "calendar list has focus"); + + // Switch to the mail tab. + + await switchTab(0); + + checkTabElements(2, 0); + assertSelected(mailTabPanel, "mail tab's panel"); + assertNotSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal( + document.activeElement, + mailTabBrowser, + "mail tab's browser has focus" + ); + Assert.equal( + mailTabBrowser.contentDocument.activeElement, + folderTree, + "folder tree has focus" + ); + Assert.ok( + !tabmail.tabInfo[0].lastActiveElement, + "mail tab's last active element should have been cleaned up" + ); + Assert.equal( + tabmail.tabInfo[1].lastActiveElement, + calendarList, + "calendar tab's last active element should be stored" + ); + + // Switch to the calendar tab. + + await switchTab(1); + + checkTabElements(2, 1); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal(document.activeElement, calendarList, "calendar list has focus"); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[1].lastActiveElement, + "calendar tab's last active element should have been cleaned up" + ); + + // Open a content tab. + + eventPromise = BrowserTestUtils.waitForEvent(tabmail.tabContainer, "TabOpen"); + contentTab = window.openContentTab("https://example.org/"); + contentTabPanel = contentTab.browser.closest( + ".contentTabInstance" + ).parentNode; + event = await eventPromise; + Assert.equal( + event.target, + getTabElements()[2], + "TabOpen event fired from tab 2" + ); + + checkTabElements(3, 2); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertNotSelected(calendarTabPanel, "calendar tab's panel"); + assertSelected(contentTabPanel, "content tab's panel"); + Assert.equal( + document.activeElement, + document.body, + "folder tree and calendar list do NOT have focus" + ); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.equal( + tabmail.tabInfo[1].lastActiveElement, + calendarList, + "calendar tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[2].lastActiveElement, + "content tab should have no last active element" + ); + + // Switch to the mail tab. + + await switchTab(0); + + checkTabElements(3, 0); + assertSelected(mailTabPanel, "mail tab's panel"); + assertNotSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal( + document.activeElement, + mailTabBrowser, + "mail tab's browser has focus" + ); + Assert.ok( + !tabmail.tabInfo[0].lastActiveElement, + "mail tab's last active element should be cleaned up" + ); + Assert.equal( + tabmail.tabInfo[1].lastActiveElement, + calendarList, + "calendar tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[2].lastActiveElement, + "content tab should have no last active element" + ); + + // Switch to the calendar tab. + + await switchTab(1); + + checkTabElements(3, 1); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal(document.activeElement, calendarList, "calendar list has focus"); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[1].lastActiveElement, + "calendar tab's last active element should be cleaned up" + ); + Assert.ok( + !tabmail.tabInfo[2].lastActiveElement, + "content tab should have no last active element" + ); + + // Switch to the content tab. + + await switchTab(2); + + checkTabElements(3, 2); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertNotSelected(calendarTabPanel, "calendar tab's panel"); + assertSelected(contentTabPanel, "content tab's panel"); + Assert.equal( + document.activeElement, + document.body, + "folder tree and calendar list do NOT have focus" + ); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.equal( + tabmail.tabInfo[1].lastActiveElement, + calendarList, + "calendar tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[2].lastActiveElement, + "content tab should have no last active element" + ); + + // Close the content tab. + + await closeTab(2); + + checkTabElements(2, 1); + assertNotSelected(mailTabPanel, "mail tab's panel"); + assertSelected(calendarTabPanel, "calendar tab's panel"); + // At this point contentTabPanel is still part of the DOM, it is removed + // after the TabClose event. + assertNotSelected(contentTabPanel, "content tab's panel"); + Assert.equal(document.activeElement, calendarList, "calendar list has focus"); + Assert.equal( + tabmail.tabInfo[0].lastActiveElement, + folderTree, + "mail tab's last active element should be stored" + ); + Assert.ok( + !tabmail.tabInfo[1].lastActiveElement, + "calendar tab's last active element should have been cleaned up" + ); + + await new Promise(resolve => setTimeout(resolve)); + Assert.ok( + !contentTabPanel.parentNode, + "content tab's panel is removed from the DOM" + ); + + // Close the calendar tab. + + await closeTab(1); + + checkTabElements(1, 0); + assertSelected(mailTabPanel, "mail tab's panel"); + assertNotSelected(calendarTabPanel, "calendar tab's panel"); + Assert.equal( + document.activeElement, + mailTabBrowser, + "mail tab's browser has focus" + ); + Assert.ok( + !tabmail.tabInfo[0].lastActiveElement, + "mail tab's last active element should have been cleaned up" + ); +}); |