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 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 // SiteInstance to a RenderViewHost (if it is different than our current | 1018 // SiteInstance to a RenderViewHost (if it is different than our current |
1019 // SiteInstance), so that it is ref counted. This will happen in | 1019 // SiteInstance), so that it is ref counted. This will happen in |
1020 // CreateRenderView. | 1020 // CreateRenderView. |
1021 return current_instance->GetRelatedSiteInstance(dest_url); | 1021 return current_instance->GetRelatedSiteInstance(dest_url); |
1022 } | 1022 } |
1023 | 1023 |
1024 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( | 1024 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( |
1025 SiteInstance* old_instance, | 1025 SiteInstance* old_instance, |
1026 SiteInstance* new_instance, | 1026 SiteInstance* new_instance, |
1027 bool is_main_frame) { | 1027 bool is_main_frame) { |
| 1028 int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0; |
1028 // Ensure that we have created RFHs for the new RFH's opener chain if | 1029 // Ensure that we have created RFHs for the new RFH's opener chain if |
1029 // we are staying in the same BrowsingInstance. This allows the new RFH | 1030 // we are staying in the same BrowsingInstance. This allows the new RFH |
1030 // to send cross-process script calls to its opener(s). | 1031 // to send cross-process script calls to its opener(s). |
1031 int opener_route_id = MSG_ROUTING_NONE; | 1032 int opener_route_id = MSG_ROUTING_NONE; |
1032 if (new_instance->IsRelatedSiteInstance(old_instance)) { | 1033 if (new_instance->IsRelatedSiteInstance(old_instance)) { |
1033 opener_route_id = | 1034 opener_route_id = |
1034 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); | 1035 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); |
1035 if (CommandLine::ForCurrentProcess()->HasSwitch( | 1036 if (CommandLine::ForCurrentProcess()->HasSwitch( |
1036 switches::kSitePerProcess)) { | 1037 switches::kSitePerProcess)) { |
1037 // Ensure that the frame tree has RenderFrameProxyHosts for the new | 1038 // Ensure that the frame tree has RenderFrameProxyHosts for the new |
1038 // SiteInstance in all nodes except the current one. | 1039 // SiteInstance in all nodes except the current one. |
1039 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( | 1040 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( |
1040 frame_tree_node_, new_instance); | 1041 frame_tree_node_, new_instance); |
| 1042 // RenderFrames in different processes from their parent RenderFrames |
| 1043 // in the frame tree require RenderWidgets for rendering and processing |
| 1044 // input events. |
| 1045 if (frame_tree_node_->parent() && |
| 1046 frame_tree_node_->parent()->render_manager()-> |
| 1047 current_frame_host()->GetSiteInstance() != new_instance) |
| 1048 create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST; |
1041 } | 1049 } |
1042 } | 1050 } |
1043 | 1051 |
| 1052 create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0; |
| 1053 |
1044 // Create a non-swapped-out RFH with the given opener. | 1054 // Create a non-swapped-out RFH with the given opener. |
1045 int route_id = CreateRenderFrame( | 1055 int route_id = CreateRenderFrame( |
1046 new_instance, opener_route_id, false, is_main_frame, | 1056 new_instance, opener_route_id, create_render_frame_flags); |
1047 delegate_->IsHidden()); | |
1048 if (route_id == MSG_ROUTING_NONE) { | 1057 if (route_id == MSG_ROUTING_NONE) { |
1049 pending_render_frame_host_.reset(); | 1058 pending_render_frame_host_.reset(); |
1050 return; | 1059 return; |
1051 } | 1060 } |
1052 } | 1061 } |
1053 | 1062 |
1054 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( | 1063 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( |
1055 SiteInstance* site_instance, | 1064 SiteInstance* site_instance, |
1056 int view_routing_id, | 1065 int view_routing_id, |
1057 int frame_routing_id, | 1066 int frame_routing_id, |
(...skipping 20 matching lines...) Expand all Loading... |
1078 render_frame_delegate_, | 1087 render_frame_delegate_, |
1079 frame_tree, | 1088 frame_tree, |
1080 frame_tree_node_, | 1089 frame_tree_node_, |
1081 frame_routing_id, | 1090 frame_routing_id, |
1082 swapped_out).release()); | 1091 swapped_out).release()); |
1083 return render_frame_host.Pass(); | 1092 return render_frame_host.Pass(); |
1084 } | 1093 } |
1085 | 1094 |
1086 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, | 1095 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, |
1087 int opener_route_id, | 1096 int opener_route_id, |
1088 bool swapped_out, | 1097 int flags) { |
1089 bool for_main_frame_navigation, | 1098 bool swapped_out = flags & SWAPPED_OUT; |
1090 bool hidden) { | |
1091 CHECK(instance); | 1099 CHECK(instance); |
1092 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 1100 // Swapped out views should always be hidden. |
| 1101 DCHECK(!swapped_out || (flags & HIDDEN)); |
1093 | 1102 |
1094 // TODO(nasko): Remove the following CHECK once cross-site navigation no | 1103 // TODO(nasko): Remove the following CHECK once cross-site navigation no |
1095 // longer relies on swapped out RFH for the top-level frame. | 1104 // longer relies on swapped out RFH for the top-level frame. |
1096 if (!frame_tree_node_->IsMainFrame()) { | 1105 if (!frame_tree_node_->IsMainFrame()) { |
1097 CHECK(!swapped_out); | 1106 CHECK(!swapped_out); |
1098 } | 1107 } |
1099 | 1108 |
1100 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | 1109 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; |
1101 RenderFrameHostImpl* frame_to_announce = NULL; | 1110 RenderFrameHostImpl* frame_to_announce = NULL; |
1102 int routing_id = MSG_ROUTING_NONE; | 1111 int routing_id = MSG_ROUTING_NONE; |
(...skipping 27 matching lines...) Expand all Loading... |
1130 int required_bindings = pending_web_ui()->GetBindings(); | 1139 int required_bindings = pending_web_ui()->GetBindings(); |
1131 RenderViewHost* rvh = new_render_frame_host->render_view_host(); | 1140 RenderViewHost* rvh = new_render_frame_host->render_view_host(); |
1132 if ((rvh->GetEnabledBindings() & required_bindings) != | 1141 if ((rvh->GetEnabledBindings() & required_bindings) != |
1133 required_bindings) { | 1142 required_bindings) { |
1134 rvh->AllowBindings(required_bindings); | 1143 rvh->AllowBindings(required_bindings); |
1135 } | 1144 } |
1136 } | 1145 } |
1137 } | 1146 } |
1138 } else { | 1147 } else { |
1139 // Create a new RenderFrameHost if we don't find an existing one. | 1148 // Create a new RenderFrameHost if we don't find an existing one. |
1140 new_render_frame_host = CreateRenderFrameHost( | 1149 new_render_frame_host = CreateRenderFrameHost(instance, |
1141 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); | 1150 MSG_ROUTING_NONE, |
| 1151 MSG_ROUTING_NONE, |
| 1152 swapped_out, |
| 1153 flags & HIDDEN); |
1142 RenderViewHostImpl* render_view_host = | 1154 RenderViewHostImpl* render_view_host = |
1143 new_render_frame_host->render_view_host(); | 1155 new_render_frame_host->render_view_host(); |
1144 int proxy_routing_id = MSG_ROUTING_NONE; | 1156 int proxy_routing_id = MSG_ROUTING_NONE; |
1145 | 1157 |
1146 // Prevent the process from exiting while we're trying to navigate in it. | 1158 // Prevent the process from exiting while we're trying to navigate in it. |
1147 // Otherwise, if the new RFH is swapped out already, store it. | 1159 // Otherwise, if the new RFH is swapped out already, store it. |
1148 if (!swapped_out) { | 1160 if (!swapped_out) { |
1149 new_render_frame_host->GetProcess()->AddPendingView(); | 1161 new_render_frame_host->GetProcess()->AddPendingView(); |
1150 } else { | 1162 } else { |
1151 proxy = new RenderFrameProxyHost( | 1163 proxy = new RenderFrameProxyHost( |
1152 new_render_frame_host->GetSiteInstance(), frame_tree_node_); | 1164 new_render_frame_host->GetSiteInstance(), frame_tree_node_); |
1153 proxy_hosts_[instance->GetId()] = proxy; | 1165 proxy_hosts_[instance->GetId()] = proxy; |
1154 proxy_routing_id = proxy->GetRoutingID(); | 1166 proxy_routing_id = proxy->GetRoutingID(); |
1155 if (frame_tree_node_->IsMainFrame()) | 1167 if (frame_tree_node_->IsMainFrame()) |
1156 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1168 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
1157 } | 1169 } |
1158 | 1170 |
1159 bool success = InitRenderView(render_view_host, | 1171 bool success = InitRenderView(render_view_host, |
1160 opener_route_id, | 1172 opener_route_id, |
1161 proxy_routing_id, | 1173 proxy_routing_id, |
1162 for_main_frame_navigation); | 1174 flags & FOR_MAIN_FRAME_NAVIGATION); |
1163 if (success) { | 1175 if (success) { |
1164 if (frame_tree_node_->IsMainFrame()) { | 1176 if (frame_tree_node_->IsMainFrame()) { |
1165 // Don't show the main frame's view until we get a DidNavigate from it. | 1177 // Don't show the main frame's view until we get a DidNavigate from it. |
1166 render_view_host->GetView()->Hide(); | 1178 render_view_host->GetView()->Hide(); |
1167 } else if (!swapped_out) { | 1179 } else if (!swapped_out) { |
1168 // Init the RFH, so a RenderFrame is created in the renderer. | 1180 // Init the RFH, so a RenderFrame is created in the renderer. |
1169 DCHECK(new_render_frame_host.get()); | 1181 DCHECK(new_render_frame_host.get()); |
1170 success = InitRenderFrame(new_render_frame_host.get()); | 1182 success = InitRenderFrame(new_render_frame_host.get()); |
1171 } | 1183 } |
1172 if (swapped_out) { | 1184 if (swapped_out) { |
1173 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); | 1185 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); |
1174 } | 1186 } |
1175 } else if (!swapped_out && pending_render_frame_host_) { | 1187 } else if (!swapped_out && pending_render_frame_host_) { |
1176 CancelPending(); | 1188 CancelPending(); |
1177 } | 1189 } |
1178 routing_id = render_view_host->GetRoutingID(); | 1190 routing_id = render_view_host->GetRoutingID(); |
1179 frame_to_announce = new_render_frame_host.get(); | 1191 frame_to_announce = new_render_frame_host.get(); |
1180 } | 1192 } |
1181 | 1193 |
| 1194 if (flags & CREATE_RENDER_WIDGET_HOST) |
| 1195 new_render_frame_host->CreateRenderWidgetHost(render_widget_delegate_, |
| 1196 flags & HIDDEN); |
| 1197 |
1182 // Use this as our new pending RFH if it isn't swapped out. | 1198 // Use this as our new pending RFH if it isn't swapped out. |
1183 if (!swapped_out) | 1199 if (!swapped_out) |
1184 pending_render_frame_host_ = new_render_frame_host.Pass(); | 1200 pending_render_frame_host_ = new_render_frame_host.Pass(); |
1185 | 1201 |
1186 // If a brand new RFH was created, announce it to observers. | 1202 // If a brand new RFH was created, announce it to observers. |
1187 if (frame_to_announce) | 1203 if (frame_to_announce) |
1188 render_frame_delegate_->RenderFrameCreated(frame_to_announce); | 1204 render_frame_delegate_->RenderFrameCreated(frame_to_announce); |
1189 | 1205 |
1190 return routing_id; | 1206 return routing_id; |
1191 } | 1207 } |
(...skipping 516 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1708 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1724 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
1709 SiteInstance* instance) { | 1725 SiteInstance* instance) { |
1710 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1726 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
1711 if (iter != proxy_hosts_.end()) { | 1727 if (iter != proxy_hosts_.end()) { |
1712 delete iter->second; | 1728 delete iter->second; |
1713 proxy_hosts_.erase(iter); | 1729 proxy_hosts_.erase(iter); |
1714 } | 1730 } |
1715 } | 1731 } |
1716 | 1732 |
1717 } // namespace content | 1733 } // namespace content |
OLD | NEW |