OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "base/logging.h" | 5 #include "base/logging.h" |
6 #include "base/utf_string_conversions.h" | 6 #include "base/utf_string_conversions.h" |
7 #include "content/browser/renderer_host/render_view_host_impl.h" | 7 #include "content/browser/renderer_host/render_view_host_impl.h" |
8 #include "content/browser/renderer_host/test_render_view_host.h" | 8 #include "content/browser/renderer_host/test_render_view_host.h" |
9 #include "content/browser/site_instance_impl.h" | 9 #include "content/browser/site_instance_impl.h" |
10 #include "content/browser/web_contents/interstitial_page_impl.h" | 10 #include "content/browser/web_contents/interstitial_page_impl.h" |
(...skipping 537 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
548 TestRenderViewHost* orig_rvh = test_rvh(); | 548 TestRenderViewHost* orig_rvh = test_rvh(); |
549 SiteInstance* instance1 = contents()->GetSiteInstance(); | 549 SiteInstance* instance1 = contents()->GetSiteInstance(); |
550 | 550 |
551 // Navigate to URL. First URL should use first RenderViewHost. | 551 // Navigate to URL. First URL should use first RenderViewHost. |
552 const GURL url("http://www.google.com"); | 552 const GURL url("http://www.google.com"); |
553 controller().LoadURL( | 553 controller().LoadURL( |
554 url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); | 554 url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
555 contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); | 555 contents()->TestDidNavigate(orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
556 | 556 |
557 // Open a new contents with the same SiteInstance, navigated to the same site. | 557 // Open a new contents with the same SiteInstance, navigated to the same site. |
558 TestWebContents contents2(browser_context_.get(), instance1); | 558 scoped_ptr<TestWebContents> contents2( |
559 contents2.transition_cross_site = true; | 559 TestWebContents::Create(browser_context_.get(), instance1)); |
560 contents2.GetController().LoadURL(url, content::Referrer(), | 560 contents2->transition_cross_site = true; |
| 561 contents2->GetController().LoadURL(url, content::Referrer(), |
561 content::PAGE_TRANSITION_TYPED, | 562 content::PAGE_TRANSITION_TYPED, |
562 std::string()); | 563 std::string()); |
563 // Need this page id to be 2 since the site instance is the same (which is the | 564 // Need this page id to be 2 since the site instance is the same (which is the |
564 // scope of page IDs) and we want to consider this a new page. | 565 // scope of page IDs) and we want to consider this a new page. |
565 contents2.TestDidNavigate( | 566 contents2->TestDidNavigate( |
566 contents2.GetRenderViewHost(), 2, url, content::PAGE_TRANSITION_TYPED); | 567 contents2->GetRenderViewHost(), 2, url, content::PAGE_TRANSITION_TYPED); |
567 | 568 |
568 // Navigate first contents to a new site. | 569 // Navigate first contents to a new site. |
569 const GURL url2a("http://www.yahoo.com"); | 570 const GURL url2a("http://www.yahoo.com"); |
570 controller().LoadURL( | 571 controller().LoadURL( |
571 url2a, content::Referrer(), content::PAGE_TRANSITION_TYPED, | 572 url2a, content::Referrer(), content::PAGE_TRANSITION_TYPED, |
572 std::string()); | 573 std::string()); |
573 orig_rvh->SendShouldCloseACK(true); | 574 orig_rvh->SendShouldCloseACK(true); |
574 TestRenderViewHost* pending_rvh_a = | 575 TestRenderViewHost* pending_rvh_a = |
575 static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost()); | 576 static_cast<TestRenderViewHost*>(contents()->GetPendingRenderViewHost()); |
576 contents()->TestDidNavigate( | 577 contents()->TestDidNavigate( |
577 pending_rvh_a, 1, url2a, content::PAGE_TRANSITION_TYPED); | 578 pending_rvh_a, 1, url2a, content::PAGE_TRANSITION_TYPED); |
578 SiteInstance* instance2a = contents()->GetSiteInstance(); | 579 SiteInstance* instance2a = contents()->GetSiteInstance(); |
579 EXPECT_NE(instance1, instance2a); | 580 EXPECT_NE(instance1, instance2a); |
580 | 581 |
581 // Navigate second contents to the same site as the first tab. | 582 // Navigate second contents to the same site as the first tab. |
582 const GURL url2b("http://mail.yahoo.com"); | 583 const GURL url2b("http://mail.yahoo.com"); |
583 contents2.GetController().LoadURL(url2b, content::Referrer(), | 584 contents2->GetController().LoadURL(url2b, content::Referrer(), |
584 content::PAGE_TRANSITION_TYPED, | 585 content::PAGE_TRANSITION_TYPED, |
585 std::string()); | 586 std::string()); |
586 TestRenderViewHost* rvh2 = | 587 TestRenderViewHost* rvh2 = |
587 static_cast<TestRenderViewHost*>(contents2.GetRenderViewHost()); | 588 static_cast<TestRenderViewHost*>(contents2->GetRenderViewHost()); |
588 rvh2->SendShouldCloseACK(true); | 589 rvh2->SendShouldCloseACK(true); |
589 TestRenderViewHost* pending_rvh_b = | 590 TestRenderViewHost* pending_rvh_b = |
590 static_cast<TestRenderViewHost*>(contents2.GetPendingRenderViewHost()); | 591 static_cast<TestRenderViewHost*>(contents2->GetPendingRenderViewHost()); |
591 EXPECT_TRUE(pending_rvh_b != NULL); | 592 EXPECT_TRUE(pending_rvh_b != NULL); |
592 EXPECT_TRUE(contents2.cross_navigation_pending()); | 593 EXPECT_TRUE(contents2->cross_navigation_pending()); |
593 | 594 |
594 // NOTE(creis): We used to be in danger of showing a crash page here if the | 595 // NOTE(creis): We used to be in danger of showing a crash page here if the |
595 // second contents hadn't navigated somewhere first (bug 1145430). That case | 596 // second contents hadn't navigated somewhere first (bug 1145430). That case |
596 // is now covered by the CrossSiteBoundariesAfterCrash test. | 597 // is now covered by the CrossSiteBoundariesAfterCrash test. |
597 contents2.TestDidNavigate( | 598 contents2->TestDidNavigate( |
598 pending_rvh_b, 2, url2b, content::PAGE_TRANSITION_TYPED); | 599 pending_rvh_b, 2, url2b, content::PAGE_TRANSITION_TYPED); |
599 SiteInstance* instance2b = contents2.GetSiteInstance(); | 600 SiteInstance* instance2b = contents2->GetSiteInstance(); |
600 EXPECT_NE(instance1, instance2b); | 601 EXPECT_NE(instance1, instance2b); |
601 | 602 |
602 // Both contentses should now be in the same SiteInstance. | 603 // Both contentses should now be in the same SiteInstance. |
603 EXPECT_EQ(instance2a, instance2b); | 604 EXPECT_EQ(instance2a, instance2b); |
604 } | 605 } |
605 | 606 |
606 // Tests that WebContentsImpl uses the current URL, not the SiteInstance's site, | 607 // Tests that WebContentsImpl uses the current URL, not the SiteInstance's site, |
607 // to determine whether a navigation is cross-site. | 608 // to determine whether a navigation is cross-site. |
608 TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) { | 609 TEST_F(WebContentsImplTest, CrossSiteComparesAgainstCurrentPage) { |
609 contents()->transition_cross_site = true; | 610 contents()->transition_cross_site = true; |
610 RenderViewHost* orig_rvh = rvh(); | 611 RenderViewHost* orig_rvh = rvh(); |
611 SiteInstance* instance1 = contents()->GetSiteInstance(); | 612 SiteInstance* instance1 = contents()->GetSiteInstance(); |
612 | 613 |
613 // Navigate to URL. | 614 // Navigate to URL. |
614 const GURL url("http://www.google.com"); | 615 const GURL url("http://www.google.com"); |
615 controller().LoadURL( | 616 controller().LoadURL( |
616 url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); | 617 url, content::Referrer(), content::PAGE_TRANSITION_TYPED, std::string()); |
617 contents()->TestDidNavigate( | 618 contents()->TestDidNavigate( |
618 orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); | 619 orig_rvh, 1, url, content::PAGE_TRANSITION_TYPED); |
619 | 620 |
620 // Open a related contents to a second site. | 621 // Open a related contents to a second site. |
621 TestWebContents contents2(browser_context_.get(), instance1); | 622 scoped_ptr<TestWebContents> contents2( |
622 contents2.transition_cross_site = true; | 623 TestWebContents::Create(browser_context_.get(), instance1)); |
| 624 contents2->transition_cross_site = true; |
623 const GURL url2("http://www.yahoo.com"); | 625 const GURL url2("http://www.yahoo.com"); |
624 contents2.GetController().LoadURL(url2, content::Referrer(), | 626 contents2->GetController().LoadURL(url2, content::Referrer(), |
625 content::PAGE_TRANSITION_TYPED, | 627 content::PAGE_TRANSITION_TYPED, |
626 std::string()); | 628 std::string()); |
627 // The first RVH in contents2 isn't live yet, so we shortcut the cross site | 629 // The first RVH in contents2 isn't live yet, so we shortcut the cross site |
628 // pending. | 630 // pending. |
629 TestRenderViewHost* rvh2 = static_cast<TestRenderViewHost*>( | 631 TestRenderViewHost* rvh2 = static_cast<TestRenderViewHost*>( |
630 contents2.GetRenderViewHost()); | 632 contents2->GetRenderViewHost()); |
631 EXPECT_FALSE(contents2.cross_navigation_pending()); | 633 EXPECT_FALSE(contents2->cross_navigation_pending()); |
632 contents2.TestDidNavigate(rvh2, 2, url2, content::PAGE_TRANSITION_TYPED); | 634 contents2->TestDidNavigate(rvh2, 2, url2, content::PAGE_TRANSITION_TYPED); |
633 SiteInstance* instance2 = contents2.GetSiteInstance(); | 635 SiteInstance* instance2 = contents2->GetSiteInstance(); |
634 EXPECT_NE(instance1, instance2); | 636 EXPECT_NE(instance1, instance2); |
635 EXPECT_FALSE(contents2.cross_navigation_pending()); | 637 EXPECT_FALSE(contents2->cross_navigation_pending()); |
636 | 638 |
637 // Simulate a link click in first contents to second site. Doesn't switch | 639 // Simulate a link click in first contents to second site. Doesn't switch |
638 // SiteInstances, because we don't intercept WebKit navigations. | 640 // SiteInstances, because we don't intercept WebKit navigations. |
639 contents()->TestDidNavigate( | 641 contents()->TestDidNavigate( |
640 orig_rvh, 2, url2, content::PAGE_TRANSITION_TYPED); | 642 orig_rvh, 2, url2, content::PAGE_TRANSITION_TYPED); |
641 SiteInstance* instance3 = contents()->GetSiteInstance(); | 643 SiteInstance* instance3 = contents()->GetSiteInstance(); |
642 EXPECT_EQ(instance1, instance3); | 644 EXPECT_EQ(instance1, instance3); |
643 EXPECT_FALSE(contents()->cross_navigation_pending()); | 645 EXPECT_FALSE(contents()->cross_navigation_pending()); |
644 | 646 |
645 // Navigate to the new site. Doesn't switch SiteInstancees, because we | 647 // Navigate to the new site. Doesn't switch SiteInstancees, because we |
(...skipping 1222 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1868 TestInterstitialPageStateGuard state_guard(interstitial); | 1870 TestInterstitialPageStateGuard state_guard(interstitial); |
1869 interstitial->Show(); | 1871 interstitial->Show(); |
1870 interstitial->TestDidNavigate(1, url2); | 1872 interstitial->TestDidNavigate(1, url2); |
1871 EXPECT_TRUE(interstitial->is_showing()); | 1873 EXPECT_TRUE(interstitial->is_showing()); |
1872 EXPECT_EQ(2, controller().GetEntryCount()); | 1874 EXPECT_EQ(2, controller().GetEntryCount()); |
1873 | 1875 |
1874 // Create another NavigationController. | 1876 // Create another NavigationController. |
1875 GURL url3("http://foo2"); | 1877 GURL url3("http://foo2"); |
1876 scoped_ptr<TestWebContents> other_contents( | 1878 scoped_ptr<TestWebContents> other_contents( |
1877 static_cast<TestWebContents*>(CreateTestWebContents())); | 1879 static_cast<TestWebContents*>(CreateTestWebContents())); |
1878 NavigationControllerImpl& other_controller = | 1880 NavigationControllerImpl& other_controller = other_contents->GetController(); |
1879 other_contents->GetControllerImpl(); | |
1880 other_contents->NavigateAndCommit(url3); | 1881 other_contents->NavigateAndCommit(url3); |
1881 other_contents->ExpectSetHistoryLengthAndPrune( | 1882 other_contents->ExpectSetHistoryLengthAndPrune( |
1882 NavigationEntryImpl::FromNavigationEntry( | 1883 NavigationEntryImpl::FromNavigationEntry( |
1883 other_controller.GetEntryAtIndex(0))->site_instance(), 1, | 1884 other_controller.GetEntryAtIndex(0))->site_instance(), 1, |
1884 other_controller.GetEntryAtIndex(0)->GetPageID()); | 1885 other_controller.GetEntryAtIndex(0)->GetPageID()); |
1885 other_controller.CopyStateFromAndPrune(&controller()); | 1886 other_controller.CopyStateFromAndPrune(&controller()); |
1886 | 1887 |
1887 // The merged controller should only have two entries: url1 and url2. | 1888 // The merged controller should only have two entries: url1 and url2. |
1888 ASSERT_EQ(2, other_controller.GetEntryCount()); | 1889 ASSERT_EQ(2, other_controller.GetEntryCount()); |
1889 EXPECT_EQ(1, other_controller.GetCurrentEntryIndex()); | 1890 EXPECT_EQ(1, other_controller.GetCurrentEntryIndex()); |
1890 EXPECT_EQ(url1, other_controller.GetEntryAtIndex(0)->GetURL()); | 1891 EXPECT_EQ(url1, other_controller.GetEntryAtIndex(0)->GetURL()); |
1891 EXPECT_EQ(url3, other_controller.GetEntryAtIndex(1)->GetURL()); | 1892 EXPECT_EQ(url3, other_controller.GetEntryAtIndex(1)->GetURL()); |
1892 | 1893 |
1893 // And the merged controller shouldn't be showing an interstitial. | 1894 // And the merged controller shouldn't be showing an interstitial. |
1894 EXPECT_FALSE(other_contents->ShowingInterstitialPage()); | 1895 EXPECT_FALSE(other_contents->ShowingInterstitialPage()); |
1895 } | 1896 } |
1896 | 1897 |
1897 // Makes sure that CopyStateFromAndPrune does the right thing if the object | 1898 // Makes sure that CopyStateFromAndPrune does the right thing if the object |
1898 // CopyStateFromAndPrune is invoked on is showing an interstitial. | 1899 // CopyStateFromAndPrune is invoked on is showing an interstitial. |
1899 TEST_F(WebContentsImplTest, CopyStateFromAndPruneTargetInterstitial) { | 1900 TEST_F(WebContentsImplTest, CopyStateFromAndPruneTargetInterstitial) { |
1900 // Navigate to a page. | 1901 // Navigate to a page. |
1901 GURL url1("http://www.google.com"); | 1902 GURL url1("http://www.google.com"); |
1902 contents()->NavigateAndCommit(url1); | 1903 contents()->NavigateAndCommit(url1); |
1903 | 1904 |
1904 // Create another NavigationController. | 1905 // Create another NavigationController. |
1905 scoped_ptr<TestWebContents> other_contents( | 1906 scoped_ptr<TestWebContents> other_contents( |
1906 static_cast<TestWebContents*>(CreateTestWebContents())); | 1907 static_cast<TestWebContents*>(CreateTestWebContents())); |
1907 NavigationControllerImpl& other_controller = | 1908 NavigationControllerImpl& other_controller = other_contents->GetController(); |
1908 other_contents->GetControllerImpl(); | |
1909 | 1909 |
1910 // Navigate it to url2. | 1910 // Navigate it to url2. |
1911 GURL url2("http://foo2"); | 1911 GURL url2("http://foo2"); |
1912 other_contents->NavigateAndCommit(url2); | 1912 other_contents->NavigateAndCommit(url2); |
1913 | 1913 |
1914 // Show an interstitial. | 1914 // Show an interstitial. |
1915 TestInterstitialPage::InterstitialState state = | 1915 TestInterstitialPage::InterstitialState state = |
1916 TestInterstitialPage::UNDECIDED; | 1916 TestInterstitialPage::UNDECIDED; |
1917 bool deleted = false; | 1917 bool deleted = false; |
1918 GURL url3("http://interstitial"); | 1918 GURL url3("http://interstitial"); |
(...skipping 20 matching lines...) Expand all Loading... |
1939 // It should have a transient entry. | 1939 // It should have a transient entry. |
1940 EXPECT_TRUE(other_controller.GetTransientEntry()); | 1940 EXPECT_TRUE(other_controller.GetTransientEntry()); |
1941 | 1941 |
1942 // And the interstitial should be showing. | 1942 // And the interstitial should be showing. |
1943 EXPECT_TRUE(other_contents->ShowingInterstitialPage()); | 1943 EXPECT_TRUE(other_contents->ShowingInterstitialPage()); |
1944 | 1944 |
1945 // And the interstitial should do a reload on don't proceed. | 1945 // And the interstitial should do a reload on don't proceed. |
1946 EXPECT_TRUE(static_cast<InterstitialPageImpl*>( | 1946 EXPECT_TRUE(static_cast<InterstitialPageImpl*>( |
1947 other_contents->GetInterstitialPage())->reload_on_dont_proceed()); | 1947 other_contents->GetInterstitialPage())->reload_on_dont_proceed()); |
1948 } | 1948 } |
OLD | NEW |