Index: chrome/browser/tab_contents/web_contents_unittest.cc |
=================================================================== |
--- chrome/browser/tab_contents/web_contents_unittest.cc (revision 113050) |
+++ chrome/browser/tab_contents/web_contents_unittest.cc (working copy) |
@@ -1,1777 +0,0 @@ |
-// Copyright (c) 2011 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 "base/logging.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/prefs/pref_service.h" |
-#include "chrome/common/pref_names.h" |
-#include "chrome/test/base/chrome_render_view_host_test_harness.h" |
-#include "chrome/test/base/testing_pref_service.h" |
-#include "chrome/test/base/testing_profile.h" |
-#include "content/browser/renderer_host/render_view_host.h" |
-#include "content/browser/renderer_host/render_widget_host_view.h" |
-#include "content/browser/site_instance.h" |
-#include "content/browser/tab_contents/interstitial_page.h" |
-#include "content/browser/tab_contents/navigation_details.h" |
-#include "content/browser/tab_contents/navigation_entry.h" |
-#include "content/browser/tab_contents/test_tab_contents.h" |
-#include "content/common/view_messages.h" |
-#include "content/public/browser/notification_details.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/browser/notification_source.h" |
-#include "content/public/common/bindings_policy.h" |
-#include "content/public/common/content_constants.h" |
-#include "content/public/common/url_constants.h" |
-#include "content/test/test_browser_thread.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
-#include "ui/base/message_box_flags.h" |
-#include "webkit/glue/webkit_glue.h" |
- |
-using content::BrowserThread; |
-using webkit_glue::PasswordForm; |
- |
-class TestInterstitialPage : public InterstitialPage { |
- public: |
- enum InterstitialState { |
- UNDECIDED = 0, // No decision taken yet. |
- OKED, // Proceed was called. |
- CANCELED // DontProceed was called. |
- }; |
- |
- class Delegate { |
- public: |
- virtual void TestInterstitialPageDeleted( |
- TestInterstitialPage* interstitial) = 0; |
- |
- protected: |
- virtual ~Delegate() {} |
- }; |
- |
- // IMPORTANT NOTE: if you pass stack allocated values for |state| and |
- // |deleted| (like all interstitial related tests do at this point), make sure |
- // to create an instance of the TestInterstitialPageStateGuard class on the |
- // stack in your test. This will ensure that the TestInterstitialPage states |
- // are cleared when the test finishes. |
- // Not doing so will cause stack trashing if your test does not hide the |
- // interstitial, as in such a case it will be destroyed in the test TearDown |
- // method and will dereference the |deleted| local variable which by then is |
- // out of scope. |
- TestInterstitialPage(TabContents* tab, |
- bool new_navigation, |
- const GURL& url, |
- InterstitialState* state, |
- bool* deleted) |
- : InterstitialPage(tab, new_navigation, url), |
- state_(state), |
- deleted_(deleted), |
- command_received_count_(0), |
- delegate_(NULL) { |
- *state_ = UNDECIDED; |
- *deleted_ = false; |
- } |
- |
- virtual ~TestInterstitialPage() { |
- if (deleted_) |
- *deleted_ = true; |
- if (delegate_) |
- delegate_->TestInterstitialPageDeleted(this); |
- } |
- |
- virtual void DontProceed() { |
- if (state_) |
- *state_ = CANCELED; |
- InterstitialPage::DontProceed(); |
- } |
- virtual void Proceed() { |
- if (state_) |
- *state_ = OKED; |
- InterstitialPage::Proceed(); |
- } |
- |
- int command_received_count() const { |
- return command_received_count_; |
- } |
- |
- void TestDomOperationResponse(const std::string& json_string) { |
- if (enabled()) |
- CommandReceived(json_string); |
- } |
- |
- void TestDidNavigate(int page_id, const GURL& url) { |
- ViewHostMsg_FrameNavigate_Params params; |
- InitNavigateParams(¶ms, page_id, url, content::PAGE_TRANSITION_TYPED); |
- DidNavigate(render_view_host(), params); |
- } |
- |
- void TestRenderViewGone(base::TerminationStatus status, int error_code) { |
- RenderViewGone(render_view_host(), status, error_code); |
- } |
- |
- bool is_showing() const { |
- return static_cast<TestRenderWidgetHostView*>(render_view_host()->view())-> |
- is_showing(); |
- } |
- |
- void ClearStates() { |
- state_ = NULL; |
- deleted_ = NULL; |
- delegate_ = NULL; |
- } |
- |
- void set_delegate(Delegate* delegate) { |
- delegate_ = delegate; |
- } |
- |
- protected: |
- virtual RenderViewHost* CreateRenderViewHost() { |
- return new TestRenderViewHost( |
- SiteInstance::CreateSiteInstance(tab()->browser_context()), |
- this, MSG_ROUTING_NONE); |
- } |
- |
- virtual TabContentsView* CreateTabContentsView() { return NULL; } |
- |
- |
- virtual void CommandReceived(const std::string& command) { |
- command_received_count_++; |
- } |
- |
- private: |
- InterstitialState* state_; |
- bool* deleted_; |
- int command_received_count_; |
- Delegate* delegate_; |
-}; |
- |
-class TestInterstitialPageStateGuard : public TestInterstitialPage::Delegate { |
- public: |
- explicit TestInterstitialPageStateGuard( |
- TestInterstitialPage* interstitial_page) |
- : interstitial_page_(interstitial_page) { |
- DCHECK(interstitial_page_); |
- interstitial_page_->set_delegate(this); |
- } |
- ~TestInterstitialPageStateGuard() { |
- if (interstitial_page_) |
- interstitial_page_->ClearStates(); |
- } |
- |
- virtual void TestInterstitialPageDeleted(TestInterstitialPage* interstitial) { |
- DCHECK(interstitial_page_ == interstitial); |
- interstitial_page_ = NULL; |
- } |
- |
- private: |
- TestInterstitialPage* interstitial_page_; |
-}; |
- |
-class TabContentsTest : public ChromeRenderViewHostTestHarness { |
- public: |
- TabContentsTest() : ui_thread_(BrowserThread::UI, &message_loop_) { |
- } |
- |
- private: |
- // Supply our own profile so we use the correct profile data. The test harness |
- // is not supposed to overwrite a profile if it's already created. |
- virtual void SetUp() { |
- ChromeRenderViewHostTestHarness::SetUp(); |
- |
- // Set some (WebKit) user preferences. |
- TestingPrefService* pref_services = profile()->GetTestingPrefService(); |
-#if defined(TOOLKIT_USES_GTK) |
- pref_services->SetUserPref(prefs::kUsesSystemTheme, |
- Value::CreateBooleanValue(false)); |
-#endif |
- pref_services->SetUserPref(prefs::kDefaultCharset, |
- Value::CreateStringValue("utf8")); |
- pref_services->SetUserPref(prefs::kWebKitDefaultFontSize, |
- Value::CreateIntegerValue(20)); |
- pref_services->SetUserPref(prefs::kWebKitTextAreasAreResizable, |
- Value::CreateBooleanValue(false)); |
- pref_services->SetUserPref(prefs::kWebKitUsesUniversalDetector, |
- Value::CreateBooleanValue(true)); |
- pref_services->SetUserPref("webkit.webprefs.foo", |
- Value::CreateStringValue("bar")); |
- } |
- |
- content::TestBrowserThread ui_thread_; |
-}; |
- |
-// Test to make sure that title updates get stripped of whitespace. |
-TEST_F(TabContentsTest, UpdateTitle) { |
- ViewHostMsg_FrameNavigate_Params params; |
- InitNavigateParams(¶ms, 0, GURL(chrome::kAboutBlankURL), |
- content::PAGE_TRANSITION_TYPED); |
- |
- content::LoadCommittedDetails details; |
- controller().RendererDidNavigate(params, &details); |
- |
- contents()->UpdateTitle(rvh(), 0, ASCIIToUTF16(" Lots O' Whitespace\n"), |
- base::i18n::LEFT_TO_RIGHT); |
- EXPECT_EQ(ASCIIToUTF16("Lots O' Whitespace"), contents()->GetTitle()); |
-} |
- |
-// Test view source mode for the new tabs page. |
-TEST_F(TabContentsTest, NTPViewSource) { |
- const char kUrl[] = "view-source:chrome://newtab"; |
- const GURL kGURL(kUrl); |
- |
- process()->sink().ClearMessages(); |
- |
- controller().LoadURL( |
- kGURL, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- rvh()->delegate()->RenderViewCreated(rvh()); |
- // Did we get the expected message? |
- EXPECT_TRUE(process()->sink().GetFirstMessageMatching( |
- ViewMsg_EnableViewSourceMode::ID)); |
- |
- ViewHostMsg_FrameNavigate_Params params; |
- InitNavigateParams(¶ms, 0, kGURL, content::PAGE_TRANSITION_TYPED); |
- content::LoadCommittedDetails details; |
- controller().RendererDidNavigate(params, &details); |
- // Also check title and url. |
- EXPECT_EQ(ASCIIToUTF16(kUrl), contents()->GetTitle()); |
-} |
- |
-// Test simple same-SiteInstance navigation. |
-TEST_F(TabContentsTest, SimpleNavigation) { |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
- |
- // Navigate to URL |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(instance1, orig_rvh->site_instance()); |
- // Controller's pending entry will have a NULL site instance until we assign |
- // it in DidNavigate. |
- EXPECT_TRUE(controller().GetActiveEntry()->site_instance() == NULL); |
- |
- // DidNavigate from the page |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- EXPECT_EQ(instance1, orig_rvh->site_instance()); |
- // Controller's entry should now have the SiteInstance, or else we won't be |
- // able to find it later. |
- EXPECT_EQ(instance1, controller().GetActiveEntry()->site_instance()); |
-} |
- |
-// Test that we reject NavigateToEntry if the url is over content::kMaxURLChars. |
-TEST_F(TabContentsTest, NavigateToExcessivelyLongURL) { |
- // Construct a URL that's kMaxURLChars + 1 long of all 'a's. |
- const GURL url(std::string("http://example.org/").append( |
- content::kMaxURLChars + 1, 'a')); |
- |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_GENERATED, |
- std::string()); |
- EXPECT_TRUE(controller().GetActiveEntry() == NULL); |
-} |
- |
-// Test that navigating across a site boundary creates a new RenderViewHost |
-// with a new SiteInstance. Going back should do the same. |
-TEST_F(TabContentsTest, CrossSiteBoundaries) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- int orig_rvh_delete_count = 0; |
- orig_rvh->set_delete_counter(&orig_rvh_delete_count); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate to new site |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- TestRenderViewHost* pending_rvh = contents()->pending_rvh(); |
- int pending_rvh_delete_count = 0; |
- pending_rvh->set_delete_counter(&pending_rvh_delete_count); |
- |
- // Navigations should be suspended in pending_rvh until ShouldCloseACK. |
- EXPECT_TRUE(pending_rvh->are_navigations_suspended()); |
- orig_rvh->SendShouldCloseACK(true); |
- EXPECT_FALSE(pending_rvh->are_navigations_suspended()); |
- |
- // DidNavigate from the pending page |
- contents()->TestDidNavigate( |
- pending_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(pending_rvh, contents()->render_view_host()); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
- // We keep the original RVH around, swapped out. |
- EXPECT_TRUE(contents()->render_manager_for_testing()->IsSwappedOut(orig_rvh)); |
- EXPECT_EQ(orig_rvh_delete_count, 0); |
- |
- // Going back should switch SiteInstances again. The first SiteInstance is |
- // stored in the NavigationEntry, so it should be the same as at the start. |
- // We should use the same RVH as before, swapping it back in. |
- controller().GoBack(); |
- TestRenderViewHost* goback_rvh = contents()->pending_rvh(); |
- EXPECT_EQ(orig_rvh, goback_rvh); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- |
- // Navigations should be suspended in goback_rvh until ShouldCloseACK. |
- EXPECT_TRUE(goback_rvh->are_navigations_suspended()); |
- pending_rvh->SendShouldCloseACK(true); |
- EXPECT_FALSE(goback_rvh->are_navigations_suspended()); |
- |
- // DidNavigate from the back action |
- contents()->TestDidNavigate( |
- goback_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(goback_rvh, contents()->render_view_host()); |
- EXPECT_EQ(instance1, contents()->GetSiteInstance()); |
- // The pending RVH should now be swapped out, not deleted. |
- EXPECT_TRUE(contents()->render_manager_for_testing()-> |
- IsSwappedOut(pending_rvh)); |
- EXPECT_EQ(pending_rvh_delete_count, 0); |
- |
- // Close tab and ensure RVHs are deleted. |
- DeleteContents(); |
- EXPECT_EQ(orig_rvh_delete_count, 1); |
- EXPECT_EQ(pending_rvh_delete_count, 1); |
-} |
- |
-// Test that navigating across a site boundary after a crash creates a new |
-// RVH without requiring a cross-site transition (i.e., PENDING state). |
-TEST_F(TabContentsTest, CrossSiteBoundariesAfterCrash) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- int orig_rvh_delete_count = 0; |
- orig_rvh->set_delete_counter(&orig_rvh_delete_count); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Crash the renderer. |
- orig_rvh->set_render_view_created(false); |
- |
- // Navigate to new site. We should not go into PENDING. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- TestRenderViewHost* new_rvh = rvh(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
- EXPECT_NE(orig_rvh, new_rvh); |
- EXPECT_EQ(orig_rvh_delete_count, 1); |
- |
- // DidNavigate from the new page |
- contents()->TestDidNavigate(new_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(new_rvh, rvh()); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
- |
- // Close tab and ensure RVHs are deleted. |
- DeleteContents(); |
- EXPECT_EQ(orig_rvh_delete_count, 1); |
-} |
- |
-// Test that opening a new tab in the same SiteInstance and then navigating |
-// both tabs to a new site will place both tabs in a single SiteInstance. |
-TEST_F(TabContentsTest, NavigateTwoTabsCrossSite) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- |
- // Open a new tab with the same SiteInstance, navigated to the same site. |
- TestTabContents contents2(profile(), instance1); |
- contents2.transition_cross_site = true; |
- contents2.controller().LoadURL(url, content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- // Need this page id to be 2 since the site instance is the same (which is the |
- // scope of page IDs) and we want to consider this a new page. |
- contents2.TestDidNavigate( |
- contents2.render_view_host(), 2, url, content::PAGE_TRANSITION_TYPED); |
- |
- // Navigate first tab to a new site |
- const GURL url2a("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2a, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- orig_rvh->SendShouldCloseACK(true); |
- TestRenderViewHost* pending_rvh_a = contents()->pending_rvh(); |
- contents()->TestDidNavigate( |
- pending_rvh_a, 1, url2a, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2a = contents()->GetSiteInstance(); |
- EXPECT_NE(instance1, instance2a); |
- |
- // Navigate second tab to the same site as the first tab |
- const GURL url2b("http://mail.yahoo.com"); |
- contents2.controller().LoadURL(url2b, content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- TestRenderViewHost* rvh2 = |
- static_cast<TestRenderViewHost*>(contents2.render_view_host()); |
- rvh2->SendShouldCloseACK(true); |
- TestRenderViewHost* pending_rvh_b = contents2.pending_rvh(); |
- EXPECT_TRUE(pending_rvh_b != NULL); |
- EXPECT_TRUE(contents2.cross_navigation_pending()); |
- |
- // NOTE(creis): We used to be in danger of showing a sad tab page here if the |
- // second tab hadn't navigated somewhere first (bug 1145430). That case is |
- // now covered by the CrossSiteBoundariesAfterCrash test. |
- contents2.TestDidNavigate( |
- pending_rvh_b, 2, url2b, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2b = contents2.GetSiteInstance(); |
- EXPECT_NE(instance1, instance2b); |
- |
- // Both tabs should now be in the same SiteInstance. |
- EXPECT_EQ(instance2a, instance2b); |
-} |
- |
-// Tests that TabContents uses the current URL, not the SiteInstance's site, to |
-// determine whether a navigation is cross-site. |
-TEST_F(TabContentsTest, CrossSiteComparesAgainstCurrentPage) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate( |
- orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- |
- // Open a related tab to a second site. |
- TestTabContents contents2(profile(), instance1); |
- contents2.transition_cross_site = true; |
- const GURL url2("http://www.yahoo.com"); |
- contents2.controller().LoadURL(url2, content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- // The first RVH in contents2 isn't live yet, so we shortcut the cross site |
- // pending. |
- TestRenderViewHost* rvh2 = static_cast<TestRenderViewHost*>( |
- contents2.render_view_host()); |
- EXPECT_FALSE(contents2.cross_navigation_pending()); |
- contents2.TestDidNavigate(rvh2, 2, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2 = contents2.GetSiteInstance(); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_FALSE(contents2.cross_navigation_pending()); |
- |
- // Simulate a link click in first tab to second site. Doesn't switch |
- // SiteInstances, because we don't intercept WebKit navigations. |
- contents()->TestDidNavigate( |
- orig_rvh, 2, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance3 = contents()->GetSiteInstance(); |
- EXPECT_EQ(instance1, instance3); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- |
- // Navigate to the new site. Doesn't switch SiteInstancees, because we |
- // compare against the current URL, not the SiteInstance's site. |
- const GURL url3("http://mail.yahoo.com"); |
- controller().LoadURL( |
- url3, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- contents()->TestDidNavigate( |
- orig_rvh, 3, url3, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance4 = contents()->GetSiteInstance(); |
- EXPECT_EQ(instance1, instance4); |
-} |
- |
-// Test that the onbeforeunload and onunload handlers run when navigating |
-// across site boundaries. |
-TEST_F(TabContentsTest, CrossSiteUnloadHandlers) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate to new site, but simulate an onbeforeunload denial. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, false)); |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate again, but simulate an onbeforeunload approval. |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- TestRenderViewHost* pending_rvh = static_cast<TestRenderViewHost*>( |
- contents()->pending_rvh()); |
- |
- // We won't hear DidNavigate until the onunload handler has finished running. |
- // (No way to simulate that here, but it involves a call from RDH to |
- // TabContents::OnCrossSiteResponse.) |
- |
- // DidNavigate from the pending page |
- contents()->TestDidNavigate( |
- pending_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(pending_rvh, rvh()); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
-} |
- |
-// Test that during a slow cross-site navigation, the original renderer can |
-// navigate to a different URL and have it displayed, canceling the slow |
-// navigation. |
-TEST_F(TabContentsTest, CrossSiteNavigationPreempted) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate to new site, simulating an onbeforeunload approval. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- |
- // Suppose the original renderer navigates before the new one is ready. |
- orig_rvh->SendNavigate(2, GURL("http://www.google.com/foo")); |
- |
- // Verify that the pending navigation is cancelled. |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, rvh()); |
- EXPECT_EQ(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
-} |
- |
-TEST_F(TabContentsTest, CrossSiteNavigationBackPreempted) { |
- contents()->transition_cross_site = true; |
- |
- // Start with NTP, which gets a new RVH with WebUI bindings. |
- const GURL url1("chrome://newtab"); |
- controller().LoadURL( |
- url1, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- TestRenderViewHost* ntp_rvh = rvh(); |
- contents()->TestDidNavigate(ntp_rvh, 1, url1, content::PAGE_TRANSITION_TYPED); |
- NavigationEntry* entry1 = controller().GetLastCommittedEntry(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(ntp_rvh, contents()->render_view_host()); |
- EXPECT_EQ(url1, entry1->url()); |
- EXPECT_EQ(instance1, entry1->site_instance()); |
- EXPECT_TRUE(ntp_rvh->enabled_bindings() & content::BINDINGS_POLICY_WEB_UI); |
- |
- // Navigate to new site. |
- const GURL url2("http://www.google.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- TestRenderViewHost* google_rvh = contents()->pending_rvh(); |
- |
- // Simulate beforeunload approval. |
- EXPECT_TRUE(ntp_rvh->is_waiting_for_beforeunload_ack()); |
- ntp_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- |
- // DidNavigate from the pending page. |
- contents()->TestDidNavigate( |
- google_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- NavigationEntry* entry2 = controller().GetLastCommittedEntry(); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(google_rvh, contents()->render_view_host()); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_FALSE(contents()->pending_rvh()); |
- EXPECT_EQ(url2, entry2->url()); |
- EXPECT_EQ(instance2, entry2->site_instance()); |
- EXPECT_FALSE(google_rvh->enabled_bindings() & |
- content::BINDINGS_POLICY_WEB_UI); |
- |
- // Navigate to third page on same site. |
- const GURL url3("http://news.google.com"); |
- controller().LoadURL( |
- url3, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- contents()->TestDidNavigate( |
- google_rvh, 2, url3, content::PAGE_TRANSITION_TYPED); |
- NavigationEntry* entry3 = controller().GetLastCommittedEntry(); |
- SiteInstance* instance3 = contents()->GetSiteInstance(); |
- |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(google_rvh, contents()->render_view_host()); |
- EXPECT_EQ(instance2, instance3); |
- EXPECT_FALSE(contents()->pending_rvh()); |
- EXPECT_EQ(url3, entry3->url()); |
- EXPECT_EQ(instance3, entry3->site_instance()); |
- |
- // Go back within the site. |
- controller().GoBack(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(entry2, controller().pending_entry()); |
- |
- // Before that commits, go back again. |
- controller().GoBack(); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- EXPECT_TRUE(contents()->pending_rvh()); |
- EXPECT_EQ(entry1, controller().pending_entry()); |
- |
- // Simulate beforeunload approval. |
- EXPECT_TRUE(google_rvh->is_waiting_for_beforeunload_ack()); |
- google_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- |
- // DidNavigate from the first back. This aborts the second back's pending RVH. |
- contents()->TestDidNavigate( |
- google_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- |
- // We should commit this page and forget about the second back. |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_FALSE(controller().pending_entry()); |
- EXPECT_EQ(google_rvh, contents()->render_view_host()); |
- EXPECT_EQ(url2, controller().GetLastCommittedEntry()->url()); |
- |
- // We should not have corrupted the NTP entry. |
- EXPECT_EQ(instance3, entry3->site_instance()); |
- EXPECT_EQ(instance2, entry2->site_instance()); |
- EXPECT_EQ(instance1, entry1->site_instance()); |
- EXPECT_EQ(url1, entry1->url()); |
-} |
- |
-// Test that during a slow cross-site navigation, a sub-frame navigation in the |
-// original renderer will not cancel the slow navigation (bug 42029). |
-TEST_F(TabContentsTest, CrossSiteNavigationNotPreemptedByFrame) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Start navigating to new site. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- |
- // Simulate a sub-frame navigation arriving and ensure the RVH is still |
- // waiting for a before unload response. |
- orig_rvh->SendNavigateWithTransition(1, GURL("http://google.com/frame"), |
- content::PAGE_TRANSITION_AUTO_SUBFRAME); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- |
- // Now simulate the onbeforeunload approval and verify the navigation is |
- // not canceled. |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
-} |
- |
-// Test that a cross-site navigation is not preempted if the previous |
-// renderer sends a FrameNavigate message just before being told to stop. |
-// We should only preempt the cross-site navigation if the previous renderer |
-// has started a new navigation. See http://crbug.com/79176. |
-TEST_F(TabContentsTest, CrossSiteNotPreemptedDuringBeforeUnload) { |
- contents()->transition_cross_site = true; |
- |
- // Navigate to NTP URL. |
- const GURL url("chrome://newtab"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- TestRenderViewHost* orig_rvh = rvh(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- |
- // Navigate to new site, with the beforeunload request in flight. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- TestRenderViewHost* pending_rvh = contents()->pending_rvh(); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- |
- // Suppose the first navigation tries to commit now, with a |
- // ViewMsg_Stop in flight. This should not cancel the pending navigation, |
- // but it should act as if the beforeunload ack arrived. |
- orig_rvh->SendNavigate(1, GURL("chrome://newtab")); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- |
- // The pending navigation should be able to commit successfully. |
- contents()->TestDidNavigate( |
- pending_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(pending_rvh, contents()->render_view_host()); |
-} |
- |
-// Test that the original renderer cannot preempt a cross-site navigation once |
-// the unload request has been made. At this point, the cross-site navigation |
-// is almost ready to be displayed, and the original renderer is only given a |
-// short chance to run an unload handler. Prevents regression of bug 23942. |
-TEST_F(TabContentsTest, CrossSiteCantPreemptAfterUnload) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate to new site, simulating an onbeforeunload approval. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- TestRenderViewHost* pending_rvh = static_cast<TestRenderViewHost*>( |
- contents()->pending_rvh()); |
- |
- // Simulate the pending renderer's response, which leads to an unload request |
- // being sent to orig_rvh. |
- contents()->render_manager_for_testing()->OnCrossSiteResponse(0, 0); |
- |
- // Suppose the original renderer navigates now, while the unload request is in |
- // flight. We should ignore it, wait for the unload ack, and let the pending |
- // request continue. Otherwise, the tab may close spontaneously or stop |
- // responding to navigation requests. (See bug 23942.) |
- ViewHostMsg_FrameNavigate_Params params1a; |
- InitNavigateParams(¶ms1a, 2, GURL("http://www.google.com/foo"), |
- content::PAGE_TRANSITION_TYPED); |
- orig_rvh->SendNavigate(2, GURL("http://www.google.com/foo")); |
- |
- // Verify that the pending navigation is still in progress. |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- EXPECT_TRUE(contents()->pending_rvh() != NULL); |
- |
- // DidNavigate from the pending page should commit it. |
- contents()->TestDidNavigate( |
- pending_rvh, 1, url2, content::PAGE_TRANSITION_TYPED); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(pending_rvh, rvh()); |
- EXPECT_NE(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
-} |
- |
-// Test that a cross-site navigation that doesn't commit after the unload |
-// handler doesn't leave the tab in a stuck state. http://crbug.com/88562. |
-TEST_F(TabContentsTest, CrossSiteNavigationCanceled) { |
- contents()->transition_cross_site = true; |
- TestRenderViewHost* orig_rvh = rvh(); |
- SiteInstance* instance1 = contents()->GetSiteInstance(); |
- |
- // Navigate to URL. First URL should use first RenderViewHost. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, contents()->render_view_host()); |
- |
- // Navigate to new site, simulating an onbeforeunload approval. |
- const GURL url2("http://www.yahoo.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- EXPECT_TRUE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- orig_rvh->TestOnMessageReceived(ViewHostMsg_ShouldClose_ACK(0, true)); |
- EXPECT_TRUE(contents()->cross_navigation_pending()); |
- |
- // Simulate swap out message when the response arrives. |
- orig_rvh->set_is_swapped_out(true); |
- |
- // Suppose the navigation doesn't get a chance to commit, and the user |
- // navigates in the current RVH's SiteInstance. |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- |
- // Verify that the pending navigation is cancelled and the renderer is no |
- // longer swapped out. |
- EXPECT_FALSE(orig_rvh->is_waiting_for_beforeunload_ack()); |
- SiteInstance* instance2 = contents()->GetSiteInstance(); |
- EXPECT_FALSE(contents()->cross_navigation_pending()); |
- EXPECT_EQ(orig_rvh, rvh()); |
- EXPECT_FALSE(orig_rvh->is_swapped_out()); |
- EXPECT_EQ(instance1, instance2); |
- EXPECT_TRUE(contents()->pending_rvh() == NULL); |
-} |
- |
-// Test that NavigationEntries have the correct content state after going |
-// forward and back. Prevents regression for bug 1116137. |
-TEST_F(TabContentsTest, NavigationEntryContentState) { |
- TestRenderViewHost* orig_rvh = rvh(); |
- |
- // Navigate to URL. There should be no committed entry yet. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- NavigationEntry* entry = controller().GetLastCommittedEntry(); |
- EXPECT_TRUE(entry == NULL); |
- |
- // Committed entry should have content state after DidNavigate. |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- entry = controller().GetLastCommittedEntry(); |
- EXPECT_FALSE(entry->content_state().empty()); |
- |
- // Navigate to same site. |
- const GURL url2("http://images.google.com"); |
- controller().LoadURL( |
- url2, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- entry = controller().GetLastCommittedEntry(); |
- EXPECT_FALSE(entry->content_state().empty()); |
- |
- // Committed entry should have content state after DidNavigate. |
- contents()->TestDidNavigate( |
- orig_rvh, 2, url2, content::PAGE_TRANSITION_TYPED); |
- entry = controller().GetLastCommittedEntry(); |
- EXPECT_FALSE(entry->content_state().empty()); |
- |
- // Now go back. Committed entry should still have content state. |
- controller().GoBack(); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- entry = controller().GetLastCommittedEntry(); |
- EXPECT_FALSE(entry->content_state().empty()); |
-} |
- |
-// Test that NavigationEntries have the correct content state after opening |
-// a new window to about:blank. Prevents regression for bug 1116137. |
-TEST_F(TabContentsTest, NavigationEntryContentStateNewWindow) { |
- TestRenderViewHost* orig_rvh = rvh(); |
- |
- // When opening a new window, it is navigated to about:blank internally. |
- // Currently, this results in two DidNavigate events. |
- const GURL url(chrome::kAboutBlankURL); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
- |
- // Should have a content state here. |
- NavigationEntry* entry = controller().GetLastCommittedEntry(); |
- EXPECT_FALSE(entry->content_state().empty()); |
-} |
- |
-// Tests to see that webkit preferences are properly loaded and copied over |
-// to a WebPreferences object. |
-TEST_F(TabContentsTest, WebKitPrefs) { |
- WebPreferences webkit_prefs = contents()->TestGetWebkitPrefs(); |
- |
- // These values have been overridden by the profile preferences. |
- EXPECT_EQ("UTF-8", webkit_prefs.default_encoding); |
- EXPECT_EQ(20, webkit_prefs.default_font_size); |
- EXPECT_FALSE(webkit_prefs.text_areas_are_resizable); |
- EXPECT_TRUE(webkit_prefs.uses_universal_detector); |
- |
- // These should still be the default values. |
-#if defined(OS_MACOSX) |
- const char kDefaultFont[] = "Times"; |
-#elif defined(OS_CHROMEOS) |
- const char kDefaultFont[] = "Tinos"; |
-#else |
- const char kDefaultFont[] = "Times New Roman"; |
-#endif |
- EXPECT_EQ(ASCIIToUTF16(kDefaultFont), webkit_prefs.standard_font_family); |
- EXPECT_TRUE(webkit_prefs.javascript_enabled); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
-// Interstitial Tests |
-//////////////////////////////////////////////////////////////////////////////// |
- |
-// Test navigating to a page (with the navigation initiated from the browser, |
-// as when a URL is typed in the location bar) that shows an interstitial and |
-// creates a new navigation entry, then hiding it without proceeding. |
-TEST_F(TabContentsTest, |
- ShowInterstitialFromBrowserWithNewNavigationDontProceed) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Initiate a browser navigation that will trigger the interstitial |
- controller().LoadURL(GURL("http://www.evil.com"), content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, std::string()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url2); |
- |
- // Now don't proceed. |
- interstitial->DontProceed(); |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url1); |
- EXPECT_EQ(1, controller().entry_count()); |
-} |
- |
-// Test navigating to a page (with the navigation initiated from the renderer, |
-// as when clicking on a link in the page) that shows an interstitial and |
-// creates a new navigation entry, then hiding it without proceeding. |
-TEST_F(TabContentsTest, |
- ShowInterstitiaFromRendererlWithNewNavigationDontProceed) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial (no pending entry, the interstitial would have been |
- // triggered by clicking on a link). |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url2); |
- |
- // Now don't proceed. |
- interstitial->DontProceed(); |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url1); |
- EXPECT_EQ(1, controller().entry_count()); |
-} |
- |
-// Test navigating to a page that shows an interstitial without creating a new |
-// navigation entry (this happens when the interstitial is triggered by a |
-// sub-resource in the page), then hiding it without proceeding. |
-TEST_F(TabContentsTest, ShowInterstitialNoNewNavigationDontProceed) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), false, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- // The URL specified to the interstitial should have been ignored. |
- EXPECT_TRUE(entry->url() == url1); |
- |
- // Now don't proceed. |
- interstitial->DontProceed(); |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url1); |
- EXPECT_EQ(1, controller().entry_count()); |
-} |
- |
-// Test navigating to a page (with the navigation initiated from the browser, |
-// as when a URL is typed in the location bar) that shows an interstitial and |
-// creates a new navigation entry, then proceeding. |
-TEST_F(TabContentsTest, |
- ShowInterstitialFromBrowserNewNavigationProceed) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Initiate a browser navigation that will trigger the interstitial |
- controller().LoadURL(GURL("http://www.evil.com"), content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, std::string()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url2); |
- |
- // Then proceed. |
- interstitial->Proceed(); |
- // The interstitial should show until the new navigation commits. |
- ASSERT_FALSE(deleted); |
- EXPECT_EQ(TestInterstitialPage::OKED, state); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- |
- // Simulate the navigation to the page, that's when the interstitial gets |
- // hidden. |
- GURL url3("http://www.thepage.com"); |
- rvh()->SendNavigate(2, url3); |
- |
- EXPECT_TRUE(deleted); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url3); |
- |
- EXPECT_EQ(2, controller().entry_count()); |
-} |
- |
-// Test navigating to a page (with the navigation initiated from the renderer, |
-// as when clicking on a link in the page) that shows an interstitial and |
-// creates a new navigation entry, then proceeding. |
-TEST_F(TabContentsTest, |
- ShowInterstitialFromRendererNewNavigationProceed) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url2); |
- |
- // Then proceed. |
- interstitial->Proceed(); |
- // The interstitial should show until the new navigation commits. |
- ASSERT_FALSE(deleted); |
- EXPECT_EQ(TestInterstitialPage::OKED, state); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- |
- // Simulate the navigation to the page, that's when the interstitial gets |
- // hidden. |
- GURL url3("http://www.thepage.com"); |
- rvh()->SendNavigate(2, url3); |
- |
- EXPECT_TRUE(deleted); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url3); |
- |
- EXPECT_EQ(2, controller().entry_count()); |
-} |
- |
-// Test navigating to a page that shows an interstitial without creating a new |
-// navigation entry (this happens when the interstitial is triggered by a |
-// sub-resource in the page), then proceeding. |
-TEST_F(TabContentsTest, ShowInterstitialNoNewNavigationProceed) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), false, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // The interstitial should not show until its navigation has committed. |
- EXPECT_FALSE(interstitial->is_showing()); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- // Let's commit the interstitial navigation. |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_TRUE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == interstitial); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- // The URL specified to the interstitial should have been ignored. |
- EXPECT_TRUE(entry->url() == url1); |
- |
- // Then proceed. |
- interstitial->Proceed(); |
- // Since this is not a new navigation, the previous page is dismissed right |
- // away and shows the original page. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::OKED, state); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == url1); |
- |
- EXPECT_EQ(1, controller().entry_count()); |
-} |
- |
-// Test navigating to a page that shows an interstitial, then navigating away. |
-TEST_F(TabContentsTest, ShowInterstitialThenNavigate) { |
- // Show interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url); |
- |
- // While interstitial showing, navigate to a new URL. |
- const GURL url2("http://www.yahoo.com"); |
- rvh()->SendNavigate(1, url2); |
- |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
-} |
- |
-// Test navigating to a page that shows an interstitial, then going back. |
-TEST_F(TabContentsTest, ShowInterstitialThenGoBack) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL interstitial_url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(2, interstitial_url); |
- |
- // While the interstitial is showing, go back. |
- controller().GoBack(); |
- rvh()->SendNavigate(1, url1); |
- |
- // Make sure we are back to the original page and that the interstitial is |
- // gone. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry); |
- EXPECT_EQ(url1.spec(), entry->url().spec()); |
-} |
- |
-// Test navigating to a page that shows an interstitial, has a renderer crash, |
-// and then goes back. |
-TEST_F(TabContentsTest, ShowInterstitialCrashRendererThenGoBack) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL interstitial_url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(2, interstitial_url); |
- |
- // Crash the renderer |
- rvh()->TestOnMessageReceived( |
- ViewHostMsg_RenderViewGone( |
- 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); |
- |
- // While the interstitial is showing, go back. |
- controller().GoBack(); |
- rvh()->SendNavigate(1, url1); |
- |
- // Make sure we are back to the original page and that the interstitial is |
- // gone. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry); |
- EXPECT_EQ(url1.spec(), entry->url().spec()); |
-} |
- |
-// Test navigating to a page that shows an interstitial, has the renderer crash, |
-// and then navigates to the interstitial. |
-TEST_F(TabContentsTest, ShowInterstitialCrashRendererThenNavigate) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL interstitial_url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- |
- // Crash the renderer |
- rvh()->TestOnMessageReceived( |
- ViewHostMsg_RenderViewGone( |
- 0, base::TERMINATION_STATUS_PROCESS_CRASHED, -1)); |
- |
- interstitial->TestDidNavigate(2, interstitial_url); |
-} |
- |
-// Test navigating to a page that shows an interstitial, then close the tab. |
-TEST_F(TabContentsTest, ShowInterstitialThenCloseTab) { |
- // Show interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url); |
- |
- // Now close the tab. |
- DeleteContents(); |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
-} |
- |
-// Test that after Proceed is called and an interstitial is still shown, no more |
-// commands get executed. |
-TEST_F(TabContentsTest, ShowInterstitialProceedMultipleCommands) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url2); |
- |
- // Run a command. |
- EXPECT_EQ(0, interstitial->command_received_count()); |
- interstitial->TestDomOperationResponse("toto"); |
- EXPECT_EQ(1, interstitial->command_received_count()); |
- |
- // Then proceed. |
- interstitial->Proceed(); |
- ASSERT_FALSE(deleted); |
- |
- // While the navigation to the new page is pending, send other commands, they |
- // should be ignored. |
- interstitial->TestDomOperationResponse("hello"); |
- interstitial->TestDomOperationResponse("hi"); |
- EXPECT_EQ(1, interstitial->command_received_count()); |
-} |
- |
-// Test showing an interstitial while another interstitial is already showing. |
-TEST_F(TabContentsTest, ShowInterstitialOnInterstitial) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL start_url("http://www.google.com"); |
- rvh()->SendNavigate(1, start_url); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state1 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted1 = false; |
- GURL url1("http://interstitial1"); |
- TestInterstitialPage* interstitial1 = |
- new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); |
- TestInterstitialPageStateGuard state_guard1(interstitial1); |
- interstitial1->Show(); |
- interstitial1->TestDidNavigate(1, url1); |
- |
- // Now show another interstitial. |
- TestInterstitialPage::InterstitialState state2 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted2 = false; |
- GURL url2("http://interstitial2"); |
- TestInterstitialPage* interstitial2 = |
- new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); |
- TestInterstitialPageStateGuard state_guard2(interstitial2); |
- interstitial2->Show(); |
- interstitial2->TestDidNavigate(1, url2); |
- |
- // Showing interstitial2 should have caused interstitial1 to go away. |
- EXPECT_TRUE(deleted1); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state1); |
- |
- // Let's make sure interstitial2 is working as intended. |
- ASSERT_FALSE(deleted2); |
- EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
- interstitial2->Proceed(); |
- GURL landing_url("http://www.thepage.com"); |
- rvh()->SendNavigate(2, landing_url); |
- |
- EXPECT_TRUE(deleted2); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == landing_url); |
- EXPECT_EQ(2, controller().entry_count()); |
-} |
- |
-// Test showing an interstitial, proceeding and then navigating to another |
-// interstitial. |
-TEST_F(TabContentsTest, ShowInterstitialProceedShowInterstitial) { |
- // Navigate to a page so we have a navigation entry in the controller. |
- GURL start_url("http://www.google.com"); |
- rvh()->SendNavigate(1, start_url); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state1 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted1 = false; |
- GURL url1("http://interstitial1"); |
- TestInterstitialPage* interstitial1 = |
- new TestInterstitialPage(contents(), true, url1, &state1, &deleted1); |
- TestInterstitialPageStateGuard state_guard1(interstitial1); |
- interstitial1->Show(); |
- interstitial1->TestDidNavigate(1, url1); |
- |
- // Take action. The interstitial won't be hidden until the navigation is |
- // committed. |
- interstitial1->Proceed(); |
- EXPECT_EQ(TestInterstitialPage::OKED, state1); |
- |
- // Now show another interstitial (simulating the navigation causing another |
- // interstitial). |
- TestInterstitialPage::InterstitialState state2 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted2 = false; |
- GURL url2("http://interstitial2"); |
- TestInterstitialPage* interstitial2 = |
- new TestInterstitialPage(contents(), true, url2, &state2, &deleted2); |
- TestInterstitialPageStateGuard state_guard2(interstitial2); |
- interstitial2->Show(); |
- interstitial2->TestDidNavigate(1, url2); |
- |
- // Showing interstitial2 should have caused interstitial1 to go away. |
- EXPECT_TRUE(deleted1); |
- |
- // Let's make sure interstitial2 is working as intended. |
- ASSERT_FALSE(deleted2); |
- EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
- interstitial2->Proceed(); |
- GURL landing_url("http://www.thepage.com"); |
- rvh()->SendNavigate(2, landing_url); |
- |
- EXPECT_TRUE(deleted2); |
- EXPECT_FALSE(contents()->showing_interstitial_page()); |
- EXPECT_TRUE(contents()->interstitial_page() == NULL); |
- NavigationEntry* entry = controller().GetActiveEntry(); |
- ASSERT_TRUE(entry != NULL); |
- EXPECT_TRUE(entry->url() == landing_url); |
- EXPECT_EQ(2, controller().entry_count()); |
-} |
- |
-// Test that navigating away from an interstitial while it's loading cause it |
-// not to show. |
-TEST_F(TabContentsTest, NavigateBeforeInterstitialShows) { |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL interstitial_url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- |
- // Let's simulate a navigation initiated from the browser before the |
- // interstitial finishes loading. |
- const GURL url("http://www.google.com"); |
- controller().LoadURL( |
- url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
- ASSERT_FALSE(deleted); |
- EXPECT_FALSE(interstitial->is_showing()); |
- |
- // Now let's make the interstitial navigation commit. |
- interstitial->TestDidNavigate(1, interstitial_url); |
- |
- // After it loaded the interstitial should be gone. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
-} |
- |
-// Test that a new request to show an interstitial while an interstitial is |
-// pending does not cause problems. htp://crbug/29655 and htp://crbug/9442. |
-TEST_F(TabContentsTest, TwoQuickInterstitials) { |
- GURL interstitial_url("http://interstitial"); |
- |
- // Show a first interstitial. |
- TestInterstitialPage::InterstitialState state1 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted1 = false; |
- TestInterstitialPage* interstitial1 = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state1, &deleted1); |
- TestInterstitialPageStateGuard state_guard1(interstitial1); |
- interstitial1->Show(); |
- |
- // Show another interstitial on that same tab before the first one had time |
- // to load. |
- TestInterstitialPage::InterstitialState state2 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted2 = false; |
- TestInterstitialPage* interstitial2 = |
- new TestInterstitialPage(contents(), true, interstitial_url, |
- &state2, &deleted2); |
- TestInterstitialPageStateGuard state_guard2(interstitial2); |
- interstitial2->Show(); |
- |
- // The first interstitial should have been closed and deleted. |
- EXPECT_TRUE(deleted1); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state1); |
- |
- // The 2nd one should still be OK. |
- ASSERT_FALSE(deleted2); |
- EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
- |
- // Make the interstitial navigation commit it should be showing. |
- interstitial2->TestDidNavigate(1, interstitial_url); |
- EXPECT_EQ(interstitial2, contents()->interstitial_page()); |
-} |
- |
-// Test showing an interstitial and have its renderer crash. |
-TEST_F(TabContentsTest, InterstitialCrasher) { |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- // Simulate a renderer crash before the interstitial is shown. |
- interstitial->TestRenderViewGone( |
- base::TERMINATION_STATUS_PROCESS_CRASHED, -1); |
- // The interstitial should have been dismissed. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- |
- // Now try again but this time crash the intersitial after it was shown. |
- interstitial = |
- new TestInterstitialPage(contents(), true, url, &state, &deleted); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url); |
- // Simulate a renderer crash. |
- interstitial->TestRenderViewGone( |
- base::TERMINATION_STATUS_PROCESS_CRASHED, -1); |
- // The interstitial should have been dismissed. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
-} |
- |
-// Tests that showing an interstitial as a result of a browser initiated |
-// navigation while an interstitial is showing does not remove the pending |
-// entry (see http://crbug.com/9791). |
-TEST_F(TabContentsTest, NewInterstitialDoesNotCancelPendingEntry) { |
- const char kUrl[] = "http://www.badguys.com/"; |
- const GURL kGURL(kUrl); |
- |
- // Start a navigation to a page |
- contents()->controller().LoadURL( |
- kGURL, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- |
- // Simulate that navigation triggering an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, kGURL); |
- |
- // Initiate a new navigation from the browser that also triggers an |
- // interstitial. |
- contents()->controller().LoadURL( |
- kGURL, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- TestInterstitialPage::InterstitialState state2 = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted2 = false; |
- TestInterstitialPage* interstitial2 = |
- new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard2(interstitial2); |
- interstitial2->Show(); |
- interstitial2->TestDidNavigate(1, kGURL); |
- |
- // Make sure we still have an entry. |
- NavigationEntry* entry = contents()->controller().pending_entry(); |
- ASSERT_TRUE(entry); |
- EXPECT_EQ(kUrl, entry->url().spec()); |
- |
- // And that the first interstitial is gone, but not the second. |
- EXPECT_TRUE(deleted); |
- EXPECT_EQ(TestInterstitialPage::CANCELED, state); |
- EXPECT_FALSE(deleted2); |
- EXPECT_EQ(TestInterstitialPage::UNDECIDED, state2); |
-} |
- |
-// Tests that Javascript messages are not shown while an interstitial is |
-// showing. |
-TEST_F(TabContentsTest, NoJSMessageOnInterstitials) { |
- const char kUrl[] = "http://www.badguys.com/"; |
- const GURL kGURL(kUrl); |
- |
- // Start a navigation to a page |
- contents()->controller().LoadURL( |
- kGURL, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
- std::string()); |
- // DidNavigate from the page |
- contents()->TestDidNavigate(rvh(), 1, kGURL, content::PAGE_TRANSITION_TYPED); |
- |
- // Simulate showing an interstitial while the page is showing. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, kGURL, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, kGURL); |
- |
- // While the interstitial is showing, let's simulate the hidden page |
- // attempting to show a JS message. |
- IPC::Message* dummy_message = new IPC::Message; |
- bool did_suppress_message = false; |
- contents()->RunJavaScriptMessage(contents()->render_view_host(), |
- ASCIIToUTF16("This is an informative message"), ASCIIToUTF16("OK"), |
- kGURL, ui::MessageBoxFlags::kIsJavascriptAlert, dummy_message, |
- &did_suppress_message); |
- EXPECT_TRUE(did_suppress_message); |
-} |
- |
-// Makes sure that if the source passed to CopyStateFromAndPrune has an |
-// interstitial it isn't copied over to the destination. |
-TEST_F(TabContentsTest, CopyStateFromAndPruneSourceInterstitial) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- rvh()->SendNavigate(1, url1); |
- EXPECT_EQ(1, controller().entry_count()); |
- |
- // Initiate a browser navigation that will trigger the interstitial |
- controller().LoadURL(GURL("http://www.evil.com"), content::Referrer(), |
- content::PAGE_TRANSITION_TYPED, std::string()); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url2("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(contents(), true, url2, &state, &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url2); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_EQ(2, controller().entry_count()); |
- |
- // Create another NavigationController. |
- GURL url3("http://foo2"); |
- scoped_ptr<TestTabContents> other_contents(CreateTestTabContents()); |
- NavigationController& other_controller = other_contents->controller(); |
- other_contents->NavigateAndCommit(url3); |
- other_contents->ExpectSetHistoryLengthAndPrune( |
- other_controller.GetEntryAtIndex(0)->site_instance(), 1, |
- other_controller.GetEntryAtIndex(0)->page_id()); |
- other_controller.CopyStateFromAndPrune(&controller()); |
- |
- // The merged controller should only have two entries: url1 and url2. |
- ASSERT_EQ(2, other_controller.entry_count()); |
- EXPECT_EQ(1, other_controller.GetCurrentEntryIndex()); |
- EXPECT_EQ(url1, other_controller.GetEntryAtIndex(0)->url()); |
- EXPECT_EQ(url3, other_controller.GetEntryAtIndex(1)->url()); |
- |
- // And the merged controller shouldn't be showing an interstitial. |
- EXPECT_FALSE(other_contents->showing_interstitial_page()); |
-} |
- |
-// Makes sure that CopyStateFromAndPrune does the right thing if the object |
-// CopyStateFromAndPrune is invoked on is showing an interstitial. |
-TEST_F(TabContentsTest, CopyStateFromAndPruneTargetInterstitial) { |
- // Navigate to a page. |
- GURL url1("http://www.google.com"); |
- contents()->NavigateAndCommit(url1); |
- |
- // Create another NavigationController. |
- scoped_ptr<TestTabContents> other_contents(CreateTestTabContents()); |
- NavigationController& other_controller = other_contents->controller(); |
- |
- // Navigate it to url2. |
- GURL url2("http://foo2"); |
- other_contents->NavigateAndCommit(url2); |
- |
- // Show an interstitial. |
- TestInterstitialPage::InterstitialState state = |
- TestInterstitialPage::UNDECIDED; |
- bool deleted = false; |
- GURL url3("http://interstitial"); |
- TestInterstitialPage* interstitial = |
- new TestInterstitialPage(other_contents.get(), true, url3, &state, |
- &deleted); |
- TestInterstitialPageStateGuard state_guard(interstitial); |
- interstitial->Show(); |
- interstitial->TestDidNavigate(1, url3); |
- EXPECT_TRUE(interstitial->is_showing()); |
- EXPECT_EQ(2, other_controller.entry_count()); |
- other_contents->ExpectSetHistoryLengthAndPrune( |
- other_controller.GetEntryAtIndex(0)->site_instance(), 1, |
- other_controller.GetEntryAtIndex(0)->page_id()); |
- other_controller.CopyStateFromAndPrune(&controller()); |
- |
- // The merged controller should only have two entries: url1 and url2. |
- ASSERT_EQ(2, other_controller.entry_count()); |
- EXPECT_EQ(1, other_controller.GetCurrentEntryIndex()); |
- EXPECT_EQ(url1, other_controller.GetEntryAtIndex(0)->url()); |
- EXPECT_EQ(url3, other_controller.GetEntryAtIndex(1)->url()); |
- |
- // It should have a transient entry. |
- EXPECT_TRUE(other_controller.GetTransientEntry()); |
- |
- // And the interstitial should be showing. |
- EXPECT_TRUE(other_contents->showing_interstitial_page()); |
- |
- // And the interstitial should do a reload on don't proceed. |
- EXPECT_TRUE(other_contents->interstitial_page()->reload_on_dont_proceed()); |
-} |