diff options
Diffstat (limited to 'comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js')
-rw-r--r-- | comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js | 945 |
1 files changed, 945 insertions, 0 deletions
diff --git a/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js b/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js new file mode 100644 index 0000000000..1a66df37d5 --- /dev/null +++ b/comm/mail/test/browser/folder-pane/browser_folderPaneHeader.js @@ -0,0 +1,945 @@ +/* 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 { add_message_sets_to_folders, be_in_folder, create_thread } = + ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" + ); + +let tabmail, + about3Pane, + folderPaneHeader, + fetchButton, + newButton, + moreButton, + moreContext, + fetchContext, + folderModesContextMenu, + folderModesContextMenuPopup; + +add_setup(async function () { + tabmail = document.getElementById("tabmail"); + about3Pane = tabmail.currentAbout3Pane; + folderPaneHeader = about3Pane.document.getElementById("folderPaneHeaderBar"); + fetchButton = folderPaneHeader.querySelector("#folderPaneGetMessages"); + fetchContext = about3Pane.document.getElementById( + "folderPaneGetMessagesContext" + ); + newButton = folderPaneHeader.querySelector("#folderPaneWriteMessage"); + moreButton = folderPaneHeader.querySelector("#folderPaneMoreButton"); + moreContext = about3Pane.document.getElementById("folderPaneMoreContext"); + folderModesContextMenu = about3Pane.document.getElementById( + "folderModesContextMenu" + ); + folderModesContextMenuPopup = about3Pane.document.getElementById( + "folderModesContextMenuPopup" + ); + registerCleanupFunction(() => { + Services.xulStore.removeDocument( + "chrome://messenger/content/messenger.xhtml" + ); + }); +}); + +async function assertAriaLabel(row, expectedLabel) { + await BrowserTestUtils.waitForCondition( + () => row.getAttribute("aria-label") === expectedLabel, + "The selected row aria-label should match the expected value" + ); +} + +add_task(function testFolderPaneHeaderDefaultState() { + Assert.ok(!folderPaneHeader.hidden, "The folder pane header is visible"); + Assert.ok(!fetchButton.disabled, "The Get Messages button is enabled"); + Assert.ok(!newButton.disabled, "The New Message button is enabled"); +}); + +add_task(async function testHideFolderPaneHeader() { + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + let hiddenPromise = BrowserTestUtils.waitForCondition( + () => folderPaneHeader.hidden, + "The folder pane header is hidden" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderHideMenuItem") + ); + await hiddenPromise; + + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneHeaderBar", + "hidden" + ) == "true", + "The customization data was saved" + ); + + // Can't access the menubar in macOS tests, so simply simulate a click on the + // toolbarbutton inside the app menu to reveal the header. The app menu + // behavior is tested later. + if (AppConstants.platform == "macosx") { + document.getElementById("appmenu_toggleFolderHeader").click(); + return; + } + + let menubar = document.getElementById("toolbar-menubar"); + menubar.removeAttribute("autohide"); + menubar.removeAttribute("inactive"); + await new Promise(resolve => requestAnimationFrame(resolve)); + + let viewShownPromise = BrowserTestUtils.waitForEvent( + document.getElementById("menu_View_Popup"), + "popupshown" + ); + EventUtils.synthesizeMouseAtCenter( + document.getElementById("menu_View"), + {}, + window + ); + await viewShownPromise; + + let viewMenuPopup = document.getElementById("menu_View_Popup"); + Assert.ok(viewMenuPopup.querySelector("#menu_FolderViews")); + + let folderViewShownPromise = BrowserTestUtils.waitForEvent( + document.getElementById("menu_FolderViewsPopup"), + "popupshown" + ); + EventUtils.synthesizeMouseAtCenter( + viewMenuPopup.querySelector("#menu_FolderViews"), + {}, + window + ); + await folderViewShownPromise; + + let toggleFolderHeader = menubar.querySelector(`[name="paneheader"]`); + Assert.ok( + !toggleFolderHeader.hasAttribute("checked"), + "The toggle header menu item is not checked" + ); + + EventUtils.synthesizeMouseAtCenter(toggleFolderHeader, {}, window); + await BrowserTestUtils.waitForCondition( + () => toggleFolderHeader.getAttribute("checked") == "true", + "The toggle header menu item is checked" + ); + + let folderViewHiddenPromise = BrowserTestUtils.waitForEvent( + document.getElementById("menu_FolderViewsPopup"), + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await folderViewHiddenPromise; + + let viewHiddenPromise = BrowserTestUtils.waitForEvent( + viewMenuPopup, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await viewHiddenPromise; + + await BrowserTestUtils.waitForCondition( + () => !folderPaneHeader.hidden, + "The folder pane header is visible" + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneHeaderBar", + "hidden" + ) == "false", + "The customization data was saved" + ); +}); + +add_task(async function testTogglePaneHeaderFromAppMenu() { + Assert.ok( + !folderPaneHeader.hidden, + "Start with a visible folder pane header" + ); + + async function toggleFolderPaneHeader(shouldBeChecked) { + let appMenu = document.getElementById("appMenu-popup"); + let menuShownPromise = BrowserTestUtils.waitForEvent(appMenu, "popupshown"); + EventUtils.synthesizeMouseAtCenter( + document.getElementById("button-appmenu"), + {}, + window + ); + await menuShownPromise; + + let viewShownPromise = BrowserTestUtils.waitForEvent( + appMenu.querySelector("#appMenu-viewView"), + "ViewShown" + ); + EventUtils.synthesizeMouseAtCenter( + appMenu.querySelector("#appmenu_View"), + {}, + window + ); + await viewShownPromise; + + let toolbarShownPromise = BrowserTestUtils.waitForEvent( + appMenu.querySelector("#appMenu-foldersView"), + "ViewShown" + ); + EventUtils.synthesizeMouseAtCenter( + appMenu.querySelector("#appmenu_FolderViews"), + {}, + window + ); + await toolbarShownPromise; + + let appMenuButton = document.getElementById("appmenu_toggleFolderHeader"); + Assert.equal( + appMenuButton.checked, + shouldBeChecked, + `The app menu item should ${shouldBeChecked ? "" : "not "}be checked` + ); + + EventUtils.synthesizeMouseAtCenter(appMenuButton, {}, window); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + appMenu, + "popuphidden" + ); + // Close the appmenu. + EventUtils.synthesizeMouseAtCenter( + document.getElementById("button-appmenu"), + {}, + window + ); + await menuHiddenPromise; + } + + await toggleFolderPaneHeader(true); + await toggleFolderPaneHeader(false); +}); + +/** + * Test the toggle that shows/hides the buttons on the folder pane header from + * the context menu. + */ +add_task(async function testTogglePaneHeaderButtons() { + Assert.ok(!folderPaneHeader.hidden, "The folder pane header is visible"); + Assert.ok(!fetchButton.hidden, "The Get Messages button is visible"); + Assert.ok(!newButton.hidden, "The New Message button is visible"); + + let folderPaneHdrToggleBtns = [ + { + menuId: "#folderPaneHeaderToggleGetMessages", + buttonId: "#folderPaneGetMessages", + label: "Get messages", + }, + { + menuId: "#folderPaneHeaderToggleNewMessage", + buttonId: "#folderPaneWriteMessage", + label: "New message", + }, + ]; + + for (let toggle of folderPaneHdrToggleBtns) { + let toggleMenuItem = moreContext.querySelector(toggle.menuId); + let toggleButton = folderPaneHeader.querySelector(toggle.buttonId); + let shouldBeChecked = !toggleButton.hidden; + + // Hide the toggle buttons + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + Assert.equal( + toggleMenuItem.hasAttribute("checked"), + shouldBeChecked, + `The "${toggle.label}" menuitem should ${ + shouldBeChecked ? "" : "not" + } be checked` + ); + + EventUtils.synthesizeMouseAtCenter(toggleMenuItem, {}, about3Pane); + + await BrowserTestUtils.waitForCondition( + () => !toggleMenuItem.hasAttribute("checked"), + `The ${toggle.label} menu item is unchecked` + ); + + await BrowserTestUtils.waitForCondition( + () => toggleButton.hidden, + `The ${toggle.label} button is hidden` + ); + + let buttonName = + toggle.buttonId == "#folderPaneGetMessages" + ? "folderPaneGetMessages" + : "folderPaneWriteMessage"; + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + buttonName, + "hidden" + ) == "true", + "The customization data was saved" + ); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + // display the toggle buttons + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + shouldBeChecked = !toggleButton.hidden; + + Assert.equal( + toggleMenuItem.hasAttribute("checked"), + shouldBeChecked, + `The "${toggle.label}" menuitem should ${ + shouldBeChecked ? "" : "not" + } be checked` + ); + EventUtils.synthesizeMouseAtCenter(toggleMenuItem, {}, about3Pane); + + await BrowserTestUtils.waitForCondition( + () => toggleMenuItem.hasAttribute("checked"), + `The ${toggle.label} menu item is checked` + ); + + await BrowserTestUtils.waitForCondition( + () => !toggleButton.hidden, + `The ${toggle.label} button is not hidden` + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + buttonName, + "hidden" + ) == "false", + "The customization data was saved" + ); + + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + } +}); + +/** + * Test the default state of the context menu in the about3Pane. + */ +add_task(async function testInitialActiveModes() { + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + let shownFolderModesSubMenuPromise = BrowserTestUtils.waitForEvent( + folderModesContextMenuPopup, + "popupshown" + ); + + EventUtils.synthesizeMouseAtCenter(folderModesContextMenu, {}, about3Pane); + await shownFolderModesSubMenuPromise; + + Assert.equal( + about3Pane.folderPane.activeModes.length, + 1, + "Only one active mode" + ); + Assert.equal( + about3Pane.folderPane.activeModes.at(0), + "all", + "The first item is 'all' value" + ); + Assert.ok( + moreContext + .querySelector("#folderPaneMoreContextAllFolders") + .getAttribute("checked"), + "'All' toggle is checked" + ); + Assert.equal(moreContext.state, "open", "The context menu remains open"); +}); + +/** + * Tests that the menu items are correctly checked corresponding to the current + * active modes. + */ +add_task(async function testFolderModesActivation() { + let folderModesArray = [ + { menuID: "#folderPaneMoreContextUnifiedFolders", modeID: "smart" }, + { menuID: "#folderPaneMoreContextUnreadFolders", modeID: "unread" }, + { menuID: "#folderPaneMoreContextFavoriteFolders", modeID: "favorite" }, + { menuID: "#folderPaneMoreContextRecentFolders", modeID: "recent" }, + ]; + let checkedModesCount = 2; + for (let mode of folderModesArray) { + Assert.ok( + !moreContext.querySelector(mode.menuID).hasAttribute("checked"), + `"${mode.modeID}" option is not checked` + ); + + let checkedPromise = TestUtils.waitForCondition( + () => moreContext.querySelector(mode.menuID).hasAttribute("checked"), + `"${mode.modeID}" option has been checked` + ); + moreContext.activateItem(moreContext.querySelector(mode.menuID)); + await checkedPromise; + + Assert.equal( + about3Pane.folderPane.activeModes.length, + checkedModesCount, + `Correct amount of active modes after enabling the "${mode.modeID}" mode` + ); + Assert.ok( + about3Pane.folderPane.activeModes.includes(mode.modeID), + `"${mode.modeID}" mode is included in the active modes array` + ); + checkedModesCount++; + } + Assert.equal(moreContext.state, "open", "The context menu remains open"); +}); + +/** + * Tests that the menu items are correctly unchecked corresponding to the + * current active modes. It verifies that the if every item is unchecked, it + * returns to the default active mode value and the corresponding menu item is + * checked. + */ +add_task(async function testFolderModesDeactivation() { + let folderActiveModesArray = [ + { menuID: "#folderPaneMoreContextAllFolders", modeID: "all" }, + { menuID: "#folderPaneMoreContextUnifiedFolders", modeID: "smart" }, + { menuID: "#folderPaneMoreContextUnreadFolders", modeID: "unread" }, + { menuID: "#folderPaneMoreContextFavoriteFolders", modeID: "favorite" }, + { menuID: "#folderPaneMoreContextRecentFolders", modeID: "recent" }, + ]; + let checkedModesCount = 4; + for (let mode of folderActiveModesArray) { + Assert.ok( + moreContext.querySelector(mode.menuID).hasAttribute("checked"), + `"${mode.modeID}" option is checked` + ); + + let uncheckedPromise = TestUtils.waitForCondition( + () => !moreContext.querySelector(mode.menuID).hasAttribute("checked"), + `"${mode.modeID}" option has been unchecked` + ); + moreContext.activateItem(moreContext.querySelector(mode.menuID)); + await uncheckedPromise; + + Assert.ok( + !about3Pane.folderPane.activeModes.includes(mode.modeID), + `"${mode.modeID}" mode is not included in the active modes array` + ); + if (checkedModesCount > 0) { + Assert.equal( + about3Pane.folderPane.activeModes.length, + checkedModesCount, + `Correct amount of active modes after disabling the "${mode.modeID}" mode` + ); + } else { + //checks if it automatically checks "all" mode if every other mode was unchecked + Assert.equal( + about3Pane.folderPane.activeModes.length, + 1, + `Correct amount of active modes after disabling the "${mode.modeID}" mode` + ); + Assert.equal( + about3Pane.folderPane.activeModes.at(0), + "all", + "The first item is 'all' value" + ); + Assert.ok( + moreContext + .querySelector("#folderPaneMoreContextAllFolders") + .getAttribute("checked"), + "'All' toggle is checked" + ); + } + checkedModesCount--; + } + Assert.equal(moreContext.state, "open", "The context menu remains open"); + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + folderModesContextMenuPopup, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + menuHiddenPromise = BrowserTestUtils.waitForEvent(moreContext, "popuphidden"); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; +}); + +add_task(async function testGetMessageContextMenu() { + const shownPromise = BrowserTestUtils.waitForEvent( + fetchContext, + "popupshown" + ); + EventUtils.synthesizeMouseAtCenter( + fetchButton, + { type: "contextmenu" }, + about3Pane + ); + await shownPromise; + + Assert.equal( + fetchContext.querySelectorAll("menuitem").length, + 2, + "2 menuitems should be present in the fetch context" + ); + + const menuHiddenPromise = BrowserTestUtils.waitForEvent( + fetchContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; +}); + +add_task(async function testTotalCountDefaultState() { + let totalCountBadge = about3Pane.document.querySelector(".total-count"); + Assert.ok( + !moreContext + .querySelector("#folderPaneHeaderToggleTotalCount") + .hasAttribute("checked"), + "The total count toggle is unchecked" + ); + Assert.ok(totalCountBadge.hidden, "The total count badges are hidden"); + Assert.notEqual( + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "totalMsgCount", + "visible" + ), + "true", + "The customization data was saved" + ); + + const rootFolder = + MailServices.accounts.accounts[0].incomingServer.rootFolder; + const inbox = rootFolder.getFolderWithFlags(Ci.nsMsgFolderFlags.Inbox); + await add_message_sets_to_folders([inbox], [create_thread(10)]); + await be_in_folder(inbox); + + about3Pane.folderTree.selectedIndex = 1; + let row = about3Pane.folderTree.getRowAtIndex(1); + await assertAriaLabel(row, "Inbox, 10 unread messages"); + + about3Pane.threadTree.selectedIndex = 0; + about3Pane.threadTree.expandRowAtIndex(0); + await assertAriaLabel(row, "Inbox, 9 unread messages"); +}); + +add_task(async function testTotalCountVisible() { + let totalCountBadge = about3Pane.document.querySelector(".total-count"); + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + // Toggle total count ON. + let toggleOnPromise = BrowserTestUtils.waitForCondition( + () => !totalCountBadge.hidden, + "The total count badges are visible" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleTotalCount") + ); + await toggleOnPromise; + // Check that toggle was successful. + Assert.ok( + moreContext + .querySelector("#folderPaneHeaderToggleTotalCount") + .hasAttribute("checked"), + "The total count toggle is checked" + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "totalMsgCount", + "visible" + ) == "true", + "The customization data was saved" + ); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + let row = about3Pane.folderTree.getRowAtIndex(1); + await assertAriaLabel(row, "Inbox, 9 unread messages, 10 total messages"); +}); + +add_task(async function testFolderSizeDefaultState() { + let folderSizeBadge = about3Pane.document.querySelector(".folder-size"); + Assert.ok( + !moreContext + .querySelector("#folderPaneHeaderToggleFolderSize") + .hasAttribute("checked"), + "The folder size toggle is unchecked" + ); + Assert.ok(folderSizeBadge.hidden, "The folder sizes are hidden"); + Assert.notEqual( + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneFolderSize", + "visible" + ), + "true", + "The folder size xulStore attribute is set to not visible" + ); +}); + +add_task(async function testFolderSizeVisible() { + let folderSizeBadge = about3Pane.document.querySelector(".folder-size"); + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + // Toggle folder size ON. + let toggleOnPromise = BrowserTestUtils.waitForCondition( + () => !folderSizeBadge.hidden, + "The folder sizes are visible" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleFolderSize") + ); + await toggleOnPromise; + // Check that toggle on was successful. + Assert.ok( + moreContext + .querySelector("#folderPaneHeaderToggleFolderSize") + .hasAttribute("checked"), + "The folder size toggle is checked" + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneFolderSize", + "visible" + ) == "true", + "The folder size xulStore attribute is set to visible" + ); + + Assert.ok(!folderSizeBadge.hidden, "The folder sizes are visible"); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + let row = about3Pane.folderTree.getRowAtIndex(1); + await assertAriaLabel( + row, + `Inbox, 9 unread messages, 10 total messages, ${row.folderSize}` + ); +}); + +add_task(async function testFolderSizeHidden() { + let folderSizeBadge = about3Pane.document.querySelector(".folder-size"); + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + // Toggle folder sizes OFF. + let toggleOffPromise = BrowserTestUtils.waitForCondition( + () => folderSizeBadge.hidden, + "The folder sizes are hidden" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleFolderSize") + ); + await toggleOffPromise; + + // Check that toggle was successful. + Assert.ok( + !moreContext + .querySelector("#folderPaneHeaderToggleFolderSize") + .getAttribute("checked"), + "The folder size toggle is unchecked" + ); + + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneFolderSize", + "visible" + ) == "false", + "The folder size xulStore visible attribute was set to false" + ); + + Assert.ok(folderSizeBadge.hidden, "The folder sizes are hidden"); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; +}); + +add_task(async function testTotalCountHidden() { + let totalCountBadge = about3Pane.document.querySelector(".total-count"); + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + // Toggle total count OFF. + let toggleOffPromise = BrowserTestUtils.waitForCondition( + () => totalCountBadge.hidden, + "The total count badges are hidden" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleTotalCount") + ); + await toggleOffPromise; + + // Check that toggle was successful. + Assert.ok( + !moreContext + .querySelector("#folderPaneHeaderToggleTotalCount") + .getAttribute("checked"), + "The total count toggle is unchecked" + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "totalMsgCount", + "visible" + ) == "false", + "The customization data was saved" + ); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + let row = about3Pane.folderTree.getRowAtIndex(1); + await assertAriaLabel(row, "Inbox, 9 unread messages"); +}); + +add_task(async function testHideLocalFoldersXULStore() { + let shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleLocalFolders") + ); + + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneLocalFolders", + "hidden" + ) == "true", + "The customization data to hide local folders should be saved" + ); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + shownPromise = BrowserTestUtils.waitForEvent(moreContext, "popupshown"); + EventUtils.synthesizeMouseAtCenter(moreButton, {}, about3Pane); + await shownPromise; + + Assert.ok( + moreContext + .querySelector("#folderPaneHeaderToggleLocalFolders") + .hasAttribute("checked"), + "The hide local folders menuitem should be checked" + ); + + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleLocalFolders") + ); + + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneLocalFolders", + "hidden" + ) == "false", + "The customization data to hide local folders should be saved" + ); +}); + +/** + * Ensure that the various badges and labels are updated and maintained when + * folders and modes change in the folder pane. + */ +add_task(async function testBadgesPersistentState() { + let totalCountBadge = about3Pane.document.querySelector(".total-count"); + let folderSizeBadge = about3Pane.document.querySelector(".folder-size"); + // Show total count. + let toggleOnPromise = BrowserTestUtils.waitForCondition( + () => !totalCountBadge.hidden, + "The total count badges are visible" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleTotalCount") + ); + await toggleOnPromise; + + // Show folder size. + toggleOnPromise = BrowserTestUtils.waitForCondition( + () => !folderSizeBadge.hidden, + "The folder sizes are visible" + ); + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleFolderSize") + ); + await toggleOnPromise; + + // Hide local folders. + moreContext.activateItem( + moreContext.querySelector("#folderPaneHeaderToggleLocalFolders") + ); + await BrowserTestUtils.waitForCondition( + () => + Services.xulStore.getValue( + "chrome://messenger/content/messenger.xhtml", + "folderPaneLocalFolders", + "hidden" + ) == "true", + "The customization data to hide local folders should be saved" + ); + // The test times out on macOS if we don't wait here before dismissing the + // context menu. Unknown why. + // eslint-disable-next-line mozilla/no-arbitrary-setTimeout + await new Promise(resolve => setTimeout(resolve, 250)); + + let menuHiddenPromise = BrowserTestUtils.waitForEvent( + moreContext, + "popuphidden" + ); + EventUtils.synthesizeKey("KEY_Escape", {}, about3Pane); + await menuHiddenPromise; + + // Ensure the badges are still visible. + Assert.ok( + !totalCountBadge.hidden, + "Folder total count badge should be visible" + ); + Assert.ok(!folderSizeBadge.hidden, "Folder size badge should be visible"); + + // Create a folder and add messages to that folder to ensure the badges are + // visible and they update properly. + const rootFolder = + MailServices.accounts.accounts[0].incomingServer.rootFolder; + rootFolder.createSubfolder("NewlyCreatedTestFolder", null); + const folder = rootFolder.getChildNamed("NewlyCreatedTestFolder"); + await be_in_folder(folder); + + about3Pane.folderTree.selectedIndex = 3; + const row = about3Pane.folderTree.getRowAtIndex(3); + Assert.equal( + row.name, + "NewlyCreatedTestFolder", + "The correct folder should have been selected" + ); + // Badges shouldn't be hidden even if there's no content. + Assert.ok( + !row.querySelector(".total-count").hidden, + "The total count badge of the newly created folder should be visible" + ); + Assert.ok( + !row.querySelector(".folder-size").hidden, + "The folder size badge of the newly created folder should be visible" + ); + + const currentTotal = row.querySelector(".total-count").textContent; + const currentSize = row.querySelector(".folder-size").textContent; + + await add_message_sets_to_folders([folder], [create_thread(10)]); + + // Weird issue with the test in which the focus is lost after creating the + // messages, and the folder pane doesn't receive the folder size property + // changes. This doesn't happen while using the app normally. + about3Pane.folderTree.selectedIndex = 0; + about3Pane.folderTree.selectedIndex = 3; + + await BrowserTestUtils.waitForCondition( + () => currentTotal != row.querySelector(".total-count").textContent, + `${currentTotal} != ${ + row.querySelector(".total-count").textContent + } | The total count should have changed after adding messages` + ); + + await BrowserTestUtils.waitForCondition( + () => currentSize != row.querySelector(".folder-size").textContent, + `${currentSize} != ${ + row.querySelector(".folder-size").textContent + } | The folder size should have changed after adding messages` + ); +}); + +add_task(async function testActionButtonsState() { + // Delete all accounts to start clean. + for (let account of MailServices.accounts.accounts) { + MailServices.accounts.removeAccount(account, true); + } + + // Confirm that we don't have any account in our test run. + Assert.equal( + MailServices.accounts.accounts.length, + 0, + "No account currently configured" + ); + + Assert.ok(fetchButton.disabled, "The Get Messages button is disabled"); + Assert.ok(newButton.disabled, "The New Message button is disabled"); + + // Create a POP server. + let popServer = MailServices.accounts + .createIncomingServer("nobody", "foo.invalid", "pop3") + .QueryInterface(Ci.nsIPop3IncomingServer); + + let identity = MailServices.accounts.createIdentity(); + identity.email = "tinderbox@foo.invalid"; + + let account = MailServices.accounts.createAccount(); + account.addIdentity(identity); + account.incomingServer = popServer; + + await BrowserTestUtils.waitForCondition( + () => !fetchButton.disabled, + "The Get Messages button is enabled" + ); + + await BrowserTestUtils.waitForCondition( + () => !newButton.disabled, + "The New Message button is enabled" + ); +}); |