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

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

Issue 1048463004: PlzNavigate: track pending commits (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Addressed comments + rebase on top of 1088933003 Created 5 years, 8 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 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 const GURL kDestUrl("http://www.google.com/"); 345 const GURL kDestUrl("http://www.google.com/");
346 346
347 // Navigate our first tab to a chrome url and then to the destination. 347 // Navigate our first tab to a chrome url and then to the destination.
348 NavigateActiveAndCommit(kChromeURL); 348 NavigateActiveAndCommit(kChromeURL);
349 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame(); 349 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame();
350 350
351 // Navigate to a cross-site URL. 351 // Navigate to a cross-site URL.
352 contents()->GetController().LoadURL( 352 contents()->GetController().LoadURL(
353 kDestUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 353 kDestUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
354 contents()->GetMainFrame()->PrepareForCommit(); 354 contents()->GetMainFrame()->PrepareForCommit();
355 EXPECT_TRUE(contents()->cross_navigation_pending()); 355 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
356 356
357 // Manually increase the number of active frames in the 357 // Manually increase the number of active frames in the
358 // SiteInstance that ntp_rfh belongs to, to prevent it from being 358 // SiteInstance that ntp_rfh belongs to, to prevent it from being
359 // destroyed when it gets swapped out. 359 // destroyed when it gets swapped out.
360 ntp_rfh->GetSiteInstance()->increment_active_frame_count(); 360 ntp_rfh->GetSiteInstance()->increment_active_frame_count();
361 361
362 TestRenderFrameHost* dest_rfh = contents()->GetPendingMainFrame(); 362 TestRenderFrameHost* dest_rfh = contents()->GetPendingMainFrame();
363 CHECK(dest_rfh); 363 CHECK(dest_rfh);
364 EXPECT_NE(ntp_rfh, dest_rfh); 364 EXPECT_NE(ntp_rfh, dest_rfh);
365 365
366 // BeforeUnload finishes. 366 // BeforeUnload finishes.
367 ntp_rfh->SendBeforeUnloadACK(true); 367 ntp_rfh->SendBeforeUnloadACK(true);
368 368
369 dest_rfh->SendNavigate(101, kDestUrl); 369 dest_rfh->SendNavigate(101, kDestUrl);
370 ntp_rfh->OnSwappedOut(); 370 ntp_rfh->OnSwappedOut();
371 371
372 EXPECT_TRUE(ntp_rfh->is_swapped_out()); 372 EXPECT_TRUE(ntp_rfh->is_swapped_out());
373 return ntp_rfh; 373 return ntp_rfh;
374 } 374 }
375 375
376 // Returns the RenderFrameHost that should be used in the navigation to 376 // Returns the RenderFrameHost that should be used in the navigation to
377 // |entry|. 377 // |entry|.
378 RenderFrameHostImpl* GetFrameHostForNavigation( 378 RenderFrameHostImpl* NavigateToEntry(
379 RenderFrameHostManager* manager, 379 RenderFrameHostManager* manager,
380 const NavigationEntryImpl& entry) { 380 const NavigationEntryImpl& entry) {
381 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 381 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
382 switches::kEnableBrowserSideNavigation)) { 382 switches::kEnableBrowserSideNavigation)) {
383 scoped_ptr<NavigationRequest> navigation_request = 383 scoped_ptr<NavigationRequest> navigation_request =
384 NavigationRequest::CreateBrowserInitiated( 384 NavigationRequest::CreateBrowserInitiated(
385 manager->frame_tree_node_, entry, FrameMsg_Navigate_Type::NORMAL, 385 manager->frame_tree_node_, entry, FrameMsg_Navigate_Type::NORMAL,
386 base::TimeTicks::Now(), 386 base::TimeTicks::Now(),
387 static_cast<NavigationControllerImpl*>(&controller())); 387 static_cast<NavigationControllerImpl*>(&controller()));
388 return manager->GetFrameHostForNavigation(*navigation_request); 388 TestRenderFrameHost* frame_host = static_cast<TestRenderFrameHost*>(
389 manager->GetFrameHostForNavigation(*navigation_request));
390 CHECK(frame_host);
391 frame_host->set_pending_commit(true);
392 return frame_host;
389 } 393 }
390 return manager->Navigate(entry); 394 return manager->Navigate(entry);
391 } 395 }
392 396
393 // Returns the pending RenderFrameHost. 397 // Returns the pending RenderFrameHost.
394 // PlzNavigate: returns the speculative RenderFrameHost. 398 // PlzNavigate: returns the speculative RenderFrameHost.
395 RenderFrameHostImpl* GetPendingFrameHost( 399 RenderFrameHostImpl* GetPendingFrameHost(
396 RenderFrameHostManager* manager) { 400 RenderFrameHostManager* manager) {
397 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 401 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
398 switches::kEnableBrowserSideNavigation)) { 402 switches::kEnableBrowserSideNavigation)) {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
444 scoped_ptr<TestWebContents> contents2( 448 scoped_ptr<TestWebContents> contents2(
445 TestWebContents::Create(browser_context(), NULL)); 449 TestWebContents::Create(browser_context(), NULL));
446 450
447 // Load the two URLs in the second tab. Note that the first navigation creates 451 // Load the two URLs in the second tab. Note that the first navigation creates
448 // a RFH that's not pending (since there is no cross-site transition), so 452 // a RFH that's not pending (since there is no cross-site transition), so
449 // we use the committed one. 453 // we use the committed one.
450 contents2->GetController().LoadURL( 454 contents2->GetController().LoadURL(
451 kChromeUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 455 kChromeUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
452 contents2->GetMainFrame()->PrepareForCommit(); 456 contents2->GetMainFrame()->PrepareForCommit();
453 TestRenderFrameHost* ntp_rfh2 = contents2->GetMainFrame(); 457 TestRenderFrameHost* ntp_rfh2 = contents2->GetMainFrame();
454 EXPECT_FALSE(contents2->cross_navigation_pending()); 458 EXPECT_FALSE(contents2->CrossProcessNavigationPending());
455 ntp_rfh2->SendNavigate(100, kChromeUrl); 459 ntp_rfh2->SendNavigate(100, kChromeUrl);
456 460
457 // The second one is the opposite, creating a cross-site transition and 461 // The second one is the opposite, creating a cross-site transition and
458 // requiring a beforeunload ack. 462 // requiring a beforeunload ack.
459 contents2->GetController().LoadURL( 463 contents2->GetController().LoadURL(
460 kDestUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 464 kDestUrl, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
461 contents2->GetMainFrame()->PrepareForCommit(); 465 contents2->GetMainFrame()->PrepareForCommit();
462 EXPECT_TRUE(contents2->cross_navigation_pending()); 466 EXPECT_TRUE(contents2->CrossProcessNavigationPending());
463 TestRenderFrameHost* dest_rfh2 = contents2->GetPendingMainFrame(); 467 TestRenderFrameHost* dest_rfh2 = contents2->GetPendingMainFrame();
464 ASSERT_TRUE(dest_rfh2); 468 ASSERT_TRUE(dest_rfh2);
465 469
466 dest_rfh2->SendNavigate(101, kDestUrl); 470 dest_rfh2->SendNavigate(101, kDestUrl);
467 471
468 // The two RFH's should be different in every way. 472 // The two RFH's should be different in every way.
469 EXPECT_NE(contents()->GetMainFrame()->GetProcess(), dest_rfh2->GetProcess()); 473 EXPECT_NE(contents()->GetMainFrame()->GetProcess(), dest_rfh2->GetProcess());
470 EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance(), 474 EXPECT_NE(contents()->GetMainFrame()->GetSiteInstance(),
471 dest_rfh2->GetSiteInstance()); 475 dest_rfh2->GetSiteInstance());
472 EXPECT_FALSE(dest_rfh2->GetSiteInstance()->IsRelatedSiteInstance( 476 EXPECT_FALSE(dest_rfh2->GetSiteInstance()->IsRelatedSiteInstance(
(...skipping 411 matching lines...) Expand 10 before | Expand all | Expand 10 after
884 888
885 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting(); 889 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting();
886 RenderFrameHostImpl* host = NULL; 890 RenderFrameHostImpl* host = NULL;
887 891
888 // 1) The first navigation. -------------------------- 892 // 1) The first navigation. --------------------------
889 const GURL kUrl1("http://www.google.com/"); 893 const GURL kUrl1("http://www.google.com/");
890 NavigationEntryImpl entry1( 894 NavigationEntryImpl entry1(
891 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), 895 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(),
892 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED, 896 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED,
893 false /* is_renderer_init */); 897 false /* is_renderer_init */);
894 host = GetFrameHostForNavigation(manager, entry1); 898 host = NavigateToEntry(manager, entry1);
895 899
896 // The RenderFrameHost created in Init will be reused. 900 // The RenderFrameHost created in Init will be reused.
897 EXPECT_TRUE(host == manager->current_frame_host()); 901 EXPECT_TRUE(host == manager->current_frame_host());
898 EXPECT_FALSE(GetPendingFrameHost(manager)); 902 EXPECT_FALSE(GetPendingFrameHost(manager));
899 903
900 // Commit. 904 // Commit.
901 manager->DidNavigateFrame(host, true); 905 manager->DidNavigateFrame(host, true);
902 // Commit to SiteInstance should be delayed until RenderFrame commit. 906 // Commit to SiteInstance should be delayed until RenderFrame commit.
903 EXPECT_TRUE(host == manager->current_frame_host()); 907 EXPECT_TRUE(host == manager->current_frame_host());
904 ASSERT_TRUE(host); 908 ASSERT_TRUE(host);
905 EXPECT_FALSE(host->GetSiteInstance()->HasSite()); 909 EXPECT_FALSE(host->GetSiteInstance()->HasSite());
906 host->GetSiteInstance()->SetSite(kUrl1); 910 host->GetSiteInstance()->SetSite(kUrl1);
907 911
908 // 2) Navigate to next site. ------------------------- 912 // 2) Navigate to next site. -------------------------
909 const GURL kUrl2("http://www.google.com/foo"); 913 const GURL kUrl2("http://www.google.com/foo");
910 NavigationEntryImpl entry2( 914 NavigationEntryImpl entry2(
911 NULL /* instance */, -1 /* page_id */, kUrl2, 915 NULL /* instance */, -1 /* page_id */, kUrl2,
912 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 916 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
913 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 917 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
914 true /* is_renderer_init */); 918 true /* is_renderer_init */);
915 host = GetFrameHostForNavigation(manager, entry2); 919 host = NavigateToEntry(manager, entry2);
916 920
917 // The RenderFrameHost created in Init will be reused. 921 // The RenderFrameHost created in Init will be reused.
918 EXPECT_TRUE(host == manager->current_frame_host()); 922 EXPECT_TRUE(host == manager->current_frame_host());
919 EXPECT_FALSE(GetPendingFrameHost(manager)); 923 EXPECT_FALSE(GetPendingFrameHost(manager));
920 924
921 // Commit. 925 // Commit.
922 manager->DidNavigateFrame(host, true); 926 manager->DidNavigateFrame(host, true);
923 EXPECT_TRUE(host == manager->current_frame_host()); 927 EXPECT_TRUE(host == manager->current_frame_host());
924 ASSERT_TRUE(host); 928 ASSERT_TRUE(host);
925 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 929 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
926 930
927 // 3) Cross-site navigate to next site. -------------- 931 // 3) Cross-site navigate to next site. --------------
928 const GURL kUrl3("http://webkit.org/"); 932 const GURL kUrl3("http://webkit.org/");
929 NavigationEntryImpl entry3( 933 NavigationEntryImpl entry3(
930 NULL /* instance */, -1 /* page_id */, kUrl3, 934 NULL /* instance */, -1 /* page_id */, kUrl3,
931 Referrer(kUrl2, blink::WebReferrerPolicyDefault), 935 Referrer(kUrl2, blink::WebReferrerPolicyDefault),
932 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 936 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
933 false /* is_renderer_init */); 937 false /* is_renderer_init */);
934 host = GetFrameHostForNavigation(manager, entry3); 938 host = NavigateToEntry(manager, entry3);
935 939
936 // A new RenderFrameHost should be created. 940 // A new RenderFrameHost should be created.
937 EXPECT_TRUE(GetPendingFrameHost(manager)); 941 EXPECT_TRUE(GetPendingFrameHost(manager));
938 ASSERT_EQ(host, GetPendingFrameHost(manager)); 942 ASSERT_EQ(host, GetPendingFrameHost(manager));
939 943
940 notifications.Reset(); 944 notifications.Reset();
941 945
942 // Commit. 946 // Commit.
943 manager->DidNavigateFrame(GetPendingFrameHost(manager), true); 947 manager->DidNavigateFrame(GetPendingFrameHost(manager), true);
944 EXPECT_TRUE(host == manager->current_frame_host()); 948 EXPECT_TRUE(host == manager->current_frame_host());
(...skipping 19 matching lines...) Expand all
964 968
965 EXPECT_FALSE(manager->current_host()->IsRenderViewLive()); 969 EXPECT_FALSE(manager->current_host()->IsRenderViewLive());
966 EXPECT_FALSE(manager->web_ui()); 970 EXPECT_FALSE(manager->web_ui());
967 EXPECT_TRUE(initial_rfh); 971 EXPECT_TRUE(initial_rfh);
968 972
969 const GURL kUrl("chrome://foo"); 973 const GURL kUrl("chrome://foo");
970 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl, 974 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl,
971 Referrer(), base::string16() /* title */, 975 Referrer(), base::string16() /* title */,
972 ui::PAGE_TRANSITION_TYPED, 976 ui::PAGE_TRANSITION_TYPED,
973 false /* is_renderer_init */); 977 false /* is_renderer_init */);
974 RenderFrameHostImpl* host = GetFrameHostForNavigation(manager, entry); 978 RenderFrameHostImpl* host = NavigateToEntry(manager, entry);
975 979
976 // We commit the pending RenderFrameHost immediately because the previous 980 // We commit the pending RenderFrameHost immediately because the previous
977 // RenderFrameHost was not live. We test a case where it is live in 981 // RenderFrameHost was not live. We test a case where it is live in
978 // WebUIInNewTab. 982 // WebUIInNewTab.
979 EXPECT_TRUE(host); 983 EXPECT_TRUE(host);
980 EXPECT_NE(initial_rfh, host); 984 EXPECT_NE(initial_rfh, host);
981 EXPECT_EQ(host, manager->current_frame_host()); 985 EXPECT_EQ(host, manager->current_frame_host());
982 EXPECT_FALSE(GetPendingFrameHost(manager)); 986 EXPECT_FALSE(GetPendingFrameHost(manager));
983 987
984 // It's important that the SiteInstance get set on the Web UI page as soon 988 // It's important that the SiteInstance get set on the Web UI page as soon
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
1020 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 1024 base::string16(), -1, MSG_ROUTING_NONE, -1, false);
1021 EXPECT_TRUE(manager1->current_host()->IsRenderViewLive()); 1025 EXPECT_TRUE(manager1->current_host()->IsRenderViewLive());
1022 EXPECT_TRUE(manager1->current_frame_host()->IsRenderFrameLive()); 1026 EXPECT_TRUE(manager1->current_frame_host()->IsRenderFrameLive());
1023 1027
1024 // Navigate to a WebUI page. 1028 // Navigate to a WebUI page.
1025 const GURL kUrl1("chrome://foo"); 1029 const GURL kUrl1("chrome://foo");
1026 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, 1030 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1,
1027 Referrer(), base::string16() /* title */, 1031 Referrer(), base::string16() /* title */,
1028 ui::PAGE_TRANSITION_TYPED, 1032 ui::PAGE_TRANSITION_TYPED,
1029 false /* is_renderer_init */); 1033 false /* is_renderer_init */);
1030 RenderFrameHostImpl* host1 = GetFrameHostForNavigation(manager1, entry1); 1034 RenderFrameHostImpl* host1 = NavigateToEntry(manager1, entry1);
1031 1035
1032 // We should have a pending navigation to the WebUI RenderViewHost. 1036 // We should have a pending navigation to the WebUI RenderViewHost.
1033 // It should already have bindings. 1037 // It should already have bindings.
1034 EXPECT_EQ(host1, GetPendingFrameHost(manager1)); 1038 EXPECT_EQ(host1, GetPendingFrameHost(manager1));
1035 EXPECT_NE(host1, manager1->current_frame_host()); 1039 EXPECT_NE(host1, manager1->current_frame_host());
1036 EXPECT_TRUE( 1040 EXPECT_TRUE(
1037 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 1041 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1038 1042
1039 // Commit and ensure we still have bindings. 1043 // Commit and ensure we still have bindings.
1040 manager1->DidNavigateFrame(host1, true); 1044 manager1->DidNavigateFrame(host1, true);
(...skipping 11 matching lines...) Expand all
1052 // RenderWidgetHost::Init when opening a new tab from a link. 1056 // RenderWidgetHost::Init when opening a new tab from a link.
1053 manager2->current_host()->CreateRenderView( 1057 manager2->current_host()->CreateRenderView(
1054 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 1058 base::string16(), -1, MSG_ROUTING_NONE, -1, false);
1055 EXPECT_TRUE(manager2->current_host()->IsRenderViewLive()); 1059 EXPECT_TRUE(manager2->current_host()->IsRenderViewLive());
1056 1060
1057 const GURL kUrl2("chrome://foo/bar"); 1061 const GURL kUrl2("chrome://foo/bar");
1058 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, 1062 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2,
1059 Referrer(), base::string16() /* title */, 1063 Referrer(), base::string16() /* title */,
1060 ui::PAGE_TRANSITION_LINK, 1064 ui::PAGE_TRANSITION_LINK,
1061 true /* is_renderer_init */); 1065 true /* is_renderer_init */);
1062 RenderFrameHostImpl* host2 = GetFrameHostForNavigation(manager2, entry2); 1066 RenderFrameHostImpl* host2 = NavigateToEntry(manager2, entry2);
1063 1067
1064 // No cross-process transition happens because we are already in the right 1068 // No cross-process transition happens because we are already in the right
1065 // SiteInstance. We should grant bindings immediately. 1069 // SiteInstance. We should grant bindings immediately.
1066 EXPECT_EQ(host2, manager2->current_frame_host()); 1070 EXPECT_EQ(host2, manager2->current_frame_host());
1067 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1071 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1068 switches::kEnableBrowserSideNavigation)) { 1072 switches::kEnableBrowserSideNavigation)) {
1069 EXPECT_TRUE(manager2->speculative_web_ui()); 1073 EXPECT_TRUE(manager2->speculative_web_ui());
1070 } else { 1074 } else {
1071 EXPECT_TRUE(manager2->pending_web_ui()); 1075 EXPECT_TRUE(manager2->pending_web_ui());
1072 } 1076 }
(...skipping 485 matching lines...) Expand 10 before | Expand all | Expand 10 after
1558 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting(); 1562 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting();
1559 1563
1560 RenderFrameHostImpl* host = NULL; 1564 RenderFrameHostImpl* host = NULL;
1561 1565
1562 // 1) The first navigation. -------------------------- 1566 // 1) The first navigation. --------------------------
1563 const GURL kUrl1("http://www.google.com/"); 1567 const GURL kUrl1("http://www.google.com/");
1564 NavigationEntryImpl entry1( 1568 NavigationEntryImpl entry1(
1565 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(), 1569 NULL /* instance */, -1 /* page_id */, kUrl1, Referrer(),
1566 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED, 1570 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED,
1567 false /* is_renderer_init */); 1571 false /* is_renderer_init */);
1568 host = manager->Navigate(entry1); 1572 host = NavigateToEntry(manager, entry1);
1569 1573
1570 // The RenderFrameHost created in Init will be reused. 1574 // The RenderFrameHost created in Init will be reused.
1571 EXPECT_TRUE(host == manager->current_frame_host()); 1575 EXPECT_TRUE(host == manager->current_frame_host());
1572 EXPECT_FALSE(manager->pending_frame_host()); 1576 EXPECT_FALSE(manager->pending_frame_host());
1573 EXPECT_EQ(manager->current_frame_host()->GetSiteInstance(), instance); 1577 EXPECT_EQ(manager->current_frame_host()->GetSiteInstance(), instance);
1574 1578
1575 // Commit. 1579 // Commit.
1576 manager->DidNavigateFrame(host, true); 1580 manager->DidNavigateFrame(host, true);
1577 // Commit to SiteInstance should be delayed until RenderFrame commit. 1581 // Commit to SiteInstance should be delayed until RenderFrame commit.
1578 EXPECT_EQ(host, manager->current_frame_host()); 1582 EXPECT_EQ(host, manager->current_frame_host());
1579 ASSERT_TRUE(host); 1583 ASSERT_TRUE(host);
1580 EXPECT_TRUE(host->GetSiteInstance()->HasSite()); 1584 EXPECT_TRUE(host->GetSiteInstance()->HasSite());
1581 1585
1582 // 2) Navigate to a different domain. ------------------------- 1586 // 2) Navigate to a different domain. -------------------------
1583 // Guests stay in the same process on navigation. 1587 // Guests stay in the same process on navigation.
1584 const GURL kUrl2("http://www.chromium.org"); 1588 const GURL kUrl2("http://www.chromium.org");
1585 NavigationEntryImpl entry2( 1589 NavigationEntryImpl entry2(
1586 NULL /* instance */, -1 /* page_id */, kUrl2, 1590 NULL /* instance */, -1 /* page_id */, kUrl2,
1587 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 1591 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
1588 base::string16() /* title */, ui::PAGE_TRANSITION_LINK, 1592 base::string16() /* title */, ui::PAGE_TRANSITION_LINK,
1589 true /* is_renderer_init */); 1593 true /* is_renderer_init */);
1590 host = manager->Navigate(entry2); 1594 host = NavigateToEntry(manager, entry2);
1591 1595
1592 // The RenderFrameHost created in Init will be reused. 1596 // The RenderFrameHost created in Init will be reused.
1593 EXPECT_EQ(host, manager->current_frame_host()); 1597 EXPECT_EQ(host, manager->current_frame_host());
1594 EXPECT_FALSE(manager->pending_frame_host()); 1598 EXPECT_FALSE(manager->pending_frame_host());
1595 1599
1596 // Commit. 1600 // Commit.
1597 manager->DidNavigateFrame(host, true); 1601 manager->DidNavigateFrame(host, true);
1598 EXPECT_EQ(host, manager->current_frame_host()); 1602 EXPECT_EQ(host, manager->current_frame_host());
1599 ASSERT_TRUE(host); 1603 ASSERT_TRUE(host);
1600 EXPECT_EQ(host->GetSiteInstance(), instance); 1604 EXPECT_EQ(host->GetSiteInstance(), instance);
(...skipping 14 matching lines...) Expand all
1615 Source<WebContents>(web_contents.get())); 1619 Source<WebContents>(web_contents.get()));
1616 1620
1617 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting(); 1621 RenderFrameHostManager* manager = web_contents->GetRenderManagerForTesting();
1618 1622
1619 // 1) The first navigation. -------------------------- 1623 // 1) The first navigation. --------------------------
1620 const GURL kUrl1("http://www.google.com/"); 1624 const GURL kUrl1("http://www.google.com/");
1621 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, 1625 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1,
1622 Referrer(), base::string16() /* title */, 1626 Referrer(), base::string16() /* title */,
1623 ui::PAGE_TRANSITION_TYPED, 1627 ui::PAGE_TRANSITION_TYPED,
1624 false /* is_renderer_init */); 1628 false /* is_renderer_init */);
1625 RenderFrameHostImpl* host = manager->Navigate(entry1); 1629 RenderFrameHostImpl* host = NavigateToEntry(manager, entry1);
1626 1630
1627 // The RenderFrameHost created in Init will be reused. 1631 // The RenderFrameHost created in Init will be reused.
1628 EXPECT_EQ(host, manager->current_frame_host()); 1632 EXPECT_EQ(host, manager->current_frame_host());
1629 EXPECT_FALSE(manager->pending_frame_host()); 1633 EXPECT_FALSE(GetPendingFrameHost(manager));
1630 1634
1631 // We should observe a notification. 1635 // We should observe a notification.
1632 EXPECT_TRUE( 1636 EXPECT_TRUE(
1633 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED)); 1637 notifications.Check1AndReset(NOTIFICATION_RENDER_VIEW_HOST_CHANGED));
1634 notifications.Reset(); 1638 notifications.Reset();
1635 1639
1636 // Commit. 1640 // Commit.
1637 manager->DidNavigateFrame(host, true); 1641 manager->DidNavigateFrame(host, true);
1638 1642
1639 // Commit to SiteInstance should be delayed until RenderFrame commits. 1643 // Commit to SiteInstance should be delayed until RenderFrame commits.
1640 EXPECT_EQ(host, manager->current_frame_host()); 1644 EXPECT_EQ(host, manager->current_frame_host());
1641 EXPECT_FALSE(host->GetSiteInstance()->HasSite()); 1645 EXPECT_FALSE(host->GetSiteInstance()->HasSite());
1642 host->GetSiteInstance()->SetSite(kUrl1); 1646 host->GetSiteInstance()->SetSite(kUrl1);
1643 1647
1644 // 2) Cross-site navigate to next site. ------------------------- 1648 // 2) Cross-site navigate to next site. -------------------------
1645 const GURL kUrl2("http://www.example.com"); 1649 const GURL kUrl2("http://www.example.com");
1646 NavigationEntryImpl entry2( 1650 NavigationEntryImpl entry2(
1647 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(), 1651 NULL /* instance */, -1 /* page_id */, kUrl2, Referrer(),
1648 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED, 1652 base::string16() /* title */, ui::PAGE_TRANSITION_TYPED,
1649 false /* is_renderer_init */); 1653 false /* is_renderer_init */);
1650 RenderFrameHostImpl* host2 = manager->Navigate(entry2); 1654 RenderFrameHostImpl* host2 = NavigateToEntry(manager, entry2);
1651 1655
1652 // A new RenderFrameHost should be created. 1656 // A new RenderFrameHost should be created.
1653 ASSERT_EQ(host2, manager->pending_frame_host()); 1657 ASSERT_EQ(host2, GetPendingFrameHost(manager));
1654 EXPECT_NE(host2, host); 1658 EXPECT_NE(host2, host);
1655 1659
1656 EXPECT_EQ(host, manager->current_frame_host()); 1660 EXPECT_EQ(host, manager->current_frame_host());
1657 EXPECT_FALSE(manager->current_frame_host()->is_swapped_out()); 1661 EXPECT_FALSE(manager->current_frame_host()->is_swapped_out());
1658 EXPECT_EQ(host2, manager->pending_frame_host()); 1662 EXPECT_EQ(host2, GetPendingFrameHost(manager));
1659 1663
1660 // 3) Close the tab. ------------------------- 1664 // 3) Close the tab. -------------------------
1661 notifications.ListenFor(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED, 1665 notifications.ListenFor(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED,
1662 Source<RenderWidgetHost>(host2->render_view_host())); 1666 Source<RenderWidgetHost>(host2->render_view_host()));
1663 manager->OnBeforeUnloadACK(false, true, base::TimeTicks()); 1667 manager->OnBeforeUnloadACK(false, true, base::TimeTicks());
1664 1668
1665 EXPECT_TRUE( 1669 EXPECT_TRUE(
1666 notifications.Check1AndReset(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED)); 1670 notifications.Check1AndReset(NOTIFICATION_RENDER_WIDGET_HOST_DESTROYED));
1667 EXPECT_FALSE(manager->pending_frame_host()); 1671 EXPECT_FALSE(GetPendingFrameHost(manager));
1668 EXPECT_EQ(host, manager->current_frame_host()); 1672 EXPECT_EQ(host, manager->current_frame_host());
1669 } 1673 }
1670 1674
1671 TEST_F(RenderFrameHostManagerTest, CloseWithPendingWhileUnresponsive) { 1675 TEST_F(RenderFrameHostManagerTest, CloseWithPendingWhileUnresponsive) {
1672 const GURL kUrl1("http://www.google.com/"); 1676 const GURL kUrl1("http://www.google.com/");
1673 const GURL kUrl2("http://www.chromium.org/"); 1677 const GURL kUrl2("http://www.chromium.org/");
1674 1678
1675 CloseWebContentsDelegate close_delegate; 1679 CloseWebContentsDelegate close_delegate;
1676 contents()->SetDelegate(&close_delegate); 1680 contents()->SetDelegate(&close_delegate);
1677 1681
1678 // Navigate to the first page. 1682 // Navigate to the first page.
1679 contents()->NavigateAndCommit(kUrl1); 1683 contents()->NavigateAndCommit(kUrl1);
1680 TestRenderFrameHost* rfh1 = contents()->GetMainFrame(); 1684 TestRenderFrameHost* rfh1 = contents()->GetMainFrame();
1681 1685
1682 // Start to close the tab, but assume it's unresponsive. 1686 // Start to close the tab, but assume it's unresponsive.
1683 rfh1->render_view_host()->ClosePage(); 1687 rfh1->render_view_host()->ClosePage();
1684 EXPECT_TRUE(rfh1->render_view_host()->is_waiting_for_close_ack()); 1688 EXPECT_TRUE(rfh1->render_view_host()->is_waiting_for_close_ack());
1685 1689
1686 // Start a navigation to a new site. 1690 // Start a navigation to a new site.
1687 controller().LoadURL( 1691 controller().LoadURL(
1688 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1692 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1689 if (base::CommandLine::ForCurrentProcess()->HasSwitch( 1693 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1690 switches::kEnableBrowserSideNavigation)) { 1694 switches::kEnableBrowserSideNavigation)) {
1691 rfh1->PrepareForCommit(); 1695 rfh1->PrepareForCommit();
1692 } 1696 }
1693 EXPECT_TRUE(contents()->cross_navigation_pending()); 1697 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1694 1698
1695 // Simulate the unresponsiveness timer. The tab should close. 1699 // Simulate the unresponsiveness timer. The tab should close.
1696 contents()->RendererUnresponsive(rfh1->render_view_host()); 1700 contents()->RendererUnresponsive(rfh1->render_view_host());
1697 EXPECT_TRUE(close_delegate.is_closed()); 1701 EXPECT_TRUE(close_delegate.is_closed());
1698 } 1702 }
1699 1703
1700 // Tests that the RenderFrameHost is properly deleted when the SwapOutACK is 1704 // Tests that the RenderFrameHost is properly deleted when the SwapOutACK is
1701 // received. (SwapOut and the corresponding ACK always occur after commit.) 1705 // received. (SwapOut and the corresponding ACK always occur after commit.)
1702 // Also tests that an early SwapOutACK is properly ignored. 1706 // Also tests that an early SwapOutACK is properly ignored.
1703 TEST_F(RenderFrameHostManagerTest, DeleteFrameAfterSwapOutACK) { 1707 TEST_F(RenderFrameHostManagerTest, DeleteFrameAfterSwapOutACK) {
1704 const GURL kUrl1("http://www.google.com/"); 1708 const GURL kUrl1("http://www.google.com/");
1705 const GURL kUrl2("http://www.chromium.org/"); 1709 const GURL kUrl2("http://www.chromium.org/");
1706 1710
1707 // Navigate to the first page. 1711 // Navigate to the first page.
1708 contents()->NavigateAndCommit(kUrl1); 1712 contents()->NavigateAndCommit(kUrl1);
1709 TestRenderFrameHost* rfh1 = contents()->GetMainFrame(); 1713 TestRenderFrameHost* rfh1 = contents()->GetMainFrame();
1710 RenderFrameHostDeletedObserver rfh_deleted_observer(rfh1); 1714 RenderFrameHostDeletedObserver rfh_deleted_observer(rfh1);
1711 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1715 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1712 1716
1713 // Navigate to new site, simulating onbeforeunload approval. 1717 // Navigate to new site, simulating onbeforeunload approval.
1714 controller().LoadURL( 1718 controller().LoadURL(
1715 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1719 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1716 contents()->GetMainFrame()->PrepareForCommit(); 1720 contents()->GetMainFrame()->PrepareForCommit();
1717 EXPECT_TRUE(contents()->cross_navigation_pending()); 1721 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1718 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1722 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1719 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame(); 1723 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame();
1720 1724
1721 // Simulate the swap out ack, unexpectedly early (before commit). It should 1725 // Simulate the swap out ack, unexpectedly early (before commit). It should
1722 // have no effect. 1726 // have no effect.
1723 rfh1->OnSwappedOut(); 1727 rfh1->OnSwappedOut();
1724 EXPECT_TRUE(contents()->cross_navigation_pending()); 1728 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1725 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1729 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1726 1730
1727 // The new page commits. 1731 // The new page commits.
1728 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED); 1732 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED);
1729 EXPECT_FALSE(contents()->cross_navigation_pending()); 1733 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1730 EXPECT_EQ(rfh2, contents()->GetMainFrame()); 1734 EXPECT_EQ(rfh2, contents()->GetMainFrame());
1731 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); 1735 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
1732 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1736 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state());
1733 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1737 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1734 EXPECT_TRUE( 1738 EXPECT_TRUE(
1735 rfh1->frame_tree_node()->render_manager()->IsPendingDeletion(rfh1)); 1739 rfh1->frame_tree_node()->render_manager()->IsPendingDeletion(rfh1));
1736 1740
1737 // Simulate the swap out ack. 1741 // Simulate the swap out ack.
1738 rfh1->OnSwappedOut(); 1742 rfh1->OnSwappedOut();
1739 1743
(...skipping 15 matching lines...) Expand all
1755 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1759 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1756 1760
1757 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is 1761 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is
1758 // not deleted on swap out. 1762 // not deleted on swap out.
1759 rfh1->GetSiteInstance()->increment_active_frame_count(); 1763 rfh1->GetSiteInstance()->increment_active_frame_count();
1760 1764
1761 // Navigate to new site, simulating onbeforeunload approval. 1765 // Navigate to new site, simulating onbeforeunload approval.
1762 controller().LoadURL( 1766 controller().LoadURL(
1763 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1767 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1764 contents()->GetMainFrame()->PrepareForCommit(); 1768 contents()->GetMainFrame()->PrepareForCommit();
1765 EXPECT_TRUE(contents()->cross_navigation_pending()); 1769 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1766 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1770 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1767 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame(); 1771 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame();
1768 1772
1769 // The new page commits. 1773 // The new page commits.
1770 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED); 1774 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED);
1771 EXPECT_FALSE(contents()->cross_navigation_pending()); 1775 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1772 EXPECT_EQ(rfh2, contents()->GetMainFrame()); 1776 EXPECT_EQ(rfh2, contents()->GetMainFrame());
1773 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); 1777 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
1774 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1778 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state());
1775 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1779 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1776 1780
1777 // Simulate the swap out ack. 1781 // Simulate the swap out ack.
1778 rfh1->OnSwappedOut(); 1782 rfh1->OnSwappedOut();
1779 1783
1780 // rfh1 should be swapped out. 1784 // rfh1 should be swapped out.
1781 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1785 EXPECT_FALSE(rfh_deleted_observer.deleted());
(...skipping 16 matching lines...) Expand all
1798 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1802 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1799 1803
1800 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is 1804 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is
1801 // not deleted on swap out. 1805 // not deleted on swap out.
1802 rfh1->GetSiteInstance()->increment_active_frame_count(); 1806 rfh1->GetSiteInstance()->increment_active_frame_count();
1803 1807
1804 // Navigate to new site, simulating onbeforeunload approval. 1808 // Navigate to new site, simulating onbeforeunload approval.
1805 controller().LoadURL( 1809 controller().LoadURL(
1806 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1810 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1807 rfh1->PrepareForCommit(); 1811 rfh1->PrepareForCommit();
1808 EXPECT_TRUE(contents()->cross_navigation_pending()); 1812 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1809 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame(); 1813 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame();
1810 1814
1811 // The new page commits. 1815 // The new page commits.
1812 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED); 1816 contents()->TestDidNavigate(rfh2, 1, kUrl2, ui::PAGE_TRANSITION_TYPED);
1813 EXPECT_FALSE(contents()->cross_navigation_pending()); 1817 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1814 EXPECT_EQ(rfh2, contents()->GetMainFrame()); 1818 EXPECT_EQ(rfh2, contents()->GetMainFrame());
1815 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); 1819 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
1816 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1820 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state());
1817 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1821 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1818 1822
1819 // Simulate the swap out ack. 1823 // Simulate the swap out ack.
1820 rfh1->OnSwappedOut(); 1824 rfh1->OnSwappedOut();
1821 1825
1822 // rfh1 should be swapped out. 1826 // rfh1 should be swapped out.
1823 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1827 EXPECT_FALSE(rfh_deleted_observer.deleted());
(...skipping 18 matching lines...) Expand all
1842 controller().LoadURL( 1846 controller().LoadURL(
1843 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1847 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1844 { 1848 {
1845 pending_rfh = contents()->GetFrameTree()->root()->render_manager() 1849 pending_rfh = contents()->GetFrameTree()->root()->render_manager()
1846 ->pending_frame_host(); 1850 ->pending_frame_host();
1847 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh); 1851 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh);
1848 1852
1849 // Cancel the navigation by simulating a declined beforeunload dialog. 1853 // Cancel the navigation by simulating a declined beforeunload dialog.
1850 contents()->GetMainFrame()->OnMessageReceived( 1854 contents()->GetMainFrame()->OnMessageReceived(
1851 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); 1855 FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
1852 EXPECT_FALSE(contents()->cross_navigation_pending()); 1856 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1853 1857
1854 // Since the pending RFH is the only one for the new SiteInstance, it should 1858 // Since the pending RFH is the only one for the new SiteInstance, it should
1855 // be deleted. 1859 // be deleted.
1856 EXPECT_TRUE(rfh_deleted_observer.deleted()); 1860 EXPECT_TRUE(rfh_deleted_observer.deleted());
1857 } 1861 }
1858 1862
1859 // Start another cross-site navigation. 1863 // Start another cross-site navigation.
1860 controller().LoadURL( 1864 controller().LoadURL(
1861 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1865 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1862 { 1866 {
1863 pending_rfh = contents()->GetFrameTree()->root()->render_manager() 1867 pending_rfh = contents()->GetFrameTree()->root()->render_manager()
1864 ->pending_frame_host(); 1868 ->pending_frame_host();
1865 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh); 1869 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh);
1866 1870
1867 // Increment the number of active frames in the new SiteInstance, which will 1871 // Increment the number of active frames in the new SiteInstance, which will
1868 // cause the pending RFH to be swapped out instead of deleted. 1872 // cause the pending RFH to be swapped out instead of deleted.
1869 pending_rfh->GetSiteInstance()->increment_active_frame_count(); 1873 pending_rfh->GetSiteInstance()->increment_active_frame_count();
1870 1874
1871 contents()->GetMainFrame()->OnMessageReceived( 1875 contents()->GetMainFrame()->OnMessageReceived(
1872 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); 1876 FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
1873 EXPECT_FALSE(contents()->cross_navigation_pending()); 1877 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1874 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1878 EXPECT_FALSE(rfh_deleted_observer.deleted());
1875 } 1879 }
1876 } 1880 }
1877 1881
1878 // Test that a pending RenderFrameHost in a non-root frame tree node is properly 1882 // Test that a pending RenderFrameHost in a non-root frame tree node is properly
1879 // deleted when the node is detached. Motivated by http://crbug.com/441357 and 1883 // deleted when the node is detached. Motivated by http://crbug.com/441357 and
1880 // http://crbug.com/444955. 1884 // http://crbug.com/444955.
1881 TEST_F(RenderFrameHostManagerTest, DetachPendingChild) { 1885 TEST_F(RenderFrameHostManagerTest, DetachPendingChild) {
1882 base::CommandLine::ForCurrentProcess()->AppendSwitch( 1886 base::CommandLine::ForCurrentProcess()->AppendSwitch(
1883 switches::kSitePerProcess); 1887 switches::kSitePerProcess);
(...skipping 14 matching lines...) Expand all
1898 RenderFrameHostManager* iframe1 = 1902 RenderFrameHostManager* iframe1 =
1899 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); 1903 contents()->GetFrameTree()->root()->child_at(0)->render_manager();
1900 RenderFrameHostManager* iframe2 = 1904 RenderFrameHostManager* iframe2 =
1901 contents()->GetFrameTree()->root()->child_at(1)->render_manager(); 1905 contents()->GetFrameTree()->root()->child_at(1)->render_manager();
1902 1906
1903 // 1) The first navigation. 1907 // 1) The first navigation.
1904 NavigationEntryImpl entryA(NULL /* instance */, -1 /* page_id */, kUrlA, 1908 NavigationEntryImpl entryA(NULL /* instance */, -1 /* page_id */, kUrlA,
1905 Referrer(), base::string16() /* title */, 1909 Referrer(), base::string16() /* title */,
1906 ui::PAGE_TRANSITION_TYPED, 1910 ui::PAGE_TRANSITION_TYPED,
1907 false /* is_renderer_init */); 1911 false /* is_renderer_init */);
1908 RenderFrameHostImpl* host1 = GetFrameHostForNavigation(iframe1, entryA); 1912 RenderFrameHostImpl* host1 = NavigateToEntry(iframe1, entryA);
1909 1913
1910 // The RenderFrameHost created in Init will be reused. 1914 // The RenderFrameHost created in Init will be reused.
1911 EXPECT_TRUE(host1 == iframe1->current_frame_host()); 1915 EXPECT_TRUE(host1 == iframe1->current_frame_host());
1912 EXPECT_FALSE(GetPendingFrameHost(iframe1)); 1916 EXPECT_FALSE(GetPendingFrameHost(iframe1));
1913 1917
1914 // Commit. 1918 // Commit.
1915 iframe1->DidNavigateFrame(host1, true); 1919 iframe1->DidNavigateFrame(host1, true);
1916 // Commit to SiteInstance should be delayed until RenderFrame commit. 1920 // Commit to SiteInstance should be delayed until RenderFrame commit.
1917 EXPECT_TRUE(host1 == iframe1->current_frame_host()); 1921 EXPECT_TRUE(host1 == iframe1->current_frame_host());
1918 ASSERT_TRUE(host1); 1922 ASSERT_TRUE(host1);
1919 EXPECT_TRUE(host1->GetSiteInstance()->HasSite()); 1923 EXPECT_TRUE(host1->GetSiteInstance()->HasSite());
1920 1924
1921 // 2) Cross-site navigate both frames to next site. 1925 // 2) Cross-site navigate both frames to next site.
1922 NavigationEntryImpl entryB(NULL /* instance */, -1 /* page_id */, kUrlB, 1926 NavigationEntryImpl entryB(NULL /* instance */, -1 /* page_id */, kUrlB,
1923 Referrer(kUrlA, blink::WebReferrerPolicyDefault), 1927 Referrer(kUrlA, blink::WebReferrerPolicyDefault),
1924 base::string16() /* title */, 1928 base::string16() /* title */,
1925 ui::PAGE_TRANSITION_LINK, 1929 ui::PAGE_TRANSITION_LINK,
1926 false /* is_renderer_init */); 1930 false /* is_renderer_init */);
1927 host1 = GetFrameHostForNavigation(iframe1, entryB); 1931 host1 = NavigateToEntry(iframe1, entryB);
1928 RenderFrameHostImpl* host2 = GetFrameHostForNavigation(iframe2, entryB); 1932 RenderFrameHostImpl* host2 = NavigateToEntry(iframe2, entryB);
1929 1933
1930 // A new, pending RenderFrameHost should be created in each FrameTreeNode. 1934 // A new, pending RenderFrameHost should be created in each FrameTreeNode.
1931 EXPECT_TRUE(GetPendingFrameHost(iframe1)); 1935 EXPECT_TRUE(GetPendingFrameHost(iframe1));
1932 EXPECT_TRUE(GetPendingFrameHost(iframe2)); 1936 EXPECT_TRUE(GetPendingFrameHost(iframe2));
1933 EXPECT_EQ(host1, GetPendingFrameHost(iframe1)); 1937 EXPECT_EQ(host1, GetPendingFrameHost(iframe1));
1934 EXPECT_EQ(host2, GetPendingFrameHost(iframe2)); 1938 EXPECT_EQ(host2, GetPendingFrameHost(iframe2));
1935 EXPECT_TRUE(RenderFrameHostImpl::IsRFHStateActive( 1939 EXPECT_TRUE(RenderFrameHostImpl::IsRFHStateActive(
1936 GetPendingFrameHost(iframe1)->rfh_state())); 1940 GetPendingFrameHost(iframe1)->rfh_state()));
1937 EXPECT_TRUE(RenderFrameHostImpl::IsRFHStateActive( 1941 EXPECT_TRUE(RenderFrameHostImpl::IsRFHStateActive(
1938 GetPendingFrameHost(iframe2)->rfh_state())); 1942 GetPendingFrameHost(iframe2)->rfh_state()));
1939 EXPECT_NE(GetPendingFrameHost(iframe1), GetPendingFrameHost(iframe2)); 1943 EXPECT_NE(GetPendingFrameHost(iframe1), GetPendingFrameHost(iframe2));
1940 EXPECT_EQ(GetPendingFrameHost(iframe1)->GetSiteInstance(), 1944 EXPECT_EQ(GetPendingFrameHost(iframe1)->GetSiteInstance(),
1941 GetPendingFrameHost(iframe2)->GetSiteInstance()); 1945 GetPendingFrameHost(iframe2)->GetSiteInstance());
1942 EXPECT_NE(iframe1->current_frame_host(), GetPendingFrameHost(iframe1)); 1946 EXPECT_NE(iframe1->current_frame_host(), GetPendingFrameHost(iframe1));
1943 EXPECT_NE(iframe2->current_frame_host(), GetPendingFrameHost(iframe2)); 1947 EXPECT_NE(iframe2->current_frame_host(), GetPendingFrameHost(iframe2));
1944 EXPECT_FALSE(contents()->cross_navigation_pending()) 1948 EXPECT_FALSE(contents()->CrossProcessNavigationPending())
1945 << "There should be no top-level pending navigation."; 1949 << "There should be no top-level pending navigation.";
1946 1950
1947 RenderFrameHostDeletedObserver delete_watcher1(GetPendingFrameHost(iframe1)); 1951 RenderFrameHostDeletedObserver delete_watcher1(GetPendingFrameHost(iframe1));
1948 RenderFrameHostDeletedObserver delete_watcher2(GetPendingFrameHost(iframe2)); 1952 RenderFrameHostDeletedObserver delete_watcher2(GetPendingFrameHost(iframe2));
1949 EXPECT_FALSE(delete_watcher1.deleted()); 1953 EXPECT_FALSE(delete_watcher1.deleted());
1950 EXPECT_FALSE(delete_watcher2.deleted()); 1954 EXPECT_FALSE(delete_watcher2.deleted());
1951 1955
1952 // Keep the SiteInstance alive for testing. 1956 // Keep the SiteInstance alive for testing.
1953 scoped_refptr<SiteInstanceImpl> site_instance = 1957 scoped_refptr<SiteInstanceImpl> site_instance =
1954 GetPendingFrameHost(iframe1)->GetSiteInstance(); 1958 GetPendingFrameHost(iframe1)->GetSiteInstance();
1955 EXPECT_TRUE(site_instance->HasSite()); 1959 EXPECT_TRUE(site_instance->HasSite());
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 contents1->GetMainFrame()->OnCreateChildFrame( 2033 contents1->GetMainFrame()->OnCreateChildFrame(
2030 contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(), 2034 contents1->GetMainFrame()->GetProcess()->GetNextRoutingID(),
2031 std::string("frame_name"), SandboxFlags::NONE); 2035 std::string("frame_name"), SandboxFlags::NONE);
2032 RenderFrameHostManager* iframe = 2036 RenderFrameHostManager* iframe =
2033 contents()->GetFrameTree()->root()->child_at(0)->render_manager(); 2037 contents()->GetFrameTree()->root()->child_at(0)->render_manager();
2034 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl2, 2038 NavigationEntryImpl entry(NULL /* instance */, -1 /* page_id */, kUrl2,
2035 Referrer(kUrl1, blink::WebReferrerPolicyDefault), 2039 Referrer(kUrl1, blink::WebReferrerPolicyDefault),
2036 base::string16() /* title */, 2040 base::string16() /* title */,
2037 ui::PAGE_TRANSITION_LINK, 2041 ui::PAGE_TRANSITION_LINK,
2038 false /* is_renderer_init */); 2042 false /* is_renderer_init */);
2039 RenderFrameHostImpl* cross_site = GetFrameHostForNavigation(iframe, entry); 2043 RenderFrameHostImpl* cross_site = NavigateToEntry(iframe, entry);
2040 iframe->DidNavigateFrame(cross_site, true); 2044 iframe->DidNavigateFrame(cross_site, true);
2041 2045
2042 // A proxy to the iframe should now exist in the SiteInstance of the main 2046 // A proxy to the iframe should now exist in the SiteInstance of the main
2043 // frames. 2047 // frames.
2044 EXPECT_NE(cross_site->GetSiteInstance(), contents1->GetSiteInstance()); 2048 EXPECT_NE(cross_site->GetSiteInstance(), contents1->GetSiteInstance());
2045 EXPECT_NE(nullptr, 2049 EXPECT_NE(nullptr,
2046 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance())); 2050 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance()));
2047 EXPECT_NE(nullptr, 2051 EXPECT_NE(nullptr,
2048 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance())); 2052 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance()));
2049 2053
2050 // Navigate |contents2| away from the sad tab (and thus away from the 2054 // Navigate |contents2| away from the sad tab (and thus away from the
2051 // SiteInstance of |contents1|). This should not destroy the proxies needed by 2055 // SiteInstance of |contents1|). This should not destroy the proxies needed by
2052 // |contents1| -- that was http://crbug.com/473714. 2056 // |contents1| -- that was http://crbug.com/473714.
2053 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); 2057 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive());
2054 contents2->NavigateAndCommit(kUrl3); 2058 contents2->NavigateAndCommit(kUrl3);
2055 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive()); 2059 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive());
2056 EXPECT_NE(nullptr, 2060 EXPECT_NE(nullptr,
2057 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance())); 2061 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance()));
2058 EXPECT_EQ(nullptr, 2062 EXPECT_EQ(nullptr,
2059 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance())); 2063 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance()));
2060 } 2064 }
2061 2065
2062 } // namespace content 2066 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698