summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/search-window/browser_searchWindow.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/mail/test/browser/search-window/browser_searchWindow.js')
-rw-r--r--comm/mail/test/browser/search-window/browser_searchWindow.js358
1 files changed, 358 insertions, 0 deletions
diff --git a/comm/mail/test/browser/search-window/browser_searchWindow.js b/comm/mail/test/browser/search-window/browser_searchWindow.js
new file mode 100644
index 0000000000..bf414bdf6f
--- /dev/null
+++ b/comm/mail/test/browser/search-window/browser_searchWindow.js
@@ -0,0 +1,358 @@
+/* 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/. */
+
+/*
+ * Tests:
+ * - https://bugzilla.mozilla.org/show_bug.cgi?id=474701#c96 first para
+ */
+
+"use strict";
+
+var {
+ assert_messages_in_view,
+ assert_number_of_tabs_open,
+ assert_selected_and_displayed,
+ assert_tab_mode_name,
+ assert_tab_titled_from,
+ be_in_folder,
+ close_message_window,
+ close_tab,
+ create_folder,
+ make_message_sets_in_folders,
+ mc,
+ open_selected_message,
+ open_selected_messages,
+ plan_for_message_display,
+ reset_open_message_behavior,
+ set_open_message_behavior,
+ switch_tab,
+ wait_for_all_messages_to_load,
+ wait_for_message_display_completion,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/FolderDisplayHelpers.jsm"
+);
+var {
+ assert_search_window_folder_displayed,
+ open_search_window,
+ assert_messages_in_search_view,
+ select_click_search_row,
+ select_shift_click_search_row,
+} = ChromeUtils.import(
+ "resource://testing-common/mozmill/SearchWindowHelpers.jsm"
+);
+var {
+ plan_for_modal_dialog,
+ async_plan_for_new_window,
+ plan_for_window_close,
+ wait_for_modal_dialog,
+ wait_for_window_close,
+} = ChromeUtils.import("resource://testing-common/mozmill/WindowHelpers.jsm");
+
+var folder, setFooBar;
+
+// Number of messages to open for multi-message tests
+var NUM_MESSAGES_TO_OPEN = 5;
+
+/**
+ * Create some messages that our constraint below will satisfy
+ */
+add_task(async function test_create_messages() {
+ folder = await create_folder("SearchWindowA");
+ [, , setFooBar] = await make_message_sets_in_folders(
+ [folder],
+ [{ subject: "foo" }, { subject: "bar" }, { subject: "foo bar" }]
+ );
+});
+
+/**
+ * The search window controller.
+ */
+var swc = null;
+
+/**
+ * Bring up the search window.
+ */
+add_task(async function test_show_search_window() {
+ // put us in the folder we care about so it defaults to that
+ await be_in_folder(folder);
+
+ swc = open_search_window();
+ assert_search_window_folder_displayed(swc, folder);
+});
+
+/**
+ * Set up the search.
+ */
+add_task(function test_enter_some_stuff() {
+ // - turn off search subfolders
+ // (we're not testing the UI, direct access is fine)
+ swc.window.document
+ .getElementById("checkSearchSubFolders")
+ .removeAttribute("checked");
+
+ // - put "foo" in the subject contains box
+ // Each filter criterion is a listitem in the listbox with id=searchTermList.
+ // Each filter criterion has id "searchRowN", and the textbox has id
+ // "searchValN" exposing the value on attribute "value".
+ // XXX I am having real difficulty getting the click/type pair to actually
+ // get the text in there reliably. I am just going to poke things directly
+ // into the text widget. (We used to use .aid instead of .a with swc.click
+ // and swc.type.)
+ let searchVal0 = swc.window.document.getElementById("searchVal0");
+ let index = 0;
+
+ if (searchVal0.hasAttribute("selectedIndex")) {
+ index = parseInt(searchVal0.getAttribute("selectedIndex"));
+ }
+
+ searchVal0 = searchVal0.children[index];
+ searchVal0.value = "foo";
+
+ // - add another subject box
+ let plusButton = swc.window.document.querySelector(
+ "#searchRow0 button[label='+']"
+ );
+ EventUtils.synthesizeMouseAtCenter(plusButton, {}, plusButton.ownerGlobal);
+
+ // - put "bar" in it
+ let searchVal1 = swc.window.document.getElementById("searchVal1");
+ index = 0;
+
+ if (searchVal1.hasAttribute("selectedIndex")) {
+ index = parseInt(searchVal1.getAttribute("selectedIndex"));
+ }
+
+ searchVal1 = searchVal1.children[index];
+ searchVal1.value = "bar";
+});
+
+/**
+ * Trigger the search, make sure the right results show up.
+ */
+add_task(function test_go_search() {
+ // - Trigger the search
+ // The "Search" button has id "search-button"
+ EventUtils.synthesizeMouseAtCenter(
+ swc.window.document.getElementById("search-button"),
+ {},
+ swc.window.document.getElementById("search-button").ownerGlobal
+ );
+ wait_for_all_messages_to_load(swc);
+
+ // - Verify we got the right messages
+ assert_messages_in_search_view(setFooBar, swc);
+
+ // - Click the "Save as Search Folder" button, id "saveAsVFButton"
+ // This will create a virtual folder properties dialog...
+ // (label: "New Saved Search Folder", source: virtualFolderProperties.xhtml
+ // no windowtype, id: "virtualFolderPropertiesDialog")
+ plan_for_modal_dialog(
+ "mailnews:virtualFolderProperties",
+ subtest_save_search
+ );
+ EventUtils.synthesizeMouseAtCenter(
+ swc.window.document.getElementById("saveAsVFButton"),
+ {},
+ swc.window.document.getElementById("saveAsVFButton").ownerGlobal
+ );
+ wait_for_modal_dialog("mailnews:virtualFolderProperties");
+});
+
+/**
+ * Test opening a single search result in a new tab.
+ */
+add_task(async function test_open_single_search_result_in_tab() {
+ swc.window.focus();
+ set_open_message_behavior("NEW_TAB");
+ let folderTab = mc.window.document.getElementById("tabmail").currentTabInfo;
+ let preCount =
+ mc.window.document.getElementById("tabmail").tabContainer.allTabs.length;
+
+ // Select one message
+ swc.window.document.getElementById("threadTree").focus();
+ let msgHdr = select_click_search_row(1, swc);
+ // Open the selected message
+ open_selected_message(swc);
+ // This is going to trigger a message display in the main 3pane window
+ wait_for_message_display_completion(mc);
+ // Check that the tab count has increased by 1
+ assert_number_of_tabs_open(preCount + 1);
+ // Check that the currently displayed tab is a message tab (i.e. our newly
+ // opened tab is in the foreground)
+ assert_tab_mode_name(null, "mailMessageTab");
+ // Check that the message header displayed is the right one
+ assert_selected_and_displayed(msgHdr);
+ // Clean up, close the tab
+ close_tab(mc.window.document.getElementById("tabmail").currentTabInfo);
+ await switch_tab(folderTab);
+ reset_open_message_behavior();
+});
+
+/**
+ * Test opening multiple search results in new tabs.
+ */
+add_task(async function test_open_multiple_search_results_in_new_tabs() {
+ swc.window.focus();
+ set_open_message_behavior("NEW_TAB");
+ let folderTab = mc.window.document.getElementById("tabmail").currentTabInfo;
+ let preCount =
+ mc.window.document.getElementById("tabmail").tabContainer.allTabs.length;
+
+ // Select a bunch of messages
+ swc.window.document.getElementById("threadTree").focus();
+ select_click_search_row(1, swc);
+ let selectedMessages = select_shift_click_search_row(
+ NUM_MESSAGES_TO_OPEN,
+ swc
+ );
+ // Open them
+ open_selected_messages(swc);
+ // This is going to trigger a message display in the main 3pane window
+ wait_for_message_display_completion(mc, true);
+ // Check that the tab count has increased by the correct number
+ assert_number_of_tabs_open(preCount + NUM_MESSAGES_TO_OPEN);
+ // Check that the currently displayed tab is a message tab (i.e. one of our
+ // newly opened tabs is in the foreground)
+ assert_tab_mode_name(null, "mailMessageTab");
+
+ // Now check whether each of the NUM_MESSAGES_TO_OPEN tabs has the correct
+ // title
+ for (let i = 0; i < NUM_MESSAGES_TO_OPEN; i++) {
+ assert_tab_titled_from(
+ mc.window.document.getElementById("tabmail").tabInfo[preCount + i],
+ selectedMessages[i]
+ );
+ }
+
+ // Check whether each tab has the correct message, then close it to load the
+ // previous tab.
+ for (let i = 0; i < NUM_MESSAGES_TO_OPEN; i++) {
+ assert_selected_and_displayed(selectedMessages.pop());
+ close_tab(mc.window.document.getElementById("tabmail").currentTabInfo);
+ }
+ await switch_tab(folderTab);
+ reset_open_message_behavior();
+});
+
+/**
+ * Test opening a search result in a new window.
+ */
+add_task(async function test_open_search_result_in_new_window() {
+ swc.window.focus();
+ set_open_message_behavior("NEW_WINDOW");
+
+ // Select a message
+ swc.window.document.getElementById("threadTree").focus();
+ let msgHdr = select_click_search_row(1, swc);
+
+ let newWindowPromise = async_plan_for_new_window("mail:messageWindow");
+ // Open it
+ open_selected_message(swc);
+ let msgc = await newWindowPromise;
+ wait_for_message_display_completion(msgc, true);
+
+ assert_selected_and_displayed(msgc, msgHdr);
+ // Clean up, close the window
+ close_message_window(msgc);
+ reset_open_message_behavior();
+});
+
+/**
+ * Test reusing an existing window to open another search result.
+ */
+add_task(async function test_open_search_result_in_existing_window() {
+ swc.window.focus();
+ set_open_message_behavior("EXISTING_WINDOW");
+
+ // Open up a window
+ swc.window.document.getElementById("threadTree").focus();
+ select_click_search_row(1, swc);
+ let newWindowPromise = async_plan_for_new_window("mail:messageWindow");
+ open_selected_message(swc);
+ let msgc = await newWindowPromise;
+ wait_for_message_display_completion(msgc, true);
+
+ // Select another message and open it
+ let msgHdr = select_click_search_row(2, swc);
+ plan_for_message_display(msgc);
+ open_selected_message(swc);
+ wait_for_message_display_completion(msgc, true);
+
+ // Check if our old window displays the message
+ assert_selected_and_displayed(msgc, msgHdr);
+ // Clean up, close the window
+ close_message_window(msgc);
+ reset_open_message_behavior();
+});
+
+/**
+ * Save the search, making sure the constraints propagated.
+ */
+function subtest_save_search(savc) {
+ // - make sure our constraint propagated
+ // The query constraints are displayed using the same widgets (and code) that
+ // we used to enter them, so it's very similar to check.
+ let searchVal0 = swc.window.document.getElementById("searchVal0");
+ let index = 0;
+
+ if (searchVal0.hasAttribute("selectedIndex")) {
+ index = parseInt(searchVal0.getAttribute("selectedIndex"));
+ }
+
+ searchVal0 = searchVal0.children[index];
+
+ Assert.ok(searchVal0);
+ Assert.equal(searchVal0.value, "foo");
+
+ let searchVal1 = swc.window.document.getElementById("searchVal1");
+ index = 0;
+
+ if (searchVal1.hasAttribute("selectedIndex")) {
+ index = parseInt(searchVal1.getAttribute("selectedIndex"));
+ }
+
+ searchVal1 = searchVal1.children[index];
+
+ Assert.ok(searchVal1);
+ Assert.equal(searchVal1.value, "bar");
+
+ // - name the search
+ savc.window.document.getElementById("name").focus();
+ EventUtils.sendString("SearchSaved", savc.window);
+
+ // - save it!
+ // this will close the dialog, which wait_for_modal_dialog is making sure
+ // happens.
+ savc.window.document.querySelector("dialog").acceptDialog();
+}
+
+add_task(function test_close_search_window() {
+ swc.window.focus();
+ // now close the search window
+ plan_for_window_close(swc);
+ EventUtils.synthesizeKey("VK_ESCAPE", {}, swc.window);
+ wait_for_window_close(swc);
+ swc = null;
+});
+
+/**
+ * Make sure the folder showed up with the right name, and that displaying it
+ * has the right contents.
+ */
+add_task(async function test_verify_saved_search() {
+ let savedFolder = folder.getChildNamed("SearchSaved");
+ if (savedFolder == null) {
+ throw new Error("Saved folder did not show up.");
+ }
+
+ await be_in_folder(savedFolder);
+ assert_messages_in_view(setFooBar);
+
+ Assert.report(
+ false,
+ undefined,
+ undefined,
+ "Test ran to completion successfully"
+ );
+});