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(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 += 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 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 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 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 += 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 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 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 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 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 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 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 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 1114