summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/folder-tree-modes/browser_modeSwitching.js
diff options
context:
space:
mode:
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.js338
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);
+});