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

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

Issue 1142123002: Remove swapped-out usage in --site-per-process. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Another round of fixes. Created 5 years, 6 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/compositor/test/no_transport_image_transport_factory.h " 10 #include "content/browser/compositor/test/no_transport_image_transport_factory.h "
(...skipping 312 matching lines...) Expand 10 before | Expand all | Expand 10 after
323 // state is being checked. 323 // state is being checked.
324 RenderFrameHostDeletedObserver rfh_observer(old_rfh); 324 RenderFrameHostDeletedObserver rfh_observer(old_rfh);
325 RenderViewHostDeletedObserver rvh_observer(old_rfh->GetRenderViewHost()); 325 RenderViewHostDeletedObserver rvh_observer(old_rfh->GetRenderViewHost());
326 active_rfh->SendNavigate(max_page_id + 1, entry_id, true, url); 326 active_rfh->SendNavigate(max_page_id + 1, entry_id, true, url);
327 327
328 // Make sure that we start to run the unload handler at the time of commit. 328 // Make sure that we start to run the unload handler at the time of commit.
329 bool expecting_rfh_shutdown = false; 329 bool expecting_rfh_shutdown = false;
330 if (old_rfh != active_rfh && !rfh_observer.deleted()) { 330 if (old_rfh != active_rfh && !rfh_observer.deleted()) {
331 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, 331 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT,
332 old_rfh->rfh_state()); 332 old_rfh->rfh_state());
333 if (!old_rfh->GetSiteInstance()->active_frame_count()) { 333 if (!old_rfh->GetSiteInstance()->active_frame_count() ||
334 base::CommandLine::ForCurrentProcess()->HasSwitch(
335 switches::kSitePerProcess)) {
334 expecting_rfh_shutdown = true; 336 expecting_rfh_shutdown = true;
335 EXPECT_TRUE( 337 EXPECT_TRUE(
336 old_rfh->frame_tree_node()->render_manager()->IsPendingDeletion( 338 old_rfh->frame_tree_node()->render_manager()->IsPendingDeletion(
337 old_rfh)); 339 old_rfh));
338 } 340 }
339 } 341 }
340 342
341 // Simulate the swap out ACK coming from the pending renderer. This should 343 // Simulate the swap out ACK coming from the pending renderer. This should
342 // either shut down the old RFH or leave it in a swapped out state. 344 // either shut down the old RFH or leave it in a swapped out state.
343 if (old_rfh != active_rfh) { 345 if (old_rfh != active_rfh) {
344 old_rfh->OnSwappedOut(); 346 old_rfh->OnSwappedOut();
345 if (expecting_rfh_shutdown) { 347 if (expecting_rfh_shutdown) {
346 EXPECT_TRUE(rfh_observer.deleted()); 348 EXPECT_TRUE(rfh_observer.deleted());
347 EXPECT_TRUE(rvh_observer.deleted()); 349 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
350 switches::kSitePerProcess)) {
351 EXPECT_TRUE(rvh_observer.deleted());
352 }
348 } else { 353 } else {
349 EXPECT_EQ(RenderFrameHostImpl::STATE_SWAPPED_OUT, 354 EXPECT_EQ(RenderFrameHostImpl::STATE_SWAPPED_OUT,
350 old_rfh->rfh_state()); 355 old_rfh->rfh_state());
351 } 356 }
352 } 357 }
353 EXPECT_EQ(active_rfh, contents()->GetMainFrame()); 358 EXPECT_EQ(active_rfh, contents()->GetMainFrame());
354 EXPECT_EQ(NULL, contents()->GetPendingMainFrame()); 359 EXPECT_EQ(NULL, contents()->GetPendingMainFrame());
355 } 360 }
356 361
357 bool ShouldSwapProcesses(RenderFrameHostManager* manager, 362 bool ShouldSwapProcesses(RenderFrameHostManager* manager,
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
520 // for synchronous messages, which cannot be ignored without leaving the 525 // for synchronous messages, which cannot be ignored without leaving the
521 // renderer in a stuck state. See http://crbug.com/93427. 526 // renderer in a stuck state. See http://crbug.com/93427.
522 TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) { 527 TEST_F(RenderFrameHostManagerTest, FilterMessagesWhileSwappedOut) {
523 const GURL kChromeURL("chrome://foo"); 528 const GURL kChromeURL("chrome://foo");
524 const GURL kDestUrl("http://www.google.com/"); 529 const GURL kDestUrl("http://www.google.com/");
525 std::vector<FaviconURL> icons; 530 std::vector<FaviconURL> icons;
526 531
527 // Navigate our first tab to a chrome url and then to the destination. 532 // Navigate our first tab to a chrome url and then to the destination.
528 NavigateActiveAndCommit(kChromeURL); 533 NavigateActiveAndCommit(kChromeURL);
529 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame(); 534 TestRenderFrameHost* ntp_rfh = contents()->GetMainFrame();
535 TestRenderViewHost* ntp_rvh = ntp_rfh->GetRenderViewHost();
530 536
531 // Send an update favicon message and make sure it works. 537 // Send an update favicon message and make sure it works.
532 { 538 {
533 PluginFaviconMessageObserver observer(contents()); 539 PluginFaviconMessageObserver observer(contents());
534 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->OnMessageReceived( 540 EXPECT_TRUE(ntp_rfh->GetRenderViewHost()->OnMessageReceived(
535 ViewHostMsg_UpdateFaviconURL( 541 ViewHostMsg_UpdateFaviconURL(
536 ntp_rfh->GetRenderViewHost()->GetRoutingID(), icons))); 542 ntp_rfh->GetRenderViewHost()->GetRoutingID(), icons)));
537 EXPECT_TRUE(observer.favicon_received()); 543 EXPECT_TRUE(observer.favicon_received());
538 } 544 }
539 // Create one more frame in the same SiteInstance where ntp_rfh 545 // Create one more frame in the same SiteInstance where ntp_rfh
(...skipping 12 matching lines...) Expand all
552 PluginFaviconMessageObserver observer(contents()); 558 PluginFaviconMessageObserver observer(contents());
553 EXPECT_TRUE( 559 EXPECT_TRUE(
554 dest_rfh->GetRenderViewHost()->OnMessageReceived( 560 dest_rfh->GetRenderViewHost()->OnMessageReceived(
555 ViewHostMsg_UpdateFaviconURL( 561 ViewHostMsg_UpdateFaviconURL(
556 dest_rfh->GetRenderViewHost()->GetRoutingID(), icons))); 562 dest_rfh->GetRenderViewHost()->GetRoutingID(), icons)));
557 EXPECT_TRUE(observer.favicon_received()); 563 EXPECT_TRUE(observer.favicon_received());
558 } 564 }
559 565
560 // The old renderer, being slow, now updates the favicon. It should be 566 // The old renderer, being slow, now updates the favicon. It should be
561 // filtered out and not take effect. 567 // filtered out and not take effect.
562 EXPECT_TRUE(ntp_rfh->is_swapped_out());
563 { 568 {
564 PluginFaviconMessageObserver observer(contents()); 569 PluginFaviconMessageObserver observer(contents());
565 EXPECT_TRUE( 570 EXPECT_TRUE(
566 ntp_rfh->GetRenderViewHost()->OnMessageReceived( 571 ntp_rvh->OnMessageReceived(
567 ViewHostMsg_UpdateFaviconURL( 572 ViewHostMsg_UpdateFaviconURL(
568 dest_rfh->GetRenderViewHost()->GetRoutingID(), icons))); 573 dest_rfh->GetRenderViewHost()->GetRoutingID(), icons)));
569 EXPECT_FALSE(observer.favicon_received()); 574 EXPECT_FALSE(observer.favicon_received());
570 } 575 }
571 576
577 // In --site-per-process, the RenderFrameHost is deleted on cross-process
578 // navigation, so the rest of the test case doesn't apply.
579 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
580 switches::kSitePerProcess)) {
581 return;
582 }
583
572 #if defined(ENABLE_PLUGINS) 584 #if defined(ENABLE_PLUGINS)
573 // The same logic should apply to RenderFrameHosts as well and routing through 585 // The same logic should apply to RenderFrameHosts as well and routing through
574 // swapped out RFH shouldn't be allowed. Use a PluginCrashObserver to check 586 // swapped out RFH shouldn't be allowed. Use a PluginCrashObserver to check
575 // if the IPC message is allowed through or not. 587 // if the IPC message is allowed through or not.
576 { 588 {
577 PluginFaviconMessageObserver observer(contents()); 589 PluginFaviconMessageObserver observer(contents());
578 EXPECT_TRUE(ntp_rfh->OnMessageReceived( 590 EXPECT_TRUE(ntp_rfh->OnMessageReceived(
579 FrameHostMsg_PluginCrashed( 591 FrameHostMsg_PluginCrashed(
580 ntp_rfh->GetRoutingID(), base::FilePath(), 0))); 592 ntp_rfh->GetRoutingID(), base::FilePath(), 0)));
581 EXPECT_FALSE(observer.plugin_crashed()); 593 EXPECT_FALSE(observer.plugin_crashed());
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 } 678 }
667 679
668 // Ensure that frames aren't added to the frame tree, if the message is coming 680 // Ensure that frames aren't added to the frame tree, if the message is coming
669 // from a process different than the parent frame's current RenderFrameHost 681 // from a process different than the parent frame's current RenderFrameHost
670 // process. Otherwise it is possible to have collisions of routing ids, as they 682 // process. Otherwise it is possible to have collisions of routing ids, as they
671 // are scoped per process. See https://crbug.com/415059. 683 // are scoped per process. See https://crbug.com/415059.
672 TEST_F(RenderFrameHostManagerTest, DropCreateChildFrameWhileSwappedOut) { 684 TEST_F(RenderFrameHostManagerTest, DropCreateChildFrameWhileSwappedOut) {
673 const GURL kUrl1("http://foo.com"); 685 const GURL kUrl1("http://foo.com");
674 const GURL kUrl2("http://www.google.com/"); 686 const GURL kUrl2("http://www.google.com/");
675 687
688 // This test is invalid in --site-per-process mode, as swapped-out is no
689 // longer used.
690 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
691 switches::kSitePerProcess)) {
692 return;
693 }
694
676 // Navigate to the first site. 695 // Navigate to the first site.
677 NavigateActiveAndCommit(kUrl1); 696 NavigateActiveAndCommit(kUrl1);
678 TestRenderFrameHost* initial_rfh = contents()->GetMainFrame(); 697 TestRenderFrameHost* initial_rfh = contents()->GetMainFrame();
679 { 698 {
680 RenderFrameHostCreatedObserver observer(contents()); 699 RenderFrameHostCreatedObserver observer(contents());
681 initial_rfh->OnCreateChildFrame( 700 initial_rfh->OnCreateChildFrame(
682 initial_rfh->GetProcess()->GetNextRoutingID(), 701 initial_rfh->GetProcess()->GetNextRoutingID(),
683 blink::WebTreeScopeType::Document, std::string(), 702 blink::WebTreeScopeType::Document, std::string(),
684 blink::WebSandboxFlags::None); 703 blink::WebSandboxFlags::None);
685 EXPECT_TRUE(observer.created()); 704 EXPECT_TRUE(observer.created());
(...skipping 18 matching lines...) Expand all
704 RenderFrameHostCreatedObserver observer(contents()); 723 RenderFrameHostCreatedObserver observer(contents());
705 initial_rfh->OnCreateChildFrame( 724 initial_rfh->OnCreateChildFrame(
706 initial_rfh->GetProcess()->GetNextRoutingID(), 725 initial_rfh->GetProcess()->GetNextRoutingID(),
707 blink::WebTreeScopeType::Document, std::string(), 726 blink::WebTreeScopeType::Document, std::string(),
708 blink::WebSandboxFlags::None); 727 blink::WebSandboxFlags::None);
709 EXPECT_FALSE(observer.created()); 728 EXPECT_FALSE(observer.created());
710 } 729 }
711 } 730 }
712 731
713 TEST_F(RenderFrameHostManagerTest, WhiteListSwapCompositorFrame) { 732 TEST_F(RenderFrameHostManagerTest, WhiteListSwapCompositorFrame) {
733 // TODO(nasko): Check with kenrb whether this test can be rewritten and
734 // whether it makes sense when swapped out is replaced with proxies.
735 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
736 switches::kSitePerProcess)) {
737 return;
738 }
714 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost(); 739 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost();
715 TestRenderWidgetHostView* swapped_out_rwhv = 740 TestRenderWidgetHostView* swapped_out_rwhv =
716 static_cast<TestRenderWidgetHostView*>( 741 static_cast<TestRenderWidgetHostView*>(
717 swapped_out_rfh->GetRenderViewHost()->GetView()); 742 swapped_out_rfh->GetRenderViewHost()->GetView());
718 EXPECT_FALSE(swapped_out_rwhv->did_swap_compositor_frame()); 743 EXPECT_FALSE(swapped_out_rwhv->did_swap_compositor_frame());
719 744
720 MockRenderProcessHost* process_host = swapped_out_rfh->GetProcess(); 745 MockRenderProcessHost* process_host = swapped_out_rfh->GetProcess();
721 process_host->sink().ClearMessages(); 746 process_host->sink().ClearMessages();
722 747
723 cc::CompositorFrame frame; 748 cc::CompositorFrame frame;
724 ViewHostMsg_SwapCompositorFrame msg( 749 ViewHostMsg_SwapCompositorFrame msg(
725 rvh()->GetRoutingID(), 0, frame, std::vector<IPC::Message>()); 750 rvh()->GetRoutingID(), 0, frame, std::vector<IPC::Message>());
726 751
727 EXPECT_TRUE(swapped_out_rfh->render_view_host()->OnMessageReceived(msg)); 752 EXPECT_TRUE(swapped_out_rfh->render_view_host()->OnMessageReceived(msg));
728 EXPECT_TRUE(swapped_out_rwhv->did_swap_compositor_frame()); 753 EXPECT_TRUE(swapped_out_rwhv->did_swap_compositor_frame());
729 } 754 }
730 755
731 // Test if RenderViewHost::GetRenderWidgetHosts() only returns active 756 // Test if RenderViewHost::GetRenderWidgetHosts() only returns active
732 // widgets. 757 // widgets.
733 TEST_F(RenderFrameHostManagerTest, GetRenderWidgetHostsReturnsActiveViews) { 758 TEST_F(RenderFrameHostManagerTest, GetRenderWidgetHostsReturnsActiveViews) {
759 // This test is invalid in --site-per-process mode, as swapped-out is no
760 // longer used.
761 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
762 switches::kSitePerProcess)) {
763 return;
764 }
765
734 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost(); 766 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost();
735 EXPECT_TRUE(swapped_out_rfh->is_swapped_out()); 767 EXPECT_TRUE(swapped_out_rfh->is_swapped_out());
736 768
737 scoped_ptr<RenderWidgetHostIterator> widgets( 769 scoped_ptr<RenderWidgetHostIterator> widgets(
738 RenderWidgetHost::GetRenderWidgetHosts()); 770 RenderWidgetHost::GetRenderWidgetHosts());
739 // We know that there is the only one active widget. Another view is 771 // We know that there is the only one active widget. Another view is
740 // now swapped out, so the swapped out view is not included in the 772 // now swapped out, so the swapped out view is not included in the
741 // list. 773 // list.
742 RenderWidgetHost* widget = widgets->GetNextHost(); 774 RenderWidgetHost* widget = widgets->GetNextHost();
743 EXPECT_FALSE(widgets->GetNextHost()); 775 EXPECT_FALSE(widgets->GetNextHost());
744 RenderViewHost* rvh = RenderViewHost::From(widget); 776 RenderViewHost* rvh = RenderViewHost::From(widget);
745 EXPECT_TRUE(static_cast<RenderViewHostImpl*>(rvh)->is_active()); 777 EXPECT_TRUE(static_cast<RenderViewHostImpl*>(rvh)->is_active());
746 } 778 }
747 779
748 // Test if RenderViewHost::GetRenderWidgetHosts() returns a subset of 780 // Test if RenderViewHost::GetRenderWidgetHosts() returns a subset of
749 // RenderViewHostImpl::GetAllRenderWidgetHosts(). 781 // RenderViewHostImpl::GetAllRenderWidgetHosts().
750 // RenderViewHost::GetRenderWidgetHosts() returns only active widgets, but 782 // RenderViewHost::GetRenderWidgetHosts() returns only active widgets, but
751 // RenderViewHostImpl::GetAllRenderWidgetHosts() returns everything 783 // RenderViewHostImpl::GetAllRenderWidgetHosts() returns everything
752 // including swapped out ones. 784 // including swapped out ones.
753 TEST_F(RenderFrameHostManagerTest, 785 TEST_F(RenderFrameHostManagerTest,
754 GetRenderWidgetHostsWithinGetAllRenderWidgetHosts) { 786 GetRenderWidgetHostsWithinGetAllRenderWidgetHosts) {
787 // This test is invalid in --site-per-process mode, as swapped-out is no
788 // longer used.
789 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
790 switches::kSitePerProcess)) {
791 return;
792 }
793
755 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost(); 794 TestRenderFrameHost* swapped_out_rfh = CreateSwappedOutRenderFrameHost();
756 EXPECT_TRUE(swapped_out_rfh->is_swapped_out()); 795 EXPECT_TRUE(swapped_out_rfh->is_swapped_out());
757 796
758 scoped_ptr<RenderWidgetHostIterator> widgets( 797 scoped_ptr<RenderWidgetHostIterator> widgets(
759 RenderWidgetHost::GetRenderWidgetHosts()); 798 RenderWidgetHost::GetRenderWidgetHosts());
760 799
761 while (RenderWidgetHost* w = widgets->GetNextHost()) { 800 while (RenderWidgetHost* w = widgets->GetNextHost()) {
762 bool found = false; 801 bool found = false;
763 scoped_ptr<RenderWidgetHostIterator> all_widgets( 802 scoped_ptr<RenderWidgetHostIterator> all_widgets(
764 RenderWidgetHostImpl::GetAllRenderWidgetHosts()); 803 RenderWidgetHostImpl::GetAllRenderWidgetHosts());
(...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 SiteInstance* blank_instance = SiteInstance::Create(browser_context()); 1141 SiteInstance* blank_instance = SiteInstance::Create(browser_context());
1103 blank_instance->GetProcess()->Init(); 1142 blank_instance->GetProcess()->Init();
1104 1143
1105 // Create a blank tab. 1144 // Create a blank tab.
1106 scoped_ptr<TestWebContents> web_contents1( 1145 scoped_ptr<TestWebContents> web_contents1(
1107 TestWebContents::Create(browser_context(), blank_instance)); 1146 TestWebContents::Create(browser_context(), blank_instance));
1108 RenderFrameHostManager* manager1 = 1147 RenderFrameHostManager* manager1 =
1109 web_contents1->GetRenderManagerForTesting(); 1148 web_contents1->GetRenderManagerForTesting();
1110 // Test the case that new RVH is considered live. 1149 // Test the case that new RVH is considered live.
1111 manager1->current_host()->CreateRenderView( 1150 manager1->current_host()->CreateRenderView(
1112 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 1151 base::string16(), -1, MSG_ROUTING_NONE, -1,
1152 FrameReplicationState(), false);
1113 EXPECT_TRUE(manager1->current_host()->IsRenderViewLive()); 1153 EXPECT_TRUE(manager1->current_host()->IsRenderViewLive());
1114 EXPECT_TRUE(manager1->current_frame_host()->IsRenderFrameLive()); 1154 EXPECT_TRUE(manager1->current_frame_host()->IsRenderFrameLive());
1115 1155
1116 // Navigate to a WebUI page. 1156 // Navigate to a WebUI page.
1117 const GURL kUrl1("chrome://foo"); 1157 const GURL kUrl1("chrome://foo");
1118 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1, 1158 NavigationEntryImpl entry1(NULL /* instance */, -1 /* page_id */, kUrl1,
1119 Referrer(), base::string16() /* title */, 1159 Referrer(), base::string16() /* title */,
1120 ui::PAGE_TRANSITION_TYPED, 1160 ui::PAGE_TRANSITION_TYPED,
1121 false /* is_renderer_init */); 1161 false /* is_renderer_init */);
1122 RenderFrameHostImpl* host1 = NavigateToEntry(manager1, entry1); 1162 RenderFrameHostImpl* host1 = NavigateToEntry(manager1, entry1);
(...skipping 13 matching lines...) Expand all
1136 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 1176 host1->render_view_host()->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1137 1177
1138 // Now simulate clicking a link that opens in a new tab. 1178 // Now simulate clicking a link that opens in a new tab.
1139 scoped_ptr<TestWebContents> web_contents2( 1179 scoped_ptr<TestWebContents> web_contents2(
1140 TestWebContents::Create(browser_context(), webui_instance)); 1180 TestWebContents::Create(browser_context(), webui_instance));
1141 RenderFrameHostManager* manager2 = 1181 RenderFrameHostManager* manager2 =
1142 web_contents2->GetRenderManagerForTesting(); 1182 web_contents2->GetRenderManagerForTesting();
1143 // Make sure the new RVH is considered live. This is usually done in 1183 // Make sure the new RVH is considered live. This is usually done in
1144 // RenderWidgetHost::Init when opening a new tab from a link. 1184 // RenderWidgetHost::Init when opening a new tab from a link.
1145 manager2->current_host()->CreateRenderView( 1185 manager2->current_host()->CreateRenderView(
1146 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 1186 base::string16(), -1, MSG_ROUTING_NONE, -1,
1187 FrameReplicationState(), false);
1147 EXPECT_TRUE(manager2->current_host()->IsRenderViewLive()); 1188 EXPECT_TRUE(manager2->current_host()->IsRenderViewLive());
1148 1189
1149 const GURL kUrl2("chrome://foo/bar"); 1190 const GURL kUrl2("chrome://foo/bar");
1150 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2, 1191 NavigationEntryImpl entry2(NULL /* instance */, -1 /* page_id */, kUrl2,
1151 Referrer(), base::string16() /* title */, 1192 Referrer(), base::string16() /* title */,
1152 ui::PAGE_TRANSITION_LINK, 1193 ui::PAGE_TRANSITION_LINK,
1153 true /* is_renderer_init */); 1194 true /* is_renderer_init */);
1154 RenderFrameHostImpl* host2 = NavigateToEntry(manager2, entry2); 1195 RenderFrameHostImpl* host2 = NavigateToEntry(manager2, entry2);
1155 1196
1156 // No cross-process transition happens because we are already in the right 1197 // No cross-process transition happens because we are already in the right
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
1306 // Now go back, but suppose the SwapOut_ACK isn't received. This shouldn't 1347 // Now go back, but suppose the SwapOut_ACK isn't received. This shouldn't
1307 // happen, but we have seen it when going back quickly across many entries 1348 // happen, but we have seen it when going back quickly across many entries
1308 // (http://crbug.com/93427). 1349 // (http://crbug.com/93427).
1309 contents()->GetController().GoBack(); 1350 contents()->GetController().GoBack();
1310 EXPECT_TRUE(rfh2->IsWaitingForBeforeUnloadACK()); 1351 EXPECT_TRUE(rfh2->IsWaitingForBeforeUnloadACK());
1311 contents()->GetMainFrame()->PrepareForCommit(); 1352 contents()->GetMainFrame()->PrepareForCommit();
1312 EXPECT_FALSE(rfh2->IsWaitingForBeforeUnloadACK()); 1353 EXPECT_FALSE(rfh2->IsWaitingForBeforeUnloadACK());
1313 1354
1314 // The back navigation commits. 1355 // The back navigation commits.
1315 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry(); 1356 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry();
1316 rfh1->SendNavigate(entry1->GetPageID(), entry1->GetUniqueID(), false, 1357 contents()->GetPendingMainFrame()->SendNavigate(
1317 entry1->GetURL()); 1358 entry1->GetPageID(), entry1->GetUniqueID(), false, entry1->GetURL());
1318 EXPECT_TRUE(rfh2->IsWaitingForUnloadACK()); 1359 EXPECT_TRUE(rfh2->IsWaitingForUnloadACK());
1319 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh2->rfh_state()); 1360 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh2->rfh_state());
1320 1361
1321 // We should be able to navigate forward. 1362 // We should be able to navigate forward.
1322 contents()->GetController().GoForward(); 1363 contents()->GetController().GoForward();
1323 contents()->GetMainFrame()->PrepareForCommit(); 1364 contents()->GetMainFrame()->PrepareForCommit();
1324 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry(); 1365 const NavigationEntry* entry2 = contents()->GetController().GetPendingEntry();
1325 rfh2->SendNavigate(entry2->GetPageID(), entry2->GetUniqueID(), false, 1366 contents()->GetPendingMainFrame()->SendNavigate(
1326 entry2->GetURL()); 1367 entry2->GetPageID(), entry2->GetUniqueID(), false, entry2->GetURL());
1327 EXPECT_EQ(rfh2, main_test_rfh()); 1368 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, main_test_rfh()->rfh_state());
1328 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1369 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1329 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1370 switches::kSitePerProcess)) {
1330 rfh1->OnSwappedOut(); 1371 EXPECT_EQ(rfh2, main_test_rfh());
1331 EXPECT_TRUE(rfh1->is_swapped_out()); 1372 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1332 EXPECT_EQ(RenderFrameHostImpl::STATE_SWAPPED_OUT, rfh1->rfh_state()); 1373 rfh1->OnSwappedOut();
1374 EXPECT_TRUE(rfh1->is_swapped_out());
1375 EXPECT_EQ(RenderFrameHostImpl::STATE_SWAPPED_OUT, rfh1->rfh_state());
1376 }
1333 } 1377 }
1334 1378
1335 // Test that we create swapped out RFHs for the opener chain when navigating an 1379 // Test that we create swapped out RFHs for the opener chain when navigating an
1336 // opened tab cross-process. This allows us to support certain cross-process 1380 // opened tab cross-process. This allows us to support certain cross-process
1337 // JavaScript calls (http://crbug.com/99202). 1381 // JavaScript calls (http://crbug.com/99202).
1338 TEST_F(RenderFrameHostManagerTest, CreateSwappedOutOpenerRFHs) { 1382 TEST_F(RenderFrameHostManagerTest, CreateSwappedOutOpenerRFHs) {
1339 const GURL kUrl1("http://www.google.com/"); 1383 const GURL kUrl1("http://www.google.com/");
1340 const GURL kUrl2("http://www.chromium.org/"); 1384 const GURL kUrl2("http://www.chromium.org/");
1341 const GURL kChromeUrl("chrome://foo"); 1385 const GURL kChromeUrl("chrome://foo");
1386 bool is_site_per_process = base::CommandLine::ForCurrentProcess()->HasSwitch(
1387 switches::kSitePerProcess);
1342 1388
1343 // Navigate to an initial URL. 1389 // Navigate to an initial URL.
1344 contents()->NavigateAndCommit(kUrl1); 1390 contents()->NavigateAndCommit(kUrl1);
1345 RenderFrameHostManager* manager = contents()->GetRenderManagerForTesting(); 1391 RenderFrameHostManager* manager = contents()->GetRenderManagerForTesting();
1346 TestRenderFrameHost* rfh1 = main_test_rfh(); 1392 TestRenderFrameHost* rfh1 = main_test_rfh();
1393 scoped_refptr<SiteInstanceImpl> site_instance1 = rfh1->GetSiteInstance();
1394 RenderFrameHostDeletedObserver rfh1_deleted_observer(rfh1);
1347 TestRenderViewHost* rvh1 = test_rvh(); 1395 TestRenderViewHost* rvh1 = test_rvh();
1348 1396
1349 // Create 2 new tabs and simulate them being the opener chain for the main 1397 // Create 2 new tabs and simulate them being the opener chain for the main
1350 // tab. They should be in the same SiteInstance. 1398 // tab. They should be in the same SiteInstance.
1351 scoped_ptr<TestWebContents> opener1( 1399 scoped_ptr<TestWebContents> opener1(
1352 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1400 TestWebContents::Create(browser_context(), site_instance1.get()));
1353 RenderFrameHostManager* opener1_manager = 1401 RenderFrameHostManager* opener1_manager =
1354 opener1->GetRenderManagerForTesting(); 1402 opener1->GetRenderManagerForTesting();
1355 contents()->SetOpener(opener1.get()); 1403 contents()->SetOpener(opener1.get());
1356 1404
1357 scoped_ptr<TestWebContents> opener2( 1405 scoped_ptr<TestWebContents> opener2(
1358 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1406 TestWebContents::Create(browser_context(), site_instance1.get()));
1359 RenderFrameHostManager* opener2_manager = 1407 RenderFrameHostManager* opener2_manager =
1360 opener2->GetRenderManagerForTesting(); 1408 opener2->GetRenderManagerForTesting();
1361 opener1->SetOpener(opener2.get()); 1409 opener1->SetOpener(opener2.get());
1362 1410
1363 // Navigate to a cross-site URL (different SiteInstance but same 1411 // Navigate to a cross-site URL (different SiteInstance but same
1364 // BrowsingInstance). 1412 // BrowsingInstance).
1365 contents()->NavigateAndCommit(kUrl2); 1413 contents()->NavigateAndCommit(kUrl2);
1366 TestRenderFrameHost* rfh2 = main_test_rfh(); 1414 TestRenderFrameHost* rfh2 = main_test_rfh();
1367 TestRenderViewHost* rvh2 = test_rvh(); 1415 TestRenderViewHost* rvh2 = test_rvh();
1368 EXPECT_NE(rfh1->GetSiteInstance(), rfh2->GetSiteInstance()); 1416 EXPECT_NE(site_instance1, rfh2->GetSiteInstance());
1369 EXPECT_TRUE(rfh1->GetSiteInstance()->IsRelatedSiteInstance( 1417 EXPECT_TRUE(site_instance1->IsRelatedSiteInstance(rfh2->GetSiteInstance()));
1370 rfh2->GetSiteInstance()));
1371 1418
1372 // Ensure rvh1 is placed on swapped out list of the current tab. 1419 // Ensure rvh1 is placed on swapped out list of the current tab.
1373 EXPECT_TRUE(manager->IsOnSwappedOutList(rfh1)); 1420 if (!is_site_per_process) {
1374 EXPECT_TRUE(manager->IsRVHOnSwappedOutList(rvh1)); 1421 EXPECT_TRUE(manager->IsRVHOnSwappedOutList(rvh1));
1375 EXPECT_EQ(rfh1, 1422 EXPECT_FALSE(rfh1_deleted_observer.deleted());
1376 manager->GetRenderFrameProxyHost(rfh1->GetSiteInstance()) 1423 EXPECT_TRUE(manager->IsOnSwappedOutList(rfh1));
1377 ->render_frame_host()); 1424 EXPECT_EQ(rfh1,
1425 manager->GetRenderFrameProxyHost(site_instance1.get())
1426 ->render_frame_host());
1427 } else {
1428 EXPECT_TRUE(rfh1_deleted_observer.deleted());
1429 EXPECT_TRUE(manager->GetRenderFrameProxyHost(site_instance1.get()));
1430 }
1378 EXPECT_EQ(rvh1, 1431 EXPECT_EQ(rvh1,
1379 manager->GetSwappedOutRenderViewHost(rvh1->GetSiteInstance())); 1432 manager->GetSwappedOutRenderViewHost(rvh1->GetSiteInstance()));
1380 1433
1381 // Ensure a swapped out RFH and RFH is created in the first opener tab. 1434 // Ensure a swapped out RFH and RFH is created in the first opener tab.
1382 RenderFrameProxyHost* opener1_proxy = 1435 RenderFrameProxyHost* opener1_proxy =
1383 opener1_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance()); 1436 opener1_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance());
1384 RenderFrameHostImpl* opener1_rfh = opener1_proxy->render_frame_host(); 1437 RenderFrameHostImpl* opener1_rfh = opener1_proxy->render_frame_host();
1385 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( 1438 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>(
1386 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); 1439 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance()));
1387 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rfh)); 1440 if (!is_site_per_process) {
1388 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh)); 1441 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rfh));
1389 EXPECT_TRUE(opener1_rfh->is_swapped_out()); 1442 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh));
1443 EXPECT_TRUE(opener1_rfh->is_swapped_out());
1444 } else {
1445 EXPECT_FALSE(opener1_rfh);
1446 }
1390 EXPECT_FALSE(opener1_rvh->is_active()); 1447 EXPECT_FALSE(opener1_rvh->is_active());
1391 1448
1392 // Ensure a swapped out RFH and RVH is created in the second opener tab. 1449 // Ensure a swapped out RFH and RVH is created in the second opener tab.
1393 RenderFrameProxyHost* opener2_proxy = 1450 RenderFrameProxyHost* opener2_proxy =
1394 opener2_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance()); 1451 opener2_manager->GetRenderFrameProxyHost(rfh2->GetSiteInstance());
1395 RenderFrameHostImpl* opener2_rfh = opener2_proxy->render_frame_host(); 1452 RenderFrameHostImpl* opener2_rfh = opener2_proxy->render_frame_host();
1396 TestRenderViewHost* opener2_rvh = static_cast<TestRenderViewHost*>( 1453 TestRenderViewHost* opener2_rvh = static_cast<TestRenderViewHost*>(
1397 opener2_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); 1454 opener2_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance()));
1398 EXPECT_TRUE(opener2_manager->IsOnSwappedOutList(opener2_rfh)); 1455 if (!is_site_per_process) {
1399 EXPECT_TRUE(opener2_manager->IsRVHOnSwappedOutList(opener2_rvh)); 1456 EXPECT_TRUE(opener2_manager->IsOnSwappedOutList(opener2_rfh));
1400 EXPECT_TRUE(opener2_rfh->is_swapped_out()); 1457 EXPECT_TRUE(opener2_manager->IsRVHOnSwappedOutList(opener2_rvh));
1458 EXPECT_TRUE(opener2_rfh->is_swapped_out());
1459 } else {
1460 EXPECT_FALSE(opener2_rfh);
1461 }
1401 EXPECT_FALSE(opener2_rvh->is_active()); 1462 EXPECT_FALSE(opener2_rvh->is_active());
1402 1463
1403 // Navigate to a cross-BrowsingInstance URL. 1464 // Navigate to a cross-BrowsingInstance URL.
1404 contents()->NavigateAndCommit(kChromeUrl); 1465 contents()->NavigateAndCommit(kChromeUrl);
1405 TestRenderFrameHost* rfh3 = main_test_rfh(); 1466 TestRenderFrameHost* rfh3 = main_test_rfh();
1406 EXPECT_NE(rfh1->GetSiteInstance(), rfh3->GetSiteInstance()); 1467 EXPECT_NE(site_instance1, rfh3->GetSiteInstance());
1407 EXPECT_FALSE(rfh1->GetSiteInstance()->IsRelatedSiteInstance( 1468 EXPECT_FALSE(site_instance1->IsRelatedSiteInstance(rfh3->GetSiteInstance()));
1408 rfh3->GetSiteInstance()));
1409 1469
1410 // No scripting is allowed across BrowsingInstances, so we should not create 1470 // No scripting is allowed across BrowsingInstances, so we should not create
1411 // swapped out RVHs for the opener chain in this case. 1471 // swapped out RVHs for the opener chain in this case.
1412 EXPECT_FALSE(opener1_manager->GetRenderFrameProxyHost( 1472 EXPECT_FALSE(opener1_manager->GetRenderFrameProxyHost(
1413 rfh3->GetSiteInstance())); 1473 rfh3->GetSiteInstance()));
1414 EXPECT_FALSE(opener1_manager->GetSwappedOutRenderViewHost( 1474 EXPECT_FALSE(opener1_manager->GetSwappedOutRenderViewHost(
1415 rfh3->GetSiteInstance())); 1475 rfh3->GetSiteInstance()));
1416 EXPECT_FALSE(opener2_manager->GetRenderFrameProxyHost( 1476 EXPECT_FALSE(opener2_manager->GetRenderFrameProxyHost(
1417 rfh3->GetSiteInstance())); 1477 rfh3->GetSiteInstance()));
1418 EXPECT_FALSE(opener2_manager->GetSwappedOutRenderViewHost( 1478 EXPECT_FALSE(opener2_manager->GetSwappedOutRenderViewHost(
1419 rfh3->GetSiteInstance())); 1479 rfh3->GetSiteInstance()));
1420 } 1480 }
1421 1481
1422 // Test that a page can disown the opener of the WebContents. 1482 // Test that a page can disown the opener of the WebContents.
1423 TEST_F(RenderFrameHostManagerTest, DisownOpener) { 1483 TEST_F(RenderFrameHostManagerTest, DisownOpener) {
1424 const GURL kUrl1("http://www.google.com/"); 1484 const GURL kUrl1("http://www.google.com/");
1425 const GURL kUrl2("http://www.chromium.org/"); 1485 const GURL kUrl2("http://www.chromium.org/");
1426 1486
1427 // Navigate to an initial URL. 1487 // Navigate to an initial URL.
1428 contents()->NavigateAndCommit(kUrl1); 1488 contents()->NavigateAndCommit(kUrl1);
1429 TestRenderFrameHost* rfh1 = main_test_rfh(); 1489 TestRenderFrameHost* rfh1 = main_test_rfh();
1490 scoped_refptr<SiteInstanceImpl> site_instance1 = rfh1->GetSiteInstance();
1430 1491
1431 // Create a new tab and simulate having it be the opener for the main tab. 1492 // Create a new tab and simulate having it be the opener for the main tab.
1432 scoped_ptr<TestWebContents> opener1( 1493 scoped_ptr<TestWebContents> opener1(
1433 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1494 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance()));
1434 contents()->SetOpener(opener1.get()); 1495 contents()->SetOpener(opener1.get());
1435 EXPECT_TRUE(contents()->HasOpener()); 1496 EXPECT_TRUE(contents()->HasOpener());
1436 1497
1437 // Navigate to a cross-site URL (different SiteInstance but same 1498 // Navigate to a cross-site URL (different SiteInstance but same
1438 // BrowsingInstance). 1499 // BrowsingInstance).
1439 contents()->NavigateAndCommit(kUrl2); 1500 contents()->NavigateAndCommit(kUrl2);
1440 TestRenderFrameHost* rfh2 = main_test_rfh(); 1501 TestRenderFrameHost* rfh2 = main_test_rfh();
1441 EXPECT_NE(rfh1->GetSiteInstance(), rfh2->GetSiteInstance()); 1502 EXPECT_NE(site_instance1, rfh2->GetSiteInstance());
1442 1503
1443 // Disown the opener from rfh2. 1504 // Disown the opener from rfh2.
1444 rfh2->DidDisownOpener(); 1505 rfh2->DidDisownOpener();
1445 1506
1446 // Ensure the opener is cleared. 1507 // Ensure the opener is cleared.
1447 EXPECT_FALSE(contents()->HasOpener()); 1508 EXPECT_FALSE(contents()->HasOpener());
1448 } 1509 }
1449 1510
1450 // Test that a page can disown a same-site opener of the WebContents. 1511 // Test that a page can disown a same-site opener of the WebContents.
1451 TEST_F(RenderFrameHostManagerTest, DisownSameSiteOpener) { 1512 TEST_F(RenderFrameHostManagerTest, DisownSameSiteOpener) {
(...skipping 17 matching lines...) Expand all
1469 } 1530 }
1470 1531
1471 // Test that a page can disown the opener just as a cross-process navigation is 1532 // Test that a page can disown the opener just as a cross-process navigation is
1472 // in progress. 1533 // in progress.
1473 TEST_F(RenderFrameHostManagerTest, DisownOpenerDuringNavigation) { 1534 TEST_F(RenderFrameHostManagerTest, DisownOpenerDuringNavigation) {
1474 const GURL kUrl1("http://www.google.com/"); 1535 const GURL kUrl1("http://www.google.com/");
1475 const GURL kUrl2("http://www.chromium.org/"); 1536 const GURL kUrl2("http://www.chromium.org/");
1476 1537
1477 // Navigate to an initial URL. 1538 // Navigate to an initial URL.
1478 contents()->NavigateAndCommit(kUrl1); 1539 contents()->NavigateAndCommit(kUrl1);
1479 TestRenderFrameHost* rfh1 = main_test_rfh(); 1540 scoped_refptr<SiteInstanceImpl> site_instance1 =
1541 main_test_rfh()->GetSiteInstance();
1480 1542
1481 // Create a new tab and simulate having it be the opener for the main tab. 1543 // Create a new tab and simulate having it be the opener for the main tab.
1482 scoped_ptr<TestWebContents> opener1( 1544 scoped_ptr<TestWebContents> opener1(
1483 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1545 TestWebContents::Create(browser_context(), site_instance1.get()));
1484 contents()->SetOpener(opener1.get()); 1546 contents()->SetOpener(opener1.get());
1485 EXPECT_TRUE(contents()->HasOpener()); 1547 EXPECT_TRUE(contents()->HasOpener());
1486 1548
1487 // Navigate to a cross-site URL (different SiteInstance but same 1549 // Navigate to a cross-site URL (different SiteInstance but same
1488 // BrowsingInstance). 1550 // BrowsingInstance).
1489 contents()->NavigateAndCommit(kUrl2); 1551 contents()->NavigateAndCommit(kUrl2);
1490 TestRenderFrameHost* rfh2 = main_test_rfh(); 1552 TestRenderFrameHost* rfh2 = main_test_rfh();
1491 EXPECT_NE(rfh1->GetSiteInstance(), rfh2->GetSiteInstance()); 1553 EXPECT_NE(site_instance1, rfh2->GetSiteInstance());
1492 1554
1493 // Start a back navigation so that rfh1 becomes the pending RFH. 1555 // Start a back navigation.
1494 contents()->GetController().GoBack(); 1556 contents()->GetController().GoBack();
1495 contents()->GetMainFrame()->PrepareForCommit(); 1557 contents()->GetMainFrame()->PrepareForCommit();
1496 1558
1497 // Disown the opener from rfh2. 1559 // Disown the opener from rfh2.
1498 rfh2->DidDisownOpener(); 1560 rfh2->DidDisownOpener();
1499 1561
1500 // Ensure the opener is cleared. 1562 // Ensure the opener is cleared.
1501 EXPECT_FALSE(contents()->HasOpener()); 1563 EXPECT_FALSE(contents()->HasOpener());
1502 1564
1503 // The back navigation commits. 1565 // The back navigation commits.
1504 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry(); 1566 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry();
1505 rfh1->SendNavigate(entry1->GetPageID(), entry1->GetUniqueID(), false, 1567 contents()->GetPendingMainFrame()->SendNavigate(
1506 entry1->GetURL()); 1568 entry1->GetPageID(), entry1->GetUniqueID(), false, entry1->GetURL());
1507 1569
1508 // Ensure the opener is still cleared. 1570 // Ensure the opener is still cleared.
1509 EXPECT_FALSE(contents()->HasOpener()); 1571 EXPECT_FALSE(contents()->HasOpener());
1510 } 1572 }
1511 1573
1512 // Test that a page can disown the opener just after a cross-process navigation 1574 // Test that a page can disown the opener just after a cross-process navigation
1513 // commits. 1575 // commits.
1514 TEST_F(RenderFrameHostManagerTest, DisownOpenerAfterNavigation) { 1576 TEST_F(RenderFrameHostManagerTest, DisownOpenerAfterNavigation) {
1515 const GURL kUrl1("http://www.google.com/"); 1577 const GURL kUrl1("http://www.google.com/");
1516 const GURL kUrl2("http://www.chromium.org/"); 1578 const GURL kUrl2("http://www.chromium.org/");
1517 1579
1518 // Navigate to an initial URL. 1580 // Navigate to an initial URL.
1519 contents()->NavigateAndCommit(kUrl1); 1581 contents()->NavigateAndCommit(kUrl1);
1520 TestRenderFrameHost* rfh1 = main_test_rfh(); 1582 scoped_refptr<SiteInstanceImpl> site_instance1 =
1583 main_test_rfh()->GetSiteInstance();
1521 1584
1522 // Create a new tab and simulate having it be the opener for the main tab. 1585 // Create a new tab and simulate having it be the opener for the main tab.
1523 scoped_ptr<TestWebContents> opener1( 1586 scoped_ptr<TestWebContents> opener1(
1524 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1587 TestWebContents::Create(browser_context(), site_instance1.get()));
1525 contents()->SetOpener(opener1.get()); 1588 contents()->SetOpener(opener1.get());
1526 EXPECT_TRUE(contents()->HasOpener()); 1589 EXPECT_TRUE(contents()->HasOpener());
1527 1590
1528 // Navigate to a cross-site URL (different SiteInstance but same 1591 // Navigate to a cross-site URL (different SiteInstance but same
1529 // BrowsingInstance). 1592 // BrowsingInstance).
1530 contents()->NavigateAndCommit(kUrl2); 1593 contents()->NavigateAndCommit(kUrl2);
1531 TestRenderFrameHost* rfh2 = main_test_rfh(); 1594 TestRenderFrameHost* rfh2 = main_test_rfh();
1532 EXPECT_NE(rfh1->GetSiteInstance(), rfh2->GetSiteInstance()); 1595 EXPECT_NE(site_instance1, rfh2->GetSiteInstance());
1533 1596
1534 // Commit a back navigation before the DidDisownOpener message arrives. 1597 // Commit a back navigation before the DidDisownOpener message arrives.
1535 // rfh1 will be kept alive because of the opener tab.
1536 contents()->GetController().GoBack(); 1598 contents()->GetController().GoBack();
1537 contents()->GetMainFrame()->PrepareForCommit(); 1599 contents()->GetMainFrame()->PrepareForCommit();
1538 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry(); 1600 const NavigationEntry* entry1 = contents()->GetController().GetPendingEntry();
1539 rfh1->SendNavigate(entry1->GetPageID(), entry1->GetUniqueID(), false, 1601 contents()->GetPendingMainFrame()->SendNavigate(
1540 entry1->GetURL()); 1602 entry1->GetPageID(), entry1->GetUniqueID(), false, entry1->GetURL());
1541 1603
1542 // Disown the opener from rfh2. 1604 // Disown the opener from rfh2.
1543 rfh2->DidDisownOpener(); 1605 rfh2->DidDisownOpener();
1544 EXPECT_FALSE(contents()->HasOpener()); 1606 EXPECT_FALSE(contents()->HasOpener());
1545 } 1607 }
1546 1608
1547 // Test that we clean up swapped out RenderViewHosts when a process hosting 1609 // Test that we clean up swapped out RenderViewHosts when a process hosting
1548 // those associated RenderViews crashes. http://crbug.com/258993 1610 // those associated RenderViews crashes. http://crbug.com/258993
1549 TEST_F(RenderFrameHostManagerTest, CleanUpSwappedOutRVHOnProcessCrash) { 1611 TEST_F(RenderFrameHostManagerTest, CleanUpSwappedOutRVHOnProcessCrash) {
1550 const GURL kUrl1("http://www.google.com/"); 1612 const GURL kUrl1("http://www.google.com/");
1551 const GURL kUrl2("http://www.chromium.org/"); 1613 const GURL kUrl2("http://www.chromium.org/");
1552 1614
1553 // Navigate to an initial URL. 1615 // Navigate to an initial URL.
1554 contents()->NavigateAndCommit(kUrl1); 1616 contents()->NavigateAndCommit(kUrl1);
1555 TestRenderFrameHost* rfh1 = contents()->GetMainFrame(); 1617 TestRenderFrameHost* rfh1 = contents()->GetMainFrame();
1556 1618
1557 // Create a new tab as an opener for the main tab. 1619 // Create a new tab as an opener for the main tab.
1558 scoped_ptr<TestWebContents> opener1( 1620 scoped_ptr<TestWebContents> opener1(
1559 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance())); 1621 TestWebContents::Create(browser_context(), rfh1->GetSiteInstance()));
1560 RenderFrameHostManager* opener1_manager = 1622 RenderFrameHostManager* opener1_manager =
1561 opener1->GetRenderManagerForTesting(); 1623 opener1->GetRenderManagerForTesting();
1562 contents()->SetOpener(opener1.get()); 1624 contents()->SetOpener(opener1.get());
1563 1625
1564 // Make sure the new opener RVH is considered live. 1626 // Make sure the new opener RVH is considered live.
1565 opener1_manager->current_host()->CreateRenderView( 1627 opener1_manager->current_host()->CreateRenderView(
1566 base::string16(), -1, MSG_ROUTING_NONE, -1, false); 1628 base::string16(), -1, MSG_ROUTING_NONE, -1,
1629 FrameReplicationState(), false);
1567 EXPECT_TRUE(opener1_manager->current_host()->IsRenderViewLive()); 1630 EXPECT_TRUE(opener1_manager->current_host()->IsRenderViewLive());
1568 EXPECT_TRUE(opener1_manager->current_frame_host()->IsRenderFrameLive()); 1631 EXPECT_TRUE(opener1_manager->current_frame_host()->IsRenderFrameLive());
1569 1632
1570 // Use a cross-process navigation in the opener to swap out the old RVH. 1633 // Use a cross-process navigation in the opener to swap out the old RVH.
1571 EXPECT_FALSE( 1634 EXPECT_FALSE(
1572 opener1_manager->GetSwappedOutRenderViewHost(rfh1->GetSiteInstance())); 1635 opener1_manager->GetSwappedOutRenderViewHost(rfh1->GetSiteInstance()));
1573 opener1->NavigateAndCommit(kUrl2); 1636 opener1->NavigateAndCommit(kUrl2);
1574 EXPECT_TRUE( 1637 EXPECT_TRUE(
1575 opener1_manager->GetSwappedOutRenderViewHost(rfh1->GetSiteInstance())); 1638 opener1_manager->GetSwappedOutRenderViewHost(rfh1->GetSiteInstance()));
1576 1639
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1627 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance()); 1690 EXPECT_NE(rvh1->GetSiteInstance(), rvh2->GetSiteInstance());
1628 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance( 1691 EXPECT_TRUE(rvh1->GetSiteInstance()->IsRelatedSiteInstance(
1629 rvh2->GetSiteInstance())); 1692 rvh2->GetSiteInstance()));
1630 1693
1631 // Ensure a swapped out RFH and RVH is created in the first opener tab. 1694 // Ensure a swapped out RFH and RVH is created in the first opener tab.
1632 RenderFrameProxyHost* opener1_proxy = 1695 RenderFrameProxyHost* opener1_proxy =
1633 opener1_manager->GetRenderFrameProxyHost(rvh2->GetSiteInstance()); 1696 opener1_manager->GetRenderFrameProxyHost(rvh2->GetSiteInstance());
1634 RenderFrameHostImpl* opener1_rfh = opener1_proxy->render_frame_host(); 1697 RenderFrameHostImpl* opener1_rfh = opener1_proxy->render_frame_host();
1635 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>( 1698 TestRenderViewHost* opener1_rvh = static_cast<TestRenderViewHost*>(
1636 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance())); 1699 opener1_manager->GetSwappedOutRenderViewHost(rvh2->GetSiteInstance()));
1637 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rfh)); 1700 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1638 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh)); 1701 switches::kSitePerProcess)) {
1639 EXPECT_TRUE(opener1_rfh->is_swapped_out()); 1702 EXPECT_TRUE(opener1_manager->IsOnSwappedOutList(opener1_rfh));
1703 EXPECT_TRUE(opener1_manager->IsRVHOnSwappedOutList(opener1_rvh));
1704 EXPECT_TRUE(opener1_rfh->is_swapped_out());
1705 } else {
1706 EXPECT_FALSE(opener1_rfh);
1707 }
1640 EXPECT_FALSE(opener1_rvh->is_active()); 1708 EXPECT_FALSE(opener1_rvh->is_active());
1641 1709
1642 // Ensure the new RVH has WebUI bindings. 1710 // Ensure the new RVH has WebUI bindings.
1643 EXPECT_TRUE(rvh2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI); 1711 EXPECT_TRUE(rvh2->GetEnabledBindings() & BINDINGS_POLICY_WEB_UI);
1644 } 1712 }
1645 1713
1646 // Test that we reuse the same guest SiteInstance if we navigate across sites. 1714 // Test that we reuse the same guest SiteInstance if we navigate across sites.
1647 TEST_F(RenderFrameHostManagerTest, NoSwapOnGuestNavigations) { 1715 TEST_F(RenderFrameHostManagerTest, NoSwapOnGuestNavigations) {
1648 GURL guest_url(std::string(kGuestScheme).append("://abc123")); 1716 GURL guest_url(std::string(kGuestScheme).append("://abc123"));
1649 SiteInstance* instance = 1717 SiteInstance* instance =
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after
1867 ui::PAGE_TRANSITION_TYPED); 1935 ui::PAGE_TRANSITION_TYPED);
1868 EXPECT_FALSE(contents()->CrossProcessNavigationPending()); 1936 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1869 EXPECT_EQ(rfh2, contents()->GetMainFrame()); 1937 EXPECT_EQ(rfh2, contents()->GetMainFrame());
1870 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); 1938 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
1871 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1939 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state());
1872 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1940 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1873 1941
1874 // Simulate the swap out ack. 1942 // Simulate the swap out ack.
1875 rfh1->OnSwappedOut(); 1943 rfh1->OnSwappedOut();
1876 1944
1877 // rfh1 should be swapped out. 1945 // rfh1 should be swapped out or deleted in --site-per-process.
1878 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1946 if (!base::CommandLine::ForCurrentProcess()->HasSwitch(
1879 EXPECT_TRUE(rfh1->is_swapped_out()); 1947 switches::kSitePerProcess)) {
1948 EXPECT_FALSE(rfh_deleted_observer.deleted());
1949 EXPECT_TRUE(rfh1->is_swapped_out());
1950 } else {
1951 EXPECT_TRUE(rfh_deleted_observer.deleted());
1952 }
1880 } 1953 }
1881 1954
1882 // Test that the RenderViewHost is properly swapped out if a navigation in the 1955 // Test that the RenderViewHost is properly swapped out if a navigation in the
1883 // new renderer commits before sending the SwapOut message to the old renderer. 1956 // new renderer commits before sending the SwapOut message to the old renderer.
1884 // This simulates a cross-site navigation to a synchronously committing URL 1957 // This simulates a cross-site navigation to a synchronously committing URL
1885 // (e.g., a data URL) and ensures it works properly. 1958 // (e.g., a data URL) and ensures it works properly.
1886 TEST_F(RenderFrameHostManagerTest, 1959 TEST_F(RenderFrameHostManagerTest,
1887 CommitNewNavigationBeforeSendingSwapOut) { 1960 CommitNewNavigationBeforeSendingSwapOut) {
1888 const GURL kUrl1("http://www.google.com/"); 1961 const GURL kUrl1("http://www.google.com/");
1889 const GURL kUrl2("http://www.chromium.org/"); 1962 const GURL kUrl2("http://www.chromium.org/");
1890 1963
1891 // Navigate to the first page. 1964 // Navigate to the first page.
1892 contents()->NavigateAndCommit(kUrl1); 1965 contents()->NavigateAndCommit(kUrl1);
1893 TestRenderFrameHost* rfh1 = contents()->GetMainFrame(); 1966 TestRenderFrameHost* rfh1 = contents()->GetMainFrame();
1894 RenderFrameHostDeletedObserver rfh_deleted_observer(rfh1); 1967 RenderFrameHostDeletedObserver rfh_deleted_observer(rfh1);
1895 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state()); 1968 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh1->rfh_state());
1896 1969
1897 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is 1970 // Increment the number of active frames in SiteInstanceImpl so that rfh1 is
1898 // not deleted on swap out. 1971 // not deleted on swap out.
1899 rfh1->GetSiteInstance()->increment_active_frame_count(); 1972 scoped_refptr<SiteInstanceImpl> site_instance = rfh1->GetSiteInstance();
1973 site_instance->increment_active_frame_count();
1900 1974
1901 // Navigate to new site, simulating onbeforeunload approval. 1975 // Navigate to new site, simulating onbeforeunload approval.
1902 controller().LoadURL( 1976 controller().LoadURL(
1903 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 1977 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1904 int entry_id = controller().GetPendingEntry()->GetUniqueID(); 1978 int entry_id = controller().GetPendingEntry()->GetUniqueID();
1905 rfh1->PrepareForCommit(); 1979 rfh1->PrepareForCommit();
1906 EXPECT_TRUE(contents()->CrossProcessNavigationPending()); 1980 EXPECT_TRUE(contents()->CrossProcessNavigationPending());
1907 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame(); 1981 TestRenderFrameHost* rfh2 = contents()->GetPendingMainFrame();
1908 1982
1909 // The new page commits. 1983 // The new page commits.
1910 contents()->TestDidNavigate(rfh2, 1, entry_id, true, kUrl2, 1984 contents()->TestDidNavigate(rfh2, 1, entry_id, true, kUrl2,
1911 ui::PAGE_TRANSITION_TYPED); 1985 ui::PAGE_TRANSITION_TYPED);
1912 EXPECT_FALSE(contents()->CrossProcessNavigationPending()); 1986 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1913 EXPECT_EQ(rfh2, contents()->GetMainFrame()); 1987 EXPECT_EQ(rfh2, contents()->GetMainFrame());
1914 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL); 1988 EXPECT_TRUE(contents()->GetPendingMainFrame() == NULL);
1915 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state()); 1989 EXPECT_EQ(RenderFrameHostImpl::STATE_DEFAULT, rfh2->rfh_state());
1916 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state()); 1990 EXPECT_EQ(RenderFrameHostImpl::STATE_PENDING_SWAP_OUT, rfh1->rfh_state());
1917 1991
1918 // Simulate the swap out ack. 1992 // Simulate the swap out ack.
1919 rfh1->OnSwappedOut(); 1993 rfh1->OnSwappedOut();
1920 1994
1921 // rfh1 should be swapped out. 1995 // rfh1 should be swapped out.
1922 EXPECT_FALSE(rfh_deleted_observer.deleted()); 1996 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
1923 EXPECT_TRUE(rfh1->is_swapped_out()); 1997 switches::kSitePerProcess)) {
1998 EXPECT_TRUE(rfh_deleted_observer.deleted());
1999 EXPECT_TRUE(contents()->GetFrameTree()->root()->render_manager()
2000 ->GetRenderFrameProxyHost(site_instance.get()));
2001 } else {
2002 EXPECT_FALSE(rfh_deleted_observer.deleted());
2003 EXPECT_TRUE(rfh1->is_swapped_out());
2004 }
1924 } 2005 }
1925 2006
1926 // Test that a RenderFrameHost is properly deleted or swapped out when a 2007 // Test that a RenderFrameHost is properly deleted when a cross-site navigation
1927 // cross-site navigation is cancelled. 2008 // is cancelled.
1928 TEST_F(RenderFrameHostManagerTest, 2009 TEST_F(RenderFrameHostManagerTest,
1929 CancelPendingProperlyDeletesOrSwaps) { 2010 CancelPendingProperlyDeletesOrSwaps) {
1930 const GURL kUrl1("http://www.google.com/"); 2011 const GURL kUrl1("http://www.google.com/");
1931 const GURL kUrl2("http://www.chromium.org/"); 2012 const GURL kUrl2("http://www.chromium.org/");
1932 RenderFrameHostImpl* pending_rfh = NULL; 2013 RenderFrameHostImpl* pending_rfh = NULL;
1933 base::TimeTicks now = base::TimeTicks::Now(); 2014 base::TimeTicks now = base::TimeTicks::Now();
1934 2015
1935 // Navigate to the first page. 2016 // Navigate to the first page.
1936 contents()->NavigateAndCommit(kUrl1); 2017 contents()->NavigateAndCommit(kUrl1);
1937 TestRenderFrameHost* rfh1 = main_test_rfh(); 2018 TestRenderFrameHost* rfh1 = main_test_rfh();
(...skipping 19 matching lines...) Expand all
1957 2038
1958 // Start another cross-site navigation. 2039 // Start another cross-site navigation.
1959 controller().LoadURL( 2040 controller().LoadURL(
1960 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string()); 2041 kUrl2, Referrer(), ui::PAGE_TRANSITION_LINK, std::string());
1961 { 2042 {
1962 pending_rfh = contents()->GetFrameTree()->root()->render_manager() 2043 pending_rfh = contents()->GetFrameTree()->root()->render_manager()
1963 ->pending_frame_host(); 2044 ->pending_frame_host();
1964 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh); 2045 RenderFrameHostDeletedObserver rfh_deleted_observer(pending_rfh);
1965 2046
1966 // Increment the number of active frames in the new SiteInstance, which will 2047 // Increment the number of active frames in the new SiteInstance, which will
1967 // cause the pending RFH to be swapped out instead of deleted. 2048 // cause the pending RFH to be deleted and a RenderFrameProxyHost to be
1968 pending_rfh->GetSiteInstance()->increment_active_frame_count(); 2049 // created.
2050 scoped_refptr<SiteInstanceImpl> site_instance =
2051 pending_rfh->GetSiteInstance();
2052 site_instance->increment_active_frame_count();
1969 2053
1970 contents()->GetMainFrame()->OnMessageReceived( 2054 contents()->GetMainFrame()->OnMessageReceived(
1971 FrameHostMsg_BeforeUnload_ACK(0, false, now, now)); 2055 FrameHostMsg_BeforeUnload_ACK(0, false, now, now));
1972 EXPECT_FALSE(contents()->CrossProcessNavigationPending()); 2056 EXPECT_FALSE(contents()->CrossProcessNavigationPending());
1973 EXPECT_FALSE(rfh_deleted_observer.deleted()); 2057
2058 if (base::CommandLine::ForCurrentProcess()->HasSwitch(
2059 switches::kSitePerProcess)) {
2060 EXPECT_TRUE(rfh_deleted_observer.deleted());
2061 EXPECT_TRUE(contents()->GetFrameTree()->root()->render_manager()
2062 ->GetRenderFrameProxyHost(site_instance.get()));
2063 } else {
2064 EXPECT_FALSE(rfh_deleted_observer.deleted());
2065 }
1974 } 2066 }
1975 } 2067 }
1976 2068
1977 // Test that a pending RenderFrameHost in a non-root frame tree node is properly 2069 // Test that a pending RenderFrameHost in a non-root frame tree node is properly
1978 // deleted when the node is detached. Motivated by http://crbug.com/441357 and 2070 // deleted when the node is detached. Motivated by http://crbug.com/441357 and
1979 // http://crbug.com/444955. 2071 // http://crbug.com/444955.
1980 TEST_F(RenderFrameHostManagerTest, DetachPendingChild) { 2072 TEST_F(RenderFrameHostManagerTest, DetachPendingChild) {
1981 base::CommandLine::ForCurrentProcess()->AppendSwitch( 2073 base::CommandLine::ForCurrentProcess()->AppendSwitch(
1982 switches::kSitePerProcess); 2074 switches::kSitePerProcess);
1983 2075
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
2157 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive()); 2249 EXPECT_FALSE(contents2->GetMainFrame()->IsRenderFrameLive());
2158 contents2->NavigateAndCommit(kUrl3); 2250 contents2->NavigateAndCommit(kUrl3);
2159 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive()); 2251 EXPECT_TRUE(contents2->GetMainFrame()->IsRenderFrameLive());
2160 EXPECT_NE(nullptr, 2252 EXPECT_NE(nullptr,
2161 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance())); 2253 iframe->GetRenderFrameProxyHost(contents1->GetSiteInstance()));
2162 EXPECT_EQ(nullptr, 2254 EXPECT_EQ(nullptr,
2163 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance())); 2255 iframe->GetRenderFrameProxyHost(contents2->GetSiteInstance()));
2164 } 2256 }
2165 2257
2166 } // namespace content 2258 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698