| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |