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

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

Issue 118443008: Support cross-process navigations in a single subframe RenderFrameHost. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Minor cleanup Created 7 years 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 | Annotate | Revision Log
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 "content/browser/frame_host/render_frame_host_manager.h" 5 #include "content/browser/frame_host/render_frame_host_manager.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/command_line.h" 9 #include "base/command_line.h"
10 #include "base/debug/trace_event.h" 10 #include "base/debug/trace_event.h"
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after
183 if (!InitRenderView(dest_render_frame_host->render_view_host(), 183 if (!InitRenderView(dest_render_frame_host->render_view_host(),
184 opener_route_id)) 184 opener_route_id))
185 return NULL; 185 return NULL;
186 186
187 // Now that we've created a new renderer, be sure to hide it if it isn't 187 // Now that we've created a new renderer, be sure to hide it if it isn't
188 // our primary one. Otherwise, we might crash if we try to call Show() 188 // our primary one. Otherwise, we might crash if we try to call Show()
189 // on it later. 189 // on it later.
190 if (dest_render_frame_host != render_frame_host_ && 190 if (dest_render_frame_host != render_frame_host_ &&
191 dest_render_frame_host->render_view_host()->GetView()) { 191 dest_render_frame_host->render_view_host()->GetView()) {
192 dest_render_frame_host->render_view_host()->GetView()->Hide(); 192 dest_render_frame_host->render_view_host()->GetView()->Hide();
193 } else { 193 } else if (frame_tree_node_->IsMainFrame()) {
194 // This is our primary renderer, notify here as we won't be calling 194 // This is our primary renderer, notify here as we won't be calling
195 // CommitPending (which does the notify). 195 // CommitPending (which does the notify). We only do this for top-level
196 // frames.
196 delegate_->NotifySwappedFromRenderManager( 197 delegate_->NotifySwappedFromRenderManager(
197 NULL, render_frame_host_->render_view_host()); 198 NULL, render_frame_host_->render_view_host());
198 } 199 }
199 } 200 }
200 201
201 // TODO(creis): Return the RFH instead, once we can navigate RFHs. 202 // TODO(creis): Return the RFH instead, once we can navigate RFHs.
202 return dest_render_frame_host->render_view_host(); 203 return dest_render_frame_host->render_view_host();
203 } 204 }
204 205
205 void RenderFrameHostManager::Stop() { 206 void RenderFrameHostManager::Stop() {
(...skipping 268 matching lines...) Expand 10 before | Expand all | Expand 10 after
474 // must be done separately from SwapOut, so that the PageGroupLoadDeferrer is 475 // must be done separately from SwapOut, so that the PageGroupLoadDeferrer is
475 // no longer on the stack when we send the SwapOut message. 476 // no longer on the stack when we send the SwapOut message.
476 delegate_->CancelModalDialogsForRenderManager(); 477 delegate_->CancelModalDialogsForRenderManager();
477 478
478 // Tell the old renderer it is being swapped out. This will fire the unload 479 // Tell the old renderer it is being swapped out. This will fire the unload
479 // handler (without firing the beforeunload handler a second time). When the 480 // handler (without firing the beforeunload handler a second time). When the
480 // unload handler finishes and the navigation completes, we will send a 481 // unload handler finishes and the navigation completes, we will send a
481 // message to the ResourceDispatcherHost, allowing the pending RVH's response 482 // message to the ResourceDispatcherHost, allowing the pending RVH's response
482 // to resume. 483 // to resume.
483 // TODO(creis): We should do this on the RFH or else we'll swap out the 484 // TODO(creis): We should do this on the RFH or else we'll swap out the
484 // top-level page when subframes navigate. 485 // top-level page when subframes navigate. Until then, we skip swapping out
485 render_frame_host_->render_view_host()->SwapOut(); 486 // for subframes.
487 if (frame_tree_node_->IsMainFrame())
488 render_frame_host_->render_view_host()->SwapOut();
489 else
490 SwappedOut(render_frame_host_->render_view_host());
486 491
487 // ResourceDispatcherHost has told us to run the onunload handler, which 492 // ResourceDispatcherHost has told us to run the onunload handler, which
488 // means it is not a download or unsafe page, and we are going to perform the 493 // means it is not a download or unsafe page, and we are going to perform the
489 // navigation. Thus, we no longer need to remember that the RenderViewHost 494 // navigation. Thus, we no longer need to remember that the RenderViewHost
490 // is part of a pending cross-site request. 495 // is part of a pending cross-site request.
491 if (pending_render_frame_host_) { 496 if (pending_render_frame_host_) {
492 pending_render_frame_host_->render_view_host()-> 497 pending_render_frame_host_->render_view_host()->
493 SetHasPendingCrossSiteRequest(false); 498 SetHasPendingCrossSiteRequest(false);
494 } 499 }
495 } 500 }
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
769 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); 774 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
770 775
771 // Create a RVH for main frames, or find the existing one for subframes. 776 // Create a RVH for main frames, or find the existing one for subframes.
772 FrameTree* frame_tree = frame_tree_node_->frame_tree(); 777 FrameTree* frame_tree = frame_tree_node_->frame_tree();
773 RenderViewHostImpl* render_view_host = NULL; 778 RenderViewHostImpl* render_view_host = NULL;
774 if (frame_tree_node_->IsMainFrame()) { 779 if (frame_tree_node_->IsMainFrame()) {
775 render_view_host = frame_tree->CreateRenderViewHostForMainFrame( 780 render_view_host = frame_tree->CreateRenderViewHostForMainFrame(
776 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); 781 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden);
777 } else { 782 } else {
778 render_view_host = frame_tree->GetRenderViewHostForSubFrame(site_instance); 783 render_view_host = frame_tree->GetRenderViewHostForSubFrame(site_instance);
784
785 // If we haven't found a RVH for a subframe RFH, it's because we currently
786 // do not create top-level RFHs for pending subframe navigations. Create
787 // the RVH here for now.
788 // TODO(creis): Mirror the frame tree so this check isn't necessary.
789 if (!render_view_host) {
790 render_view_host = frame_tree->CreateRenderViewHostForMainFrame(
791 site_instance, view_routing_id, frame_routing_id, swapped_out,
792 hidden);
793 }
779 } 794 }
780 795
781 // TODO(creis): Make render_frame_host a scoped_ptr. 796 // TODO(creis): Make render_frame_host a scoped_ptr.
782 // TODO(creis): Pass hidden to RFH. 797 // TODO(creis): Pass hidden to RFH.
783 RenderFrameHostImpl* render_frame_host = 798 RenderFrameHostImpl* render_frame_host =
784 RenderFrameHostFactory::Create(render_view_host, 799 RenderFrameHostFactory::Create(render_view_host,
785 render_frame_delegate_, 800 render_frame_delegate_,
786 frame_tree, 801 frame_tree,
787 frame_tree_node_, 802 frame_tree_node_,
788 frame_routing_id, 803 frame_routing_id,
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
825 } else { 840 } else {
826 new_render_frame_host->GetProcess()->AddPendingView(); 841 new_render_frame_host->GetProcess()->AddPendingView();
827 } 842 }
828 843
829 RenderViewHostImpl* render_view_host = 844 RenderViewHostImpl* render_view_host =
830 new_render_frame_host->render_view_host(); 845 new_render_frame_host->render_view_host();
831 bool success = InitRenderView(render_view_host, opener_route_id); 846 bool success = InitRenderView(render_view_host, opener_route_id);
832 if (success && frame_tree_node_->IsMainFrame()) { 847 if (success && frame_tree_node_->IsMainFrame()) {
833 // Don't show the main frame's view until we get a DidNavigate from it. 848 // Don't show the main frame's view until we get a DidNavigate from it.
834 render_view_host->GetView()->Hide(); 849 render_view_host->GetView()->Hide();
835 } else if (!swapped_out) { 850 } else if (!swapped_out && pending_render_frame_host_) {
836 CancelPending(); 851 CancelPending();
837 } 852 }
838 } 853 }
839 854
840 // Use this as our new pending RFH if it isn't swapped out. 855 // Use this as our new pending RFH if it isn't swapped out.
841 if (!swapped_out) 856 if (!swapped_out)
842 pending_render_frame_host_ = new_render_frame_host; 857 pending_render_frame_host_ = new_render_frame_host;
843 858
844 return new_render_frame_host->render_view_host()->GetRoutingID(); 859 return new_render_frame_host->render_view_host()->GetRoutingID();
845 } 860 }
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
901 delegate_->SetFocusToLocationBar(false); 916 delegate_->SetFocusToLocationBar(false);
902 return; 917 return;
903 } 918 }
904 919
905 // Remember if the page was focused so we can focus the new renderer in 920 // Remember if the page was focused so we can focus the new renderer in
906 // that case. 921 // that case.
907 bool focus_render_view = !will_focus_location_bar && 922 bool focus_render_view = !will_focus_location_bar &&
908 render_frame_host_->render_view_host()->GetView() && 923 render_frame_host_->render_view_host()->GetView() &&
909 render_frame_host_->render_view_host()->GetView()->HasFocus(); 924 render_frame_host_->render_view_host()->GetView()->HasFocus();
910 925
926 // TODO(creis): As long as show/hide are on RVH, we don't want to do them for
927 // subframe navigations or they'll interfere with the top-level page.
928 bool is_main_frame = frame_tree_node_->IsMainFrame();
929
911 // Swap in the pending frame and make it active. Also ensure the FrameTree 930 // Swap in the pending frame and make it active. Also ensure the FrameTree
912 // stays in sync. 931 // stays in sync.
913 RenderFrameHostImpl* old_render_frame_host = render_frame_host_; 932 RenderFrameHostImpl* old_render_frame_host = render_frame_host_;
914 render_frame_host_ = pending_render_frame_host_; 933 render_frame_host_ = pending_render_frame_host_;
915 pending_render_frame_host_ = NULL; 934 pending_render_frame_host_ = NULL;
916 render_frame_host_->render_view_host()->AttachToFrameTree(); 935 if (is_main_frame)
936 render_frame_host_->render_view_host()->AttachToFrameTree();
917 937
918 // The process will no longer try to exit, so we can decrement the count. 938 // The process will no longer try to exit, so we can decrement the count.
919 render_frame_host_->GetProcess()->RemovePendingView(); 939 render_frame_host_->GetProcess()->RemovePendingView();
920 940
921 // TODO(creis): As long as show/hide are on RVH, we don't want to do them for
922 // subframe navigations or they'll interfere with the top-level page.
923 bool is_main_frame = frame_tree_node_->IsMainFrame();
924
925 // If the view is gone, then this RenderViewHost died while it was hidden. 941 // If the view is gone, then this RenderViewHost died while it was hidden.
926 // We ignored the RenderProcessGone call at the time, so we should send it now 942 // We ignored the RenderProcessGone call at the time, so we should send it now
927 // to make sure the sad tab shows up, etc. 943 // to make sure the sad tab shows up, etc.
928 if (!render_frame_host_->render_view_host()->GetView()) { 944 if (!render_frame_host_->render_view_host()->GetView()) {
929 delegate_->RenderProcessGoneFromRenderManager( 945 delegate_->RenderProcessGoneFromRenderManager(
930 render_frame_host_->render_view_host()); 946 render_frame_host_->render_view_host());
931 } else if (!delegate_->IsHidden() && is_main_frame) { 947 } else if (!delegate_->IsHidden() && is_main_frame) {
932 render_frame_host_->render_view_host()->GetView()->Show(); 948 render_frame_host_->render_view_host()->GetView()->Show();
933 } 949 }
934 950
935 // Hide the old view now that the new one is visible. 951 // If the old view is live and top-level, hide it now that the new one is
952 // visible.
936 if (old_render_frame_host->render_view_host()->GetView()) { 953 if (old_render_frame_host->render_view_host()->GetView()) {
937 old_render_frame_host->render_view_host()->GetView()->Hide(); 954 if (is_main_frame) {
938 old_render_frame_host->render_view_host()->WasSwappedOut(); 955 old_render_frame_host->render_view_host()->GetView()->Hide();
956 old_render_frame_host->render_view_host()->WasSwappedOut();
957 } else {
958 // TODO(creis): Swap out the subframe. We'll need to swap it back in when
959 // navigating back.
960 }
939 } 961 }
940 962
941 // Make sure the size is up to date. (Fix for bug 1079768.) 963 // Make sure the size is up to date. (Fix for bug 1079768.)
942 delegate_->UpdateRenderViewSizeForRenderManager(); 964 delegate_->UpdateRenderViewSizeForRenderManager();
943 965
944 if (will_focus_location_bar) { 966 if (will_focus_location_bar) {
945 delegate_->SetFocusToLocationBar(false); 967 delegate_->SetFocusToLocationBar(false);
946 } else if (focus_render_view && 968 } else if (focus_render_view &&
947 render_frame_host_->render_view_host()->GetView()) { 969 render_frame_host_->render_view_host()->GetView()) {
948 RenderWidgetHostViewPort::FromRWHV( 970 RenderWidgetHostViewPort::FromRWHV(
(...skipping 10 matching lines...) Expand all
959 render_frame_host_->render_view_host()); 981 render_frame_host_->render_view_host());
960 } 982 }
961 983
962 // If the pending frame was on the swapped out list, we can remove it. 984 // If the pending frame was on the swapped out list, we can remove it.
963 swapped_out_hosts_.erase(render_frame_host_->render_view_host()-> 985 swapped_out_hosts_.erase(render_frame_host_->render_view_host()->
964 GetSiteInstance()->GetId()); 986 GetSiteInstance()->GetId());
965 987
966 if (old_render_frame_host->render_view_host()->IsRenderViewLive()) { 988 if (old_render_frame_host->render_view_host()->IsRenderViewLive()) {
967 // If the old RFH is live, we are swapping it out and should keep track of 989 // If the old RFH is live, we are swapping it out and should keep track of
968 // it in case we navigate back to it. 990 // it in case we navigate back to it.
969 DCHECK(old_render_frame_host->render_view_host()->is_swapped_out()); 991 // TODO(creis): Swap out the subframe in --site-per-process.
992 if (!CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess))
993 DCHECK(old_render_frame_host->render_view_host()->is_swapped_out());
970 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make 994 // Temp fix for http://crbug.com/90867 until we do a better cleanup to make
971 // sure we don't get different rvh instances for the same site instance 995 // sure we don't get different rvh instances for the same site instance
972 // in the same rvhmgr. 996 // in the same rvhmgr.
973 // TODO(creis): Clean this up. 997 // TODO(creis): Clean this up.
974 int32 old_site_instance_id = 998 int32 old_site_instance_id =
975 old_render_frame_host->render_view_host()->GetSiteInstance()->GetId(); 999 old_render_frame_host->render_view_host()->GetSiteInstance()->GetId();
976 RenderFrameHostMap::iterator iter = 1000 RenderFrameHostMap::iterator iter =
977 swapped_out_hosts_.find(old_site_instance_id); 1001 swapped_out_hosts_.find(old_site_instance_id);
978 if (iter != swapped_out_hosts_.end() && 1002 if (iter != swapped_out_hosts_.end() &&
979 iter->second != old_render_frame_host) { 1003 iter->second != old_render_frame_host) {
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after
1285 SiteInstance* instance) const { 1309 SiteInstance* instance) const {
1286 RenderFrameHostMap::const_iterator iter = 1310 RenderFrameHostMap::const_iterator iter =
1287 swapped_out_hosts_.find(instance->GetId()); 1311 swapped_out_hosts_.find(instance->GetId());
1288 if (iter != swapped_out_hosts_.end()) 1312 if (iter != swapped_out_hosts_.end())
1289 return iter->second; 1313 return iter->second;
1290 1314
1291 return NULL; 1315 return NULL;
1292 } 1316 }
1293 1317
1294 } // namespace content 1318 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698