Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(154)

Side by Side Diff: chrome_frame/test/navigation_test.cc

Issue 126143005: Remove Chrome Frame code and resources. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: sync to r244038 Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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
OLDNEW
« no previous file with comments | « chrome_frame/test/mock_ie_event_sink_test.cc ('k') | chrome_frame/test/net/fake_external_tab.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698