summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js')
-rw-r--r--comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js383
1 files changed, 383 insertions, 0 deletions
diff --git a/comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js b/comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js
new file mode 100644
index 0000000000..50566c62c0
--- /dev/null
+++ b/comm/mail/test/browser/folder-display/browser_deletionFromVirtualFolders.js
@@ -0,0 +1,383 @@
+/* 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 that deleting messages works from a virtual folder.
+ */
+
+"use strict";
+
+var {
+ assert_messages_in_view,
+ assert_selected_and_displayed,
+ assert_tab_titled_from,
+ be_in_folder,
+ create_folder,
+ get_smart_folder_named,
+ inboxFolder,
+ make_message_sets_in_folders,
+ mc,
+ open_selected_message_in_new_tab,
+ open_selected_message_in_new_window,
+ press_delete,
+ select_click_row,
+ switch_tab,
+ wait_for_all_messages_to_load,
+ get_about_3pane,
+ get_about_message,
+ delete_messages,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+var {
+ plan_for_modal_dialog,
+ plan_for_window_close,
+ wait_for_modal_dialog,
+ wait_for_window_close,
+} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");
+
+var { MailViewConstants } = ChromeUtils.import(
+ "resource:///modules/MailViewManager.jsm"
+);
+
+const { storeState } = ChromeUtils.importESModule(
+ "resource:///modules/CustomizationState.mjs"
+);
+
+var baseFolder, folder, lastMessageFolder;
+
+var tabFolder, tabMessage, tabMessageBackground, curMessage, nextMessage;
+
+var setNormal;
+
+/**
+ * The message window controller.
+ */
+var msgc;
+
+add_setup(async function () {
+ // Make sure the whole test runs with an unthreaded view in all folders.
+ Services.prefs.setIntPref("mailnews.default_view_flags", 0);
+
+ baseFolder = await create_folder("DeletionFromVirtualFoldersA");
+ // For setTagged, we want exactly as many messages as we plan to delete, so
+ // that we can test that the message window and tabs close when they run out
+ // of things to display.
+ let [, setTagged] = await make_message_sets_in_folders(
+ [baseFolder],
+ [{ count: 4 }, { count: 4 }]
+ );
+ setTagged.addTag("$label1"); // Important, by default
+ // We depend on the count for this, too
+ [setNormal] = await make_message_sets_in_folders(
+ [inboxFolder],
+ [{ count: 4 }]
+ );
+
+ // Show the smart folders view.
+ get_about_3pane().folderPane.activeModes = ["all", "smart"];
+
+ // Add the view picker to the toolbar
+ storeState({
+ mail: ["view-picker"],
+ });
+ await BrowserTestUtils.waitForMutationCondition(
+ document.getElementById("unifiedToolbarContent"),
+ {
+ subtree: true,
+ childList: true,
+ },
+ () => document.querySelector("#unifiedToolbarContent .view-picker")
+ );
+
+ registerCleanupFunction(() => {
+ storeState({});
+ Services.prefs.clearUserPref("mailnews.default_view_flags");
+ get_about_3pane().folderPane.activeModes = ["all"];
+ });
+});
+
+// Check whether this message is displayed in the folder tab
+var VERIFY_FOLDER_TAB = 0x1;
+// Check whether this message is displayed in the foreground message tab
+var VERIFY_MESSAGE_TAB = 0x2;
+// Check whether this message is displayed in the background message tab
+var VERIFY_BACKGROUND_MESSAGE_TAB = 0x4;
+// Check whether this message is displayed in the message window
+var VERIFY_MESSAGE_WINDOW = 0x8;
+var VERIFY_ALL = 0xf;
+
+/**
+ * Verify that the message is displayed in the given tabs. The index is
+ * optional.
+ */
+async function _verify_message_is_displayed_in(aFlags, aMessage, aIndex) {
+ if (aFlags & VERIFY_FOLDER_TAB) {
+ await switch_tab(tabFolder);
+ assert_selected_and_displayed(aMessage);
+ if (aIndex !== undefined) {
+ assert_selected_and_displayed(aIndex);
+ }
+ }
+ if (aFlags & VERIFY_MESSAGE_TAB) {
+ // Verify the title first
+ assert_tab_titled_from(tabMessage, aMessage);
+ await switch_tab(tabMessage);
+ // Verify the title again, just in case
+ assert_tab_titled_from(tabMessage, aMessage);
+ assert_selected_and_displayed(aMessage);
+ if (aIndex !== undefined) {
+ assert_selected_and_displayed(aIndex);
+ }
+ }
+ if (aFlags & VERIFY_BACKGROUND_MESSAGE_TAB) {
+ // Only verify the title
+ assert_tab_titled_from(tabMessageBackground, aMessage);
+ }
+ if (aFlags & VERIFY_MESSAGE_WINDOW) {
+ assert_selected_and_displayed(msgc, aMessage);
+ if (aIndex !== undefined) {
+ assert_selected_and_displayed(msgc, aIndex);
+ }
+ }
+}
+
+add_task(async function test_create_virtual_folders() {
+ await be_in_folder(baseFolder);
+
+ // Apply the mail view
+ mc.window.RefreshAllViewPopups(
+ mc.window.document.getElementById("toolbarViewPickerPopup")
+ );
+ mc.window.ViewChange(":$label1");
+ wait_for_all_messages_to_load();
+
+ // - save it
+ plan_for_modal_dialog(
+ "mailnews:virtualFolderProperties",
+ subtest_save_mail_view
+ );
+ // we have to use value here because the option mechanism is not sophisticated
+ // enough.
+ mc.window.ViewChange(MailViewConstants.kViewItemVirtual);
+ wait_for_modal_dialog("mailnews:virtualFolderProperties");
+});
+
+function subtest_save_mail_view(savc) {
+ savc.window.document.querySelector("dialog").acceptDialog();
+}
+
+async function _open_first_message() {
+ // Enter the folder and open a message
+ tabFolder = await be_in_folder(folder);
+ curMessage = select_click_row(0);
+ assert_selected_and_displayed(curMessage);
+
+ // Open the tab with the message
+ tabMessage = await open_selected_message_in_new_tab();
+ assert_selected_and_displayed(curMessage);
+ assert_tab_titled_from(tabMessage, curMessage);
+
+ await switch_tab(tabFolder);
+
+ // Open another tab with the message, this time in the background
+ tabMessageBackground = await open_selected_message_in_new_tab(true);
+ assert_tab_titled_from(tabMessageBackground, curMessage);
+
+ // Open the window with the message
+ await switch_tab(tabFolder);
+ msgc = await open_selected_message_in_new_window();
+ assert_selected_and_displayed(msgc, curMessage);
+}
+
+add_task(async function test_open_first_message_in_virtual_folder() {
+ folder = baseFolder.getChildNamed(baseFolder.prettyName + "-Important");
+ if (!folder) {
+ throw new Error("DeletionFromVirtualFoldersA-Important was not created!");
+ }
+
+ await _open_first_message();
+});
+
+/**
+ * Perform a deletion from the folder tab, verify the others update correctly
+ * (advancing to the next message).
+ */
+add_task(async function test_delete_from_virtual_folder_in_folder_tab() {
+ const { gDBView } = get_about_3pane();
+ // - plan to end up on the guy who is currently at index 1
+ curMessage = gDBView.getMsgHdrAt(1);
+ // while we're at it, figure out who is at 2 for the next step
+ nextMessage = gDBView.getMsgHdrAt(2);
+ // - delete the message
+ press_delete();
+
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+});
+
+/**
+ * Perform a deletion from the message tab, verify the others update correctly
+ * (advancing to the next message).
+ */
+add_task(async function test_delete_from_virtual_folder_in_message_tab() {
+ await switch_tab(tabMessage);
+ // nextMessage is the guy we want to see once the delete completes.
+ press_delete();
+ curMessage = nextMessage;
+
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+
+ const { gDBView } = get_about_message();
+ // figure out the next guy...
+ nextMessage = gDBView.getMsgHdrAt(1);
+ if (!nextMessage) {
+ throw new Error("We ran out of messages early?");
+ }
+});
+
+/**
+ * Perform a deletion from the message window, verify the others update
+ * correctly (advancing to the next message).
+ */
+add_task(async function test_delete_from_virtual_folder_in_message_window() {
+ // - delete
+ press_delete(msgc);
+ curMessage = nextMessage;
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+});
+
+/**
+ * Delete the last message in that folder, which should close all message
+ * displays.
+ */
+add_task(
+ async function test_delete_last_message_from_virtual_folder_closes_message_displays() {
+ // - since we have both foreground and background message tabs, we don't need
+ // to open yet another tab to test
+
+ // - prep for the message window disappearing
+ plan_for_window_close(msgc);
+
+ // - let's arbitrarily perform the deletion on this message tab
+ await switch_tab(tabMessage);
+ press_delete();
+
+ // - the message window should have gone away...
+ // (this also helps ensure that the 3pane gets enough event loop time to do
+ // all that it needs to accomplish)
+ wait_for_window_close(msgc);
+ msgc = null;
+
+ // - and we should now be on the folder tab and there should be no other tabs
+ if (mc.window.document.getElementById("tabmail").tabInfo.length != 1) {
+ throw new Error("There should only be one tab left!");
+ }
+ // the below check is implied by the previous check if things are sane-ish
+ if (
+ mc.window.document.getElementById("tabmail").currentTabInfo != tabFolder
+ ) {
+ throw new Error("We should be on the folder tab!");
+ }
+ }
+);
+
+/**
+ * Open the first message in the smart inbox.
+ */
+add_task(async function test_open_first_message_in_smart_inbox() {
+ // Select the smart inbox
+ folder = get_smart_folder_named("Inbox");
+ await be_in_folder(folder);
+ assert_messages_in_view(setNormal);
+ // Open the first message
+ await _open_first_message();
+});
+
+/**
+ * Perform a deletion from the folder tab, verify the others update correctly
+ * (advancing to the next message).
+ */
+add_task(async function test_delete_from_smart_inbox_in_folder_tab() {
+ const { gDBView } = get_about_3pane();
+ // - plan to end up on the guy who is currently at index 1
+ curMessage = gDBView.getMsgHdrAt(1);
+ // while we're at it, figure out who is at 2 for the next step
+ nextMessage = gDBView.getMsgHdrAt(2);
+ // - delete the message
+ press_delete();
+
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+});
+
+/**
+ * Perform a deletion from the message tab, verify the others update correctly
+ * (advancing to the next message).
+ */
+add_task(async function test_delete_from_smart_inbox_in_message_tab() {
+ await switch_tab(tabMessage);
+ // nextMessage is the guy we want to see once the delete completes.
+ press_delete();
+ curMessage = nextMessage;
+
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+
+ const { gDBView } = get_about_message();
+ // figure out the next guy...
+ nextMessage = gDBView.getMsgHdrAt(1);
+ if (!nextMessage) {
+ throw new Error("We ran out of messages early?");
+ }
+});
+
+/**
+ * Perform a deletion from the message window, verify the others update
+ * correctly (advancing to the next message).
+ */
+add_task(async function test_delete_from_smart_inbox_in_message_window() {
+ // - delete
+ press_delete(msgc);
+ curMessage = nextMessage;
+ // - verify all displays
+ await _verify_message_is_displayed_in(VERIFY_ALL, curMessage, 0);
+});
+
+/**
+ * Delete the last message in that folder, which should close all message
+ * displays.
+ */
+add_task(
+ async function test_delete_last_message_from_smart_inbox_closes_message_displays() {
+ // - since we have both foreground and background message tabs, we don't need
+ // to open yet another tab to test
+
+ // - prep for the message window disappearing
+ plan_for_window_close(msgc);
+
+ // - let's arbitrarily perform the deletion on this message tab
+ await switch_tab(tabMessage);
+ press_delete();
+
+ // - the message window should have gone away...
+ // (this also helps ensure that the 3pane gets enough event loop time to do
+ // all that it needs to accomplish)
+ wait_for_window_close(msgc);
+ msgc = null;
+
+ // - and we should now be on the folder tab and there should be no other tabs
+ if (mc.window.document.getElementById("tabmail").tabInfo.length != 1) {
+ throw new Error("There should only be one tab left!");
+ }
+ // the below check is implied by the previous check if things are sane-ish
+ if (
+ mc.window.document.getElementById("tabmail").currentTabInfo != tabFolder
+ ) {
+ throw new Error("We should be on the folder tab!");
+ }
+ }
+);