diff options
Diffstat (limited to 'comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js')
-rw-r--r-- | comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js | 338 |
1 files changed, 338 insertions, 0 deletions
diff --git a/comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js b/comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js new file mode 100644 index 0000000000..dee646c754 --- /dev/null +++ b/comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js @@ -0,0 +1,338 @@ +/* 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/. */ + +/* + * Test the ability to switch between multiple folder modes. + */ + +"use strict"; + +var { + assert_folder_visible, + inboxFolder, + make_message_sets_in_folders, + mc, + toggle_main_menu, +} = ChromeUtils.import( + "resource://testing-common/mozmill/FolderDisplayHelpers.jsm" +); +var { MailTelemetryForTests } = ChromeUtils.import( + "resource:///modules/MailGlue.jsm" +); +var { TelemetryTestUtils } = ChromeUtils.importESModule( + "resource://testing-common/TelemetryTestUtils.sys.mjs" +); +var { click_menus_in_sequence, click_through_appmenu, close_popup_sequence } = + ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm"); + +var rootFolder; +var unreadFolder; +var favoriteFolder; +var modeList_menu; +var modeList_appmenu; +var view_menu; +var view_menupopup; +var appmenu_button; +var appmenu_mainView; +var appmenu_popup; +var menu_state; +var about3Pane; + +add_setup(async function () { + rootFolder = inboxFolder.server.rootFolder; + + // Create one folder with unread messages and one favorite folder. + inboxFolder.createSubfolder("UnreadFolder", null); + unreadFolder = inboxFolder.getChildNamed("UnreadFolder"); + + inboxFolder.createSubfolder("FavoriteFolder", null); + favoriteFolder = inboxFolder.getChildNamed("FavoriteFolder"); + + await make_message_sets_in_folders([unreadFolder], [{ count: 1 }]); + favoriteFolder.setFlag(Ci.nsMsgFolderFlags.Favorite); + + modeList_menu = mc.window.document.getElementById("menu_FolderViewsPopup"); + modeList_appmenu = mc.window.document.getElementById("appMenu-foldersView"); + + view_menu = mc.window.document.getElementById("menu_View"); + view_menupopup = mc.window.document.getElementById("menu_View_Popup"); + appmenu_button = mc.window.document.getElementById("button-appmenu"); + appmenu_mainView = mc.window.document.getElementById("appMenu-mainView"); + appmenu_popup = mc.window.document.getElementById("appMenu-popup"); + + // Main menu is needed for this whole test file. + menu_state = toggle_main_menu(true); + + about3Pane = document.getElementById("tabmail").currentAbout3Pane; + + Services.xulStore.removeDocument( + "chrome://messenger/content/messenger.xhtml" + ); + Services.telemetry.clearScalars(); +}); + +/** + * Check whether the expected folder mode is selected in menus and internally. + * + * @param {string} aMode - The name of the expected mode. + */ +async function assert_mode_selected(aMode) { + if (aMode != "compact") { + // "compact" isn't really a mode, we're just using this function because + // it tests everything we want to test. + Assert.ok(about3Pane.folderPane.activeModes.includes(aMode)); + } + + // We need to open the menu because only then the right mode is set in them. + if (["linux", "win"].includes(AppConstants.platform)) { + // On OS X the main menu seems not accessible for clicking from tests. + EventUtils.synthesizeMouseAtCenter(view_menu, { clickCount: 1 }, mc.window); + let popuplist = await click_menus_in_sequence( + view_menupopup, + [{ id: modeList_menu.parentNode.id }], + true + ); + for (let mode of about3Pane.folderPane.activeModes) { + Assert.ok( + modeList_menu.querySelector(`[value="${mode}"]`).hasAttribute("checked") + ); + } + close_popup_sequence(popuplist); + } + + EventUtils.synthesizeMouseAtCenter(appmenu_button, {}, mc.window); + click_through_appmenu( + [{ id: "appmenu_View" }, { id: "appmenu_FolderViews" }], + null, + mc.window + ); + for (let mode of about3Pane.folderPane.activeModes) { + Assert.ok( + modeList_appmenu + .querySelector(`[value="${mode}"]`) + .hasAttribute("checked") + ); + } + appmenu_popup.hidePopup(); +} + +/** + * Check whether the expected folder mode is unselected in menus and internally. + * + * @param {string} mode - The name of the missing mode. + */ +async function assert_mode_not_selected(mode) { + Assert.ok(!about3Pane.folderPane.activeModes.includes(mode)); + + // We need to open the menu because only then the right mode is set in them. + if (["linux", "win"].includes(AppConstants.platform)) { + // On OS X the main menu seems not accessible for clicking from tests. + EventUtils.synthesizeMouseAtCenter(view_menu, { clickCount: 1 }, mc.window); + let popuplist = await click_menus_in_sequence( + view_menupopup, + [{ id: modeList_menu.parentNode.id }], + true + ); + Assert.ok( + !modeList_menu.querySelector(`[value="${mode}"]`).hasAttribute("checked") + ); + close_popup_sequence(popuplist); + } + + EventUtils.synthesizeMouseAtCenter(appmenu_button, {}, mc.window); + click_through_appmenu( + [{ id: "appmenu_View" }, { id: "appmenu_FolderViews" }], + null, + mc.window + ); + Assert.ok( + !modeList_appmenu.querySelector(`[value="${mode}"]`).hasAttribute("checked") + ); + appmenu_popup.hidePopup(); +} + +/** + * Toggle the folder mode by clicking in the menu. + * + * @param mode The base name of the mode to select. + */ +function select_mode_in_menu(mode) { + EventUtils.synthesizeMouseAtCenter(appmenu_button, {}, mc.window); + click_through_appmenu( + [{ id: "appmenu_View" }, { id: "appmenu_FolderViews" }], + { value: mode }, + mc.window + ); + appmenu_popup.hidePopup(); +} + +/** + * Check the all folders mode. + */ +async function subtest_toggle_all_folders(show) { + let mode = "all"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Check the unread folders mode. + */ +async function subtest_toggle_unread_folders(show) { + let mode = "unread"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + + // Mode is hierarchical, parent folders are shown. + assert_folder_visible(inboxFolder.server.rootFolder); + assert_folder_visible(inboxFolder); + assert_folder_visible(unreadFolder); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Check the favorite folders mode. + */ +async function subtest_toggle_favorite_folders(show) { + let mode = "favorite"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + + // Mode is hierarchical, parent folders are shown. + assert_folder_visible(inboxFolder.server.rootFolder); + assert_folder_visible(inboxFolder); + assert_folder_visible(favoriteFolder); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Check the recent folders mode. + */ +async function subtest_toggle_recent_folders(show) { + let mode = "recent"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Check the smart folders mode. + */ +async function subtest_toggle_smart_folders(show) { + let mode = "smart"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Toggle the compact mode. + */ +async function subtest_toggle_compact(compact) { + let mode = "compact"; + select_mode_in_menu(mode); + + if (compact) { + await assert_mode_selected(mode); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Toggle the compact mode. + */ +async function subtest_toggle_tags(show) { + let mode = "tags"; + select_mode_in_menu(mode); + + if (show) { + await assert_mode_selected(mode); + } else { + await assert_mode_not_selected(mode); + } +} + +/** + * Check that the current mode(s) are accurately recorded in telemetry. + * Note that `reportUIConfiguration` usually only runs at start-up. + */ +function check_scalars(expected) { + MailTelemetryForTests.reportUIConfiguration(); + let scalarName = "tb.ui.configuration.folder_tree_modes"; + let scalars = TelemetryTestUtils.getProcessScalars("parent"); + if (expected) { + TelemetryTestUtils.assertScalar(scalars, scalarName, expected); + } else { + TelemetryTestUtils.assertScalarUnset(scalars, scalarName); + } +} + +/** + * Toggle folder modes through different means and sequences. + */ +add_task(async function test_toggling_modes() { + check_scalars(); + + await subtest_toggle_all_folders(true); + await subtest_toggle_smart_folders(true); + check_scalars("all,smart"); + + await subtest_toggle_tags(true); + check_scalars("all,smart,tags"); + + await subtest_toggle_unread_folders(true); + await subtest_toggle_favorite_folders(true); + await subtest_toggle_recent_folders(true); + check_scalars("all,smart,tags,unread,favorite,recent"); + + await subtest_toggle_compact(true); + check_scalars("all,smart,tags,unread,favorite,recent (compact)"); + + await subtest_toggle_unread_folders(false); + check_scalars("all,smart,tags,favorite,recent (compact)"); + + await subtest_toggle_compact(false); + check_scalars("all,smart,tags,favorite,recent"); + + await subtest_toggle_favorite_folders(false); + check_scalars("all,smart,tags,recent"); + + await subtest_toggle_all_folders(false); + await subtest_toggle_recent_folders(false); + await subtest_toggle_smart_folders(false); + await subtest_toggle_tags(false); + + // Confirm that the all folders mode is visible even after all the modes have + // been deselected in order to ensure that the Folder Pane is never empty. + await assert_mode_selected("all"); + check_scalars("all"); +}); + +registerCleanupFunction(function () { + inboxFolder.propagateDelete(unreadFolder, true); + inboxFolder.propagateDelete(favoriteFolder, true); + toggle_main_menu(menu_state); +}); |