| 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 <string> | |
| 6 | |
| 7 #include "base/file_util.h" | |
| 8 #include "base/test/test_file_util.h" | |
| 9 #include "base/win/scoped_comptr.h" | |
| 10 #include "base/win/windows_version.h" | |
| 11 #include "chrome_frame/test/chrome_frame_test_utils.h" | |
| 12 #include "chrome_frame/test/chrome_frame_ui_test_utils.h" | |
| 13 #include "chrome_frame/test/mock_ie_event_sink_actions.h" | |
| 14 #include "chrome_frame/test/mock_ie_event_sink_test.h" | |
| 15 #include "net/http/http_util.h" | |
| 16 | |
| 17 // Needed for CreateFunctor. | |
| 18 #define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING | |
| 19 #include "testing/gmock_mutant.h" | |
| 20 | |
| 21 using testing::InSequence; | |
| 22 using testing::StrEq; | |
| 23 using testing::_; | |
| 24 | |
| 25 namespace chrome_frame_test { | |
| 26 | |
| 27 // Test fixture for navigation-related tests. Each test is run thrice: IE, CF | |
| 28 // with meta tag invocation, and CF with http header invocation. This is | |
| 29 // accomplished by using gTest's parameterized test. | |
| 30 class FullTabNavigationTest | |
| 31 : public MockIEEventSinkTest, public testing::TestWithParam<CFInvocation> { | |
| 32 public: | |
| 33 FullTabNavigationTest() {} | |
| 34 }; | |
| 35 | |
| 36 // Instantiate each test case. Instead of doing in one statement, it is split | |
| 37 // into three so gTest prints nicer names. | |
| 38 INSTANTIATE_TEST_CASE_P(IE, FullTabNavigationTest, testing::Values( | |
| 39 CFInvocation(CFInvocation::NONE))); | |
| 40 INSTANTIATE_TEST_CASE_P(MetaTag, FullTabNavigationTest, testing::Values( | |
| 41 CFInvocation(CFInvocation::META_TAG))); | |
| 42 INSTANTIATE_TEST_CASE_P(HttpHeader, FullTabNavigationTest, testing::Values( | |
| 43 CFInvocation(CFInvocation::HTTP_HEADER))); | |
| 44 | |
| 45 // This tests navigation to a typed URL. | |
| 46 TEST_P(FullTabNavigationTest, TypeUrl) { | |
| 47 MockAccEventObserver acc_observer; | |
| 48 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 49 AccObjectMatcher address_matcher(L"Address*", L"editable text"); | |
| 50 AccObjectMatcher go_matcher(L"Go*", L"push button"); | |
| 51 | |
| 52 ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl()); | |
| 53 server_mock_.ExpectAndServeRequest(CFInvocation::None(), GetSimplePageUrl()); | |
| 54 // Enter the new url into the address bar. | |
| 55 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl()))) | |
| 56 .WillOnce(testing::DoAll( | |
| 57 AccSetValueInBrowser(&ie_mock_, address_matcher, GetAnchorPageUrl(0)), | |
| 58 AccWatchForOneValueChange(&acc_observer, address_matcher))); | |
| 59 // Click the go button once the address has changed. | |
| 60 EXPECT_CALL(acc_observer, OnAccValueChange(_, _, GetAnchorPageUrl(0))) | |
| 61 .WillOnce(AccLeftClickInBrowser(&ie_mock_, go_matcher)); | |
| 62 | |
| 63 bool in_cf = GetParam().invokes_cf(); | |
| 64 ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(0)); | |
| 65 server_mock_.ExpectAndServeRequest(GetParam(), GetAnchorPageUrl(0)); | |
| 66 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(0)))) | |
| 67 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 68 | |
| 69 LaunchIEAndNavigate(GetSimplePageUrl()); | |
| 70 } | |
| 71 | |
| 72 // This tests navigation to a typed URL containing an fragment. | |
| 73 TEST_P(FullTabNavigationTest, TypeAnchorUrl) { | |
| 74 MockAccEventObserver acc_observer; | |
| 75 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 76 AccObjectMatcher address_matcher(L"Address*", L"editable text"); | |
| 77 AccObjectMatcher go_matcher(L"Go*", L"push button"); | |
| 78 | |
| 79 ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl()); | |
| 80 server_mock_.ExpectAndServeRequest(CFInvocation::None(), GetSimplePageUrl()); | |
| 81 | |
| 82 // Enter the new url into the address bar. | |
| 83 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl()))) | |
| 84 .WillOnce(testing::DoAll( | |
| 85 AccSetValueInBrowser(&ie_mock_, address_matcher, GetAnchorPageUrl(1)), | |
| 86 AccWatchForOneValueChange(&acc_observer, address_matcher))); | |
| 87 // Click the go button once the address has changed. | |
| 88 EXPECT_CALL(acc_observer, OnAccValueChange(_, _, GetAnchorPageUrl(1))) | |
| 89 .WillOnce(AccLeftClickInBrowser(&ie_mock_, go_matcher)); | |
| 90 | |
| 91 bool in_cf = GetParam().invokes_cf(); | |
| 92 ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(1)); | |
| 93 server_mock_.ExpectAndServeRequest(GetParam(), GetAnchorPageUrl(1)); | |
| 94 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1)))) | |
| 95 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 96 | |
| 97 LaunchIEAndNavigate(GetSimplePageUrl()); | |
| 98 } | |
| 99 | |
| 100 // Tests refreshing causes a page load. | |
| 101 TEST_P(FullTabNavigationTest, Refresh) { | |
| 102 if (GetInstalledIEVersion() == IE_7) { | |
| 103 LOG(ERROR) << "Test disabled for this configuration."; | |
| 104 return; | |
| 105 } | |
| 106 bool in_cf = GetParam().invokes_cf(); | |
| 107 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 108 InSequence expect_in_sequence_for_scope; | |
| 109 | |
| 110 ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl()); | |
| 111 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetSimplePageUrl()))) | |
| 112 .WillOnce(DelayRefresh(&ie_mock_, &loop_, base::TimeDelta())); | |
| 113 | |
| 114 if (in_cf) { | |
| 115 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetSimplePageUrl()))) | |
| 116 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 117 } else { | |
| 118 // For some reason IE still requests the resource again, but does not | |
| 119 // trigger another load. | |
| 120 EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetSimplePageUrl()), _)) | |
| 121 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 122 } | |
| 123 | |
| 124 LaunchIEAndNavigate(GetSimplePageUrl()); | |
| 125 } | |
| 126 | |
| 127 // Test that multiple back and forward requests work. | |
| 128 // TODO(tsepez): http://crbug.com/83133 | |
| 129 TEST_P(FullTabNavigationTest, DISABLED_MultipleBackForward) { | |
| 130 std::wstring page1 = GetSimplePageUrl(); | |
| 131 std::wstring page2 = GetLinkPageUrl(); | |
| 132 std::wstring page3 = GetAnchorPageUrl(0); | |
| 133 bool in_cf = GetParam().invokes_cf(); | |
| 134 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 135 InSequence expect_in_sequence_for_scope; | |
| 136 | |
| 137 // Navigate to url 2 after the previous navigation is complete. | |
| 138 ie_mock_.ExpectNavigation(in_cf, page1); | |
| 139 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1))) | |
| 140 .WillOnce(testing::DoAll( | |
| 141 VerifyAddressBarUrl(&ie_mock_), | |
| 142 Navigate(&ie_mock_, page2))); | |
| 143 | |
| 144 // Navigate to url 3 after the previous navigation is complete. | |
| 145 ie_mock_.ExpectNavigation(in_cf, page2); | |
| 146 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2))) | |
| 147 .WillOnce(testing::DoAll( | |
| 148 VerifyAddressBarUrl(&ie_mock_), | |
| 149 Navigate(&ie_mock_, page3))); | |
| 150 | |
| 151 // We have reached url 3 and have two back entries for url 1 & 2. | |
| 152 // Go back to url 2 now. | |
| 153 ie_mock_.ExpectNavigation(in_cf, page3); | |
| 154 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page3))) | |
| 155 .WillOnce(testing::DoAll( | |
| 156 VerifyAddressBarUrl(&ie_mock_), | |
| 157 DelayGoBack(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 158 | |
| 159 // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3. | |
| 160 // Go back to url 1 now. | |
| 161 ie_mock_.ExpectNavigation(in_cf, page2); | |
| 162 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2))) | |
| 163 .WillOnce(testing::DoAll( | |
| 164 VerifyAddressBarUrl(&ie_mock_), | |
| 165 DelayGoBack(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 166 | |
| 167 // We have reached url 1 and have 0 back & 2 forward entries for url 2 & 3. | |
| 168 // Go forward to url 2 now. | |
| 169 ie_mock_.ExpectNavigation(in_cf, page1); | |
| 170 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1))) | |
| 171 .WillOnce(testing::DoAll( | |
| 172 VerifyAddressBarUrl(&ie_mock_), | |
| 173 DelayGoForward(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 174 | |
| 175 // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3. | |
| 176 // Go forward to url 3 now. | |
| 177 ie_mock_.ExpectNavigation(in_cf, page2); | |
| 178 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2))) | |
| 179 .WillOnce(testing::DoAll( | |
| 180 VerifyAddressBarUrl(&ie_mock_), | |
| 181 DelayGoForward(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 182 | |
| 183 // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3. | |
| 184 ie_mock_.ExpectNavigation(in_cf, page3); | |
| 185 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page3))) | |
| 186 .WillOnce(testing::DoAll( | |
| 187 VerifyAddressBarUrl(&ie_mock_), | |
| 188 CloseBrowserMock(&ie_mock_))); | |
| 189 | |
| 190 LaunchIENavigateAndLoop(page1, kChromeFrameLongNavigationTimeout * 2); | |
| 191 } | |
| 192 | |
| 193 // Test multiple back and forward operations among urls with anchors. | |
| 194 TEST_P(FullTabNavigationTest, BackForwardAnchor) { | |
| 195 std::wstring title(GetAnchorPageTitle()); | |
| 196 bool in_cf = GetParam().invokes_cf(); | |
| 197 ie_mock_.ExpectAnyNavigations(); | |
| 198 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 199 MockAccEventObserver acc_observer; | |
| 200 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 201 | |
| 202 // Navigate to anchor 1. | |
| 203 // Back/Forward state at this point: | |
| 204 // Back: 0 | |
| 205 // Forward: 0 | |
| 206 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(0)))) | |
| 207 .Times(testing::AtMost(1)); | |
| 208 EXPECT_CALL(acc_observer, OnAccDocLoad(TabContentsTitleEq(GetAnchorPageUrl(0), | |
| 209 title))) | |
| 210 .WillOnce(AccDoDefaultAction(AccObjectMatcher(L"*1", L"link"))) | |
| 211 .RetiresOnSaturation(); | |
| 212 | |
| 213 InSequence expect_in_sequence_for_scope; | |
| 214 // Navigate to anchor 2 after the previous navigation is complete | |
| 215 // Back/Forward state at this point: | |
| 216 // Back: 1 (kAnchorUrl) | |
| 217 // Forward: 0 | |
| 218 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1)))) | |
| 219 .WillOnce(testing::DoAll( | |
| 220 VerifyAddressBarUrl(&ie_mock_), | |
| 221 AccDoDefaultActionInRenderer(&ie_mock_, | |
| 222 AccObjectMatcher(L"*2", L"link")))); | |
| 223 | |
| 224 // Navigate to anchor 3 after the previous navigation is complete | |
| 225 // Back/Forward state at this point: | |
| 226 // Back: 2 (kAnchorUrl, kAnchor1Url) | |
| 227 // Forward: 0 | |
| 228 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2)))) | |
| 229 .WillOnce(testing::DoAll( | |
| 230 VerifyAddressBarUrl(&ie_mock_), | |
| 231 AccDoDefaultActionInRenderer(&ie_mock_, | |
| 232 AccObjectMatcher(L"*3", L"link")))); | |
| 233 | |
| 234 // We will reach anchor 3 once the navigation is complete, | |
| 235 // then go back to anchor 2 | |
| 236 // Back/Forward state at this point: | |
| 237 // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url) | |
| 238 // Forward: 0 | |
| 239 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(3)))) | |
| 240 .WillOnce(testing::DoAll( | |
| 241 VerifyAddressBarUrl(&ie_mock_), | |
| 242 DelayGoBack(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 243 | |
| 244 // We will reach anchor 2 once the navigation is complete, | |
| 245 // then go back to anchor 1 | |
| 246 // Back/Forward state at this point: | |
| 247 // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url) | |
| 248 // Forward: 1 (kAnchor3Url) | |
| 249 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2)))) | |
| 250 .WillOnce(testing::DoAll( | |
| 251 VerifyAddressBarUrl(&ie_mock_), | |
| 252 DelayGoBack(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 253 | |
| 254 // We will reach anchor 1 once the navigation is complete, | |
| 255 // now go forward to anchor 2 | |
| 256 // Back/Forward state at this point: | |
| 257 // Back: 2 (kAnchorUrl, kAnchor1Url) | |
| 258 // Forward: 2 (kAnchor2Url, kAnchor3Url) | |
| 259 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1)))) | |
| 260 .WillOnce(testing::DoAll( | |
| 261 VerifyAddressBarUrl(&ie_mock_), | |
| 262 DelayGoForward(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 263 | |
| 264 // We have reached anchor 2, go forward to anchor 3 again | |
| 265 // Back/Forward state at this point: | |
| 266 // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url) | |
| 267 // Forward: 1 (kAnchor3Url) | |
| 268 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2)))) | |
| 269 .WillOnce(testing::DoAll( | |
| 270 VerifyAddressBarUrl(&ie_mock_), | |
| 271 DelayGoForward(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 272 | |
| 273 // We have gone a few steps back and forward, this should be enough for now. | |
| 274 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(3)))) | |
| 275 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 276 | |
| 277 LaunchIEAndNavigate(GetAnchorPageUrl(0)); | |
| 278 } | |
| 279 | |
| 280 // Test that a user cannot navigate to a restricted site and that the security | |
| 281 // dialog appears. | |
| 282 TEST_P(FullTabNavigationTest, RestrictedSite) { | |
| 283 // Add the server to restricted sites zone. | |
| 284 base::win::ScopedComPtr<IInternetSecurityManager> security_manager; | |
| 285 HRESULT hr = security_manager.CreateInstance(CLSID_InternetSecurityManager); | |
| 286 ASSERT_HRESULT_SUCCEEDED(hr); | |
| 287 hr = security_manager->SetZoneMapping(URLZONE_UNTRUSTED, | |
| 288 GetTestUrl(L"").c_str(), SZM_CREATE); | |
| 289 | |
| 290 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 291 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 292 | |
| 293 MockWindowObserver win_observer_mock; | |
| 294 | |
| 295 // If the page is loaded in mshtml, then IE allows the page to be loaded | |
| 296 // and just shows 'Restricted sites' in the status bar. | |
| 297 if (!GetParam().invokes_cf()) { | |
| 298 ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl()); | |
| 299 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl()))) | |
| 300 .Times(1) | |
| 301 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 302 } else { | |
| 303 // If the page is being loaded in chrome frame then we will see | |
| 304 // a security dialog. | |
| 305 const char* kAlertDlgCaption = "Security Alert"; | |
| 306 win_observer_mock.WatchWindow(kAlertDlgCaption, ""); | |
| 307 | |
| 308 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 309 testing::HasSubstr(GetSimplePageUrl())), _, _, _, _, _)) | |
| 310 .Times(testing::AtMost(2)); | |
| 311 | |
| 312 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 313 testing::Field(&VARIANT::bstrVal, StrEq(GetSimplePageUrl())))) | |
| 314 .Times(testing::AtMost(1)); | |
| 315 | |
| 316 EXPECT_CALL(win_observer_mock, OnWindowOpen(_)) | |
| 317 .Times(1) | |
| 318 .WillOnce(DoCloseWindow()); | |
| 319 EXPECT_CALL(win_observer_mock, OnWindowClose(_)) | |
| 320 .Times(1) | |
| 321 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 322 } | |
| 323 | |
| 324 LaunchIEAndNavigate(GetSimplePageUrl()); | |
| 325 | |
| 326 ASSERT_HRESULT_SUCCEEDED(security_manager->SetZoneMapping(URLZONE_UNTRUSTED, | |
| 327 GetTestUrl(L"").c_str(), SZM_DELETE)); | |
| 328 } | |
| 329 | |
| 330 // This test checks if window.open calls with target blank issued for a | |
| 331 // different domain make it back to IE instead of completing the navigation | |
| 332 // within Chrome. We validate this by initiating a navigation to a non existent | |
| 333 // url which ensures we would get an error during navigation. | |
| 334 // Marking this disabled as it leaves behind Chrome processes, at least on | |
| 335 // IE 6 XP (http://crbug.com/48732). | |
| 336 TEST_P(FullTabNavigationTest, DISABLED_JavascriptWindowOpenDifferentDomain) { | |
| 337 if (!GetParam().invokes_cf() || GetInstalledIEVersion() == IE_7) { | |
| 338 LOG(ERROR) << "Test disabled for this configuration."; | |
| 339 return; | |
| 340 } | |
| 341 std::wstring parent_url = GetWindowOpenUrl(L"http://www.nonexistent.com"); | |
| 342 MockAccEventObserver acc_observer; | |
| 343 MockIEEventSink new_window_mock; | |
| 344 ie_mock_.ExpectAnyNavigations(); | |
| 345 new_window_mock.ExpectAnyNavigations(); | |
| 346 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 347 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 348 | |
| 349 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(parent_url))); | |
| 350 EXPECT_CALL(acc_observer, | |
| 351 OnAccDocLoad(TabContentsTitleEq(parent_url, | |
| 352 GetWindowOpenTitle()))) | |
| 353 .WillOnce(AccLeftClick(AccObjectMatcher())); | |
| 354 | |
| 355 ie_mock_.ExpectNewWindow(&new_window_mock); | |
| 356 EXPECT_CALL(new_window_mock, OnNavigateError(_, _, _, _, _)) | |
| 357 .Times(1) | |
| 358 .WillOnce(CloseBrowserMock(&new_window_mock)); | |
| 359 | |
| 360 EXPECT_CALL(new_window_mock, OnLoad(_, _)) | |
| 361 .Times(testing::AtMost(1)); | |
| 362 | |
| 363 EXPECT_CALL(new_window_mock, OnQuit()) | |
| 364 .Times(1) | |
| 365 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 366 | |
| 367 // OnNavigateError can take a long time to fire. | |
| 368 LaunchIENavigateAndLoop(parent_url, kChromeFrameLongNavigationTimeout * 4); | |
| 369 ASSERT_TRUE(new_window_mock.event_sink()->web_browser2() != NULL); | |
| 370 } | |
| 371 | |
| 372 // Tests that the parent window can successfully close its popup through | |
| 373 // the javascript close method. | |
| 374 TEST_P(FullTabNavigationTest, JavascriptWindowOpenCanClose) { | |
| 375 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
| 376 // for more information on why this test is disabled for Vista with IE7. | |
| 377 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
| 378 GetInstalledIEVersion() == IE_7) { | |
| 379 LOG(INFO) << "Not running test on Vista with IE7"; | |
| 380 return; | |
| 381 } | |
| 382 | |
| 383 std::wstring parent_url = GetWindowOpenUrl(L"simple.html"); | |
| 384 MockAccEventObserver acc_observer; | |
| 385 MockIEEventSink new_window_mock; | |
| 386 ie_mock_.ExpectAnyNavigations(); | |
| 387 new_window_mock.ExpectAnyNavigations(); | |
| 388 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 389 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 390 | |
| 391 // Tell the page to open the popup. Some versions of IE will prevent a popup | |
| 392 // unless a click is involved. | |
| 393 EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(parent_url))); | |
| 394 EXPECT_CALL(acc_observer, | |
| 395 OnAccDocLoad(TabContentsTitleEq(parent_url, | |
| 396 GetWindowOpenTitle()))) | |
| 397 .WillOnce(AccLeftClick(AccObjectMatcher())); | |
| 398 | |
| 399 ie_mock_.ExpectNewWindow(&new_window_mock); | |
| 400 EXPECT_CALL(new_window_mock, OnLoad(_, StrEq(GetSimplePageUrl()))) | |
| 401 .Times(testing::AtMost(2)) | |
| 402 .WillOnce(PostKeyMessageToRenderer(&ie_mock_, 'c')) // close the popup | |
| 403 .WillOnce(testing::Return()); | |
| 404 | |
| 405 EXPECT_CALL(new_window_mock, OnQuit()) | |
| 406 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 407 | |
| 408 LaunchIENavigateAndLoop(parent_url, kChromeFrameLongNavigationTimeout * 2); | |
| 409 } | |
| 410 | |
| 411 // Parameter for tests using the NavigationTransitionTest fixture. Includes two | |
| 412 // pages, each with their own possible CF invocation. | |
| 413 struct NavigationTransitionTestParameter { | |
| 414 NavigationTransitionTestParameter(CFInvocation::Type type1, | |
| 415 CFInvocation::Type type2) { | |
| 416 page1_ = CFInvocation(type1); | |
| 417 page2_ = CFInvocation(type2); | |
| 418 } | |
| 419 CFInvocation page1_; | |
| 420 CFInvocation page2_; | |
| 421 }; | |
| 422 | |
| 423 // Parameterized test fixture for tests which test navigation transitions | |
| 424 // between two pages. | |
| 425 class NavigationTransitionTest | |
| 426 : public MockIEEventSinkTest, | |
| 427 public testing::TestWithParam<NavigationTransitionTestParameter> { | |
| 428 public: | |
| 429 NavigationTransitionTest() {} | |
| 430 | |
| 431 virtual void SetUp() { | |
| 432 page1_ = GetParam().page1_; | |
| 433 page2_ = GetParam().page2_; | |
| 434 } | |
| 435 | |
| 436 protected: | |
| 437 CFInvocation page1_; | |
| 438 CFInvocation page2_; | |
| 439 }; | |
| 440 | |
| 441 // This instantiates each parameterized test with some of the different CF | |
| 442 // invocation methods. | |
| 443 INSTANTIATE_TEST_CASE_P( | |
| 444 IEToIE, | |
| 445 NavigationTransitionTest, | |
| 446 testing::Values(NavigationTransitionTestParameter( | |
| 447 CFInvocation::NONE, CFInvocation::NONE))); | |
| 448 INSTANTIATE_TEST_CASE_P( | |
| 449 IEToMetaTag, | |
| 450 NavigationTransitionTest, | |
| 451 testing::Values(NavigationTransitionTestParameter( | |
| 452 CFInvocation::NONE, CFInvocation::META_TAG))); | |
| 453 INSTANTIATE_TEST_CASE_P( | |
| 454 IEToHttpHeader, | |
| 455 NavigationTransitionTest, | |
| 456 testing::Values(NavigationTransitionTestParameter( | |
| 457 CFInvocation::NONE, CFInvocation::HTTP_HEADER))); | |
| 458 INSTANTIATE_TEST_CASE_P( | |
| 459 CFToCF, | |
| 460 NavigationTransitionTest, | |
| 461 testing::Values(NavigationTransitionTestParameter( | |
| 462 CFInvocation::META_TAG, CFInvocation::META_TAG))); | |
| 463 INSTANTIATE_TEST_CASE_P( | |
| 464 CFToIE, | |
| 465 NavigationTransitionTest, | |
| 466 testing::Values(NavigationTransitionTestParameter( | |
| 467 CFInvocation::META_TAG, CFInvocation::NONE))); | |
| 468 | |
| 469 // Test window.open calls. | |
| 470 TEST_P(NavigationTransitionTest, JavascriptWindowOpen) { | |
| 471 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
| 472 // for more information on why this test is disabled for Vista with IE7. | |
| 473 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
| 474 GetInstalledIEVersion() == IE_7) { | |
| 475 LOG(INFO) << "Not running test on Vista with IE7"; | |
| 476 return; | |
| 477 } | |
| 478 | |
| 479 std::wstring parent_url = GetWindowOpenUrl(L"simple.html"); | |
| 480 std::wstring new_window_url = GetSimplePageUrl(); | |
| 481 MockAccEventObserver acc_observer; | |
| 482 testing::StrictMock<MockIEEventSink> new_window_mock; | |
| 483 | |
| 484 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 485 ie_mock_.ExpectNavigation(page1_.invokes_cf(), parent_url); | |
| 486 server_mock_.ExpectAndServeRequest(page1_, parent_url); | |
| 487 EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(parent_url))); | |
| 488 // Tell the page to open the popup. Some versions of IE will prevent a popup | |
| 489 // unless a click is involved. | |
| 490 EXPECT_CALL(acc_observer, | |
| 491 OnAccDocLoad(TabContentsTitleEq(parent_url, | |
| 492 GetWindowOpenTitle()))) | |
| 493 .WillOnce(AccLeftClick(AccObjectMatcher())); | |
| 494 | |
| 495 // If the parent window is in CF, the child should always load in CF since | |
| 496 // the domain is the same. | |
| 497 bool expect_cf = page1_.invokes_cf() || page2_.invokes_cf(); | |
| 498 ie_mock_.ExpectNewWindow(&new_window_mock); | |
| 499 new_window_mock.ExpectJavascriptWindowOpenNavigation(page1_.invokes_cf(), | |
| 500 expect_cf, | |
| 501 new_window_url); | |
| 502 server_mock_.ExpectAndServeRequest(page2_, new_window_url); | |
| 503 EXPECT_CALL(new_window_mock, OnLoad(expect_cf, StrEq(new_window_url))) | |
| 504 .WillOnce(testing::DoAll( | |
| 505 ValidateWindowSize(&new_window_mock, 10, 10, 250, 250), | |
| 506 CloseBrowserMock(&new_window_mock))); | |
| 507 | |
| 508 EXPECT_CALL(new_window_mock, OnQuit()) | |
| 509 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 510 | |
| 511 LaunchIENavigateAndLoop(parent_url, kChromeFrameLongNavigationTimeout * 2); | |
| 512 } | |
| 513 | |
| 514 // Test redirection with window.location in Javascript. | |
| 515 // Disabled because crashes IE occasionally: http://crbug.com/48849. | |
| 516 TEST_P(NavigationTransitionTest, DISABLED_JavascriptRedirection) { | |
| 517 std::wstring redirect_url = GetTestUrl(L"javascript_redirect.html"); | |
| 518 | |
| 519 ie_mock_.ExpectNavigation(page1_.invokes_cf(), redirect_url); | |
| 520 server_mock_.ExpectAndServeRequest(page1_, redirect_url); | |
| 521 EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(redirect_url))) | |
| 522 .WillOnce(VerifyAddressBarUrl(&ie_mock_)); | |
| 523 | |
| 524 ie_mock_.ExpectNavigation(page2_.invokes_cf(), GetSimplePageUrl()); | |
| 525 server_mock_.ExpectAndServeRequest(page2_, GetSimplePageUrl()); | |
| 526 EXPECT_CALL(ie_mock_, OnLoad(page2_.invokes_cf(), StrEq(GetSimplePageUrl()))) | |
| 527 .WillOnce(testing::DoAll( | |
| 528 VerifyAddressBarUrl(&ie_mock_), | |
| 529 CloseBrowserMock(&ie_mock_))); | |
| 530 | |
| 531 LaunchIEAndNavigate(redirect_url); | |
| 532 } | |
| 533 | |
| 534 // Test following a link. | |
| 535 TEST_P(NavigationTransitionTest, FollowLink) { | |
| 536 if (page1_.invokes_cf() && page2_.invokes_cf()) { | |
| 537 // For some reason IE 7 and 8 send two BeforeNavigate events for the second | |
| 538 // page for this case. All versions do not send the OnLoad event for the | |
| 539 // second page if both pages are renderered in CF. | |
| 540 LOG(ERROR) << "Test disabled for this configuration."; | |
| 541 return; | |
| 542 } | |
| 543 MockAccEventObserver acc_observer; | |
| 544 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 545 | |
| 546 ie_mock_.ExpectNavigation(page1_.invokes_cf(), GetLinkPageUrl()); | |
| 547 // Two requests are made when going from CF to IE, at least on Win7 IE8. | |
| 548 EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetLinkPageUrl()), _)) | |
| 549 .Times(testing::Between(1, 2)) | |
| 550 .WillRepeatedly(SendResponse(&server_mock_, page1_)); | |
| 551 EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(GetLinkPageUrl()))); | |
| 552 EXPECT_CALL(acc_observer, | |
| 553 OnAccDocLoad(TabContentsTitleEq(GetLinkPageUrl(), | |
| 554 GetLinkPageTitle()))) | |
| 555 .WillOnce(AccDoDefaultAction(AccObjectMatcher(L"", L"link"))) | |
| 556 .RetiresOnSaturation(); | |
| 557 | |
| 558 ie_mock_.ExpectNavigation(page2_.invokes_cf(), GetSimplePageUrl()); | |
| 559 server_mock_.ExpectAndServeRequest(page2_, GetSimplePageUrl()); | |
| 560 EXPECT_CALL(ie_mock_, OnLoad(page2_.invokes_cf(), StrEq(GetSimplePageUrl()))) | |
| 561 .WillOnce(testing::DoAll( | |
| 562 VerifyAddressBarUrl(&ie_mock_), | |
| 563 CloseBrowserMock(&ie_mock_))); | |
| 564 | |
| 565 LaunchIEAndNavigate(GetLinkPageUrl()); | |
| 566 } | |
| 567 | |
| 568 // gMock matcher which tests if a url is blank. | |
| 569 MATCHER(BlankUrl, "is \"\" or NULL") { | |
| 570 return arg == NULL || wcslen(arg) == 0; | |
| 571 } | |
| 572 | |
| 573 // Basic navigation test fixture which uses the MockIEEventSink. These tests | |
| 574 // are not parameterized. | |
| 575 class NavigationTest : public MockIEEventSinkTest, public testing::Test { | |
| 576 public: | |
| 577 NavigationTest() {} | |
| 578 | |
| 579 void TestDisAllowedUrl(const wchar_t* url) { | |
| 580 // If a navigation fails then IE issues a navigation to an interstitial | |
| 581 // page. Catch this to track navigation errors as the NavigateError | |
| 582 // notification does not seem to fire reliably. | |
| 583 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 584 StrEq(url)), | |
| 585 _, _, _, _, _)); | |
| 586 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, BlankUrl())) | |
| 587 .Times(testing::AtMost(1)); | |
| 588 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 589 testing::StartsWith(L"res:")), | |
| 590 _, _, _, _, _)); | |
| 591 EXPECT_CALL(ie_mock_, OnFileDownload(VARIANT_TRUE, _)) | |
| 592 .Times(testing::AnyNumber()) | |
| 593 .WillRepeatedly(testing::Return()); | |
| 594 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 595 testing::Field(&VARIANT::bstrVal, | |
| 596 StrEq(url)))); | |
| 597 // Although we expect a load event for this, we should never receive a | |
| 598 // corresponding GET request. | |
| 599 EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(url))) | |
| 600 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 601 | |
| 602 LaunchIEAndNavigate(url); | |
| 603 } | |
| 604 | |
| 605 }; | |
| 606 | |
| 607 // Test navigation to a disallowed gcf: url with file scheme. | |
| 608 // Times out sporadically; http://crbug.com/119718. | |
| 609 TEST_F(NavigationTest, DISABLED_GcfProtocol1) { | |
| 610 // Make sure that we are not accidently enabling gcf protocol. | |
| 611 SetConfigBool(kAllowUnsafeURLs, false); | |
| 612 TestDisAllowedUrl(L"gcf:file:///C:/"); | |
| 613 } | |
| 614 | |
| 615 // Test navigation to a disallowed gcf: url with http scheme. | |
| 616 TEST_F(NavigationTest, GcfProtocol2) { | |
| 617 // Make sure that we are not accidently enabling gcf protocol. | |
| 618 SetConfigBool(kAllowUnsafeURLs, false); | |
| 619 TestDisAllowedUrl(L"gcf:http://www.google.com"); | |
| 620 } | |
| 621 | |
| 622 // Test navigation to a disallowed gcf: url with https scheme. | |
| 623 TEST_F(NavigationTest, GcfProtocol3) { | |
| 624 // Make sure that we are not accidently enabling gcf protocol. | |
| 625 SetConfigBool(kAllowUnsafeURLs, false); | |
| 626 TestDisAllowedUrl(L"gcf:https://www.google.com"); | |
| 627 } | |
| 628 | |
| 629 // NOTE: This test is currently disabled as we haven't finished implementing | |
| 630 // support for this yet. The test (as written) works fine for IE. CF might | |
| 631 // have a different set of requirements once we fully support this and hence | |
| 632 // the test might need some refining before being enabled. | |
| 633 TEST_F(NavigationTest, DISABLED_DownloadInNewWindow) { | |
| 634 MockIEEventSink new_window_mock; | |
| 635 std::wstring kDownloadFromNewWin = | |
| 636 GetTestUrl(L"full_tab_download_from_new_window.html"); | |
| 637 | |
| 638 ie_mock_.ExpectNavigation(IN_CF, kDownloadFromNewWin); | |
| 639 | |
| 640 EXPECT_CALL(ie_mock_, OnNewWindow3(_, _, _, _, _)); | |
| 641 | |
| 642 EXPECT_CALL(ie_mock_, OnNewBrowserWindow(_, _)) | |
| 643 .WillOnce(testing::WithArgs<0>(testing::Invoke(testing::CreateFunctor( | |
| 644 &new_window_mock, &MockIEEventSink::Attach)))); | |
| 645 EXPECT_CALL(new_window_mock, OnBeforeNavigate2(_, _, _, _, _, _, _)); | |
| 646 | |
| 647 EXPECT_CALL(new_window_mock, OnFileDownload(VARIANT_FALSE, _)) | |
| 648 .Times(2) | |
| 649 .WillRepeatedly(CloseBrowserMock(&new_window_mock)); | |
| 650 | |
| 651 EXPECT_CALL(new_window_mock, OnNavigateComplete2(_, _)); | |
| 652 | |
| 653 EXPECT_CALL(new_window_mock, OnQuit()).WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 654 | |
| 655 LaunchIEAndNavigate(kDownloadFromNewWin); | |
| 656 } | |
| 657 | |
| 658 // Flaky on ie6, http://crbug.com/255098. | |
| 659 TEST_P(FullTabNavigationTest, DISABLED_FormPostBackForward) { | |
| 660 bool in_cf = GetParam().invokes_cf(); | |
| 661 // Navigate to the form-get.html page: | |
| 662 // - First set focus to chrome renderer window | |
| 663 // - Send over a character to the window. | |
| 664 // - This should initiate a form post which eventually navigates to the | |
| 665 // action.html page. | |
| 666 // Navigate backwards from the action.html page and then navigate forward | |
| 667 // from the form-get.html page. | |
| 668 std::wstring kFormPostUrl = GetTestUrl(L"form-get.html"); | |
| 669 std::wstring kFormPostActionUrl = | |
| 670 GetTestUrl(L"action.html?field1=a&field2=b&submit=Submit"); | |
| 671 std::wstring kFormPostTitle(L"ChromeFrame form submit test(GET method)"); | |
| 672 | |
| 673 MockAccEventObserver acc_observer; | |
| 674 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 675 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 676 | |
| 677 EXPECT_CALL(acc_observer, OnAccDocLoad(TabContentsTitleEq(kFormPostUrl, | |
| 678 kFormPostTitle))) | |
| 679 .WillOnce(AccDoDefaultAction(AccObjectMatcher(L"Submit"))) | |
| 680 .RetiresOnSaturation(); | |
| 681 | |
| 682 InSequence expect_in_sequence_for_scope; | |
| 683 | |
| 684 ie_mock_.ExpectNavigation(in_cf, kFormPostUrl); | |
| 685 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kFormPostUrl))); | |
| 686 | |
| 687 ie_mock_.ExpectNavigationOptionalBefore(in_cf, kFormPostActionUrl); | |
| 688 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kFormPostActionUrl))) | |
| 689 .WillOnce(testing::DoAll( | |
| 690 VerifyAddressBarUrl(&ie_mock_), | |
| 691 DelayGoBack(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 692 | |
| 693 ie_mock_.ExpectNavigation(in_cf, kFormPostUrl); | |
| 694 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kFormPostUrl))) | |
| 695 .WillOnce(testing::DoAll( | |
| 696 VerifyAddressBarUrl(&ie_mock_), | |
| 697 DelayGoForward(&ie_mock_, &loop_, base::TimeDelta()))); | |
| 698 | |
| 699 ie_mock_.ExpectNavigationOptionalBefore(in_cf, kFormPostActionUrl); | |
| 700 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kFormPostActionUrl))) | |
| 701 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 702 | |
| 703 LaunchIEAndNavigate(kFormPostUrl); | |
| 704 } | |
| 705 | |
| 706 TEST_P(FullTabNavigationTest, CF_UnloadEventTest) { | |
| 707 bool in_cf = GetParam().invokes_cf(); | |
| 708 if (!in_cf) { | |
| 709 LOG(ERROR) << "Test not yet implemented."; | |
| 710 return; | |
| 711 } | |
| 712 | |
| 713 std::wstring kUnloadEventTestUrl = | |
| 714 GetTestUrl(L"fulltab_before_unload_event_test.html"); | |
| 715 | |
| 716 std::wstring kUnloadEventMainUrl = | |
| 717 GetTestUrl(L"fulltab_before_unload_event_main.html"); | |
| 718 | |
| 719 server_mock_.ExpectAndServeAnyRequests(GetParam()); | |
| 720 InSequence expect_in_sequence_for_scope; | |
| 721 | |
| 722 ie_mock_.ExpectNavigation(in_cf, kUnloadEventTestUrl); | |
| 723 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kUnloadEventTestUrl))); | |
| 724 | |
| 725 ie_mock_.ExpectNavigationOptionalBefore(in_cf, kUnloadEventMainUrl); | |
| 726 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(kUnloadEventMainUrl))); | |
| 727 | |
| 728 EXPECT_CALL(ie_mock_, OnMessage(_, _, _)) | |
| 729 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 730 | |
| 731 LaunchIEAndNavigate(kUnloadEventTestUrl); | |
| 732 } | |
| 733 | |
| 734 // Fixture for ChromeFrame download tests. | |
| 735 class FullTabDownloadTest | |
| 736 : public MockIEEventSinkTest, public testing::TestWithParam<CFInvocation> { | |
| 737 public: | |
| 738 FullTabDownloadTest() {} | |
| 739 }; | |
| 740 | |
| 741 void SaveOwnerWindow(HWND* owner_window, HWND window) { | |
| 742 *owner_window = GetWindow(window, GW_OWNER); | |
| 743 } | |
| 744 | |
| 745 void CloseWindow(HWND* window) { | |
| 746 if (window) | |
| 747 PostMessage(*window, WM_CLOSE, 0, 0); | |
| 748 } | |
| 749 | |
| 750 // See bug http://crbug.com/36694 | |
| 751 // This test does the following:- | |
| 752 // Navigates IE to a URL which in ChromeFrame. | |
| 753 // Performs a top level form post in the document | |
| 754 // In response to the POST we send over an attachment via the | |
| 755 // content-disposition header. | |
| 756 // IE brings up a file open dialog in this context. | |
| 757 // We bring up the Save dialog via accessibility and save the file | |
| 758 // and validate that all is well. | |
| 759 TEST_F(FullTabDownloadTest, CF_DownloadFileFromPost) { | |
| 760 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
| 761 // for more information on why this test is disabled for Vista with IE7. | |
| 762 if (base::win::GetVersion() >= base::win::VERSION_VISTA) { | |
| 763 if (GetInstalledIEVersion() == IE_7) { | |
| 764 LOG(INFO) << "Not running test on Vista with IE7"; | |
| 765 return; | |
| 766 } else if (GetInstalledIEVersion() == IE_9) { | |
| 767 LOG(INFO) << "Not running test on Vista/Windows 7 with IE9"; | |
| 768 return; | |
| 769 } | |
| 770 } | |
| 771 | |
| 772 chrome_frame_test::MockWindowObserver download_watcher; | |
| 773 download_watcher.WatchWindow("File Download", ""); | |
| 774 | |
| 775 chrome_frame_test::MockWindowObserver save_dialog_watcher; | |
| 776 save_dialog_watcher.WatchWindow("Save As", ""); | |
| 777 | |
| 778 testing::StrictMock<MockIEEventSink> download_window_mock; | |
| 779 | |
| 780 EXPECT_CALL(server_mock_, Get(_, StrEq(L"/post_source.html"), _)).WillOnce( | |
| 781 SendFast( | |
| 782 "HTTP/1.1 200 OK\r\n" | |
| 783 "Content-Type: text/html\r\n", | |
| 784 "<html>" | |
| 785 "<head><meta http-equiv=\"x-ua-compatible\" content=\"chrome=1\" />" | |
| 786 " <script type=\"text/javascript\">" | |
| 787 " function onLoad() {" | |
| 788 " document.getElementById(\"myform\").submit();}</script></head>" | |
| 789 " <body onload=\"setTimeout(onLoad, 2000);\">" | |
| 790 " <form id=\"myform\" action=\"post_target.html\" method=\"POST\">" | |
| 791 "</form></body></html>")); | |
| 792 | |
| 793 EXPECT_CALL(server_mock_, Post(_, StrEq(L"/post_target.html"), _)) | |
| 794 .Times(2) | |
| 795 .WillRepeatedly( | |
| 796 SendFast( | |
| 797 "HTTP/1.1 200 OK\r\n" | |
| 798 "content-disposition: attachment;filename=\"hello.txt\"\r\n" | |
| 799 "Content-Type: application/text\r\n" | |
| 800 "Cache-Control: private\r\n", | |
| 801 "hello")); | |
| 802 | |
| 803 // If you want to debug this action then you may need to | |
| 804 // SendMessage(parent_window, WM_NCACTIVATE, TRUE, 0); | |
| 805 // SendMessage(parent_window, WM_COMMAND, MAKEWPARAM(0x114B, BN_CLICKED), | |
| 806 // control_window); | |
| 807 // For the uninitiated, please debug IEFrame!CDialogActivateGuard::* | |
| 808 EXPECT_CALL(download_watcher, OnWindowOpen(_)) | |
| 809 .Times(2) | |
| 810 .WillOnce(DelayAccDoDefaultAction( | |
| 811 AccObjectMatcher(L"Save", L"push button"), | |
| 812 1000)) | |
| 813 .WillOnce(testing::Return()); | |
| 814 | |
| 815 EXPECT_CALL(download_watcher, OnWindowClose(_)) | |
| 816 .Times(testing::AnyNumber()); | |
| 817 | |
| 818 std::wstring src_url = server_mock_.Resolve(L"/post_source.html"); | |
| 819 std::wstring tgt_url = server_mock_.Resolve(L"/post_target.html"); | |
| 820 | |
| 821 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 822 | |
| 823 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, | |
| 824 testing::Field(&VARIANT::bstrVal, | |
| 825 StrEq(src_url)), _, _, _, _, _)); | |
| 826 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 827 testing::Field(&VARIANT::bstrVal, | |
| 828 StrEq(src_url)))); | |
| 829 EXPECT_CALL(ie_mock_, OnLoad(true, StrEq(src_url))) | |
| 830 .Times(testing::AnyNumber()); | |
| 831 | |
| 832 ie_mock_.ExpectNewWindow(&download_window_mock); | |
| 833 EXPECT_CALL(ie_mock_, OnLoadError(StrEq(tgt_url))) | |
| 834 .Times(testing::AnyNumber()); | |
| 835 | |
| 836 EXPECT_CALL(download_window_mock, OnFileDownload(_, _)) | |
| 837 .Times(testing::AnyNumber()); | |
| 838 EXPECT_CALL(download_window_mock, OnLoadError(StrEq(tgt_url))) | |
| 839 .Times(testing::AtMost(1)); | |
| 840 EXPECT_CALL(download_window_mock, OnBeforeNavigate2(_, | |
| 841 testing::Field(&VARIANT::bstrVal, | |
| 842 StrEq(tgt_url)), _, _, _, _, _)); | |
| 843 EXPECT_CALL(download_window_mock, OnLoad(false, _)); | |
| 844 EXPECT_CALL(download_window_mock, OnQuit()).Times(testing::AtMost(1)); | |
| 845 | |
| 846 base::FilePath temp_file_path; | |
| 847 ASSERT_TRUE(base::CreateTemporaryFile(&temp_file_path)); | |
| 848 file_util::DieFileDie(temp_file_path, false); | |
| 849 | |
| 850 temp_file_path = temp_file_path.ReplaceExtension(L"txt"); | |
| 851 file_util::DieFileDie(temp_file_path, false); | |
| 852 | |
| 853 AccObjectMatcher file_name_box(L"File name:", L"editable text"); | |
| 854 | |
| 855 HWND owner_window = NULL; | |
| 856 | |
| 857 EXPECT_CALL(save_dialog_watcher, OnWindowOpen(_)) | |
| 858 .WillOnce(testing::DoAll( | |
| 859 testing::Invoke(testing::CreateFunctor( | |
| 860 SaveOwnerWindow, &owner_window)), | |
| 861 AccSendCharMessage(file_name_box, L'a'), | |
| 862 AccSetValue(file_name_box, temp_file_path.value()), | |
| 863 AccDoDefaultAction(AccObjectMatcher(L"Save", L"push button")))); | |
| 864 | |
| 865 EXPECT_CALL(save_dialog_watcher, OnWindowClose(_)) | |
| 866 .WillOnce(testing::DoAll( | |
| 867 WaitForFileSave(temp_file_path, 3000), | |
| 868 testing::InvokeWithoutArgs( | |
| 869 testing::CreateFunctor(CloseWindow, &owner_window)), | |
| 870 CloseBrowserMock(&ie_mock_))); | |
| 871 LaunchIENavigateAndLoop(src_url, kChromeFrameVeryLongNavigationTimeout); | |
| 872 | |
| 873 std::string data; | |
| 874 EXPECT_TRUE(base::ReadFileToString(temp_file_path, &data)); | |
| 875 EXPECT_EQ("hello", data); | |
| 876 file_util::DieFileDie(temp_file_path, false); | |
| 877 } | |
| 878 | |
| 879 // Test fixture for testing if http header works for supported content types | |
| 880 class HttpHeaderTest : public MockIEEventSinkTest, public testing::Test { | |
| 881 public: | |
| 882 HttpHeaderTest() {} | |
| 883 | |
| 884 void HeaderTestWithData(const char* content_type, const char* data) { | |
| 885 const wchar_t* relative_url = L"/header_test"; | |
| 886 const char* kHeaderFormat = | |
| 887 "HTTP/1.1 200 OK\r\n" | |
| 888 "Connection: close\r\n" | |
| 889 "Content-Type: %s\r\n" | |
| 890 "X-UA-Compatible: chrome=1\r\n"; | |
| 891 std::string header = base::StringPrintf(kHeaderFormat, content_type); | |
| 892 std::wstring url = server_mock_.Resolve(relative_url); | |
| 893 EXPECT_CALL(server_mock_, Get(_, StrEq(relative_url), _)) | |
| 894 .WillRepeatedly(SendFast(header, data)); | |
| 895 | |
| 896 InSequence expect_in_sequence_for_scope; | |
| 897 | |
| 898 ie_mock_.ExpectNavigation(IN_CF, url); | |
| 899 EXPECT_CALL(ie_mock_, OnLoad(IN_CF, StrEq(url))) | |
| 900 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 901 | |
| 902 LaunchIEAndNavigate(url); | |
| 903 } | |
| 904 }; | |
| 905 | |
| 906 const char* kXmlContent = | |
| 907 "<tree>" | |
| 908 "<node href=\"root.htm\" text=\"Root\">" | |
| 909 "<node href=\"child1.htm\" text=\"Child 1\" />" | |
| 910 "<node href=\"child2.htm\" text=\"Child 2\" />" | |
| 911 "</node>" | |
| 912 "</tree>"; | |
| 913 | |
| 914 TEST_F(HttpHeaderTest, ApplicationXhtml) { | |
| 915 HeaderTestWithData("application/xhtml+xml", kXmlContent); | |
| 916 } | |
| 917 | |
| 918 TEST_F(HttpHeaderTest, ApplicationXml) { | |
| 919 HeaderTestWithData("application/xml", kXmlContent); | |
| 920 } | |
| 921 | |
| 922 TEST_F(HttpHeaderTest, TextXml) { | |
| 923 HeaderTestWithData("text/xml", kXmlContent); | |
| 924 } | |
| 925 | |
| 926 const char* kImageSvg = | |
| 927 "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\" " | |
| 928 "\"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">" | |
| 929 "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"100%\" height=\"100%\">" | |
| 930 "<rect height=\"100\" width=\"300\" " | |
| 931 "style=\"fill:rgb(0,0,255);stroke-width:2;\"/>" | |
| 932 "</svg>"; | |
| 933 | |
| 934 TEST_F(HttpHeaderTest, DISABLED_ImageSvg) { | |
| 935 HeaderTestWithData("image/svg", kImageSvg); | |
| 936 } | |
| 937 | |
| 938 TEST_F(HttpHeaderTest, ImageSvgXml) { | |
| 939 HeaderTestWithData("image/svg+xml", kImageSvg); | |
| 940 } | |
| 941 | |
| 942 // Tests refreshing causes a page load. | |
| 943 TEST_P(FullTabNavigationTest, RefreshContents) { | |
| 944 bool in_cf = GetParam().invokes_cf(); | |
| 945 if (!in_cf) { | |
| 946 VLOG(1) << "Disabled for this configuration"; | |
| 947 return; | |
| 948 } | |
| 949 | |
| 950 const char kHeaders[] = | |
| 951 "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n" | |
| 952 "X-UA-Compatible: chrome=1\r\nCache-control: no-cache\r\n"; | |
| 953 | |
| 954 const char kBody[] = "<html><body>Hi there. Got new content?" | |
| 955 "</body></html>"; | |
| 956 | |
| 957 std::wstring src_url = server_mock_.Resolve(L"/refresh_src.html"); | |
| 958 | |
| 959 EXPECT_CALL(server_mock_, Get(_, StrEq(L"/refresh_src.html"), _)) | |
| 960 .Times(2) | |
| 961 .WillRepeatedly(SendFast(kHeaders, kBody)); | |
| 962 | |
| 963 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 964 | |
| 965 EXPECT_CALL(ie_mock_, | |
| 966 OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 967 StrEq(src_url)), | |
| 968 _, _, _, _, _)); | |
| 969 EXPECT_CALL(ie_mock_, | |
| 970 OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal, | |
| 971 StrEq(src_url)))); | |
| 972 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(src_url))) | |
| 973 .Times(2) | |
| 974 .WillOnce(DelayRefresh( | |
| 975 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(50))) | |
| 976 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 977 | |
| 978 LaunchIENavigateAndLoop(src_url, kChromeFrameVeryLongNavigationTimeout); | |
| 979 } | |
| 980 | |
| 981 class FullTabSeleniumTest | |
| 982 : public MockIEEventSinkTest, public testing::TestWithParam<CFInvocation> { | |
| 983 public: | |
| 984 FullTabSeleniumTest() | |
| 985 : MockIEEventSinkTest(1337, L"127.0.0.1", GetSeleniumTestFolder()) {} | |
| 986 }; | |
| 987 | |
| 988 ACTION(VerifySeleniumCoreTestResults) { | |
| 989 int num_tests = 0; | |
| 990 int failed_tests = 0; | |
| 991 | |
| 992 swscanf(arg0, L"%d/%d", &num_tests, &failed_tests); | |
| 993 | |
| 994 // Currently we run total 505 tests and 8 steps fail. | |
| 995 // TODO(amit): send results as JSON, diagnose and eliminate failures. | |
| 996 EXPECT_LE(failed_tests, 15) << "Expected failures: " << 15 << | |
| 997 " Actual failures: " << failed_tests; | |
| 998 EXPECT_GE(num_tests, 500) << "Expected to run: " << 500 << " tests." << | |
| 999 " Actual number of tests run: " << num_tests; | |
| 1000 } | |
| 1001 | |
| 1002 // Crashes flakily: http://crbug.com/109114 | |
| 1003 // Tests refreshing causes a page load. | |
| 1004 TEST_F(FullTabSeleniumTest, DISABLED_Core) { | |
| 1005 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
| 1006 // for more information on why this test is disabled for Vista with IE7. | |
| 1007 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
| 1008 GetInstalledIEVersion() == IE_7) { | |
| 1009 LOG(INFO) << "Not running test on Vista with IE7"; | |
| 1010 return; | |
| 1011 } | |
| 1012 | |
| 1013 server_mock_.ExpectAndServeAnyRequests(CFInvocation::HttpHeader()); | |
| 1014 std::wstring url = GetTestUrl(L"core/TestRunner.html"); | |
| 1015 | |
| 1016 // Expectations for TestRunner.html | |
| 1017 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 1018 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, | |
| 1019 testing::Field(&VARIANT::bstrVal, | |
| 1020 testing::StartsWith(url)), _, _, _, _, _)) | |
| 1021 .Times(testing::AnyNumber()); | |
| 1022 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 1023 testing::Field(&VARIANT::bstrVal, | |
| 1024 testing::StartsWith(url)))) | |
| 1025 .Times(testing::AnyNumber()); | |
| 1026 EXPECT_CALL(ie_mock_, OnLoad(true, testing::StartsWith(url))) | |
| 1027 .Times(testing::AnyNumber()); | |
| 1028 | |
| 1029 // Expectation for cookie test | |
| 1030 EXPECT_CALL(ie_mock_, OnLoadError(testing::StartsWith(url))) | |
| 1031 .Times(testing::AtMost(3)); | |
| 1032 | |
| 1033 // Expectations for popups | |
| 1034 std::wstring attach_url_prefix = GetTestUrl(L"?attach_external_tab&"); | |
| 1035 EXPECT_CALL(ie_mock_, OnNewWindow3(_, _, _, _, | |
| 1036 testing::StartsWith(attach_url_prefix))) | |
| 1037 .Times(testing::AnyNumber()); | |
| 1038 EXPECT_CALL(ie_mock_, OnNewBrowserWindow(_, | |
| 1039 testing::StartsWith(attach_url_prefix))) | |
| 1040 .Times(testing::AnyNumber()); | |
| 1041 | |
| 1042 // At the end the tests will post us a message. See _onTestSuiteComplete in | |
| 1043 // ...\src\data\selenium_core\core\scripts\selenium-testrunner.js | |
| 1044 EXPECT_CALL(ie_mock_, OnMessage(_, _, _)) | |
| 1045 .WillOnce(testing::DoAll(VerifySeleniumCoreTestResults(), | |
| 1046 CloseBrowserMock(&ie_mock_))); | |
| 1047 | |
| 1048 // Selenium tests take longer to finish, lets give it 2 mins. | |
| 1049 const base::TimeDelta kSeleniumTestTimeout = base::TimeDelta::FromMinutes(2); | |
| 1050 LaunchIENavigateAndLoop(url, kSeleniumTestTimeout); | |
| 1051 } | |
| 1052 | |
| 1053 // See bug http://code.google.com/p/chromium/issues/detail?id=64901 | |
| 1054 // This test does the following:- | |
| 1055 // Navigates IE to a non ChromeFrame URL. | |
| 1056 // Performs a top level form post in the document | |
| 1057 // In response to the POST send over a html document containing a meta tag | |
| 1058 // This would cause IE to switch to ChromeFrame. | |
| 1059 // Refresh the page in ChromeFrame. | |
| 1060 // This should bring up a confirmation dialog which we hit yes on. This should | |
| 1061 // reissue the top level post request in response to which the html content | |
| 1062 // containing the meta tag is sent again. | |
| 1063 TEST_F(FullTabDownloadTest, TopLevelPostReissueFromChromeFramePage) { | |
| 1064 chrome_frame_test::MockWindowObserver post_reissue_watcher; | |
| 1065 post_reissue_watcher.WatchWindow("Confirm Form Resubmission", ""); | |
| 1066 | |
| 1067 EXPECT_CALL(server_mock_, Get(_, StrEq(L"/post_source.html"), _)) | |
| 1068 .WillOnce(SendFast( | |
| 1069 "HTTP/1.1 200 OK\r\n" | |
| 1070 "Content-Type: text/html\r\n", | |
| 1071 "<html>" | |
| 1072 "<head>" | |
| 1073 " <script type=\"text/javascript\">" | |
| 1074 " function onLoad() {" | |
| 1075 " document.getElementById(\"myform\").submit();}</script></head>" | |
| 1076 " <body onload=\"setTimeout(onLoad, 2000);\">" | |
| 1077 " <form id=\"myform\" action=\"post_target.html\" method=\"POST\">" | |
| 1078 "</form></body></html>")); | |
| 1079 | |
| 1080 EXPECT_CALL(server_mock_, Post(_, StrEq(L"/post_target.html"), _)) | |
| 1081 .Times(2) | |
| 1082 .WillRepeatedly( | |
| 1083 SendFast( | |
| 1084 "HTTP/1.1 200 OK\r\n" | |
| 1085 "Content-Type: text/html\r\n", | |
| 1086 "<html>" | |
| 1087 "<head><meta http-equiv=\"x-ua-compatible\" content=\"chrome=1\" />" | |
| 1088 "</head>" | |
| 1089 "<body> Target page in ChromeFrame </body>" | |
| 1090 "</html>")); | |
| 1091 | |
| 1092 EXPECT_CALL(post_reissue_watcher, OnWindowOpen(_)) | |
| 1093 .WillOnce(DelayAccDoDefaultAction( | |
| 1094 AccObjectMatcher(L"Yes", L"push button"), | |
| 1095 1000)); | |
| 1096 | |
| 1097 EXPECT_CALL(post_reissue_watcher, OnWindowClose(_)); | |
| 1098 | |
| 1099 std::wstring src_url = server_mock_.Resolve(L"/post_source.html"); | |
| 1100 std::wstring tgt_url = server_mock_.Resolve(L"/post_target.html"); | |
| 1101 | |
| 1102 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 1103 | |
| 1104 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, | |
| 1105 testing::Field(&VARIANT::bstrVal, | |
| 1106 StrEq(src_url)), _, _, _, _, _)); | |
| 1107 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 1108 testing::Field(&VARIANT::bstrVal, | |
| 1109 StrEq(src_url)))); | |
| 1110 EXPECT_CALL(ie_mock_, OnLoad(false, StrEq(src_url))); | |
| 1111 | |
| 1112 EXPECT_CALL(ie_mock_, OnLoad(true, StrEq(tgt_url))) | |
| 1113 .Times(2) | |
| 1114 .WillOnce(DelayRefresh( | |
| 1115 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(50))) | |
| 1116 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 1117 | |
| 1118 EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, | |
| 1119 testing::Field(&VARIANT::bstrVal, | |
| 1120 StrEq(tgt_url)), _, _, _, _, _)) | |
| 1121 .Times(2); | |
| 1122 | |
| 1123 EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, | |
| 1124 testing::Field(&VARIANT::bstrVal, | |
| 1125 StrEq(tgt_url)))) | |
| 1126 .Times(2); | |
| 1127 | |
| 1128 LaunchIENavigateAndLoop(src_url, kChromeFrameVeryLongNavigationTimeout); | |
| 1129 } | |
| 1130 | |
| 1131 MATCHER_P(UserAgentHeaderMatcher, ua_string, "") { | |
| 1132 std::string headers = arg.headers(); | |
| 1133 StringToUpperASCII(&headers); | |
| 1134 | |
| 1135 std::string ua_string_to_search = ua_string; | |
| 1136 StringToUpperASCII(&ua_string_to_search); | |
| 1137 | |
| 1138 net::HttpUtil::HeadersIterator it(headers.begin(), headers.end(), | |
| 1139 "\r\n"); | |
| 1140 while (it.GetNext()) { | |
| 1141 if (lstrcmpiA(it.name().c_str(), "User-Agent") == 0) { | |
| 1142 if (it.values().find(ua_string_to_search) != std::string::npos) | |
| 1143 return true; | |
| 1144 } | |
| 1145 } | |
| 1146 return false; | |
| 1147 } | |
| 1148 | |
| 1149 // Tests refreshing causes a page load and that the chrome frame user agent | |
| 1150 // string is appended to the UA in the incoming top level HTTP requests. | |
| 1151 TEST_P(FullTabNavigationTest, RefreshContentsUATest) { | |
| 1152 const char kBody[] = "<html><head></head>" | |
| 1153 "<body>Hi there. Got new content?" | |
| 1154 "</body></html>"; | |
| 1155 | |
| 1156 std::string headers = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n" | |
| 1157 "Cache-control: no-cache\r\n"; | |
| 1158 bool in_cf = GetParam().invokes_cf(); | |
| 1159 if (in_cf) { | |
| 1160 headers.append("X-UA-Compatible: chrome=1\r\n"); | |
| 1161 } else { | |
| 1162 if (GetInstalledIEVersion() == IE_9) { | |
| 1163 LOG(ERROR) << "Test disabled for IE9"; | |
| 1164 return; | |
| 1165 } | |
| 1166 } | |
| 1167 | |
| 1168 std::wstring src_url = server_mock_.Resolve(L"/refresh_src.html"); | |
| 1169 | |
| 1170 if (in_cf) { | |
| 1171 // In the case of Chrome Frame, end the test when the second OnLoad is | |
| 1172 // fired. | |
| 1173 EXPECT_CALL(server_mock_, Get(_, StrEq(L"/refresh_src.html"), | |
| 1174 UserAgentHeaderMatcher("chromeframe"))) | |
| 1175 .Times(2) | |
| 1176 .WillRepeatedly(SendFast(headers, kBody)); | |
| 1177 } else { | |
| 1178 // In the case of IE, we never receive a second OnLoad event, so end the | |
| 1179 // test when the second request is made on the server. | |
| 1180 EXPECT_CALL(server_mock_, Get(_, StrEq(L"/refresh_src.html"), | |
| 1181 UserAgentHeaderMatcher("chromeframe"))) | |
| 1182 .Times(2) | |
| 1183 .WillOnce(SendFast(headers, kBody)) | |
| 1184 .WillOnce(testing::DoAll( | |
| 1185 SendFast(headers, kBody), | |
| 1186 CloseBrowserMock(&ie_mock_))); | |
| 1187 } | |
| 1188 | |
| 1189 EXPECT_CALL(ie_mock_, OnFileDownload(_, _)).Times(testing::AnyNumber()); | |
| 1190 | |
| 1191 EXPECT_CALL(ie_mock_, | |
| 1192 OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 1193 StrEq(src_url)), | |
| 1194 _, _, _, _, _)); | |
| 1195 EXPECT_CALL(ie_mock_, | |
| 1196 OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal, | |
| 1197 StrEq(src_url)))); | |
| 1198 if (in_cf) { | |
| 1199 // As mentioned above, end the test once the refreshed document is loaded. | |
| 1200 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(src_url))) | |
| 1201 .Times(2) | |
| 1202 .WillOnce(DelayRefresh( | |
| 1203 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(50))) | |
| 1204 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 1205 } else { | |
| 1206 // As mentioned above, we only receive an OnLoad for the intial load, not | |
| 1207 // for the refresh. | |
| 1208 EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(src_url))) | |
| 1209 .WillOnce(DelayRefresh( | |
| 1210 &ie_mock_, &loop_, base::TimeDelta::FromMilliseconds(50))); | |
| 1211 } | |
| 1212 | |
| 1213 LaunchIENavigateAndLoop(src_url, kChromeFrameVeryLongNavigationTimeout); | |
| 1214 } | |
| 1215 | |
| 1216 // Link navigations in the same domain specified with the noreferrer flag | |
| 1217 // should be opened in the host browser. | |
| 1218 TEST_F(FullTabNavigationTest, JavascriptWindowOpenNoReferrerOpensInHost) { | |
| 1219 // Please see http://code.google.com/p/chromium/issues/detail?id=60987 | |
| 1220 // for more information on why this test is disabled for Vista with IE7. | |
| 1221 if (base::win::GetVersion() == base::win::VERSION_VISTA && | |
| 1222 GetInstalledIEVersion() == IE_7) { | |
| 1223 LOG(INFO) << "Not running test on Vista with IE7"; | |
| 1224 return; | |
| 1225 } | |
| 1226 | |
| 1227 MockAccEventObserver acc_observer; | |
| 1228 EXPECT_CALL(acc_observer, OnAccDocLoad(_)).Times(testing::AnyNumber()); | |
| 1229 | |
| 1230 testing::StrictMock<MockIEEventSink> new_window_mock; | |
| 1231 testing::StrictMock<MockIEEventSink> | |
| 1232 no_referrer_target_opener_window_mock; | |
| 1233 | |
| 1234 std::wstring initial_url = | |
| 1235 GetWindowOpenUrl(L"open_href_target_no_referrer.html"); | |
| 1236 | |
| 1237 std::wstring parent_url = GetTestUrl( | |
| 1238 L"open_href_target_no_referrer.html"); | |
| 1239 | |
| 1240 std::wstring new_window_url = GetSimplePageUrl(); | |
| 1241 | |
| 1242 ie_mock_.ExpectNavigation(false, initial_url); | |
| 1243 EXPECT_CALL(ie_mock_, OnLoad(false, StrEq(initial_url))); | |
| 1244 | |
| 1245 EXPECT_CALL(acc_observer, | |
| 1246 OnAccDocLoad(TabContentsTitleEq(initial_url, | |
| 1247 GetWindowOpenTitle()))) | |
| 1248 .WillOnce(AccLeftClick(AccObjectMatcher())) | |
| 1249 .RetiresOnSaturation(); | |
| 1250 | |
| 1251 ie_mock_.ExpectNewWindow(&no_referrer_target_opener_window_mock); | |
| 1252 | |
| 1253 no_referrer_target_opener_window_mock.ExpectNavigation(true, parent_url); | |
| 1254 | |
| 1255 server_mock_.ExpectAndServeRequest(CFInvocation::MetaTag(), parent_url); | |
| 1256 server_mock_.ExpectAndServeRequest(CFInvocation::None(), new_window_url); | |
| 1257 server_mock_.ExpectAndServeRequest(CFInvocation::None(), initial_url); | |
| 1258 | |
| 1259 EXPECT_CALL(no_referrer_target_opener_window_mock, | |
| 1260 OnLoad(false, StrEq(parent_url))) | |
| 1261 .Times(testing::AnyNumber()); | |
| 1262 | |
| 1263 EXPECT_CALL(no_referrer_target_opener_window_mock, | |
| 1264 OnLoad(true, StrEq(parent_url))) | |
| 1265 .WillOnce(DelayAccDoDefaultActionInRenderer( | |
| 1266 &no_referrer_target_opener_window_mock, | |
| 1267 AccObjectMatcher(L"", L"link"), 1000)); | |
| 1268 | |
| 1269 // The parent window is in CF and opens a child window with the no referrer | |
| 1270 // flag in which case it should open in IE. | |
| 1271 no_referrer_target_opener_window_mock.ExpectNewWindow(&new_window_mock); | |
| 1272 new_window_mock.ExpectNavigation(false, new_window_url); | |
| 1273 | |
| 1274 EXPECT_CALL(new_window_mock, OnFileDownload(_, _)) | |
| 1275 .Times(testing::AnyNumber()); | |
| 1276 | |
| 1277 EXPECT_CALL(new_window_mock, | |
| 1278 OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal, | |
| 1279 testing::HasSubstr(L"attach")), | |
| 1280 _, _, _, _, _)); | |
| 1281 EXPECT_CALL(new_window_mock, | |
| 1282 OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal, | |
| 1283 testing::HasSubstr(L"attach")))) | |
| 1284 .Times(testing::AtMost(1)); | |
| 1285 | |
| 1286 EXPECT_CALL(new_window_mock, OnLoad(false, StrEq(new_window_url))) | |
| 1287 .WillOnce(CloseBrowserMock(&new_window_mock)); | |
| 1288 | |
| 1289 EXPECT_CALL(new_window_mock, OnQuit()) | |
| 1290 .WillOnce(CloseBrowserMock( | |
| 1291 &no_referrer_target_opener_window_mock)); | |
| 1292 | |
| 1293 EXPECT_CALL(no_referrer_target_opener_window_mock, OnQuit()) | |
| 1294 .WillOnce(CloseBrowserMock(&ie_mock_)); | |
| 1295 | |
| 1296 LaunchIENavigateAndLoop(initial_url, kChromeFrameVeryLongNavigationTimeout); | |
| 1297 } | |
| 1298 | |
| 1299 } // namespace chrome_frame_test | |
| OLD | NEW |