OLD | NEW |
| (Empty) |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <mshtmcid.h> | |
6 #include <string> | |
7 | |
8 #include "base/file_util.h" | |
9 #include "base/strings/utf_string_conversions.h" | |
10 #include "base/test/test_file_util.h" | |
11 #include "base/win/scoped_bstr.h" | |
12 #include "base/win/scoped_variant.h" | |
13 #include "base/win/windows_version.h" | |
14 #include "chrome/common/url_constants.h" | |
15 #include "chrome_frame/test/chrome_frame_test_utils.h" | |
16 #include "chrome_frame/test/chrome_frame_ui_test_utils.h" | |
17 #include "chrome_frame/test/mock_ie_event_sink_actions.h" | |
18 #include "chrome_frame/test/mock_ie_event_sink_test.h" | |
19 #include "chrome_frame/test/simulate_input.h" | |
20 | |
21 #include "testing/gmock_mutant.h" | |
22 | |
23 using testing::_; | |
24 using testing::InSequence; | |
25 using testing::StrCaseEq; | |
26 using testing::StrEq; | |
27 | |
28 namespace chrome_frame_test { | |
29 | |
30 // This parameterized test fixture uses the MockIEEventSink and is used by | |
31 // UI-related tests. | |
32 class FullTabUITest : public MockIEEventSinkTest, | |
33 public testing::TestWithParam<CFInvocation> { | |
34 public: | |
35 FullTabUITest() {} | |
36 | |
37 virtual void SetUp() { | |
38 ResetKeyState(); | |
39 | |
40 // These are UI-related tests, so we do not care about the exact requests | |
41 // and navigations that occur. | |
42 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
43 ie_mock_.ExpectAnyNavigations(); | |
44 } | |
45 | |
46 virtual void TearDown() { | |
47 ResetKeyState(); | |
48 } | |
49 | |
50 void ResetKeyState() { | |
51 // Call this to reset the state of any current keyboard modifiers, as it has | |
52 // been observed that these tests can leave the desktop in an invalid state | |
53 // (e.g. thinking that the Ctrl key is held down). Send F23 as that is | |
54 // particularly unlikely to be used by any real application. | |
55 simulate_input::SendMnemonic( | |
56 VK_F23, | |
57 simulate_input::CONTROL | simulate_input::SHIFT | simulate_input::ALT, | |
58 false, | |
59 false, | |
60 simulate_input::KEY_UP); | |
61 } | |
62 }; | |
63 | |
64 // Instantiate each test case for the IE case and for CF meta tag case. | |
65 // It does not seem too useful to also run the CF http header case since these | |
66 // are UI, not navigation tests. | |
67 INSTANTIATE_TEST_CASE_P(IE, FullTabUITest, | |
68 testing::Values(CFInvocation::None())); | |
69 INSTANTIATE_TEST_CASE_P(CF, FullTabUITest, | |
70 testing::Values(CFInvocation::MetaTag())); | |
71 | |
72 // Tests keyboard input. | |
73 TEST_P(FullTabUITest, KeyboardInput) { | |
74 if (!GetParam().invokes_cf()) { | |
75 LOG(ERROR) << "Test not implemented for this configuration."; | |
76 return; | |
77 } | |
78 std::wstring key_event_url = GetTestUrl(L"keyevent.html"); | |
79 | |
80 static const char input[] = "chrome"; | |
81 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(key_event_url))) | |
82 .WillOnce(PostKeyMessagesToRenderer(&ie_mock_, input)); | |
83 | |
84 EXPECT_CALL(ie_mock_, OnMessage(StrCaseEq(base::UTF8ToWide(input)), _, _)) | |
85 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
86 | |
87 LaunchIEAndNavigate(key_event_url); | |
88 } | |
89 | |
90 // Tests keyboard shortcuts for back and forward. | |
91 // http://code.google.com/p/chromium/issues/detail?id=114058 | |
92 TEST_P(FullTabUITest, DISABLED_KeyboardBackForward) { | |
93 if (IsWorkstationLocked()) { | |
94 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
95 return; | |
96 } | |
97 | |
98 std::wstring page1 = GetSimplePageUrl(); | |
99 std::wstring page2 = GetLinkPageUrl(); | |
100 bool in_cf = GetParam().invokes_cf(); | |
101 InSequence expect_in_sequence_for_scope; | |
102 | |
103 // This test performs the following steps. | |
104 // 1. Launches IE and navigates to page1 | |
105 // 2. It then navigates to page2 | |
106 // 3. Sends the VK_BACK keystroke to IE, which should navigate back to | |
107 // page 1 | |
108 // 4. Sends the Shift + VK_BACK keystroke to IE which should navigate | |
109 // forward to page2 | |
110 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1))) | |
111 .WillOnce(Navigate(&ie_mock_, page2)); | |
112 | |
113 short bkspace = VkKeyScanA(VK_BACK); // NOLINT | |
114 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2))) | |
115 .WillOnce(testing::DoAll( | |
116 SetFocusToRenderer(&ie_mock_), | |
117 DelaySendScanCode(&loop_, | |
118 base::TimeDelta::FromSeconds(1), | |
119 bkspace, | |
120 simulate_input::NONE))); | |
121 | |
122 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1))) | |
123 .WillOnce(testing::DoAll( | |
124 SetFocusToRenderer(&ie_mock_), | |
125 DelaySendScanCode(&loop_, | |
126 base::TimeDelta::FromSeconds(1), | |
127 bkspace, | |
128 simulate_input::SHIFT))); | |
129 | |
130 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2))) | |
131 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
132 | |
133 LaunchIENavigateAndLoop(page1, kChromeFrameVeryLongNavigationTimeout); | |
134 } | |
135 | |
136 // Tests new window behavior with ctrl+N. | |
137 TEST_P(FullTabUITest, CtrlN) { | |
138 if (IsWorkstationLocked()) { | |
139 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
140 return; | |
141 } | |
142 | |
143 bool is_cf = GetParam().invokes_cf(); | |
144 if (!is_cf) { | |
145 LOG(ERROR) << "Test not implemented for this configuration."; | |
146 return; | |
147 } | |
148 // Ideally we want to use a ie_mock_ to watch for finer grained | |
149 // events for New Window, but for Crl+N we don't get any | |
150 // OnNewWindowX notifications. :( | |
151 MockWindowObserver win_observer_mock; | |
152 | |
153 const char* kNewWindowTitlePattern = "*Internet Explorer*"; | |
154 EXPECT_CALL(ie_mock_, OnLoad(is_cf, StrEq(GetSimplePageUrl()))) | |
155 .WillOnce(testing::DoAll( | |
156 WatchWindow(&win_observer_mock, kNewWindowTitlePattern, ""), | |
157 SetFocusToRenderer(&ie_mock_), | |
158 DelaySendChar(&loop_, | |
159 base::TimeDelta::FromSeconds(1), | |
160 'n', | |
161 simulate_input::CONTROL))); | |
162 | |
163 // Watch for new window. It appears that the window close message cannot be | |
164 // reliably delivered immediately upon receipt of the window open event. | |
165 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
166 .Times(testing::AtMost(2)) | |
167 .WillOnce(CloseBrowserMock(&ie_mock_)) | |
168 .WillOnce(testing::Return()); | |
169 | |
170 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
171 .Times(testing::AtMost(2)); | |
172 | |
173 LaunchIENavigateAndLoop(GetSimplePageUrl(), | |
174 kChromeFrameVeryLongNavigationTimeout); | |
175 } | |
176 | |
177 // Test that Ctrl+F opens the Find dialog. | |
178 TEST_P(FullTabUITest, CtrlF) { | |
179 if (IsWorkstationLocked()) { | |
180 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
181 return; | |
182 } | |
183 | |
184 bool is_cf = GetParam().invokes_cf(); | |
185 if (!is_cf) { | |
186 LOG(ERROR) << "Test not implemented for this configuration."; | |
187 return; | |
188 } | |
189 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
190 MockWindowObserver win_observer_mock; | |
191 InSequence expect_in_sequence_for_scope; | |
192 | |
193 const char* kFindDialogCaption = "Find"; | |
194 EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(GetSimplePageUrl()))) | |
195 .WillOnce(testing::DoAll( | |
196 WatchWindow(&win_observer_mock, kFindDialogCaption, ""), | |
197 SetFocusToRenderer(&ie_mock_), | |
198 DelaySendChar(&loop_, | |
199 base::TimeDelta::FromMilliseconds(1500), | |
200 'f', | |
201 simulate_input::CONTROL))); | |
202 | |
203 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
204 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
205 | |
206 LaunchIENavigateAndLoop(GetSimplePageUrl(), | |
207 kChromeFrameVeryLongNavigationTimeout); | |
208 } | |
209 | |
210 // Test that ctrl+r does cause a refresh. | |
211 TEST_P(FullTabUITest, CtrlR) { | |
212 if (IsWorkstationLocked()) { | |
213 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
214 return; | |
215 } | |
216 | |
217 EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetSimplePageUrl()), _)) | |
218 .Times(testing::AtMost(2)) | |
219 .WillRepeatedly(SendResponse(&server_mock_, GetParam())); | |
220 | |
221 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), | |
222 StrEq(GetSimplePageUrl()))) | |
223 .Times(testing::AtMost(2)) | |
224 .WillOnce(testing::DoAll( | |
225 SetFocusToRenderer(&ie_mock_), | |
226 DelaySendChar(&loop_, | |
227 base::TimeDelta::FromSeconds(1), | |
228 'r', | |
229 simulate_input::CONTROL), | |
230 DelayCloseBrowserMock( | |
231 &loop_, base::TimeDelta::FromSeconds(4), &ie_mock_))) | |
232 .WillRepeatedly(testing::Return()); | |
233 | |
234 LaunchIENavigateAndLoop(GetSimplePageUrl(), | |
235 kChromeFrameVeryLongNavigationTimeout); | |
236 } | |
237 | |
238 // Test window close with ctrl+w. | |
239 TEST_P(FullTabUITest, CtrlW) { | |
240 if (IsWorkstationLocked()) { | |
241 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
242 return; | |
243 } | |
244 | |
245 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), | |
246 StrEq(GetSimplePageUrl()))) | |
247 .WillOnce(testing::DoAll( | |
248 SetFocusToRenderer(&ie_mock_), | |
249 DelaySendChar(&loop_, | |
250 base::TimeDelta::FromSeconds(1), | |
251 'w', | |
252 simulate_input::CONTROL))); | |
253 | |
254 LaunchIENavigateAndLoop(GetSimplePageUrl(), | |
255 kChromeFrameVeryLongNavigationTimeout); | |
256 } | |
257 | |
258 // Test address bar navigation with Alt+d and URL. | |
259 // Flaky due to TypeUrlInAddressBar; see http://crbug.com/124244. | |
260 TEST_P(FullTabUITest, DISABLED_AltD) { | |
261 if (IsWorkstationLocked()) { | |
262 LOG(ERROR) << "This test cannot be run in a locked workstation."; | |
263 return; | |
264 } | |
265 | |
266 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), | |
267 StrEq(GetSimplePageUrl()))) | |
268 .WillOnce(testing::DoAll( | |
269 SetFocusToRenderer(&ie_mock_), | |
270 TypeUrlInAddressBar(&loop_, | |
271 GetLinkPageUrl(), | |
272 base::TimeDelta::FromMilliseconds(1500)))); | |
273 | |
274 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), | |
275 StrEq(GetLinkPageUrl()))) | |
276 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
277 | |
278 LaunchIENavigateAndLoop(GetSimplePageUrl(), | |
279 kChromeFrameVeryLongNavigationTimeout); | |
280 } | |
281 | |
282 // Tests that the renderer has focus after navigation. | |
283 // Flaky, see http://crbug.com/90791 . | |
284 TEST_P(FullTabUITest, DISABLED_RendererHasFocus) { | |
285 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), | |
286 StrEq(GetSimplePageUrl()))) | |
287 .WillOnce(testing::DoAll( | |
288 ExpectRendererHasFocus(&ie_mock_), | |
289 CloseBrowserMock(&ie_mock_))); | |
290 | |
291 LaunchIEAndNavigate(GetSimplePageUrl()); | |
292 } | |
293 | |
294 // Tests that view source works. | |
295 TEST_P(FullTabUITest, ViewSource) { | |
296 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
297 // for more information on why this test is disabled for Vista with IE7. | |
298 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
299 GetInstalledIEVersion() == IE_7) { | |
300 LOG(INFO) << "Not running test on Vista with IE7"; | |
301 return; | |
302 } | |
303 | |
304 bool in_cf = GetParam().invokes_cf(); | |
305 if (!in_cf) { | |
306 LOG(ERROR) << "Test not implemented for this configuration."; | |
307 return; | |
308 } | |
309 MockIEEventSink view_source_mock; | |
310 view_source_mock.ExpectAnyNavigations(); | |
311 InSequence expect_in_sequence_for_scope; | |
312 | |
313 // After navigation invoke view soruce action using IWebBrowser2::ExecWB | |
314 VARIANT empty = base::win::ScopedVariant::kEmptyVariant; | |
315 EXPECT_CALL(ie_mock_, OnLoad(in_cf, | |
316 StrEq(GetSimplePageUrl()))) | |
317 .WillOnce(DelayExecCommand( | |
318 &ie_mock_, &loop_, base::TimeDelta(), &CGID_MSHTML, | |
319 static_cast<OLECMDID>(IDM_VIEWSOURCE), | |
320 OLECMDEXECOPT_DONTPROMPTUSER, &empty, &empty)); | |
321 | |
322 // Expect notification for view-source window, handle new window event | |
323 // and attach a new ie_mock_ to the received web browser | |
324 std::wstring view_source_url; | |
325 view_source_url += base::UTF8ToWide(content::kViewSourceScheme); | |
326 view_source_url += L":"; | |
327 view_source_url += GetSimplePageUrl(); | |
328 std::wstring url_in_new_window = kChromeProtocolPrefix; | |
329 url_in_new_window += view_source_url; | |
330 | |
331 ie_mock_.ExpectNewWindow(&view_source_mock); | |
332 // For some reason this happens occasionally at least on XP IE7. | |
333 EXPECT_CALL(view_source_mock, OnLoad(IN_IE, StrEq(url_in_new_window))) | |
334 .Times(testing::AtMost(1)); | |
335 EXPECT_CALL(view_source_mock, OnLoad(in_cf, StrEq(view_source_url))) | |
336 .WillOnce(testing::DoAll( | |
337 VerifyAddressBarUrlWithGcf(&view_source_mock), | |
338 CloseBrowserMock(&view_source_mock))); | |
339 | |
340 EXPECT_CALL(view_source_mock, OnQuit()) | |
341 .Times(testing::AtMost(1)) | |
342 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
343 | |
344 LaunchIEAndNavigate(GetSimplePageUrl()); | |
345 } | |
346 | |
347 void NavigateToCurrentUrl(MockIEEventSink* mock) { | |
348 IWebBrowser2* browser = mock->event_sink()->web_browser2(); | |
349 DCHECK(browser); | |
350 base::win::ScopedBstr bstr; | |
351 HRESULT hr = browser->get_LocationURL(bstr.Receive()); | |
352 EXPECT_HRESULT_SUCCEEDED(hr); | |
353 if (SUCCEEDED(hr)) { | |
354 DCHECK(bstr.Length()); | |
355 VARIANT empty = base::win::ScopedVariant::kEmptyVariant; | |
356 hr = browser->Navigate(bstr, &empty, &empty, &empty, &empty); | |
357 EXPECT_HRESULT_SUCCEEDED(hr); | |
358 } | |
359 } | |
360 | |
361 // Tests that Chrome gets re-instantiated after crash if we reload via | |
362 // the address bar or via a new navigation. | |
363 // Flaky on ie7, http://crbug.com/277406. | |
364 TEST_P(FullTabUITest, DISABLED_TabCrashReload) { | |
365 using testing::DoAll; | |
366 | |
367 if (!GetParam().invokes_cf()) { | |
368 LOG(ERROR) << "Test needs CF."; | |
369 return; | |
370 } | |
371 | |
372 MockPropertyNotifySinkListener prop_listener; | |
373 InSequence expect_in_sequence_for_scope; | |
374 | |
375 EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl()))) | |
376 .WillOnce(DoAll( | |
377 ExpectRendererHasFocus(&ie_mock_), | |
378 ExpectDocumentReadystate(&ie_mock_, READYSTATE_COMPLETE), | |
379 ConnectDocPropNotifySink(&ie_mock_, &prop_listener), | |
380 KillChromeFrameProcesses())); | |
381 | |
382 EXPECT_CALL(prop_listener, OnChanged(DISPID_READYSTATE)) | |
383 .WillOnce(DoAll( | |
384 ExpectDocumentReadystate(&ie_mock_, READYSTATE_UNINITIALIZED), | |
385 DelayNavigateToCurrentUrl( | |
386 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(10)))); | |
387 | |
388 EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl()))) | |
389 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
390 | |
391 LaunchIEAndNavigate(GetSimplePageUrl()); | |
392 } | |
393 | |
394 // Tests if Chrome gets restarted after a crash by just refreshing the document. | |
395 // DISABLED as per bug http://crbug.com/99317 (one of the failures is a | |
396 // timeout, which marking as FLAKY or FAILS won't mask). | |
397 TEST_P(FullTabUITest, DISABLED_TabCrashRefresh) { | |
398 using testing::DoAll; | |
399 | |
400 if (!GetParam().invokes_cf()) { | |
401 LOG(ERROR) << "Test needs CF."; | |
402 return; | |
403 } | |
404 | |
405 MockPropertyNotifySinkListener prop_listener; | |
406 InSequence expect_in_sequence_for_scope; | |
407 | |
408 EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl()))) | |
409 .WillOnce(DoAll( | |
410 ExpectRendererHasFocus(&ie_mock_), | |
411 ExpectDocumentReadystate(&ie_mock_, READYSTATE_COMPLETE), | |
412 ConnectDocPropNotifySink(&ie_mock_, &prop_listener), | |
413 KillChromeFrameProcesses())); | |
414 | |
415 VARIANT empty = base::win::ScopedVariant::kEmptyVariant; | |
416 EXPECT_CALL(prop_listener, OnChanged(/*DISPID_READYSTATE*/_)) | |
417 .WillOnce(DoAll( | |
418 DisconnectDocPropNotifySink(&prop_listener), | |
419 ExpectDocumentReadystate(&ie_mock_, READYSTATE_UNINITIALIZED), | |
420 DelayExecCommand( | |
421 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(10), | |
422 static_cast<GUID*>(NULL), OLECMDID_REFRESH, 0, &empty, &empty))); | |
423 | |
424 EXPECT_CALL(ie_mock_, OnLoad(_, StrEq(GetSimplePageUrl()))) | |
425 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
426 | |
427 LaunchIEAndNavigate(GetSimplePageUrl()); | |
428 } | |
429 | |
430 // Test that window.print() on a page results in the native Windows print dialog | |
431 // appearing rather than Chrome's in-page print preview. | |
432 TEST_P(FullTabUITest, WindowPrintOpensNativePrintDialog) { | |
433 std::wstring window_print_url(GetTestUrl(L"window_print.html")); | |
434 std::wstring window_print_title(L"window.print"); | |
435 | |
436 const bool is_cf = GetParam().invokes_cf(); | |
437 MockWindowObserver win_observer_mock; | |
438 | |
439 // When the page is loaded, start watching for the Print dialog to appear. | |
440 EXPECT_CALL(ie_mock_, OnLoad(is_cf, StrEq(window_print_url))) | |
441 .WillOnce(WatchWindow(&win_observer_mock, "Print", "")); | |
442 | |
443 // When the print dialog opens, close it. | |
444 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
445 .WillOnce(DoCloseWindow()); | |
446 | |
447 // When the print dialog closes, close the browser. | |
448 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
449 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
450 | |
451 // Launch IE and navigate to the window_print.html page, which will | |
452 // window.print() immediately after loading. | |
453 LaunchIEAndNavigate(window_print_url); | |
454 } | |
455 | |
456 // Test fixture for tests related to the context menu UI. Since the context | |
457 // menus for CF and IE are different, these tests are not parameterized. | |
458 class ContextMenuTest : public MockIEEventSinkTest, public testing::Test { | |
459 public: | |
460 ContextMenuTest(): kTextFieldInitValue(L"SomeInitializedTextValue") {} | |
461 | |
462 virtual void SetUp() { | |
463 context_menu_page_url = GetTestUrl(L"context_menu.html"); | |
464 context_menu_page_title = L"context menu"; | |
465 // Clear clipboard to make sure there is no effect from previous tests. | |
466 SetClipboardText(L""); | |
467 // These are UI-related tests, so we do not care about the exact | |
468 // navigations that occur. | |
469 ie_mock_.ExpectAnyNavigations(); | |
470 EXPECT_CALL(ie_mock_, OnLoad(_, _)).Times(testing::AnyNumber()); | |
471 EXPECT_CALL(acc_observer_, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
472 } | |
473 | |
474 virtual void TearDown() { | |
475 // Destroy the clipboard here because it is not destroyed automatically. | |
476 DestroyClipboard(); | |
477 } | |
478 | |
479 // Common helper function for "Save xxx As" tests. | |
480 void DoSaveAsTest(const wchar_t* role, const wchar_t* menu_item_name, | |
481 const wchar_t* file_ext) { | |
482 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
483 MockWindowObserver win_observer_mock; | |
484 InSequence expect_in_sequence_for_scope; | |
485 | |
486 // Open 'Save As' dialog. | |
487 base::string16 initial_url(GetTestUrl(L"save_as_context_menu.html")); | |
488 const char* kSaveDlgCaption = "Save As"; | |
489 EXPECT_CALL(acc_observer_, | |
490 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
491 L"Save As download test"))) | |
492 .WillOnce(testing::DoAll( | |
493 WatchWindow(&win_observer_mock, kSaveDlgCaption, ""), | |
494 AccRightClick(AccObjectMatcher(L"", role)))); | |
495 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
496 .WillOnce(AccLeftClick(AccObjectMatcher(menu_item_name))); | |
497 | |
498 // Get safe download name using temporary file. | |
499 base::FilePath temp_file_path; | |
500 ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path)); | |
501 ASSERT_TRUE(file_util::DieFileDie(temp_file_path, false)); | |
502 temp_file_path = temp_file_path.ReplaceExtension(file_ext); | |
503 | |
504 AccObjectMatcher file_name_box(L"File name:", L"editable text"); | |
505 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
506 .WillOnce(testing::DoAll( | |
507 AccSendCharMessage(file_name_box, L'a'), | |
508 AccSetValue(file_name_box, temp_file_path.value()), | |
509 AccDoDefaultAction(AccObjectMatcher(L"Save", L"push button")))); | |
510 | |
511 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
512 .WillOnce(CloseWhenFileSaved(&ie_mock_, temp_file_path, 8000)); | |
513 | |
514 LaunchIENavigateAndLoop(initial_url, | |
515 kChromeFrameVeryLongNavigationTimeout); | |
516 ASSERT_TRUE(file_util::DieFileDie(temp_file_path, false)); | |
517 } | |
518 | |
519 protected: | |
520 // Html page that holds a text field for context menu testing. | |
521 std::wstring context_menu_page_url; | |
522 // Title of said html page. | |
523 std::wstring context_menu_page_title; | |
524 // This is the text value used to test cut/copy/paste etc. | |
525 const std::wstring kTextFieldInitValue; | |
526 | |
527 testing::NiceMock<MockAccEventObserver> acc_observer_; | |
528 }; | |
529 | |
530 // Test reloading from the context menu. | |
531 TEST_F(ContextMenuTest, CFReload) { | |
532 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
533 InSequence expect_in_sequence_for_scope; | |
534 | |
535 base::string16 initial_url(GetSimplePageUrl()); | |
536 EXPECT_CALL(acc_observer_, | |
537 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
538 GetSimplePageTitle()))) | |
539 .WillOnce(OpenContextMenuAsync()); | |
540 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
541 .WillOnce(AccLeftClick(AccObjectMatcher(L"Reload"))); | |
542 | |
543 EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(initial_url))) | |
544 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
545 | |
546 LaunchIEAndNavigate(initial_url); | |
547 } | |
548 | |
549 // Test view source from the context menu. | |
550 TEST_F(ContextMenuTest, CFViewSource) { | |
551 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
552 // for more information on why this test is disabled for Vista with IE7. | |
553 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
554 GetInstalledIEVersion() == IE_7) { | |
555 LOG(INFO) << "Not running test on Vista with IE7"; | |
556 return; | |
557 } | |
558 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
559 MockIEEventSink view_source_mock; | |
560 view_source_mock.ExpectAnyNavigations(); | |
561 InSequence expect_in_sequence_for_scope; | |
562 base::string16 initial_url(GetSimplePageUrl()); | |
563 | |
564 // View the page source. | |
565 EXPECT_CALL(acc_observer_, | |
566 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
567 GetSimplePageTitle()))) | |
568 .WillOnce(OpenContextMenuAsync()); | |
569 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
570 .WillOnce(AccLeftClick(AccObjectMatcher(L"View page source"))); | |
571 | |
572 // Expect notification for view-source window, handle new window event | |
573 // and attach a new ie_mock_ to the received web browser | |
574 std::wstring view_source_url; | |
575 view_source_url += base::UTF8ToWide(content::kViewSourceScheme); | |
576 view_source_url += L":"; | |
577 view_source_url += initial_url; | |
578 std::wstring url_in_new_window = kChromeProtocolPrefix; | |
579 url_in_new_window += view_source_url; | |
580 | |
581 ie_mock_.ExpectNewWindow(&view_source_mock); | |
582 // For some reason this happens occasionally at least on XP IE7 and Win7 IE8. | |
583 EXPECT_CALL(view_source_mock, OnLoad(IN_IE, StrEq(url_in_new_window))) | |
584 .Times(testing::AtMost(1)); | |
585 EXPECT_CALL(view_source_mock, OnLoad(IN_CF, StrEq(view_source_url))) | |
586 .WillOnce(testing::DoAll( | |
587 VerifyAddressBarUrlWithGcf(&view_source_mock), | |
588 CloseBrowserMock(&view_source_mock))); | |
589 EXPECT_CALL(view_source_mock, OnQuit()) | |
590 .Times(testing::AtMost(1)) | |
591 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
592 | |
593 LaunchIEAndNavigate(initial_url); | |
594 } | |
595 | |
596 TEST_F(ContextMenuTest, DISABLED_CFPageInfo) { | |
597 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
598 MockWindowObserver win_observer_mock; | |
599 InSequence expect_in_sequence_for_scope; | |
600 base::string16 initial_url(GetSimplePageUrl()); | |
601 | |
602 // View page information. | |
603 EXPECT_CALL(acc_observer_, | |
604 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
605 GetSimplePageTitle()))) | |
606 .WillOnce(testing::DoAll( | |
607 WatchWindow(&win_observer_mock, "", "Chrome_WidgetWin_*"), | |
608 OpenContextMenuAsync())); | |
609 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
610 .WillOnce(AccLeftClick(AccObjectMatcher(L"View page info"))); | |
611 | |
612 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)).Times(1); | |
613 // Expect page info dialog to pop up. Dismiss the dialog with 'Esc' key | |
614 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
615 .WillOnce(DoCloseWindow()); | |
616 | |
617 EXPECT_CALL(win_observer_mock, OnWindowClose(_)).Times(1); | |
618 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
619 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
620 | |
621 LaunchIEAndNavigate(initial_url); | |
622 } | |
623 | |
624 TEST_F(ContextMenuTest, CFInspector) { | |
625 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
626 MockWindowObserver win_observer_mock; | |
627 InSequence expect_in_sequence_for_scope; | |
628 | |
629 // Open developer tools. | |
630 // Devtools begins life with "Untitled" caption and it changes | |
631 // later to the 'Developer Tools - <url> form. | |
632 const char* kPageInfoCaptionPattern = "Untitled*"; | |
633 base::string16 initial_url(GetSimplePageUrl()); | |
634 EXPECT_CALL(acc_observer_, | |
635 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
636 GetSimplePageTitle()))) | |
637 .WillOnce(testing::DoAll( | |
638 WatchWindow(&win_observer_mock, kPageInfoCaptionPattern, ""), | |
639 OpenContextMenuAsync())); | |
640 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
641 .WillOnce(AccLeftClick(AccObjectMatcher(L"Inspect element"))); | |
642 | |
643 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
644 .WillOnce(DelayDoCloseWindow(5000)); // wait to catch possible crash | |
645 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
646 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
647 | |
648 LaunchIENavigateAndLoop(initial_url, | |
649 kChromeFrameVeryLongNavigationTimeout); | |
650 } | |
651 | |
652 // http://code.google.com/p/chromium/issues/detail?id=83114 | |
653 TEST_F(ContextMenuTest, DISABLED_CFSavePageAs) { | |
654 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
655 // for more information on why this test is disabled for Vista with IE7. | |
656 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
657 GetInstalledIEVersion() == IE_7) { | |
658 LOG(INFO) << "Not running test on Vista with IE7"; | |
659 return; | |
660 } | |
661 ASSERT_NO_FATAL_FAILURE(DoSaveAsTest(L"", L"Save as...", L".html")); | |
662 } | |
663 | |
664 // http://code.google.com/p/chromium/issues/detail?id=83114 | |
665 TEST_F(ContextMenuTest, DISABLED_CFSaveLinkAs) { | |
666 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
667 // for more information on why this test is disabled for Vista with IE7. | |
668 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
669 GetInstalledIEVersion() == IE_7) { | |
670 LOG(INFO) << "Not running test on Vista with IE7"; | |
671 return; | |
672 } | |
673 ASSERT_NO_FATAL_FAILURE(DoSaveAsTest(L"link", L"Save link as...", L".zip")); | |
674 } | |
675 | |
676 // This tests that the about:version page can be opened via the CF context menu. | |
677 TEST_F(ContextMenuTest, CFAboutVersionLoads) { | |
678 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
679 // for more information on why this test is disabled for Vista with IE7. | |
680 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
681 GetInstalledIEVersion() == IE_7) { | |
682 LOG(INFO) << "Not running test on Vista with IE7"; | |
683 return; | |
684 } | |
685 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
686 const wchar_t* kAboutVersionUrl = L"gcf:about:version"; | |
687 const wchar_t* kAboutVersionWithoutProtoUrl = L"about:version"; | |
688 MockIEEventSink new_window_mock; | |
689 new_window_mock.ExpectAnyNavigations(); | |
690 InSequence expect_in_sequence_for_scope; | |
691 base::string16 initial_url(GetSimplePageUrl()); | |
692 | |
693 EXPECT_CALL(acc_observer_, | |
694 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
695 GetSimplePageTitle()))) | |
696 .WillOnce(OpenContextMenuAsync()); | |
697 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
698 .WillOnce(AccLeftClick(AccObjectMatcher(L"About*"))); | |
699 | |
700 ie_mock_.ExpectNewWindow(&new_window_mock); | |
701 // For some reason this happens occasionally at least on Win7 IE8. | |
702 EXPECT_CALL(new_window_mock, OnLoad(IN_IE, StrEq(kAboutVersionUrl))) | |
703 .Times(testing::AtMost(1)); | |
704 EXPECT_CALL(new_window_mock, | |
705 OnLoad(IN_CF, StrEq(kAboutVersionWithoutProtoUrl))) | |
706 .WillOnce(testing::DoAll( | |
707 VerifyAddressBarUrlWithGcf(&new_window_mock), | |
708 CloseBrowserMock(&new_window_mock))); | |
709 | |
710 EXPECT_CALL(new_window_mock, OnQuit()) | |
711 .Times(testing::AtMost(1)) | |
712 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
713 | |
714 LaunchIEAndNavigate(initial_url); | |
715 } | |
716 | |
717 TEST_F(ContextMenuTest, IEOpen) { | |
718 server_mock_.ExpectAndServeAnyRequests(CFInvocation::None()); | |
719 InSequence expect_in_sequence_for_scope; | |
720 base::string16 initial_url(GetLinkPageUrl()); | |
721 | |
722 // Open the link through the context menu. | |
723 EXPECT_CALL(acc_observer_, | |
724 OnAccDocLoad(TabContentsTitleEq(initial_url, GetLinkPageTitle()))) | |
725 .WillOnce(AccRightClick(AccObjectMatcher(L"", L"link"))); | |
726 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
727 .WillOnce(AccLeftClick(AccObjectMatcher(L"Open"))); | |
728 | |
729 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl()))) | |
730 .WillOnce(testing::DoAll( | |
731 VerifyAddressBarUrl(&ie_mock_), | |
732 CloseBrowserMock(&ie_mock_))); | |
733 | |
734 LaunchIEAndNavigate(initial_url); | |
735 } | |
736 | |
737 TEST_F(ContextMenuTest, IEOpenInNewWindow) { | |
738 // See crbug.com/64794. | |
739 if (GetInstalledIEVersion() == IE_7) { | |
740 LOG(INFO) << "Not running test with IE7"; | |
741 return; | |
742 } | |
743 server_mock_.ExpectAndServeAnyRequests(CFInvocation::None()); | |
744 MockIEEventSink new_window_mock; | |
745 new_window_mock.ExpectAnyNavigations(); | |
746 InSequence expect_in_sequence_for_scope; | |
747 base::string16 initial_url(GetLinkPageUrl()); | |
748 | |
749 // Open the link in a new window. | |
750 EXPECT_CALL(acc_observer_, | |
751 OnAccDocLoad(TabContentsTitleEq(initial_url, GetLinkPageTitle()))) | |
752 .WillOnce(AccRightClick(AccObjectMatcher(L"", L"link"))); | |
753 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
754 .WillOnce(AccLeftClick(AccObjectMatcher(L"Open in New Window"))); | |
755 | |
756 ie_mock_.ExpectNewWindow(&new_window_mock); | |
757 EXPECT_CALL(new_window_mock, OnLoad(IN_IE, StrEq(GetSimplePageUrl()))) | |
758 // TODO(kkania): Verifying the address bar is flaky with this, at least | |
759 // on XP ie6. Fix. | |
760 .WillOnce(CloseBrowserMock(&new_window_mock)); | |
761 | |
762 EXPECT_CALL(new_window_mock, OnQuit()) | |
763 .Times(testing::AtMost(1)) | |
764 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
765 | |
766 LaunchIEAndNavigate(initial_url); | |
767 } | |
768 | |
769 // Test Back/Forward from context menu. | |
770 TEST_F(ContextMenuTest, IEBackForward) { | |
771 server_mock_.ExpectAndServeAnyRequests(CFInvocation::None()); | |
772 std::wstring page1 = GetLinkPageUrl(); | |
773 std::wstring title1 = GetLinkPageTitle(); | |
774 std::wstring page2 = GetSimplePageUrl(); | |
775 std::wstring title2 = GetSimplePageTitle(); | |
776 InSequence expect_in_sequence_for_scope; | |
777 | |
778 // Navigate to second page. | |
779 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page1, title1))) | |
780 .WillOnce(Navigate(&ie_mock_, page2)); | |
781 | |
782 // Go back. | |
783 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page2, title2))) | |
784 .WillOnce(testing::DoAll( | |
785 VerifyPageLoad(&ie_mock_, IN_IE, page2), | |
786 OpenContextMenuAsync())); | |
787 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
788 .WillOnce(AccLeftClick(AccObjectMatcher(L"Back"))); | |
789 | |
790 // Go forward. | |
791 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page1, title1))) | |
792 .WillOnce(testing::DoAll( | |
793 VerifyPageLoad(&ie_mock_, IN_IE, page1), | |
794 OpenContextMenuAsync())); | |
795 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
796 .WillOnce(AccLeftClick(AccObjectMatcher(L"Forward"))); | |
797 | |
798 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(page2))) | |
799 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
800 | |
801 LaunchIEAndNavigate(page1); | |
802 } | |
803 | |
804 // Test CF link context menu - Open link in new window. | |
805 // Failing intermittently on IE6/7. See crbug.com/64794. | |
806 TEST_F(ContextMenuTest, DISABLED_CFOpenLinkInNewWindow) { | |
807 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
808 MockIEEventSink new_window_mock; | |
809 new_window_mock.ExpectAnyNavigations(); | |
810 base::string16 initial_url(GetLinkPageUrl()); | |
811 | |
812 // Invoke 'Open link in new window' context menu item. | |
813 EXPECT_CALL(acc_observer_, | |
814 OnAccDocLoad(TabContentsTitleEq(initial_url, GetLinkPageTitle()))) | |
815 .Times(testing::AtMost(2)) | |
816 .WillOnce(AccRightClick(AccObjectMatcher(L"", L"link"))) | |
817 .WillOnce(testing::Return()); | |
818 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
819 .WillOnce(AccLeftClick(AccObjectMatcher(L"Open link in new window*"))); | |
820 | |
821 ie_mock_.ExpectNewWindow(&new_window_mock); | |
822 EXPECT_CALL(new_window_mock, OnLoad(IN_CF, StrEq(GetSimplePageUrl()))) | |
823 .WillOnce(CloseBrowserMock(&new_window_mock)); | |
824 EXPECT_CALL(new_window_mock, OnQuit()) | |
825 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
826 | |
827 LaunchIEAndNavigate(initial_url); | |
828 } | |
829 | |
830 // Test CF link context menu - Copy link address. | |
831 TEST_F(ContextMenuTest, CFCopyLinkAddress) { | |
832 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
833 base::string16 initial_url(GetLinkPageUrl()); | |
834 | |
835 // Invoke 'Copy link address' context menu item. | |
836 EXPECT_CALL(acc_observer_, | |
837 OnAccDocLoad(TabContentsTitleEq(initial_url, GetLinkPageTitle()))) | |
838 .WillOnce(AccRightClick(AccObjectMatcher(L"", L"link"))); | |
839 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
840 .WillOnce(testing::DoAll( | |
841 AccLeftClick(AccObjectMatcher(L"Copy link address*")), | |
842 CloseBrowserMock(&ie_mock_))); | |
843 | |
844 LaunchIEAndNavigate(initial_url); | |
845 | |
846 EXPECT_STREQ(GetSimplePageUrl().c_str(), GetClipboardText().c_str()); | |
847 } | |
848 | |
849 // Test CF text field context menu - cut. | |
850 // Times out sporadically http://crbug.com/119660. | |
851 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldCut) { | |
852 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
853 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
854 | |
855 // Invoke "Cut" context menu item of text field. | |
856 EXPECT_CALL(acc_observer_, | |
857 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
858 context_menu_page_title))) | |
859 .WillOnce(testing::DoAll( | |
860 AccRightClick(txtfield_matcher), | |
861 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); | |
862 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
863 .WillOnce(AccLeftClick(AccObjectMatcher(L"Cut*"))); | |
864 | |
865 // Verify that text field is empty after cut operation. | |
866 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L""))) | |
867 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
868 | |
869 LaunchIEAndNavigate(context_menu_page_url); | |
870 // Verify that the text value has been cut to clipboard. | |
871 EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str()); | |
872 } | |
873 | |
874 // Test CF text field context menu - copy. | |
875 // Times out sporadically http://crbug.com/119660. | |
876 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldCopy) { | |
877 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
878 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
879 | |
880 // Invoke "Copy" context menu item of text field. | |
881 EXPECT_CALL(acc_observer_, | |
882 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
883 context_menu_page_title))) | |
884 .WillOnce(testing::DoAll( | |
885 AccRightClick(txtfield_matcher), | |
886 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); | |
887 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
888 .WillOnce(testing::DoAll( | |
889 AccLeftClick(AccObjectMatcher(L"Copy*")), | |
890 CloseBrowserMock(&ie_mock_))); | |
891 | |
892 // Verify that there is no change on text field value after copy operation. | |
893 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, _)) | |
894 .Times(testing::AtMost(0)); | |
895 | |
896 LaunchIEAndNavigate(context_menu_page_url); | |
897 // Verify that the text value has been copied to clipboard. | |
898 EXPECT_STREQ(kTextFieldInitValue.c_str(), GetClipboardText().c_str()); | |
899 } | |
900 | |
901 // Test CF text field context menu - paste. | |
902 // Times out sporadically http://crbug.com/119660. | |
903 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldPaste) { | |
904 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
905 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
906 | |
907 // Invoke "Paste" context menu item of text field. | |
908 EXPECT_CALL(acc_observer_, | |
909 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
910 context_menu_page_title))) | |
911 .WillOnce(testing::DoAll( | |
912 AccRightClick(txtfield_matcher), | |
913 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); | |
914 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
915 .WillOnce(AccLeftClick(AccObjectMatcher(L"Paste*"))); | |
916 // Verify that value has been pasted to text field. | |
917 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) | |
918 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
919 | |
920 // Set some text value to clipboard, this is to emulate the 'copy' action. | |
921 SetClipboardText(kTextFieldInitValue); | |
922 | |
923 LaunchIEAndNavigate(context_menu_page_url); | |
924 } | |
925 | |
926 // Test CF text field context menu - delete. | |
927 // Times out sporadically http://crbug.com/119660. | |
928 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldDelete) { | |
929 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
930 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
931 | |
932 // Invoke 'Delete' context menu item of text field. | |
933 EXPECT_CALL(acc_observer_, | |
934 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
935 context_menu_page_title))) | |
936 .WillOnce(testing::DoAll( | |
937 AccRightClick(txtfield_matcher), | |
938 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher))); | |
939 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
940 .WillOnce(AccLeftClick(AccObjectMatcher(L"Delete*"))); | |
941 // Verify that value has been deleted from text field. | |
942 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L""))) | |
943 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
944 | |
945 LaunchIEAndNavigate(context_menu_page_url); | |
946 } | |
947 | |
948 // Test CF text field context menu - select all. | |
949 // Flaky: http://crbug.com/144664 | |
950 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldSelectAll) { | |
951 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
952 | |
953 // Invoke 'Select all' context menu item of text field. | |
954 EXPECT_CALL(acc_observer_, | |
955 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
956 context_menu_page_title))) | |
957 .WillOnce(AccRightClick(AccObjectMatcher(L"", L"editable text"))); | |
958 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
959 .WillOnce(testing::DoAll( | |
960 AccLeftClick(AccObjectMatcher(L"Select all*")), | |
961 PostMessageToCF(&ie_mock_, L"selectall"))); | |
962 // Client side script verifies that the text field value has been selected, | |
963 // then send 'OK' message. | |
964 EXPECT_CALL(ie_mock_, OnMessage(testing::StrCaseEq(L"OK"), _, _)) | |
965 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
966 | |
967 LaunchIEAndNavigate(context_menu_page_url + L"?action=selectall"); | |
968 } | |
969 | |
970 // Test CF text field context menu - undo. | |
971 // Times out sporadically http://crbug.com/119660. | |
972 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldUndo) { | |
973 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
974 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
975 | |
976 // Change the value of text field to 'A'. | |
977 EXPECT_CALL(acc_observer_, | |
978 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
979 context_menu_page_title))) | |
980 .WillOnce(testing::DoAll( | |
981 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), | |
982 AccSendCharMessage(txtfield_matcher, L'A'))); | |
983 // Bring up the context menu once the value has changed. | |
984 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A"))) | |
985 .WillOnce(AccRightClick(txtfield_matcher)); | |
986 // Then select "Undo". | |
987 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
988 .WillOnce(testing::DoAll( | |
989 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), | |
990 AccLeftClick(AccObjectMatcher(L"Undo*")))); | |
991 | |
992 // Verify that value has been reset to initial value after undo operation. | |
993 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) | |
994 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
995 | |
996 LaunchIEAndNavigate(context_menu_page_url); | |
997 } | |
998 | |
999 // Test CF text field context menu - redo. | |
1000 // Times out sporadically http://crbug.com/119660. | |
1001 TEST_F(ContextMenuTest, DISABLED_CFTxtFieldRedo) { | |
1002 server_mock_.ExpectAndServeAnyRequests(CFInvocation::MetaTag()); | |
1003 AccObjectMatcher txtfield_matcher(L"", L"editable text"); | |
1004 InSequence expect_in_sequence_for_scope; | |
1005 | |
1006 // Change text field from its initial value to 'A'. | |
1007 EXPECT_CALL(acc_observer_, | |
1008 OnAccDocLoad(TabContentsTitleEq(context_menu_page_url, | |
1009 context_menu_page_title))) | |
1010 .WillOnce(testing::DoAll( | |
1011 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), | |
1012 AccSendCharMessage(txtfield_matcher, L'A'))); | |
1013 // Bring up the context menu. | |
1014 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A"))) | |
1015 .WillOnce(AccRightClick(txtfield_matcher)); | |
1016 // Select "Undo" | |
1017 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1018 .WillOnce(testing::DoAll( | |
1019 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), | |
1020 AccLeftClick(AccObjectMatcher(L"Undo*")))); | |
1021 | |
1022 // After undo operation is done, bring up the context menu again. | |
1023 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(kTextFieldInitValue))) | |
1024 .WillOnce(AccRightClick(txtfield_matcher)); | |
1025 // Select "Redo" | |
1026 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1027 .WillOnce(testing::DoAll( | |
1028 AccWatchForOneValueChange(&acc_observer_, txtfield_matcher), | |
1029 AccLeftClick(AccObjectMatcher(L"Redo*")))); | |
1030 | |
1031 // Verify that text field value is reset to its changed value 'A' and exit. | |
1032 EXPECT_CALL(acc_observer_, OnAccValueChange(_, _, StrEq(L"A"))) | |
1033 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
1034 | |
1035 LaunchIEAndNavigate(context_menu_page_url); | |
1036 } | |
1037 | |
1038 // Disabled because it seems to hang, causing the test process to timeout and | |
1039 // be killed; see http://crbug.com/121097. | |
1040 TEST_F(ContextMenuTest, DISABLED_CFBackForward) { | |
1041 std::wstring page1 = GetLinkPageUrl(); | |
1042 std::wstring title1 = GetLinkPageTitle(); | |
1043 std::wstring page2 = GetSimplePageUrl(); | |
1044 std::wstring title2 = GetSimplePageTitle(); | |
1045 std::wstring page3 = GetTestUrl(L"anchor.html"); | |
1046 std::wstring title3 = GetAnchorPageTitle(); | |
1047 | |
1048 server_mock_.ExpectAndServeRequestWithCardinality( | |
1049 CFInvocation::MetaTag(), page1, testing::Exactly(2)); | |
1050 | |
1051 server_mock_.ExpectAndServeRequestWithCardinality( | |
1052 CFInvocation::None(), page2, testing::Exactly(3)); | |
1053 | |
1054 server_mock_.ExpectAndServeRequestWithCardinality( | |
1055 CFInvocation::MetaTag(), page3, testing::Exactly(2)); | |
1056 | |
1057 InSequence expect_in_sequence_for_scope; | |
1058 | |
1059 // Navigate to second page. | |
1060 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page1, title1))) | |
1061 .WillOnce(testing::DoAll( | |
1062 VerifyPageLoad(&ie_mock_, IN_CF, page1), | |
1063 Navigate(&ie_mock_, page2))); | |
1064 | |
1065 // Navigate to third page. | |
1066 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page2, title2))) | |
1067 .WillOnce(testing::DoAll( | |
1068 VerifyPageLoad(&ie_mock_, IN_IE, page2), | |
1069 Navigate(&ie_mock_, page3))); | |
1070 | |
1071 // Go back. | |
1072 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page3, title3))) | |
1073 .WillOnce(testing::DoAll( | |
1074 VerifyPageLoad(&ie_mock_, IN_CF, page3), | |
1075 OpenContextMenuAsync())); | |
1076 | |
1077 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1078 .WillOnce(AccLeftClick(AccObjectMatcher(L"Back"))); | |
1079 | |
1080 // Go back | |
1081 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page2, title2))) | |
1082 .WillOnce(testing::DoAll( | |
1083 VerifyPageLoad(&ie_mock_, IN_IE, page2), | |
1084 OpenContextMenuAsync())); | |
1085 | |
1086 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1087 .WillOnce(AccLeftClick(AccObjectMatcher(L"Back"))); | |
1088 | |
1089 // Go forward. | |
1090 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page1, title1))) | |
1091 .WillOnce(testing::DoAll( | |
1092 VerifyPageLoad(&ie_mock_, IN_CF, page1), | |
1093 OpenContextMenuAsync())); | |
1094 | |
1095 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1096 .WillOnce(AccLeftClick(AccObjectMatcher(L"Forward"))); | |
1097 | |
1098 // Go forward. | |
1099 EXPECT_CALL(acc_observer_, OnAccDocLoad(TabContentsTitleEq(page2, title2))) | |
1100 .WillOnce(testing::DoAll( | |
1101 VerifyPageLoad(&ie_mock_, IN_IE, page2), | |
1102 OpenContextMenuAsync())); | |
1103 | |
1104 EXPECT_CALL(acc_observer_, OnMenuPopup(_)) | |
1105 .WillOnce(AccLeftClick(AccObjectMatcher(L"Forward"))); | |
1106 | |
1107 EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(page3))) | |
1108 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
1109 | |
1110 LaunchIENavigateAndLoop(page1, kChromeFrameVeryLongNavigationTimeout); | |
1111 } | |
1112 | |
1113 } // namespace chrome_frame_test | |
OLD | NEW |