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 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1019 // SiteInstance to a RenderViewHost (if it is different than our current | 1019 // SiteInstance to a RenderViewHost (if it is different than our current |
1020 // SiteInstance), so that it is ref counted. This will happen in | 1020 // SiteInstance), so that it is ref counted. This will happen in |
1021 // CreateRenderView. | 1021 // CreateRenderView. |
1022 return current_instance->GetRelatedSiteInstance(dest_url); | 1022 return current_instance->GetRelatedSiteInstance(dest_url); |
1023 } | 1023 } |
1024 | 1024 |
1025 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( | 1025 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( |
1026 SiteInstance* old_instance, | 1026 SiteInstance* old_instance, |
1027 SiteInstance* new_instance, | 1027 SiteInstance* new_instance, |
1028 bool is_main_frame) { | 1028 bool is_main_frame) { |
1029 int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0; | |
1029 // Ensure that we have created RFHs for the new RFH's opener chain if | 1030 // Ensure that we have created RFHs for the new RFH's opener chain if |
1030 // we are staying in the same BrowsingInstance. This allows the new RFH | 1031 // we are staying in the same BrowsingInstance. This allows the new RFH |
1031 // to send cross-process script calls to its opener(s). | 1032 // to send cross-process script calls to its opener(s). |
1032 int opener_route_id = MSG_ROUTING_NONE; | 1033 int opener_route_id = MSG_ROUTING_NONE; |
1033 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1034 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
1034 opener_route_id = | 1035 opener_route_id = |
1035 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); | 1036 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); |
1036 if (CommandLine::ForCurrentProcess()->HasSwitch( | 1037 if (CommandLine::ForCurrentProcess()->HasSwitch( |
1037 switches::kSitePerProcess)) { | 1038 switches::kSitePerProcess)) { |
1038 // Ensure that the frame tree has RenderFrameProxyHosts for the new | 1039 // Ensure that the frame tree has RenderFrameProxyHosts for the new |
1039 // SiteInstance in all nodes except the current one. | 1040 // SiteInstance in all nodes except the current one. |
1040 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( | 1041 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( |
1041 frame_tree_node_, new_instance); | 1042 frame_tree_node_, new_instance); |
1043 // RenderFrames in different processes from their parent RenderFrames | |
nasko
2014/10/01 16:37:14
nit: s/different processes/different SiteInstance/
Charlie Reis
2014/10/01 17:01:08
nit: s/RenderFrames/RenderFrame(Host)s/
kenrb
2014/10/01 19:27:51
Changed RenderWidget(Host)s to just RenderWidgets.
kenrb
2014/10/01 19:27:51
Might processes be better? We use SiteInstance rig
Charlie Reis
2014/10/02 00:06:57
I think we do want to say SiteInstance here.
If t
kenrb
2014/10/02 20:20:47
I'm not sure I agree. If a non-protected SiteInsta
Charlie Reis
2014/10/08 21:21:13
I'm skeptical about that. It doesn't make sense t
| |
1044 // in the frame tree require RenderWidget(Host)s for rendering | |
1045 // and processing input events. | |
1046 if (frame_tree_node_->parent() && | |
1047 frame_tree_node_->parent()->render_manager()-> | |
1048 current_frame_host()->GetSiteInstance() == new_instance) | |
nasko
2014/10/01 16:37:14
Shouldn't this be "!=" instead of "=="?
kenrb
2014/10/01 19:27:51
Yes! That explains a lot about some of the problem
| |
1049 create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST; | |
1042 } | 1050 } |
1043 } | 1051 } |
1044 | 1052 |
1053 create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0; | |
1054 | |
1045 // Create a non-swapped-out RFH with the given opener. | 1055 // Create a non-swapped-out RFH with the given opener. |
1046 int route_id = CreateRenderFrame( | 1056 int route_id = CreateRenderFrame( |
1047 new_instance, opener_route_id, false, is_main_frame, | 1057 new_instance, opener_route_id, create_render_frame_flags); |
1048 delegate_->IsHidden()); | |
1049 if (route_id == MSG_ROUTING_NONE) { | 1058 if (route_id == MSG_ROUTING_NONE) { |
1050 pending_render_frame_host_.reset(); | 1059 pending_render_frame_host_.reset(); |
1051 return; | 1060 return; |
1052 } | 1061 } |
1053 } | 1062 } |
1054 | 1063 |
1055 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1064 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1056 SiteInstance* site_instance, | 1065 SiteInstance* site_instance, |
1057 int view_routing_id, | 1066 int view_routing_id, |
1058 int frame_routing_id, | 1067 int frame_routing_id, |
(...skipping 20 matching lines...) Expand all Loading... | |
1079 render_frame_delegate_, | 1088 render_frame_delegate_, |
1080 frame_tree, | 1089 frame_tree, |
1081 frame_tree_node_, | 1090 frame_tree_node_, |
1082 frame_routing_id, | 1091 frame_routing_id, |
1083 swapped_out).release()); | 1092 swapped_out).release()); |
1084 return render_frame_host.Pass(); | 1093 return render_frame_host.Pass(); |
1085 } | 1094 } |
1086 | 1095 |
1087 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, | 1096 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, |
1088 int opener_route_id, | 1097 int opener_route_id, |
1089 bool swapped_out, | 1098 int flags) { |
1090 bool for_main_frame_navigation, | 1099 bool swapped_out = flags & SWAPPED_OUT; |
1091 bool hidden) { | |
1092 CHECK(instance); | 1100 CHECK(instance); |
1093 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 1101 // Swapped out views should always be hidden. |
1102 DCHECK(!swapped_out || (flags & HIDDEN)); | |
1094 | 1103 |
1095 // TODO(nasko): Remove the following CHECK once cross-site navigation no | 1104 // TODO(nasko): Remove the following CHECK once cross-site navigation no |
1096 // longer relies on swapped out RFH for the top-level frame. | 1105 // longer relies on swapped out RFH for the top-level frame. |
1097 if (!frame_tree_node_->IsMainFrame()) { | 1106 if (!frame_tree_node_->IsMainFrame()) { |
1098 CHECK(!swapped_out); | 1107 CHECK(!swapped_out); |
1099 } | 1108 } |
1100 | 1109 |
1101 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | 1110 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; |
1102 RenderFrameHostImpl* frame_to_announce = NULL; | 1111 RenderFrameHostImpl* frame_to_announce = NULL; |
1103 int routing_id = MSG_ROUTING_NONE; | 1112 int routing_id = MSG_ROUTING_NONE; |
(...skipping 27 matching lines...) Expand all Loading... | |
1131 int required_bindings = pending_web_ui()->GetBindings(); | 1140 int required_bindings = pending_web_ui()->GetBindings(); |
1132 RenderViewHost* rvh = new_render_frame_host->render_view_host(); | 1141 RenderViewHost* rvh = new_render_frame_host->render_view_host(); |
1133 if ((rvh->GetEnabledBindings() & required_bindings) != | 1142 if ((rvh->GetEnabledBindings() & required_bindings) != |
1134 required_bindings) { | 1143 required_bindings) { |
1135 rvh->AllowBindings(required_bindings); | 1144 rvh->AllowBindings(required_bindings); |
1136 } | 1145 } |
1137 } | 1146 } |
1138 } | 1147 } |
1139 } else { | 1148 } else { |
1140 // Create a new RenderFrameHost if we don't find an existing one. | 1149 // Create a new RenderFrameHost if we don't find an existing one. |
1141 new_render_frame_host = CreateRenderFrameHost( | 1150 new_render_frame_host = CreateRenderFrameHost(instance, |
1142 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); | 1151 MSG_ROUTING_NONE, |
1152 MSG_ROUTING_NONE, | |
1153 swapped_out, | |
1154 flags & HIDDEN); | |
1143 RenderViewHostImpl* render_view_host = | 1155 RenderViewHostImpl* render_view_host = |
1144 new_render_frame_host->render_view_host(); | 1156 new_render_frame_host->render_view_host(); |
1145 int proxy_routing_id = MSG_ROUTING_NONE; | 1157 int proxy_routing_id = MSG_ROUTING_NONE; |
1146 | 1158 |
1147 // Prevent the process from exiting while we're trying to navigate in it. | 1159 // Prevent the process from exiting while we're trying to navigate in it. |
1148 // Otherwise, if the new RFH is swapped out already, store it. | 1160 // Otherwise, if the new RFH is swapped out already, store it. |
1149 if (!swapped_out) { | 1161 if (!swapped_out) { |
1150 new_render_frame_host->GetProcess()->AddPendingView(); | 1162 new_render_frame_host->GetProcess()->AddPendingView(); |
1151 } else { | 1163 } else { |
1152 proxy = new RenderFrameProxyHost( | 1164 proxy = new RenderFrameProxyHost( |
1153 new_render_frame_host->GetSiteInstance(), frame_tree_node_); | 1165 new_render_frame_host->GetSiteInstance(), frame_tree_node_); |
1154 proxy_hosts_[instance->GetId()] = proxy; | 1166 proxy_hosts_[instance->GetId()] = proxy; |
1155 proxy_routing_id = proxy->GetRoutingID(); | 1167 proxy_routing_id = proxy->GetRoutingID(); |
1156 if (frame_tree_node_->IsMainFrame()) | 1168 if (frame_tree_node_->IsMainFrame()) |
1157 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1169 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1158 } | 1170 } |
1159 | 1171 |
1160 bool success = InitRenderView(render_view_host, | 1172 bool success = InitRenderView(render_view_host, |
1161 opener_route_id, | 1173 opener_route_id, |
1162 proxy_routing_id, | 1174 proxy_routing_id, |
1163 for_main_frame_navigation); | 1175 flags & FOR_MAIN_FRAME_NAVIGATION); |
1164 if (success) { | 1176 if (success) { |
1165 if (frame_tree_node_->IsMainFrame()) { | 1177 if (frame_tree_node_->IsMainFrame()) { |
1166 // Don't show the main frame's view until we get a DidNavigate from it. | 1178 // Don't show the main frame's view until we get a DidNavigate from it. |
1167 render_view_host->GetView()->Hide(); | 1179 render_view_host->GetView()->Hide(); |
1168 } else if (!swapped_out) { | 1180 } else if (!swapped_out) { |
1169 // Init the RFH, so a RenderFrame is created in the renderer. | 1181 // Init the RFH, so a RenderFrame is created in the renderer. |
1170 DCHECK(new_render_frame_host.get()); | 1182 DCHECK(new_render_frame_host.get()); |
1171 success = InitRenderFrame(new_render_frame_host.get()); | 1183 success = InitRenderFrame(new_render_frame_host.get()); |
1172 } | 1184 } |
1173 if (swapped_out) { | 1185 if (swapped_out) { |
1174 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); | 1186 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); |
1175 } | 1187 } |
1176 } else if (!swapped_out && pending_render_frame_host_) { | 1188 } else if (!swapped_out && pending_render_frame_host_) { |
1177 CancelPending(); | 1189 CancelPending(); |
1178 } | 1190 } |
1179 routing_id = render_view_host->GetRoutingID(); | 1191 routing_id = render_view_host->GetRoutingID(); |
1180 frame_to_announce = new_render_frame_host.get(); | 1192 frame_to_announce = new_render_frame_host.get(); |
1181 } | 1193 } |
1182 | 1194 |
1195 if (flags & CREATE_RENDER_WIDGET_HOST) | |
1196 new_render_frame_host->CreateRenderWidgetHost(render_widget_delegate_, | |
nasko
2014/10/01 16:37:14
Is there ever a case where we need to create a Ren
Charlie Reis
2014/10/01 17:01:08
+1. We do something similar for creating the Rend
kenrb
2014/10/01 19:27:51
I had thought of this, but the comment in line 112
Charlie Reis
2014/10/02 00:06:57
That's only for main frames, which store their RFH
kenrb
2014/10/02 20:20:48
Probably not. This is good to know, I have made th
| |
1197 flags & HIDDEN); | |
1198 | |
1183 // Use this as our new pending RFH if it isn't swapped out. | 1199 // Use this as our new pending RFH if it isn't swapped out. |
1184 if (!swapped_out) | 1200 if (!swapped_out) |
1185 pending_render_frame_host_ = new_render_frame_host.Pass(); | 1201 pending_render_frame_host_ = new_render_frame_host.Pass(); |
1186 | 1202 |
1187 // If a brand new RFH was created, announce it to observers. | 1203 // If a brand new RFH was created, announce it to observers. |
1188 if (frame_to_announce) | 1204 if (frame_to_announce) |
1189 render_frame_delegate_->RenderFrameCreated(frame_to_announce); | 1205 render_frame_delegate_->RenderFrameCreated(frame_to_announce); |
1190 | 1206 |
1191 return routing_id; | 1207 return routing_id; |
1192 } | 1208 } |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1717 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1733 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1718 SiteInstance* instance) { | 1734 SiteInstance* instance) { |
1719 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1735 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1720 if (iter != proxy_hosts_.end()) { | 1736 if (iter != proxy_hosts_.end()) { |
1721 delete iter->second; | 1737 delete iter->second; |
1722 proxy_hosts_.erase(iter); | 1738 proxy_hosts_.erase(iter); |
1723 } | 1739 } |
1724 } | 1740 } |
1725 | 1741 |
1726 } // namespace content | 1742 } // namespace content |
OLD | NEW |