summaryrefslogtreecommitdiffstats
path: root/comm/mail/test/browser/search-window/browser_searchWindow.js
blob: bf414bdf6f85b22a1dc5b8d66a8c0599160564e8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
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"
  );
});