diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 17:32:43 +0000 |
commit | 6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch) | |
tree | a68f146d7fa01f0134297619fbe7e33db084e0aa /comm/mail/base/test/browser/browser_mailTabsAndWindows.js | |
parent | Initial commit. (diff) | |
download | thunderbird-upstream.tar.xz thunderbird-upstream.zip |
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | comm/mail/base/test/browser/browser_mailTabsAndWindows.js | 355 |
1 files changed, 355 insertions, 0 deletions
diff --git a/comm/mail/base/test/browser/browser_mailTabsAndWindows.js b/comm/mail/base/test/browser/browser_mailTabsAndWindows.js new file mode 100644 index 0000000000..3da815edd9 --- /dev/null +++ b/comm/mail/base/test/browser/browser_mailTabsAndWindows.js @@ -0,0 +1,355 @@ +/* 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/. */ + +var { MailServices } = ChromeUtils.import( + "resource:///modules/MailServices.jsm" +); +var { MailUtils } = ChromeUtils.import("resource:///modules/MailUtils.jsm"); +var { MessageGenerator } = ChromeUtils.import( + "resource://testing-common/mailnews/MessageGenerator.jsm" +); + +let folderA, messagesA, folderB, messagesB; + +add_setup(async function () { + let tabmail = document.getElementById("tabmail"); + if (tabmail.tabInfo.length > 1) { + info(`Will close ${tabmail.tabInfo.length - 1} tabs left over from others`); + for (let i = tabmail.tabInfo.length - 1; i > 0; i--) { + tabmail.closeTab(i); + } + } + Assert.equal(tabmail.tabInfo.length, 1, "should be set up with one tab"); + + let generator = new MessageGenerator(); + + MailServices.accounts.createLocalMailAccount(); + let account = MailServices.accounts.accounts[0]; + let rootFolder = account.incomingServer.rootFolder; + + rootFolder.createSubfolder("mailTabsA", null); + folderA = rootFolder + .getChildNamed("mailTabsA") + .QueryInterface(Ci.nsIMsgLocalMailFolder); + folderA.addMessageBatch( + generator.makeMessages({ count: 5 }).map(message => message.toMboxString()) + ); + messagesA = [...folderA.messages]; + + rootFolder.createSubfolder("mailTabsB", null); + folderB = rootFolder + .getChildNamed("mailTabsB") + .QueryInterface(Ci.nsIMsgLocalMailFolder); + folderB.addMessageBatch( + generator.makeMessages({ count: 2 }).map(message => message.toMboxString()) + ); + messagesB = [...folderB.messages]; + + registerCleanupFunction(() => { + MailServices.accounts.removeAccount(account, false); + }); +}); + +add_task(async function testTabs() { + let tabmail = document.getElementById("tabmail"); + Assert.equal(tabmail.tabInfo.length, 1, "should start off with one tab open"); + Assert.equal(tabmail.currentTabInfo, tabmail.tabInfo[0], "should show tab0"); + + // Check the first tab. + + let firstTab = tabmail.currentTabInfo; + Assert.equal(firstTab.mode.name, "mail3PaneTab"); + Assert.equal(firstTab.mode.tabType.name, "mailTab"); + + let firstChromeBrowser = firstTab.chromeBrowser; + Assert.equal(firstChromeBrowser.currentURI.spec, "about:3pane"); + Assert.equal(tabmail.currentAbout3Pane, firstChromeBrowser.contentWindow); + + let firstMessageBrowser = + firstChromeBrowser.contentDocument.getElementById("messageBrowser"); + Assert.equal(firstMessageBrowser.currentURI.spec, "about:message"); + + let firstMessagePane = + firstMessageBrowser.contentDocument.getElementById("messagepane"); + Assert.equal(firstMessagePane.currentURI.spec, "about:blank"); + Assert.equal( + tabmail.currentAboutMessage, + null, + "currentAboutMessage should be null with no message selected" + ); + Assert.equal(firstTab.browser, null); + Assert.equal(firstTab.linkedBrowser, null); + + let { folderTree, threadTree, messagePane, paneLayout } = + firstChromeBrowser.contentWindow; + + firstTab.folder = folderA; + Assert.equal(firstTab.folder, folderA); + Assert.equal( + folderTree.querySelector(".selected .name").textContent, + "mailTabsA" + ); + Assert.equal(threadTree.view.rowCount, 5); + Assert.equal(threadTree.selectedIndex, -1); + + Assert.equal(firstTab.message, null); + threadTree.selectedIndex = 0; + Assert.equal( + tabmail.currentAboutMessage, + firstMessageBrowser.contentWindow, + "currentAboutMessage should have a value with a message selected" + ); + Assert.equal(firstTab.message, messagesA[0]); + Assert.equal(firstTab.browser, firstMessagePane); + Assert.equal(firstTab.linkedBrowser, firstMessagePane); + + Assert.ok(BrowserTestUtils.is_visible(folderTree)); + Assert.ok(BrowserTestUtils.is_visible(firstMessageBrowser)); + + paneLayout.folderPaneVisible = false; + Assert.ok(BrowserTestUtils.is_hidden(folderTree)); + Assert.ok(BrowserTestUtils.is_visible(firstMessageBrowser)); + + paneLayout.messagePaneVisible = false; + Assert.ok(BrowserTestUtils.is_hidden(folderTree)); + Assert.ok(BrowserTestUtils.is_hidden(firstMessageBrowser)); + Assert.equal( + tabmail.currentAboutMessage, + null, + "currentAboutMessage should be null with the message pane hidden" + ); + Assert.equal(firstTab.browser, null); + Assert.equal(firstTab.linkedBrowser, null); + + paneLayout.folderPaneVisible = true; + Assert.ok(BrowserTestUtils.is_visible(folderTree)); + Assert.ok(BrowserTestUtils.is_hidden(firstMessageBrowser)); + + paneLayout.messagePaneVisible = true; + Assert.ok(BrowserTestUtils.is_visible(folderTree)); + Assert.ok(BrowserTestUtils.is_visible(firstMessageBrowser)); + Assert.equal( + tabmail.currentAboutMessage, + firstMessageBrowser.contentWindow, + "currentAboutMessage should have a value with the message pane shown" + ); + Assert.equal(firstTab.browser, firstMessagePane); + Assert.equal(firstTab.linkedBrowser, firstMessagePane); + + Assert.equal(firstChromeBrowser.contentWindow.tabOrWindow, firstTab); + Assert.equal(firstMessageBrowser.contentWindow.tabOrWindow, firstTab); + + // Select multiple messages. + + let firstMultiMessageBrowser = + firstChromeBrowser.contentDocument.getElementById("multiMessageBrowser"); + let firstWebBrowser = + firstChromeBrowser.contentDocument.getElementById("webBrowser"); + + threadTree.selectedIndices = [1, 2]; + Assert.ok(BrowserTestUtils.is_hidden(firstWebBrowser)); + Assert.ok(BrowserTestUtils.is_hidden(firstMessageBrowser)); + Assert.ok(BrowserTestUtils.is_visible(firstMultiMessageBrowser)); + Assert.equal( + tabmail.currentAboutMessage, + null, + "currentAboutMessage should be null with multiple messages selected" + ); + Assert.equal(firstTab.browser, null); + Assert.equal(firstTab.linkedBrowser, null); + + // Load a web page. + + let loadedPromise = BrowserTestUtils.browserLoaded( + firstWebBrowser, + false, + "http://mochi.test:8888/" + ); + messagePane.displayWebPage("http://mochi.test:8888/"); + await loadedPromise; + Assert.ok(BrowserTestUtils.is_visible(firstWebBrowser)); + Assert.ok(BrowserTestUtils.is_hidden(firstMessageBrowser)); + Assert.ok(BrowserTestUtils.is_hidden(firstMultiMessageBrowser)); + Assert.equal(firstWebBrowser.currentURI.spec, "http://mochi.test:8888/"); + Assert.equal( + tabmail.currentAboutMessage, + null, + "currentAboutMessage should be null with a web page loaded" + ); + Assert.equal(firstTab.browser, firstWebBrowser); + Assert.equal(firstTab.linkedBrowser, firstWebBrowser); + + // Go back to a single selection. + + threadTree.selectedIndex = 0; + Assert.ok(BrowserTestUtils.is_hidden(firstWebBrowser)); + Assert.ok(BrowserTestUtils.is_visible(firstMessageBrowser)); + Assert.ok(BrowserTestUtils.is_hidden(firstMultiMessageBrowser)); + Assert.equal( + tabmail.currentAboutMessage, + firstMessageBrowser.contentWindow, + "currentAboutMessage should have a value with a single message selected" + ); + Assert.equal(firstTab.browser, firstMessagePane); + Assert.equal(firstTab.linkedBrowser, firstMessagePane); + + // Open some more tabs. These should open in the background. + + window.MsgOpenNewTabForFolders([folderB], { + folderPaneVisible: true, + messagePaneVisible: true, + }); + + for (let message of messagesB) { + window.OpenMessageInNewTab(message, {}); + } + + Assert.equal(tabmail.tabInfo.length, 4); + Assert.equal(tabmail.currentTabInfo, firstTab); + Assert.equal(tabmail.currentAbout3Pane, firstChromeBrowser.contentWindow); + Assert.equal(tabmail.currentAboutMessage, firstMessageBrowser.contentWindow); + + // Check the second tab. + + tabmail.switchToTab(1); + Assert.equal(tabmail.currentTabInfo, tabmail.tabInfo[1]); + + let secondTab = tabmail.currentTabInfo; + Assert.equal(secondTab.mode.name, "mail3PaneTab"); + Assert.equal(secondTab.mode.tabType.name, "mailTab"); + + let secondChromeBrowser = secondTab.chromeBrowser; + await ensureBrowserLoaded(secondChromeBrowser); + Assert.equal(secondChromeBrowser.currentURI.spec, "about:3pane"); + Assert.equal(tabmail.currentAbout3Pane, secondChromeBrowser.contentWindow); + + let secondMessageBrowser = + secondChromeBrowser.contentDocument.getElementById("messageBrowser"); + await ensureBrowserLoaded(secondMessageBrowser); + Assert.equal(secondMessageBrowser.currentURI.spec, "about:message"); + + let secondMessagePane = + secondMessageBrowser.contentDocument.getElementById("messagepane"); + Assert.equal(secondMessagePane.currentURI.spec, "about:blank"); + Assert.equal( + tabmail.currentAboutMessage, + null, + "currentAboutMessage should be null with no message selected" + ); + Assert.equal(secondTab.browser, null); + Assert.equal(secondTab.linkedBrowser, null); + + Assert.equal(secondTab.folder, folderB); + + secondChromeBrowser.contentWindow.threadTree.selectedIndex = 0; + Assert.equal( + tabmail.currentAboutMessage, + secondMessageBrowser.contentWindow, + "currentAboutMessage should have a value with a message selected" + ); + + Assert.equal(secondChromeBrowser.contentWindow.tabOrWindow, secondTab); + Assert.equal(secondMessageBrowser.contentWindow.tabOrWindow, secondTab); + + // Check the third tab. + + tabmail.switchToTab(2); + Assert.equal(tabmail.currentTabInfo, tabmail.tabInfo[2]); + + let thirdTab = tabmail.currentTabInfo; + Assert.equal(thirdTab.mode.name, "mailMessageTab"); + Assert.equal(thirdTab.mode.tabType.name, "mailTab"); + + let thirdChromeBrowser = thirdTab.chromeBrowser; + await ensureBrowserLoaded(thirdChromeBrowser); + Assert.equal(thirdChromeBrowser.currentURI.spec, "about:message"); + Assert.equal(tabmail.currentAbout3Pane, null); + Assert.equal(tabmail.currentAboutMessage, thirdChromeBrowser.contentWindow); + + let thirdMessagePane = + thirdChromeBrowser.contentDocument.getElementById("messagepane"); + Assert.equal(thirdMessagePane.currentURI.spec, messageToURL(messagesB[0])); + Assert.equal(thirdTab.browser, thirdMessagePane); + Assert.equal(thirdTab.linkedBrowser, thirdMessagePane); + + Assert.equal(thirdTab.folder, folderB); + Assert.equal(thirdTab.message, messagesB[0]); + + Assert.equal(thirdChromeBrowser.contentWindow.tabOrWindow, thirdTab); + + // Check the fourth tab. + + tabmail.switchToTab(3); + Assert.equal(tabmail.currentTabInfo, tabmail.tabInfo[3]); + + let fourthTab = tabmail.currentTabInfo; + Assert.equal(fourthTab.mode.name, "mailMessageTab"); + Assert.equal(fourthTab.mode.tabType.name, "mailTab"); + + let fourthChromeBrowser = fourthTab.chromeBrowser; + await ensureBrowserLoaded(fourthChromeBrowser); + Assert.equal(fourthChromeBrowser.currentURI.spec, "about:message"); + Assert.equal(tabmail.currentAbout3Pane, null); + Assert.equal(tabmail.currentAboutMessage, fourthChromeBrowser.contentWindow); + + let fourthMessagePane = + fourthChromeBrowser.contentDocument.getElementById("messagepane"); + Assert.equal(fourthMessagePane.currentURI.spec, messageToURL(messagesB[1])); + Assert.equal(fourthTab.browser, fourthMessagePane); + Assert.equal(fourthTab.linkedBrowser, fourthMessagePane); + + Assert.equal(fourthTab.folder, folderB); + Assert.equal(fourthTab.message, messagesB[1]); + + Assert.equal(fourthChromeBrowser.contentWindow.tabOrWindow, fourthTab); + + // Close tabs. + + tabmail.closeTab(3); + Assert.equal(tabmail.currentTabInfo, thirdTab); + Assert.equal(tabmail.currentAbout3Pane, null); + Assert.equal(tabmail.currentAboutMessage, thirdChromeBrowser.contentWindow); + + tabmail.closeTab(2); + Assert.equal(tabmail.currentTabInfo, secondTab); + Assert.equal(tabmail.currentAbout3Pane, secondChromeBrowser.contentWindow); + Assert.equal(tabmail.currentAboutMessage, secondMessageBrowser.contentWindow); + + tabmail.closeTab(1); + Assert.equal(tabmail.currentTabInfo, firstTab); + Assert.equal(tabmail.currentAbout3Pane, firstChromeBrowser.contentWindow); + Assert.equal(tabmail.currentAboutMessage, firstMessageBrowser.contentWindow); +}); + +add_task(async function testMessageWindow() { + let messageWindowPromise = BrowserTestUtils.domWindowOpenedAndLoaded( + undefined, + async win => + win.document.documentURI == + "chrome://messenger/content/messageWindow.xhtml" + ); + MailUtils.openMessageInNewWindow(messagesB[0]); + + let messageWindow = await messageWindowPromise; + let messageBrowser = messageWindow.messageBrowser; + await ensureBrowserLoaded(messageBrowser); + Assert.equal(messageBrowser.contentWindow.tabOrWindow, messageWindow); + + await BrowserTestUtils.closeWindow(messageWindow); +}); + +async function ensureBrowserLoaded(browser) { + await TestUtils.waitForCondition( + () => + browser.currentURI.spec != "about:blank" && + browser.contentDocument.readyState == "complete", + "waiting for browser to finish loading" + ); +} + +function messageToURL(message) { + let messageService = MailServices.messageServiceFromURI("mailbox-message://"); + let uri = message.folder.getUriForMsg(message); + return messageService.getUrlForUri(uri).spec; +} |