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

Unified Diff: chrome_frame/test/navigation_test.cc

Issue 2822016: [chrome_frame] Refactor/merge IE no interference tests with other mock event ... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « chrome_frame/test/mock_ie_event_sink_test.cc ('k') | chrome_frame/test/no_interference_test.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome_frame/test/navigation_test.cc
===================================================================
--- chrome_frame/test/navigation_test.cc (revision 0)
+++ chrome_frame/test/navigation_test.cc (revision 0)
@@ -0,0 +1,638 @@
+// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <string>
+
+#include "base/scoped_comptr_win.h"
+#include "base/win_util.h"
+#include "chrome_frame/test/chrome_frame_test_utils.h"
+#include "chrome_frame/test/mock_ie_event_sink_actions.h"
+#include "chrome_frame/test/mock_ie_event_sink_test.h"
+
+// Needed for CreateFunctor.
+#define GMOCK_MUTANT_INCLUDE_LATE_OBJECT_BINDING
+#include "testing/gmock_mutant.h"
+
+using testing::_;
+using testing::InSequence;
+using testing::StrEq;
+
+namespace chrome_frame_test {
+
+const wchar_t tab_enter_keys[] = { VK_TAB, VK_RETURN, 0 };
+
+// Test fixture for navigation-related tests. Each test is run thrice: IE, CF
+// with meta tag invocation, and CF with http header invocation. This is
+// accomplished by using gTest's parameterized test.
+class FullTabNavigationTest
+ : public MockIEEventSinkTest, public testing::TestWithParam<CFInvocation> {
+ public:
+ FullTabNavigationTest() {}
+};
+
+// Instantiate each test case. Instead of doing in one statement, it is split
+// into three so gTest prints nicer names.
+INSTANTIATE_TEST_CASE_P(IE, FullTabNavigationTest, testing::Values(
+ CFInvocation(CFInvocation::NONE)));
+INSTANTIATE_TEST_CASE_P(MetaTag, FullTabNavigationTest, testing::Values(
+ CFInvocation(CFInvocation::META_TAG)));
+INSTANTIATE_TEST_CASE_P(HttpHeader, FullTabNavigationTest, testing::Values(
+ CFInvocation(CFInvocation::HTTP_HEADER)));
+
+// This tests navigation to a typed URL.
+TEST_P(FullTabNavigationTest, FLAKY_TypeUrl) {
+ ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl());
+ server_mock_.ExpectAndServeRequest(CFInvocation::None(), GetSimplePageUrl());
+ EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ TypeUrlInAddressBar(&loop_, GetAnchorPageUrl(0), 2000)));
+
+ bool in_cf = GetParam().invokes_cf();
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(0));
+ server_mock_.ExpectAndServeRequest(GetParam(), GetAnchorPageUrl(0));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(0))))
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(GetSimplePageUrl());
+}
+
+// This tests navigation to a typed URL containing an fragment.
+TEST_P(FullTabNavigationTest, FLAKY_TypeAnchorUrl) {
+ if (IsIBrowserServicePatchEnabled()) {
+ LOG(ERROR) << "Not running test. IBrowserServicePatch is in place.";
+ return;
+ }
+
+ ie_mock_.ExpectNavigation(IN_IE, GetSimplePageUrl());
+ server_mock_.ExpectAndServeRequest(CFInvocation::None(), GetSimplePageUrl());
+ EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ TypeUrlInAddressBar(&loop_, GetAnchorPageUrl(1), 2000)));
+
+ bool in_cf = GetParam().invokes_cf();
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(1));
+ server_mock_.ExpectAndServeRequest(GetParam(), GetAnchorPageUrl(1));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1))))
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(GetSimplePageUrl());
+}
+
+// Tests refreshing when a cached copy is available.
+TEST_P(FullTabNavigationTest, FLAKY_RefreshWithCachedCopy) {
+ if (GetInstalledIEVersion() == IE_7) {
+ LOG(ERROR) << "Test disabled for this configuration.";
+ return;
+ }
+ bool in_cf = GetParam().invokes_cf();
+ ie_mock_.ExpectAnyNavigations();
+ InSequence expect_in_scope_for_sequence;
+
+ testing::Cardinality initial_req_cardinality = testing::Exactly(1);
+ // TODO(kkania): Remove this allowance for double request on meta tag when no
+ // longer necessary.
+ if (GetParam().type() == CFInvocation::META_TAG)
+ initial_req_cardinality = testing::Between(1, 2);
+ EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetSimplePageUrl()), _))
+ .Times(initial_req_cardinality)
+ .WillRepeatedly(SendAllowCacheResponse(&server_mock_, GetParam()));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ DelayRefresh(&ie_mock_, &loop_, 0)));
+
+ if (in_cf) {
+ // For some reason IE7 requests the resource again.
+ if (GetInstalledIEVersion() == IE_7) {
+ server_mock_.ExpectAndServeRequest(GetParam(), GetSimplePageUrl());
+ }
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ CloseBrowserMock(&ie_mock_)));
+ } else {
+ // For some reason IE still requests the resource again, but does not
+ // trigger another load.
+ EXPECT_CALL(server_mock_, Get(_, UrlPathEq(GetSimplePageUrl()), _))
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+ }
+
+ LaunchIEAndNavigate(GetSimplePageUrl());
+}
+
+// Test that multiple back and forward requests work.
+TEST_P(FullTabNavigationTest, FLAKY_MultipleBackForward) {
+ std::wstring page1 = GetSimplePageUrl();
+ std::wstring page2 = GetLinkPageUrl();
+ std::wstring page3 = GetAnchorPageUrl(0);
+ bool in_cf = GetParam().invokes_cf();
+ server_mock_.ExpectAndServeAnyRequests(GetParam());
+ InSequence expect_in_sequence_for_scope;
+
+ // Navigate to url 2 after the previous navigation is complete.
+ ie_mock_.ExpectNavigation(in_cf, page1);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ Navigate(&ie_mock_, page2)));
+
+ // Navigate to url 3 after the previous navigation is complete.
+ ie_mock_.ExpectNavigation(in_cf, page2);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ Navigate(&ie_mock_, page3)));
+
+ // We have reached url 3 and have two back entries for url 1 & 2.
+ // Go back to url 2 now.
+ ie_mock_.ExpectNavigation(in_cf, page3);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page3)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoBack(&ie_mock_, &loop_, 0)));
+
+ // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3.
+ // Go back to url 1 now.
+ ie_mock_.ExpectNavigation(in_cf, page2);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoBack(&ie_mock_, &loop_, 0)));
+
+ // We have reached url 1 and have 0 back & 2 forward entries for url 2 & 3.
+ // Go forward to url 2 now.
+ ie_mock_.ExpectNavigation(in_cf, page1);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page1)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoForward(&ie_mock_, &loop_, 0)));
+
+ // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3.
+ // Go forward to url 3 now.
+ ie_mock_.ExpectNavigation(in_cf, page2);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page2)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoForward(&ie_mock_, &loop_, 0)));
+
+ // We have reached url 2 and have 1 back & 1 forward entries for url 1 & 3.
+ ie_mock_.ExpectNavigation(in_cf, page3);
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(page3)))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ CloseBrowserMock(&ie_mock_)));
+
+ LaunchIEAndNavigate(page1);
+}
+
+// Test multiple back and forward operations among urls with anchors.
+// Marking this test FLAKY as it fails at times on the buildbot.
+// http://code.google.com/p/chromium/issues/detail?id=26549
+TEST_P(FullTabNavigationTest, FLAKY_BackForwardAnchor) {
+ bool in_cf = GetParam().invokes_cf();
+ if (!in_cf) {
+ LOG(ERROR) << "Test not yet implemented.";
+ return;
+ }
+ server_mock_.ExpectAndServeAnyRequests(GetParam());
+ InSequence expect_in_sequence_for_scope;
+
+ // Navigate to anchor 1:
+ // - First set focus to chrome renderer window
+ // Call WebBrowserEventSink::SetFocusToRenderer only once
+ // in the beginning. Calling it again will change focus from the
+ // current location to an element near the simulated mouse click.
+ // - Then send keyboard input of TAB + ENTER to cause navigation.
+ // It's better to send input as PostDelayedTask since the Activex
+ // message loop_ on the other side might be blocked when we get
+ // called in Onload.
+ // Back/Forward state at this point:
+ // Back: 0
+ // Forward: 0
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(0));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(0))))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ DelaySendString(&loop_, 500, tab_enter_keys)));
+
+ // Navigate to anchor 2 after the previous navigation is complete
+ // Back/Forward state at this point:
+ // Back: 1 (kAnchorUrl)
+ // Forward: 0
+ ie_mock_.ExpectInPageNavigation(in_cf, GetAnchorPageUrl(1));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelaySendString(&loop_, 500, tab_enter_keys)));
+
+ // Navigate to anchor 3 after the previous navigation is complete
+ // Back/Forward state at this point:
+ // Back: 2 (kAnchorUrl, kAnchor1Url)
+ // Forward: 0
+ ie_mock_.ExpectInPageNavigation(in_cf, GetAnchorPageUrl(2));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelaySendString(&loop_, 500, tab_enter_keys)));
+
+ // We will reach anchor 3 once the navigation is complete,
+ // then go back to anchor 2
+ // Back/Forward state at this point:
+ // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url)
+ // Forward: 0
+ ie_mock_.ExpectInPageNavigation(in_cf, GetAnchorPageUrl(3));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(3))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoBack(&ie_mock_, &loop_, 0)));
+
+ // We will reach anchor 2 once the navigation is complete,
+ // then go back to anchor 1
+ // Back/Forward state at this point:
+ // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url)
+ // Forward: 1 (kAnchor3Url)
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(2));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoBack(&ie_mock_, &loop_, 0)));
+
+ // We will reach anchor 1 once the navigation is complete,
+ // now go forward to anchor 2
+ // Back/Forward state at this point:
+ // Back: 2 (kAnchorUrl, kAnchor1Url)
+ // Forward: 2 (kAnchor2Url, kAnchor3Url)
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(1));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(1))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoForward(&ie_mock_, &loop_, 0)));
+
+ // We have reached anchor 2, go forward to anchor 3 again
+ // Back/Forward state at this point:
+ // Back: 3 (kAnchorUrl, kAnchor1Url, kAnchor2Url)
+ // Forward: 1 (kAnchor3Url)
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(2));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(2))))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ DelayGoForward(&ie_mock_, &loop_, 0)));
+
+ // We have gone a few steps back and forward, this should be enough for now.
+ ie_mock_.ExpectNavigation(in_cf, GetAnchorPageUrl(3));
+ EXPECT_CALL(ie_mock_, OnLoad(in_cf, StrEq(GetAnchorPageUrl(3))))
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(GetAnchorPageUrl(0));
+}
+
+// Test that a user cannot navigate to a restricted site and that the security
+// dialog appears.
+TEST_P(FullTabNavigationTest, FLAKY_RestrictedSite) {
+ if (!GetParam().invokes_cf() || GetInstalledIEVersion() == IE_8) {
+ // Test has been disabled on IE8 bot because it hangs at times.
+ // http://crbug.com/47596
+ LOG(ERROR) << "Test disabled for this configuration.";
+ return;
+ }
+ if (IsIBrowserServicePatchEnabled()) {
+ LOG(ERROR) << "Not running test. IBrowserServicePatch is in place.";
+ return;
+ }
+ MockWindowObserver win_observer_mock;
+ ScopedComPtr<IInternetSecurityManager> security_manager;
+ HRESULT hr = security_manager.CreateInstance(CLSID_InternetSecurityManager);
+ ASSERT_HRESULT_SUCCEEDED(hr);
+ // Add the server to restricted sites zone.
+ hr = security_manager->SetZoneMapping(URLZONE_UNTRUSTED,
+ GetTestUrl(L"").c_str(), SZM_CREATE);
+
+ EXPECT_CALL(ie_mock_, OnFileDownload(_, _))
+ .Times(testing::AnyNumber());
+ server_mock_.ExpectAndServeAnyRequests(GetParam());
+
+ ProtocolPatchMethod patch_method = GetPatchMethod();
+
+ const wchar_t* kDialogClass = L"#32770";
+ const char* kAlertDlgCaption = "Security Alert";
+
+ EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_,
+ testing::Field(&VARIANT::bstrVal,
+ testing::StrCaseEq(GetSimplePageUrl())), _, _, _, _, _))
+ .Times(1)
+ .WillOnce(WatchWindow(&win_observer_mock, kDialogClass));
+
+ if (patch_method == PATCH_METHOD_INET_PROTOCOL) {
+ EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_,
+ testing::Field(&VARIANT::bstrVal,
+ testing::HasSubstr(L"res://")), _, _, _, _, _))
+ .Times(testing::AtMost(1));
+ }
+
+ EXPECT_CALL(ie_mock_, OnNavigateComplete2(_,
+ testing::Field(&VARIANT::bstrVal, StrEq(GetSimplePageUrl()))))
+ .Times(testing::AtMost(1));
+
+ EXPECT_CALL(win_observer_mock, OnWindowDetected(_, StrEq(kAlertDlgCaption)))
+ .Times(1)
+ .WillOnce(testing::DoAll(
+ DoCloseWindow(),
+ CloseBrowserMock(&ie_mock_)));
+
+ LaunchIEAndNavigate(GetSimplePageUrl());
+
+ ASSERT_HRESULT_SUCCEEDED(security_manager->SetZoneMapping(URLZONE_UNTRUSTED,
+ GetTestUrl(L"").c_str(), SZM_DELETE));
+}
+
+// This test checks if window.open calls with target blank issued for a
+// different domain make it back to IE instead of completing the navigation
+// within Chrome. We validate this by initiating a navigation to a non existent
+// url which ensures we would get an error during navigation.
+// Marking this disabled as it leaves behind Chrome processes, at least on
+// IE 6 XP (http://crbug.com/48732).
+TEST_P(FullTabNavigationTest, DISABLED_JavascriptWindowOpenDifferentDomain) {
+ if (!GetParam().invokes_cf() || GetInstalledIEVersion() == IE_7) {
+ LOG(ERROR) << "Test disabled for this configuration.";
+ return;
+ }
+ std::wstring parent_url =
+ GetTestUrl(L"window_open.html?http://www.nonexistent.com");
+ MockIEEventSink new_window_mock;
+ ie_mock_.ExpectAnyNavigations();
+ new_window_mock.ExpectAnyNavigations();
+ server_mock_.ExpectAndServeAnyRequests(GetParam());
+
+ EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(parent_url)))
+ .WillOnce(DelaySendDoubleClick(&ie_mock_, &loop_, 0, 10, 10));
+
+ ie_mock_.ExpectNewWindow(&new_window_mock);
+
+ EXPECT_CALL(new_window_mock, OnNavigateError(_, _, _, _, _))
+ .Times(1)
+ .WillOnce(CloseBrowserMock(&new_window_mock));
+
+ EXPECT_CALL(new_window_mock, OnLoad(_, _))
+ .Times(testing::AtMost(1));
+
+ EXPECT_CALL(new_window_mock, OnQuit())
+ .Times(1)
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ // OnNavigateError can take a long time to fire.
+ LaunchIENavigateAndLoop(parent_url,
+ kChromeFrameLongNavigationTimeoutInSeconds * 4);
+ ASSERT_TRUE(new_window_mock.event_sink()->web_browser2() != NULL);
+}
+
+// Tests that a page that calls window.open can then close the popup.
+// Marking this test as FLAKY initially as it relies on getting focus and user
+// input which don't work correctly at times.
+// http://code.google.com/p/chromium/issues/detail?id=26549
+TEST_P(FullTabNavigationTest, FLAKY_JavascriptWindowOpenCanClose) {
+ std::wstring parent_url =
+ GetTestUrl(L"window_open.html?simple.html");
+ MockIEEventSink new_window_mock;
+ ie_mock_.ExpectAnyNavigations();
+ new_window_mock.ExpectAnyNavigations();
+ server_mock_.ExpectAndServeAnyRequests(GetParam());
+
+ // Sending 'A' to the renderer should cause window.open then window.close.
+ EXPECT_CALL(ie_mock_, OnLoad(GetParam().invokes_cf(), StrEq(parent_url)))
+ .WillOnce(DelaySendDoubleClick(&ie_mock_, &loop_, 0, 10, 10));
+
+ ie_mock_.ExpectNewWindow(&new_window_mock);
+
+ EXPECT_CALL(new_window_mock, OnLoad(_, StrEq(GetSimplePageUrl())))
+ .Times(testing::AtMost(2))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ DelaySendChar(&loop_, 500, 'C', simulate_input::NONE)))
+ .WillOnce(testing::Return()); // just to stop a gmock warning
+
+ EXPECT_CALL(new_window_mock, OnQuit())
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(parent_url);
+}
+
+// Parameter for tests using the NavigationTransitionTest fixture. Includes two
+// pages, each with their own possible CF invocation.
+struct NavigationTransitionTestParameter {
+ NavigationTransitionTestParameter(CFInvocation::Type type1,
+ CFInvocation::Type type2) {
+ page1_ = CFInvocation(type1);
+ page2_ = CFInvocation(type2);
+ }
+ CFInvocation page1_;
+ CFInvocation page2_;
+};
+
+// Parameterized test fixture for tests which test navigation transitions
+// between two pages.
+class NavigationTransitionTest
+ : public MockIEEventSinkTest,
+ public testing::TestWithParam<NavigationTransitionTestParameter> {
+ public:
+ NavigationTransitionTest() {}
+
+ virtual void SetUp() {
+ page1_ = GetParam().page1_;
+ page2_ = GetParam().page2_;
+ }
+
+ protected:
+ CFInvocation page1_;
+ CFInvocation page2_;
+};
+
+// This instantiates each parameterized test with some of the different CF
+// invocation methods.
+// TODO(kkania): Do not allow these tests to be cache the pages. This is used
+// currently because otherwise the meta tags can cause double requests. Change
+// ExpectAndServeRequestAllowCache to ExpectAndServeRequest when allowed.
+INSTANTIATE_TEST_CASE_P(
+ IEToIE,
+ NavigationTransitionTest,
+ testing::Values(NavigationTransitionTestParameter(
+ CFInvocation::NONE, CFInvocation::NONE)));
+INSTANTIATE_TEST_CASE_P(
+ IEToMetaTag,
+ NavigationTransitionTest,
+ testing::Values(NavigationTransitionTestParameter(
+ CFInvocation::NONE, CFInvocation::META_TAG)));
+INSTANTIATE_TEST_CASE_P(
+ IEToHttpHeader,
+ NavigationTransitionTest,
+ testing::Values(NavigationTransitionTestParameter(
+ CFInvocation::NONE, CFInvocation::HTTP_HEADER)));
+INSTANTIATE_TEST_CASE_P(
+ CFToCF,
+ NavigationTransitionTest,
+ testing::Values(NavigationTransitionTestParameter(
+ CFInvocation::META_TAG, CFInvocation::META_TAG)));
+INSTANTIATE_TEST_CASE_P(
+ CFToIE,
+ NavigationTransitionTest,
+ testing::Values(NavigationTransitionTestParameter(
+ CFInvocation::META_TAG, CFInvocation::NONE)));
+
+// Test window.open calls.
+// Marking this test as FLAKY initially as it relies on getting focus and user
+// input which don't work correctly at times.
+// http://code.google.com/p/chromium/issues/detail?id=26549
+TEST_P(NavigationTransitionTest, FLAKY_JavascriptWindowOpen) {
+ std::wstring parent_url = GetTestUrl(L"window_open.html?simple.html");
+ std::wstring new_window_url = GetSimplePageUrl();
+ testing::StrictMock<MockIEEventSink> new_window_mock;
+
+ ie_mock_.ExpectNavigation(page1_.invokes_cf(), parent_url);
+ server_mock_.ExpectAndServeRequestAllowCache(page1_, parent_url);
+ EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(parent_url)))
+ .WillOnce(DelaySendDoubleClick(&ie_mock_, &loop_, 0, 10, 10));
+
+ // If the parent window is in CF, the child will load in CF regardless of
+ // whether the child page invokes CF.
+ bool expect_cf = page1_.invokes_cf() || page2_.invokes_cf();
+ ie_mock_.ExpectNewWindow(&new_window_mock);
+ new_window_mock.ExpectJavascriptWindowOpenNavigation(page1_.invokes_cf(),
+ expect_cf,
+ new_window_url);
+ EXPECT_CALL(server_mock_, Get(_, UrlPathEq(new_window_url), _))
+ .Times(testing::AtMost(1))
+ .WillOnce(SendAllowCacheResponse(&server_mock_, page2_));
+ EXPECT_CALL(new_window_mock, OnLoad(expect_cf, StrEq(new_window_url)))
+ .WillOnce(testing::DoAll(
+ ValidateWindowSize(&new_window_mock, 10, 10, 250, 250),
+ CloseBrowserMock(&new_window_mock)));
+
+ EXPECT_CALL(new_window_mock, OnQuit())
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIENavigateAndLoop(parent_url,
+ kChromeFrameLongNavigationTimeoutInSeconds * 2);
+}
+
+// Test redirection with window.location in Javascript.
+TEST_P(NavigationTransitionTest, FLAKY_JavascriptRedirection) {
+ if (GetInstalledIEVersion() == IE_7) {
+ LOG(ERROR) << "Test disabled for this configuration.";
+ return;
+ }
+ std::wstring redirect_url = GetTestUrl(L"javascript_redirect.html");
+
+ ie_mock_.ExpectNavigation(page1_.invokes_cf(), redirect_url);
+ server_mock_.ExpectAndServeRequestAllowCache(page1_, redirect_url);
+ EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(redirect_url)))
+ .WillOnce(VerifyAddressBarUrl(&ie_mock_));
+
+ ie_mock_.ExpectNavigation(page2_.invokes_cf(), GetSimplePageUrl());
+ server_mock_.ExpectAndServeRequestAllowCache(page2_, GetSimplePageUrl());
+ EXPECT_CALL(ie_mock_, OnLoad(page2_.invokes_cf(), StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ CloseBrowserMock(&ie_mock_)));
+
+ LaunchIEAndNavigate(redirect_url);
+}
+
+// Test following a link by TAB + ENTER.
+TEST_P(NavigationTransitionTest, FLAKY_FollowLink) {
+ if (page1_.invokes_cf() && page2_.invokes_cf() &&
+ GetInstalledIEVersion() > IE_6) {
+ // For some reason IE 7 and 8 send two BeforeNavigate events for the second
+ // page for this case.
+ LOG(ERROR) << "Test disabled for this configuration.";
+ return;
+ }
+ ie_mock_.ExpectNavigation(page1_.invokes_cf(), GetLinkPageUrl());
+ server_mock_.ExpectAndServeRequestAllowCache(page1_, GetLinkPageUrl());
+ EXPECT_CALL(ie_mock_, OnLoad(page1_.invokes_cf(), StrEq(GetLinkPageUrl())))
+ .WillOnce(testing::DoAll(
+ SetFocusToRenderer(&ie_mock_),
+ DelaySendChar(&loop_, 500, VK_TAB, simulate_input::NONE),
+ DelaySendChar(&loop_, 1000, VK_RETURN, simulate_input::NONE)));
+
+ ie_mock_.ExpectNavigation(page2_.invokes_cf(), GetSimplePageUrl());
+ server_mock_.ExpectAndServeRequestAllowCache(page2_, GetSimplePageUrl());
+ EXPECT_CALL(ie_mock_, OnLoad(page2_.invokes_cf(), StrEq(GetSimplePageUrl())))
+ .WillOnce(testing::DoAll(
+ VerifyAddressBarUrl(&ie_mock_),
+ CloseBrowserMock(&ie_mock_)));
+
+ LaunchIEAndNavigate(GetLinkPageUrl());
+}
+
+// Basic navigation test fixture which uses the MockIEEventSink. These tests
+// are not parameterized.
+class NavigationTest : public MockIEEventSinkTest, public testing::Test {
+ public:
+ NavigationTest() {}
+};
+
+// gMock matcher which tests if a url is blank.
+MATCHER(BlankUrl, "is \"\" or NULL") {
+ return arg == NULL || wcslen(arg) == 0;
+}
+
+// Test navigation to a disallowed url.
+TEST_F(NavigationTest, DisallowedUrl) {
+ // If a navigation fails then IE issues a navigation to an interstitial
+ // page. Catch this to track navigation errors as the NavigateError
+ // notification does not seem to fire reliably.
+ const wchar_t disallowed_url[] = L"gcf:file:///C:/";
+
+ EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal,
+ StrEq(disallowed_url)),
+ _, _, _, _, _));
+ EXPECT_CALL(ie_mock_, OnLoad(IN_IE, BlankUrl()))
+ .Times(testing::AtMost(1));
+ EXPECT_CALL(ie_mock_, OnBeforeNavigate2(_, testing::Field(&VARIANT::bstrVal,
+ testing::StartsWith(L"res:")),
+ _, _, _, _, _));
+ EXPECT_CALL(ie_mock_, OnFileDownload(VARIANT_TRUE, _))
+ .Times(testing::AnyNumber())
+ .WillRepeatedly(testing::Return());
+ EXPECT_CALL(ie_mock_, OnNavigateComplete2(_, testing::Field(&VARIANT::bstrVal,
+ StrEq(disallowed_url))));
+ // Although we expect a load event for this, we should never receive a
+ // corresponding GET request.
+ EXPECT_CALL(ie_mock_, OnLoad(IN_IE, StrEq(disallowed_url)))
+ .WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(disallowed_url);
+}
+
+// NOTE: This test is currently disabled as we haven't finished implementing
+// support for this yet. The test (as written) works fine for IE. CF might
+// have a different set of requirements once we fully support this and hence
+// the test might need some refining before being enabled.
+TEST_F(NavigationTest, DISABLED_DownloadInNewWindow) {
+ MockIEEventSink new_window_mock;
+ std::wstring kDownloadFromNewWin =
+ GetTestUrl(L"full_tab_download_from_new_window.html");
+
+ ie_mock_.ExpectNavigation(IN_CF, kDownloadFromNewWin);
+
+ EXPECT_CALL(ie_mock_, OnNewWindow3(_, _, _, _, _));
+
+ EXPECT_CALL(ie_mock_, OnNewBrowserWindow(_, _))
+ .WillOnce(testing::WithArgs<0>(testing::Invoke(testing::CreateFunctor(
+ &new_window_mock, &MockIEEventSink::Attach))));
+ EXPECT_CALL(new_window_mock, OnBeforeNavigate2(_, _, _, _, _, _, _));
+
+ EXPECT_CALL(new_window_mock, OnFileDownload(VARIANT_FALSE, _))
+ .Times(2)
+ .WillRepeatedly(CloseBrowserMock(&new_window_mock));
+
+ EXPECT_CALL(new_window_mock, OnNavigateComplete2(_, _));
+
+ EXPECT_CALL(new_window_mock, OnQuit()).WillOnce(CloseBrowserMock(&ie_mock_));
+
+ LaunchIEAndNavigate(kDownloadFromNewWin);
+}
+
+} // namespace chrome_frame_test
Property changes on: chrome_frame\test\navigation_test.cc
___________________________________________________________________
Added: svn:eol-style
+ LF
« no previous file with comments | « chrome_frame/test/mock_ie_event_sink_test.cc ('k') | chrome_frame/test/no_interference_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698