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

Side by Side Diff: content/browser/frame_host/render_frame_host_manager_unittest.cc

Issue 701953006: PlzNavigate: Speculatively spawns a renderer process for navigations. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed last round of CR comments. Created 5 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/command_line.h" 5 #include "base/command_line.h"
6 #include "base/files/file_path.h" 6 #include "base/files/file_path.h"
7 #include "base/strings/utf_string_conversions.h" 7 #include "base/strings/utf_string_conversions.h"
8 #include "base/test/histogram_tester.h" 8 #include "base/test/histogram_tester.h"
9 #include "base/time/time.h" 9 #include "base/time/time.h"
10 #include "content/browser/frame_host/cross_site_transferring_request.h" 10 #include "content/browser/frame_host/cross_site_transferring_request.h"
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
835 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), 835 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(),
836 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED, 836 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED,
837 false /* is_renderer_init */); 837 false /* is_renderer_init */);
838 host = manager->Navigate(entry1); 838 host = manager->Navigate(entry1);
839 839
840 // The RenderFrameHost created in Init will be reused. 840 // The RenderFrameHost created in Init will be reused.
841 EXPECT_TRUE(host == manager->current_frame_host()); 841 EXPECT_TRUE(host == manager->current_frame_host());
842 EXPECT_FALSE(manager->pending_frame_host()); 842 EXPECT_FALSE(manager->pending_frame_host());
843 843
844 // Commit. 844 // Commit.
845 manager->DidNavigateFrame(host, true); 845 manager->DidNavigateFrame(host, true, false);
846 // Commit to SiteInstance should be delayed until RenderFrame commit. 846 // Commit to SiteInstance should be delayed until RenderFrame commit.
847 EXPECT_TRUE(host == manager->current_frame_host()); 847 EXPECT_TRUE(host == manager->current_frame_host());
848 ASSERT_TRUE(host); 848 ASSERT_TRUE(host);
849 EXPECT_FALSE(host->GetSiteInstance()->HasSite()); 849 EXPECT_FALSE(host->GetSiteInstance()->HasSite());
850 host->GetSiteInstance()->SetSite(kUrl1); 850 host->GetSiteInstance()->SetSite(kUrl1);
851 851
852 // 2) Navigate to next site. ------------------------- 852 // 2) Navigate to next site. -------------------------
853 const GURL kUrl2("http://www.google.com/foo"); 853 const GURL kUrl2("http://www.google.com/foo");
854 NavigationEntryImpl entry2( 854 NavigationEntryImpl entry2(
855 NULL /* instance */, -1 /* page_id */, kUrl2, 855 NULL /* instance */, -1 /* page_id */, kUrl2,
856 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 856 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
857 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 857 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
858 true /* is_renderer_init */); 858 true /* is_renderer_init */);
859 host = manager->Navigate(entry2); 859 host = manager->Navigate(entry2);
860 860
861 // The RenderFrameHost created in Init will be reused. 861 // The RenderFrameHost created in Init will be reused.
862 EXPECT_TRUE(host == manager->current_frame_host()); 862 EXPECT_TRUE(host == manager->current_frame_host());
863 EXPECT_FALSE(manager->pending_frame_host()); 863 EXPECT_FALSE(manager->pending_frame_host());
864 864
865 // Commit. 865 // Commit.
866 manager->DidNavigateFrame(host, true); 866 manager->DidNavigateFrame(host, true, false);
867 EXPECT_TRUE(host == manager->current_frame_host()); 867 EXPECT_TRUE(host == manager->current_frame_host());
868 ASSERT_TRUE(host); 868 ASSERT_TRUE(host);
869 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 869 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
870 870
871 // 3) Cross-site navigate to next site. -------------- 871 // 3) Cross-site navigate to next site. --------------
872 const GURL kUrl3("http://webkit.org/"); 872 const GURL kUrl3("http://webkit.org/");
873 NavigationEntryImpl entry3( 873 NavigationEntryImpl entry3(
874 NULL /* instance */, -1 /* page_id */, kUrl3, 874 NULL /* instance */, -1 /* page_id */, kUrl3,
875 Referrer(kUrl2, blink::WebReferrerPolicyDefault), 875 Referrer(kUrl2, blink::WebReferrerPolicyDefault),
876 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 876 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
877 false /* is_renderer_init */); 877 false /* is_renderer_init */);
878 host = manager->Navigate(entry3); 878 host = manager->Navigate(entry3);
879 879
880 // A new RenderFrameHost should be created. 880 // A new RenderFrameHost should be created.
881 EXPECT_TRUE(manager->pending_frame_host()); 881 EXPECT_TRUE(manager->pending_frame_host());
882 ASSERT_EQ(host, manager->pending_frame_host()); 882 ASSERT_EQ(host, manager->pending_frame_host());
883 883
884 notifications.Reset(); 884 notifications.Reset();
885 885
886 // Commit. 886 // Commit.
887 manager->DidNavigateFrame(manager->pending_frame_host(), true); 887 manager->DidNavigateFrame(manager->pending_frame_host(), true, false);
888 EXPECT_TRUE(host == manager->current_frame_host()); 888 EXPECT_TRUE(host == manager->current_frame_host());
889 ASSERT_TRUE(host); 889 ASSERT_TRUE(host);
890 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 890 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
891 // Check the pending RenderFrameHost has been committed. 891 // Check the pending RenderFrameHost has been committed.
892 EXPECT_FALSE(manager->pending_frame_host()); 892 EXPECT_FALSE(manager->pending_frame_host());
893 893
894 // We should observe a notification. 894 // We should observe a notification.
895 EXPECT_TRUE( 895 EXPECT_TRUE(
896 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); 896 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED));
897 } 897 }
(...skipping 29 matching lines...) Expand all
927 // get loaded in between. 927 // get loaded in between.
928 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 928 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
929 EXPECT_EQ(kUrl, host->GetSiteInstance()->GetSiteURL()); 929 EXPECT_EQ(kUrl, host->GetSiteInstance()->GetSiteURL());
930 930
931 // The Web UI is committed immediately because the RenderViewHost has not been 931 // The Web UI is committed immediately because the RenderViewHost has not been
932 // used yet. UpdateStateForNavigate() took the short cut path. 932 // used yet. UpdateStateForNavigate() took the short cut path.
933 EXPECT_FALSE(manager->pending_web_ui()); 933 EXPECT_FALSE(manager->pending_web_ui());
934 EXPECT_TRUE(manager->web_ui()); 934 EXPECT_TRUE(manager->web_ui());
935 935
936 // Commit. 936 // Commit.
937 manager->DidNavigateFrame(host, true); 937 manager->DidNavigateFrame(host, true, false);
938 EXPECT_TRUE( 938 EXPECT_TRUE(
939 host->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 939 host->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
940 } 940 }
941 941
942 // Tests that we can open a WebUI link in a new tab from a WebUI page and still 942 // Tests that we can open a WebUI link in a new tab from a WebUI page and still
943 // grant the correct bindings. http://crbug.com/189101. 943 // grant the correct bindings. http://crbug.com/189101.
944 TEST_F(RenderFrameHostManagerTest, WebUIInNewTab) { 944 TEST_F(RenderFrameHostManagerTest, WebUIInNewTab) {
945 set_should_create_webui(true); 945 set_should_create_webui(true);
946 SiteInstance* blank_instance = SiteInstance::Create(browser_context()); 946 SiteInstance* blank_instance = SiteInstance::Create(browser_context());
947 947
(...skipping 17 matching lines...) Expand all
965 RenderFrameHostImpl* host1 = manager1->Navigate(entry1); 965 RenderFrameHostImpl* host1 = manager1->Navigate(entry1);
966 966
967 // We should have a pending navigation to the WebUI RenderViewHost. 967 // We should have a pending navigation to the WebUI RenderViewHost.
968 // It should already have bindings. 968 // It should already have bindings.
969 EXPECT_EQ(host1, manager1->pending_frame_host()); 969 EXPECT_EQ(host1, manager1->pending_frame_host());
970 EXPECT_NE(host1, manager1->current_frame_host()); 970 EXPECT_NE(host1, manager1->current_frame_host());
971 EXPECT_TRUE( 971 EXPECT_TRUE(
972 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 972 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
973 973
974 // Commit and ensure we still have bindings. 974 // Commit and ensure we still have bindings.
975 manager1->DidNavigateFrame(host1, true); 975 manager1->DidNavigateFrame(host1, true, false);
976 SiteInstance* webui_instance = host1->GetSiteInstance(); 976 SiteInstance* webui_instance = host1->GetSiteInstance();
977 EXPECT_EQ(host1, manager1->current_frame_host()); 977 EXPECT_EQ(host1, manager1->current_frame_host());
978 EXPECT_TRUE( 978 EXPECT_TRUE(
979 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 979 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
980 980
981 // Now simulate clicking a link that opens in a new tab. 981 // Now simulate clicking a link that opens in a new tab.
982 scoped_ptr<TestWebContents> web_contents2( 982 scoped_ptr<TestWebContents> web_contents2(
983 TestWebContents::Create(browser_context(), webui_instance)); 983 TestWebContents::Create(browser_context(), webui_instance));
984 RenderFrameHostManager* manager2 = 984 RenderFrameHostManager* manager2 =
985 web_contents2->GetRenderManagerForTesting(); 985 web_contents2->GetRenderManagerForTesting();
986 // Make sure the new RVH is considered live. This is usually done in 986 // Make sure the new RVH is considered live. This is usually done in
987 // RenderWidgetHost::Init when opening a new tab from a link. 987 // RenderWidgetHost::Init when opening a new tab from a link.
988 manager2->current_host()->CreateRenderView( 988 manager2->current_host()->CreateRenderView(
989 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 989 base::string16(), -1, MSG_ROUTING_NONE, -1, false);
990 990
991 const GURL kUrl2("chrome://foo/bar"); 991 const GURL kUrl2("chrome://foo/bar");
992 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, 992 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2,
993 Referrer(), base::string16() /* title */, 993 Referrer(), base::string16() /* title */,
994 ui::PAGE_TRANSITION_LINK, 994 ui::PAGE_TRANSITION_LINK,
995 true /* is_renderer_init */); 995 true /* is_renderer_init */);
996 RenderFrameHostImpl* host2 = manager2->Navigate(entry2); 996 RenderFrameHostImpl* host2 = manager2->Navigate(entry2);
997 997
998 // No cross-process transition happens because we are already in the right 998 // No cross-process transition happens because we are already in the right
999 // SiteInstance. We should grant bindings immediately. 999 // SiteInstance. We should grant bindings immediately.
1000 EXPECT_EQ(host2, manager2->current_frame_host()); 1000 EXPECT_EQ(host2, manager2->current_frame_host());
1001 EXPECT_TRUE( 1001 EXPECT_TRUE(
1002 host2->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 1002 host2->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1003 1003
1004 manager2->DidNavigateFrame(host2, true); 1004 manager2->DidNavigateFrame(host2, true, false);
1005 } 1005 }
1006 1006
1007 // Tests that we don't end up in an inconsistent state if a page does a back and 1007 // Tests that we don't end up in an inconsistent state if a page does a back and
1008 // then reload. http://crbug.com/51680 1008 // then reload. http://crbug.com/51680
1009 // Also tests that only user-gesture navigations can interrupt cross-process 1009 // Also tests that only user-gesture navigations can interrupt cross-process
1010 // navigations. http://crbug.com/75195 1010 // navigations. http://crbug.com/75195
1011 TEST_F(RenderFrameHostManagerTest, PageDoesBackAndReload) { 1011 TEST_F(RenderFrameHostManagerTest, PageDoesBackAndReload) {
1012 const GURL kUrl1("http://www.google.com/"); 1012 const GURL kUrl1("http://www.google.com/");
1013 const GURL kUrl2("http://www.evil-site.com/"); 1013 const GURL kUrl2("http://www.evil-site.com/");
1014 1014
(...skipping 442 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED, 1457 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED,
1458 false /* is_renderer_init */); 1458 false /* is_renderer_init */);
1459 host = manager->Navigate(entry1); 1459 host = manager->Navigate(entry1);
1460 1460
1461 // The RenderFrameHost created in Init will be reused. 1461 // The RenderFrameHost created in Init will be reused.
1462 EXPECT_TRUE(host == manager->current_frame_host()); 1462 EXPECT_TRUE(host == manager->current_frame_host());
1463 EXPECT_FALSE(manager->pending_frame_host()); 1463 EXPECT_FALSE(manager->pending_frame_host());
1464 EXPECT_EQ(manager->current_frame_host()->GetSiteInstance(), instance); 1464 EXPECT_EQ(manager->current_frame_host()->GetSiteInstance(), instance);
1465 1465
1466 // Commit. 1466 // Commit.
1467 manager->DidNavigateFrame(host, true); 1467 manager->DidNavigateFrame(host, true, false);
1468 // Commit to SiteInstance should be delayed until RenderFrame commit. 1468 // Commit to SiteInstance should be delayed until RenderFrame commit.
1469 EXPECT_EQ(host, manager->current_frame_host()); 1469 EXPECT_EQ(host, manager->current_frame_host());
1470 ASSERT_TRUE(host); 1470 ASSERT_TRUE(host);
1471 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 1471 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
1472 1472
1473 // 2) Navigate to a different domain. ------------------------- 1473 // 2) Navigate to a different domain. -------------------------
1474 // Guests stay in the same process on navigation. 1474 // Guests stay in the same process on navigation.
1475 const GURL kUrl2("http://www.chromium.org"); 1475 const GURL kUrl2("http://www.chromium.org");
1476 NavigationEntryImpl entry2( 1476 NavigationEntryImpl entry2(
1477 NULL /* instance */, -1 /* page_id */, kUrl2, 1477 NULL /* instance */, -1 /* page_id */, kUrl2,
1478 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 1478 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
1479 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 1479 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
1480 true /* is_renderer_init */); 1480 true /* is_renderer_init */);
1481 host = manager->Navigate(entry2); 1481 host = manager->Navigate(entry2);
1482 1482
1483 // The RenderFrameHost created in Init will be reused. 1483 // The RenderFrameHost created in Init will be reused.
1484 EXPECT_EQ(host, manager->current_frame_host()); 1484 EXPECT_EQ(host, manager->current_frame_host());
1485 EXPECT_FALSE(manager->pending_frame_host()); 1485 EXPECT_FALSE(manager->pending_frame_host());
1486 1486
1487 // Commit. 1487 // Commit.
1488 manager->DidNavigateFrame(host, true); 1488 manager->DidNavigateFrame(host, true, false);
1489 EXPECT_EQ(host, manager->current_frame_host()); 1489 EXPECT_EQ(host, manager->current_frame_host());
1490 ASSERT_TRUE(host); 1490 ASSERT_TRUE(host);
1491 EXPECT_EQ(host->GetSiteInstance(), instance); 1491 EXPECT_EQ(host->GetSiteInstance(), instance);
1492 } 1492 }
1493 1493
1494 // Test that we cancel a pending RVH if we close the tab while it's pending. 1494 // Test that we cancel a pending RVH if we close the tab while it's pending.
1495 // http://crbug.com/294697. 1495 // http://crbug.com/294697.
1496 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyClose) { 1496 TEST_F(RenderFrameHostManagerTest, NavigateWithEarlyClose) {
1497 TestNotificationTracker notifications; 1497 TestNotificationTracker notifications;
1498 1498
(...skipping 19 matching lines...) Expand all
1518 // The RenderFrameHost created in Init will be reused. 1518 // The RenderFrameHost created in Init will be reused.
1519 EXPECT_EQ(host, manager->current_frame_host()); 1519 EXPECT_EQ(host, manager->current_frame_host());
1520 EXPECT_FALSE(manager->pending_frame_host()); 1520 EXPECT_FALSE(manager->pending_frame_host());
1521 1521
1522 // We should observe a notification. 1522 // We should observe a notification.
1523 EXPECT_TRUE( 1523 EXPECT_TRUE(
1524 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); 1524 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED));
1525 notifications.Reset(); 1525 notifications.Reset();
1526 1526
1527 // Commit. 1527 // Commit.
1528 manager->DidNavigateFrame(host, true); 1528 manager->DidNavigateFrame(host, true, false);
1529 1529
1530 // Commit to SiteInstance should be delayed until RenderFrame commits. 1530 // Commit to SiteInstance should be delayed until RenderFrame commits.
1531 EXPECT_EQ(host, manager->current_frame_host()); 1531 EXPECT_EQ(host, manager->current_frame_host());
1532 EXPECT_FALSE(host->GetSiteInstance()->HasSite()); 1532 EXPECT_FALSE(host->GetSiteInstance()->HasSite());
1533 host->GetSiteInstance()->SetSite(kUrl1); 1533 host->GetSiteInstance()->SetSite(kUrl1);
1534 1534
1535 // 2) Cross-site navigate to next site. ------------------------- 1535 // 2) Cross-site navigate to next site. -------------------------
1536 const GURL kUrl2("http://www.example.com"); 1536 const GURL kUrl2("http://www.example.com");
1537 NavigationEntryImpl entry2( 1537 NavigationEntryImpl entry2(
1538 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), 1538 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(),
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
1791 Referrer(), base::string16() /* title */, 1791 Referrer(), base::string16() /* title */,
1792 ui::PAGE_TRANSITION_TYPED, 1792 ui::PAGE_TRANSITION_TYPED,
1793 false /* is_renderer_init */); 1793 false /* is_renderer_init */);
1794 host = manager->Navigate(entry1); 1794 host = manager->Navigate(entry1);
1795 1795
1796 // The RenderFrameHost created in Init will be reused. 1796 // The RenderFrameHost created in Init will be reused.
1797 EXPECT_TRUE(host == manager->current_frame_host()); 1797 EXPECT_TRUE(host == manager->current_frame_host());
1798 EXPECT_FALSE(manager->pending_frame_host()); 1798 EXPECT_FALSE(manager->pending_frame_host());
1799 1799
1800 // Commit. 1800 // Commit.
1801 manager->DidNavigateFrame(host, true); 1801 manager->DidNavigateFrame(host, true, false);
1802 // Commit to SiteInstance should be delayed until RenderFrame commit. 1802 // Commit to SiteInstance should be delayed until RenderFrame commit.
1803 EXPECT_TRUE(host == manager->current_frame_host()); 1803 EXPECT_TRUE(host == manager->current_frame_host());
1804 ASSERT_TRUE(host); 1804 ASSERT_TRUE(host);
1805 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 1805 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
1806 1806
1807 // 2) Cross-site navigate to next site. -------------- 1807 // 2) Cross-site navigate to next site. --------------
1808 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, 1808 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2,
1809 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 1809 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
1810 base::string16() /* title */, 1810 base::string16() /* title */,
1811 ui::PAGE_TRANSITION_LINK, 1811 ui::PAGE_TRANSITION_LINK,
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
1844 #if 0 1844 #if 0
1845 // TODO(nick): Currently a proxy to the removed frame lingers in the parent. 1845 // TODO(nick): Currently a proxy to the removed frame lingers in the parent.
1846 // Enable this assert below once the proxies to the subframe are correctly 1846 // Enable this assert below once the proxies to the subframe are correctly
1847 // cleaned up after detach. http://crbug.com/444955. 1847 // cleaned up after detach. http://crbug.com/444955.
1848 ASSERT_TRUE(site_instance->HasOneRef()) 1848 ASSERT_TRUE(site_instance->HasOneRef())
1849 << "This SiteInstance should be destroyable now."; 1849 << "This SiteInstance should be destroyable now.";
1850 #endif 1850 #endif
1851 } 1851 }
1852 1852
1853 } // namespace content 1853 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698