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 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 79 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
80 SiteInstance* site_instance, | 80 SiteInstance* site_instance, |
81 int view_routing_id, | 81 int view_routing_id, |
82 int frame_routing_id) { | 82 int frame_routing_id) { |
83 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 83 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
84 // is important to immediately give this SiteInstance to a RenderViewHost so | 84 // is important to immediately give this SiteInstance to a RenderViewHost so |
85 // that the SiteInstance is ref counted. | 85 // that the SiteInstance is ref counted. |
86 if (!site_instance) | 86 if (!site_instance) |
87 site_instance = SiteInstance::Create(browser_context); | 87 site_instance = SiteInstance::Create(browser_context); |
88 | 88 |
| 89 int flags = delegate_->IsHidden() ? HIDDEN : 0; |
89 SetRenderFrameHost(CreateRenderFrameHost(site_instance, | 90 SetRenderFrameHost(CreateRenderFrameHost(site_instance, |
90 view_routing_id, | 91 view_routing_id, |
91 frame_routing_id, | 92 frame_routing_id, |
92 false, | 93 flags)); |
93 delegate_->IsHidden())); | |
94 | 94 |
95 // Keep track of renderer processes as they start to shut down or are | 95 // Keep track of renderer processes as they start to shut down or are |
96 // crashed/killed. | 96 // crashed/killed. |
97 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 97 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
98 NotificationService::AllSources()); | 98 NotificationService::AllSources()); |
99 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 99 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
100 NotificationService::AllSources()); | 100 NotificationService::AllSources()); |
101 } | 101 } |
102 | 102 |
103 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 103 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
104 if (!render_frame_host_) | 104 if (!render_frame_host_) |
105 return NULL; | 105 return NULL; |
106 return render_frame_host_->render_view_host(); | 106 return render_frame_host_->render_view_host(); |
107 } | 107 } |
108 | 108 |
109 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { | 109 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { |
110 if (!pending_render_frame_host_) | 110 if (!pending_render_frame_host_) |
111 return NULL; | 111 return NULL; |
112 return pending_render_frame_host_->render_view_host(); | 112 return pending_render_frame_host_->render_view_host(); |
113 } | 113 } |
114 | 114 |
115 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { | 115 RenderWidgetHostView* RenderFrameHostManager::GetRenderWidgetHostView() const { |
116 if (interstitial_page_) | 116 if (interstitial_page_) |
117 return interstitial_page_->GetView(); | 117 return interstitial_page_->GetView(); |
118 if (!render_frame_host_) | 118 if (!render_frame_host_) |
119 return NULL; | 119 return NULL; |
120 return render_frame_host_->render_view_host()->GetView(); | 120 return static_cast<RenderFrameHostImpl*>(render_frame_host_-> |
| 121 render_view_host()->GetMainFrame())->GetView(); |
121 } | 122 } |
122 | 123 |
123 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { | 124 RenderFrameProxyHost* RenderFrameHostManager::GetProxyToParent() { |
124 if (frame_tree_node_->IsMainFrame()) | 125 if (frame_tree_node_->IsMainFrame()) |
125 return NULL; | 126 return NULL; |
126 | 127 |
127 RenderFrameProxyHostMap::iterator iter = | 128 RenderFrameProxyHostMap::iterator iter = |
128 proxy_hosts_.find(frame_tree_node_->parent() | 129 proxy_hosts_.find(frame_tree_node_->parent() |
129 ->render_manager() | 130 ->render_manager() |
130 ->current_frame_host() | 131 ->current_frame_host() |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 if (!InitRenderView(dest_render_frame_host->render_view_host(), | 193 if (!InitRenderView(dest_render_frame_host->render_view_host(), |
193 opener_route_id, | 194 opener_route_id, |
194 MSG_ROUTING_NONE, | 195 MSG_ROUTING_NONE, |
195 frame_tree_node_->IsMainFrame())) | 196 frame_tree_node_->IsMainFrame())) |
196 return NULL; | 197 return NULL; |
197 | 198 |
198 // Now that we've created a new renderer, be sure to hide it if it isn't | 199 // Now that we've created a new renderer, be sure to hide it if it isn't |
199 // our primary one. Otherwise, we might crash if we try to call Show() | 200 // our primary one. Otherwise, we might crash if we try to call Show() |
200 // on it later. | 201 // on it later. |
201 if (dest_render_frame_host != render_frame_host_ && | 202 if (dest_render_frame_host != render_frame_host_ && |
202 dest_render_frame_host->render_view_host()->GetView()) { | 203 dest_render_frame_host->GetView()) { |
203 dest_render_frame_host->render_view_host()->GetView()->Hide(); | 204 dest_render_frame_host->GetView()->Hide(); |
204 } else { | 205 } else { |
205 // Notify here as we won't be calling CommitPending (which does the | 206 // Notify here as we won't be calling CommitPending (which does the |
206 // notify). | 207 // notify). |
207 delegate_->NotifySwappedFromRenderManager( | 208 delegate_->NotifySwappedFromRenderManager( |
208 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame()); | 209 NULL, render_frame_host_.get(), frame_tree_node_->IsMainFrame()); |
209 } | 210 } |
210 } | 211 } |
211 | 212 |
212 // If entry includes the request ID of a request that is being transferred, | 213 // If entry includes the request ID of a request that is being transferred, |
213 // the destination render frame will take ownership, so release ownership of | 214 // the destination render frame will take ownership, so release ownership of |
(...skipping 737 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
951 // SiteInstance to a RenderViewHost (if it is different than our current | 952 // SiteInstance to a RenderViewHost (if it is different than our current |
952 // SiteInstance), so that it is ref counted. This will happen in | 953 // SiteInstance), so that it is ref counted. This will happen in |
953 // CreateRenderView. | 954 // CreateRenderView. |
954 return current_instance->GetRelatedSiteInstance(dest_url); | 955 return current_instance->GetRelatedSiteInstance(dest_url); |
955 } | 956 } |
956 | 957 |
957 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( | 958 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( |
958 SiteInstance* old_instance, | 959 SiteInstance* old_instance, |
959 SiteInstance* new_instance, | 960 SiteInstance* new_instance, |
960 bool is_main_frame) { | 961 bool is_main_frame) { |
| 962 int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0; |
961 // Ensure that we have created RFHs for the new RFH's opener chain if | 963 // Ensure that we have created RFHs for the new RFH's opener chain if |
962 // we are staying in the same BrowsingInstance. This allows the new RFH | 964 // we are staying in the same BrowsingInstance. This allows the new RFH |
963 // to send cross-process script calls to its opener(s). | 965 // to send cross-process script calls to its opener(s). |
964 int opener_route_id = MSG_ROUTING_NONE; | 966 int opener_route_id = MSG_ROUTING_NONE; |
965 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 967 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
966 opener_route_id = | 968 opener_route_id = |
967 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); | 969 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); |
968 if (CommandLine::ForCurrentProcess()->HasSwitch( | 970 if (CommandLine::ForCurrentProcess()->HasSwitch( |
969 switches::kSitePerProcess)) { | 971 switches::kSitePerProcess)) { |
970 // Ensure that the frame tree has RenderFrameProxyHosts for the new | 972 // Ensure that the frame tree has RenderFrameProxyHosts for the new |
971 // SiteInstance in all nodes except the current one. | 973 // SiteInstance in all nodes except the current one. |
972 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( | 974 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( |
973 frame_tree_node_, new_instance); | 975 frame_tree_node_, new_instance); |
| 976 // RenderFrames in different processes from their parent RenderFrames |
| 977 // in the frame tree require RenderWidgets for rendering and processing |
| 978 // input events. |
| 979 if (frame_tree_node_->parent() && |
| 980 frame_tree_node_->parent()->render_manager()-> |
| 981 current_frame_host()->GetSiteInstance() != new_instance) |
| 982 create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST; |
974 } | 983 } |
975 } | 984 } |
976 | 985 |
| 986 create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0; |
| 987 |
977 // Create a non-swapped-out RFH with the given opener. | 988 // Create a non-swapped-out RFH with the given opener. |
978 int route_id = CreateRenderFrame( | 989 int route_id = CreateRenderFrame( |
979 new_instance, opener_route_id, false, is_main_frame, | 990 new_instance, opener_route_id, create_render_frame_flags); |
980 delegate_->IsHidden()); | |
981 if (route_id == MSG_ROUTING_NONE) { | 991 if (route_id == MSG_ROUTING_NONE) { |
982 pending_render_frame_host_.reset(); | 992 pending_render_frame_host_.reset(); |
983 return; | 993 return; |
984 } | 994 } |
985 } | 995 } |
986 | 996 |
987 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 997 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
988 SiteInstance* site_instance, | 998 SiteInstance* site_instance, |
989 int view_routing_id, | 999 int view_routing_id, |
990 int frame_routing_id, | 1000 int frame_routing_id, |
991 bool swapped_out, | 1001 int flags) { |
992 bool hidden) { | |
993 if (frame_routing_id == MSG_ROUTING_NONE) | 1002 if (frame_routing_id == MSG_ROUTING_NONE) |
994 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1003 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
995 | 1004 |
| 1005 bool swapped_out = flags & SWAPPED_OUT; |
| 1006 bool hidden = flags & HIDDEN; |
| 1007 |
996 // Create a RVH for main frames, or find the existing one for subframes. | 1008 // Create a RVH for main frames, or find the existing one for subframes. |
997 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1009 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
998 RenderViewHostImpl* render_view_host = NULL; | 1010 RenderViewHostImpl* render_view_host = NULL; |
999 if (frame_tree_node_->IsMainFrame()) { | 1011 if (frame_tree_node_->IsMainFrame()) { |
1000 render_view_host = frame_tree->CreateRenderViewHost( | 1012 render_view_host = frame_tree->CreateRenderViewHost( |
1001 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1013 site_instance, |
| 1014 view_routing_id, |
| 1015 frame_routing_id, |
| 1016 swapped_out, |
| 1017 hidden); |
1002 } else { | 1018 } else { |
1003 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1019 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
1004 | 1020 |
1005 CHECK(render_view_host); | 1021 CHECK(render_view_host); |
1006 } | 1022 } |
1007 | 1023 |
1008 // TODO(creis): Pass hidden to RFH. | 1024 // TODO(creis): Pass hidden to RFH. |
1009 scoped_ptr<RenderFrameHostImpl> render_frame_host = | 1025 scoped_ptr<RenderFrameHostImpl> render_frame_host = |
1010 make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host, | 1026 make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host, |
1011 render_frame_delegate_, | 1027 render_frame_delegate_, |
| 1028 render_widget_delegate_, |
1012 frame_tree, | 1029 frame_tree, |
1013 frame_tree_node_, | 1030 frame_tree_node_, |
1014 frame_routing_id, | 1031 frame_routing_id, |
1015 swapped_out).release()); | 1032 flags).release()); |
1016 return render_frame_host.Pass(); | 1033 return render_frame_host.Pass(); |
1017 } | 1034 } |
1018 | 1035 |
1019 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, | 1036 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, |
1020 int opener_route_id, | 1037 int opener_route_id, |
1021 bool swapped_out, | 1038 int flags) { |
1022 bool for_main_frame_navigation, | 1039 bool swapped_out = flags & SWAPPED_OUT; |
1023 bool hidden) { | |
1024 CHECK(instance); | 1040 CHECK(instance); |
1025 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 1041 // Swapped out views should always be hidden. |
| 1042 DCHECK(!swapped_out || (flags & HIDDEN)); |
1026 | 1043 |
1027 // TODO(nasko): Remove the following CHECK once cross-site navigation no | 1044 // TODO(nasko): Remove the following CHECK once cross-site navigation no |
1028 // longer relies on swapped out RFH for the top-level frame. | 1045 // longer relies on swapped out RFH for the top-level frame. |
1029 if (!frame_tree_node_->IsMainFrame()) { | 1046 if (!frame_tree_node_->IsMainFrame()) { |
1030 CHECK(!swapped_out); | 1047 CHECK(!swapped_out); |
1031 } | 1048 } |
1032 | 1049 |
1033 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | 1050 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; |
1034 RenderFrameHostImpl* frame_to_announce = NULL; | 1051 RenderFrameHostImpl* frame_to_announce = NULL; |
1035 int routing_id = MSG_ROUTING_NONE; | 1052 int routing_id = MSG_ROUTING_NONE; |
(...skipping 27 matching lines...) Expand all Loading... |
1063 int required_bindings = pending_web_ui()->GetBindings(); | 1080 int required_bindings = pending_web_ui()->GetBindings(); |
1064 RenderViewHost* rvh = new_render_frame_host->render_view_host(); | 1081 RenderViewHost* rvh = new_render_frame_host->render_view_host(); |
1065 if ((rvh->GetEnabledBindings() & required_bindings) != | 1082 if ((rvh->GetEnabledBindings() & required_bindings) != |
1066 required_bindings) { | 1083 required_bindings) { |
1067 rvh->AllowBindings(required_bindings); | 1084 rvh->AllowBindings(required_bindings); |
1068 } | 1085 } |
1069 } | 1086 } |
1070 } | 1087 } |
1071 } else { | 1088 } else { |
1072 // Create a new RenderFrameHost if we don't find an existing one. | 1089 // Create a new RenderFrameHost if we don't find an existing one. |
1073 new_render_frame_host = CreateRenderFrameHost( | 1090 new_render_frame_host = CreateRenderFrameHost(instance, |
1074 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); | 1091 MSG_ROUTING_NONE, |
| 1092 MSG_ROUTING_NONE, |
| 1093 flags); |
1075 RenderViewHostImpl* render_view_host = | 1094 RenderViewHostImpl* render_view_host = |
1076 new_render_frame_host->render_view_host(); | 1095 new_render_frame_host->render_view_host(); |
1077 int proxy_routing_id = MSG_ROUTING_NONE; | 1096 int proxy_routing_id = MSG_ROUTING_NONE; |
1078 | 1097 |
1079 // Prevent the process from exiting while we're trying to navigate in it. | 1098 // Prevent the process from exiting while we're trying to navigate in it. |
1080 // Otherwise, if the new RFH is swapped out already, store it. | 1099 // Otherwise, if the new RFH is swapped out already, store it. |
1081 if (!swapped_out) { | 1100 if (!swapped_out) { |
1082 new_render_frame_host->GetProcess()->AddPendingView(); | 1101 new_render_frame_host->GetProcess()->AddPendingView(); |
1083 } else { | 1102 } else { |
1084 proxy = new RenderFrameProxyHost( | 1103 proxy = new RenderFrameProxyHost( |
1085 new_render_frame_host->GetSiteInstance(), frame_tree_node_); | 1104 new_render_frame_host->GetSiteInstance(), frame_tree_node_); |
1086 proxy_hosts_[instance->GetId()] = proxy; | 1105 proxy_hosts_[instance->GetId()] = proxy; |
1087 proxy_routing_id = proxy->GetRoutingID(); | 1106 proxy_routing_id = proxy->GetRoutingID(); |
1088 if (frame_tree_node_->IsMainFrame()) | 1107 if (frame_tree_node_->IsMainFrame()) |
1089 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1108 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1090 } | 1109 } |
1091 | 1110 |
1092 bool success = InitRenderView(render_view_host, | 1111 bool success = InitRenderView(render_view_host, |
1093 opener_route_id, | 1112 opener_route_id, |
1094 proxy_routing_id, | 1113 proxy_routing_id, |
1095 for_main_frame_navigation); | 1114 flags & FOR_MAIN_FRAME_NAVIGATION); |
1096 if (success) { | 1115 if (success) { |
1097 if (frame_tree_node_->IsMainFrame()) { | 1116 if (frame_tree_node_->IsMainFrame()) { |
1098 // Don't show the main frame's view until we get a DidNavigate from it. | 1117 // Don't show the main frame's view until we get a DidNavigate from it. |
1099 render_view_host->GetView()->Hide(); | 1118 // Only top-level RenderViewHosts have RenderWidgetHostViews; |
| 1119 // RenderWidgetHosts for out-of-process iframes will be created |
| 1120 // later and hidden. |
| 1121 if (render_view_host->GetView()) |
| 1122 render_view_host->GetView()->Hide(); |
1100 } else if (!swapped_out) { | 1123 } else if (!swapped_out) { |
1101 // Init the RFH, so a RenderFrame is created in the renderer. | 1124 // Init the RFH, so a RenderFrame is created in the renderer. |
1102 DCHECK(new_render_frame_host.get()); | 1125 DCHECK(new_render_frame_host.get()); |
1103 success = InitRenderFrame(new_render_frame_host.get()); | 1126 success = InitRenderFrame(new_render_frame_host.get()); |
1104 } | 1127 } |
1105 if (swapped_out) { | 1128 if (swapped_out) { |
1106 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); | 1129 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); |
1107 } | 1130 } |
1108 } else if (!swapped_out && pending_render_frame_host_) { | 1131 } else if (!swapped_out && pending_render_frame_host_) { |
1109 CancelPending(); | 1132 CancelPending(); |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1223 // committing above and we're done. | 1246 // committing above and we're done. |
1224 if (!pending_render_frame_host_) { | 1247 if (!pending_render_frame_host_) { |
1225 if (will_focus_location_bar) | 1248 if (will_focus_location_bar) |
1226 delegate_->SetFocusToLocationBar(false); | 1249 delegate_->SetFocusToLocationBar(false); |
1227 return; | 1250 return; |
1228 } | 1251 } |
1229 | 1252 |
1230 // Remember if the page was focused so we can focus the new renderer in | 1253 // Remember if the page was focused so we can focus the new renderer in |
1231 // that case. | 1254 // that case. |
1232 bool focus_render_view = !will_focus_location_bar && | 1255 bool focus_render_view = !will_focus_location_bar && |
1233 render_frame_host_->render_view_host()->GetView() && | 1256 render_frame_host_->GetView() && |
1234 render_frame_host_->render_view_host()->GetView()->HasFocus(); | 1257 render_frame_host_->GetView()->HasFocus(); |
1235 | 1258 |
1236 bool is_main_frame = frame_tree_node_->IsMainFrame(); | 1259 bool is_main_frame = frame_tree_node_->IsMainFrame(); |
1237 | 1260 |
1238 // Swap in the pending frame and make it active. Also ensure the FrameTree | 1261 // Swap in the pending frame and make it active. Also ensure the FrameTree |
1239 // stays in sync. | 1262 // stays in sync. |
1240 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = | 1263 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
1241 SetRenderFrameHost(pending_render_frame_host_.Pass()); | 1264 SetRenderFrameHost(pending_render_frame_host_.Pass()); |
1242 if (is_main_frame) | 1265 if (is_main_frame) |
1243 render_frame_host_->render_view_host()->AttachToFrameTree(); | 1266 render_frame_host_->render_view_host()->AttachToFrameTree(); |
1244 | 1267 |
1245 // The process will no longer try to exit, so we can decrement the count. | 1268 // The process will no longer try to exit, so we can decrement the count. |
1246 render_frame_host_->GetProcess()->RemovePendingView(); | 1269 render_frame_host_->GetProcess()->RemovePendingView(); |
1247 | 1270 |
1248 // Show the new view (or a sad tab) if necessary. | 1271 // Show the new view (or a sad tab) if necessary. |
1249 bool new_rfh_has_view = !!render_frame_host_->render_view_host()->GetView(); | 1272 bool new_rfh_has_view = !!render_frame_host_->GetView(); |
1250 if (!delegate_->IsHidden() && new_rfh_has_view) { | 1273 if (!delegate_->IsHidden() && new_rfh_has_view) { |
1251 // In most cases, we need to show the new view. | 1274 // In most cases, we need to show the new view. |
1252 render_frame_host_->render_view_host()->GetView()->Show(); | 1275 render_frame_host_->GetView()->Show(); |
1253 } | 1276 } |
1254 if (!new_rfh_has_view) { | 1277 if (!new_rfh_has_view) { |
1255 // If the view is gone, then this RenderViewHost died while it was hidden. | 1278 // If the view is gone, then this RenderViewHost died while it was hidden. |
1256 // We ignored the RenderProcessGone call at the time, so we should send it | 1279 // We ignored the RenderProcessGone call at the time, so we should send it |
1257 // now to make sure the sad tab shows up, etc. | 1280 // now to make sure the sad tab shows up, etc. |
1258 DCHECK(!render_frame_host_->IsRenderFrameLive()); | 1281 DCHECK(!render_frame_host_->IsRenderFrameLive()); |
1259 DCHECK(!render_frame_host_->render_view_host()->IsRenderViewLive()); | 1282 DCHECK(!render_frame_host_->render_view_host()->IsRenderViewLive()); |
1260 delegate_->RenderProcessGoneFromRenderManager( | 1283 delegate_->RenderProcessGoneFromRenderManager( |
1261 render_frame_host_->render_view_host()); | 1284 render_frame_host_->render_view_host()); |
1262 } | 1285 } |
1263 | 1286 |
1264 // For top-level frames, also hide the old RenderViewHost's view. | 1287 // For top-level frames, also hide the old RenderViewHost's view. |
1265 // TODO(creis): As long as show/hide are on RVH, we don't want to hide on | 1288 // TODO(creis): As long as show/hide are on RVH, we don't want to hide on |
1266 // subframe navigations or we will interfere with the top-level frame. | 1289 // subframe navigations or we will interfere with the top-level frame. |
1267 if (is_main_frame && old_render_frame_host->render_view_host()->GetView()) | 1290 if (is_main_frame && old_render_frame_host->render_view_host()->GetView()) |
1268 old_render_frame_host->render_view_host()->GetView()->Hide(); | 1291 old_render_frame_host->render_view_host()->GetView()->Hide(); |
1269 | 1292 |
1270 // Make sure the size is up to date. (Fix for bug 1079768.) | 1293 // Make sure the size is up to date. (Fix for bug 1079768.) |
1271 delegate_->UpdateRenderViewSizeForRenderManager(); | 1294 delegate_->UpdateRenderViewSizeForRenderManager(); |
1272 | 1295 |
1273 if (will_focus_location_bar) { | 1296 if (will_focus_location_bar) { |
1274 delegate_->SetFocusToLocationBar(false); | 1297 delegate_->SetFocusToLocationBar(false); |
1275 } else if (focus_render_view && | 1298 } else if (focus_render_view && |
1276 render_frame_host_->render_view_host()->GetView()) { | 1299 render_frame_host_->GetView()) { |
1277 render_frame_host_->render_view_host()->GetView()->Focus(); | 1300 render_frame_host_->GetView()->Focus(); |
1278 } | 1301 } |
1279 | 1302 |
1280 // Notify that we've swapped RenderFrameHosts. We do this before shutting down | 1303 // Notify that we've swapped RenderFrameHosts. We do this before shutting down |
1281 // the RFH so that we can clean up RendererResources related to the RFH first. | 1304 // the RFH so that we can clean up RendererResources related to the RFH first. |
1282 delegate_->NotifySwappedFromRenderManager( | 1305 delegate_->NotifySwappedFromRenderManager( |
1283 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame); | 1306 old_render_frame_host.get(), render_frame_host_.get(), is_main_frame); |
1284 | 1307 |
1285 // Swap out the old frame now that the new one is visible. | 1308 // Swap out the old frame now that the new one is visible. |
1286 // This will swap it out and then put it on the proxy list (if there are other | 1309 // This will swap it out and then put it on the proxy list (if there are other |
1287 // active views in its SiteInstance) or schedule it for deletion when the swap | 1310 // active views in its SiteInstance) or schedule it for deletion when the swap |
1288 // out ack arrives (or immediately if the process isn't live). | 1311 // out ack arrives (or immediately if the process isn't live). |
1289 // In the --site-per-process case, old subframe RHFs are not kept alive inside | 1312 // In the --site-per-process case, old subframe RHFs are not kept alive inside |
1290 // the proxy. | 1313 // the proxy. |
1291 SwapOutOldFrame(old_render_frame_host.Pass()); | 1314 SwapOutOldFrame(old_render_frame_host.Pass()); |
1292 | 1315 |
1293 // If this is a subframe, it should have a CrossProcessFrameConnector | 1316 // If this is a subframe, it should have a CrossProcessFrameConnector |
1294 // created already. Use it to link the new RFH's view to the proxy that | 1317 // created already. Use it to link the new RFH's view to the proxy that |
1295 // belongs to the parent frame's SiteInstance. | 1318 // belongs to the parent frame's SiteInstance. |
1296 // Note: We do this after swapping out the old RFH because that may create the | 1319 // Note: We do this after swapping out the old RFH because that may create the |
1297 // proxy we're looking for. | 1320 // proxy we're looking for. |
1298 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && | 1321 if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kSitePerProcess) && |
1299 !is_main_frame) { | 1322 !is_main_frame) { |
1300 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); | 1323 RenderFrameProxyHost* proxy_to_parent = GetProxyToParent(); |
1301 if (proxy_to_parent) { | 1324 if (proxy_to_parent) { |
1302 proxy_to_parent->SetChildRWHView( | 1325 proxy_to_parent->SetChildRWHView( |
1303 render_frame_host_->render_view_host()->GetView()); | 1326 render_frame_host_->GetView()); |
1304 } | 1327 } |
1305 } | 1328 } |
1306 } | 1329 } |
1307 | 1330 |
1308 void RenderFrameHostManager::ShutdownRenderFrameProxyHostsInSiteInstance( | 1331 void RenderFrameHostManager::ShutdownRenderFrameProxyHostsInSiteInstance( |
1309 int32 site_instance_id) { | 1332 int32 site_instance_id) { |
1310 // First remove any swapped out RFH for this SiteInstance from our own list. | 1333 // First remove any swapped out RFH for this SiteInstance from our own list. |
1311 ClearProxiesInSiteInstance(site_instance_id, frame_tree_node_); | 1334 ClearProxiesInSiteInstance(site_instance_id, frame_tree_node_); |
1312 | 1335 |
1313 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts | 1336 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts |
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1588 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1611 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1589 SiteInstance* instance) { | 1612 SiteInstance* instance) { |
1590 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1613 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1591 if (iter != proxy_hosts_.end()) { | 1614 if (iter != proxy_hosts_.end()) { |
1592 delete iter->second; | 1615 delete iter->second; |
1593 proxy_hosts_.erase(iter); | 1616 proxy_hosts_.erase(iter); |
1594 } | 1617 } |
1595 } | 1618 } |
1596 | 1619 |
1597 } // namespace content | 1620 } // namespace content |
OLD | NEW |