| 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 121 void RenderFrameHostManager::Init(BrowserContext* browser_context, | 121 void RenderFrameHostManager::Init(BrowserContext* browser_context, |
| 122 SiteInstance* site_instance, | 122 SiteInstance* site_instance, |
| 123 int view_routing_id, | 123 int view_routing_id, |
| 124 int frame_routing_id) { | 124 int frame_routing_id) { |
| 125 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It | 125 // Create a RenderViewHost and RenderFrameHost, once we have an instance. It |
| 126 // is important to immediately give this SiteInstance to a RenderViewHost so | 126 // is important to immediately give this SiteInstance to a RenderViewHost so |
| 127 // that the SiteInstance is ref counted. | 127 // that the SiteInstance is ref counted. |
| 128 if (!site_instance) | 128 if (!site_instance) |
| 129 site_instance = SiteInstance::Create(browser_context); | 129 site_instance = SiteInstance::Create(browser_context); |
| 130 | 130 |
| 131 int flags = delegate_->IsHidden() ? HIDDEN : 0; |
| 131 SetRenderFrameHost(CreateRenderFrameHost(site_instance, | 132 SetRenderFrameHost(CreateRenderFrameHost(site_instance, |
| 132 view_routing_id, | 133 view_routing_id, |
| 133 frame_routing_id, | 134 frame_routing_id, |
| 134 false, | 135 flags)); |
| 135 delegate_->IsHidden())); | |
| 136 | 136 |
| 137 // Keep track of renderer processes as they start to shut down or are | 137 // Keep track of renderer processes as they start to shut down or are |
| 138 // crashed/killed. | 138 // crashed/killed. |
| 139 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, | 139 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, |
| 140 NotificationService::AllSources()); | 140 NotificationService::AllSources()); |
| 141 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, | 141 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, |
| 142 NotificationService::AllSources()); | 142 NotificationService::AllSources()); |
| 143 } | 143 } |
| 144 | 144 |
| 145 RenderViewHostImpl* RenderFrameHostManager::current_host() const { | 145 RenderViewHostImpl* RenderFrameHostManager::current_host() const { |
| (...skipping 872 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, |
| 1058 bool swapped_out, | 1067 int flags) { |
| 1059 bool hidden) { | |
| 1060 if (frame_routing_id == MSG_ROUTING_NONE) | 1068 if (frame_routing_id == MSG_ROUTING_NONE) |
| 1061 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); | 1069 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); |
| 1062 | 1070 |
| 1071 bool swapped_out = flags & SWAPPED_OUT; |
| 1072 bool hidden = flags & HIDDEN; |
| 1073 |
| 1063 // Create a RVH for main frames, or find the existing one for subframes. | 1074 // Create a RVH for main frames, or find the existing one for subframes. |
| 1064 FrameTree* frame_tree = frame_tree_node_->frame_tree(); | 1075 FrameTree* frame_tree = frame_tree_node_->frame_tree(); |
| 1065 RenderViewHostImpl* render_view_host = NULL; | 1076 RenderViewHostImpl* render_view_host = NULL; |
| 1066 if (frame_tree_node_->IsMainFrame()) { | 1077 if (frame_tree_node_->IsMainFrame()) { |
| 1067 render_view_host = frame_tree->CreateRenderViewHost( | 1078 render_view_host = frame_tree->CreateRenderViewHost( |
| 1068 site_instance, view_routing_id, frame_routing_id, swapped_out, hidden); | 1079 site_instance, |
| 1080 view_routing_id, |
| 1081 frame_routing_id, |
| 1082 swapped_out, |
| 1083 hidden); |
| 1069 } else { | 1084 } else { |
| 1070 render_view_host = frame_tree->GetRenderViewHost(site_instance); | 1085 render_view_host = frame_tree->GetRenderViewHost(site_instance); |
| 1071 | 1086 |
| 1072 CHECK(render_view_host); | 1087 CHECK(render_view_host); |
| 1073 } | 1088 } |
| 1074 | 1089 |
| 1075 // TODO(creis): Pass hidden to RFH. | 1090 // TODO(creis): Pass hidden to RFH. |
| 1076 scoped_ptr<RenderFrameHostImpl> render_frame_host = | 1091 scoped_ptr<RenderFrameHostImpl> render_frame_host = |
| 1077 make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host, | 1092 make_scoped_ptr(RenderFrameHostFactory::Create(render_view_host, |
| 1078 render_frame_delegate_, | 1093 render_frame_delegate_, |
| 1094 render_widget_delegate_, |
| 1079 frame_tree, | 1095 frame_tree, |
| 1080 frame_tree_node_, | 1096 frame_tree_node_, |
| 1081 frame_routing_id, | 1097 frame_routing_id, |
| 1082 swapped_out).release()); | 1098 flags).release()); |
| 1083 return render_frame_host.Pass(); | 1099 return render_frame_host.Pass(); |
| 1084 } | 1100 } |
| 1085 | 1101 |
| 1086 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, | 1102 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, |
| 1087 int opener_route_id, | 1103 int opener_route_id, |
| 1088 bool swapped_out, | 1104 int flags) { |
| 1089 bool for_main_frame_navigation, | 1105 bool swapped_out = flags & SWAPPED_OUT; |
| 1090 bool hidden) { | |
| 1091 CHECK(instance); | 1106 CHECK(instance); |
| 1092 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. | 1107 // Swapped out views should always be hidden. |
| 1108 DCHECK(!swapped_out || (flags & HIDDEN)); |
| 1093 | 1109 |
| 1094 // TODO(nasko): Remove the following CHECK once cross-site navigation no | 1110 // TODO(nasko): Remove the following CHECK once cross-site navigation no |
| 1095 // longer relies on swapped out RFH for the top-level frame. | 1111 // longer relies on swapped out RFH for the top-level frame. |
| 1096 if (!frame_tree_node_->IsMainFrame()) { | 1112 if (!frame_tree_node_->IsMainFrame()) { |
| 1097 CHECK(!swapped_out); | 1113 CHECK(!swapped_out); |
| 1098 } | 1114 } |
| 1099 | 1115 |
| 1100 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; | 1116 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; |
| 1101 RenderFrameHostImpl* frame_to_announce = NULL; | 1117 RenderFrameHostImpl* frame_to_announce = NULL; |
| 1102 int routing_id = MSG_ROUTING_NONE; | 1118 int routing_id = MSG_ROUTING_NONE; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 1130 int required_bindings = pending_web_ui()->GetBindings(); | 1146 int required_bindings = pending_web_ui()->GetBindings(); |
| 1131 RenderViewHost* rvh = new_render_frame_host->render_view_host(); | 1147 RenderViewHost* rvh = new_render_frame_host->render_view_host(); |
| 1132 if ((rvh->GetEnabledBindings() & required_bindings) != | 1148 if ((rvh->GetEnabledBindings() & required_bindings) != |
| 1133 required_bindings) { | 1149 required_bindings) { |
| 1134 rvh->AllowBindings(required_bindings); | 1150 rvh->AllowBindings(required_bindings); |
| 1135 } | 1151 } |
| 1136 } | 1152 } |
| 1137 } | 1153 } |
| 1138 } else { | 1154 } else { |
| 1139 // Create a new RenderFrameHost if we don't find an existing one. | 1155 // Create a new RenderFrameHost if we don't find an existing one. |
| 1140 new_render_frame_host = CreateRenderFrameHost( | 1156 new_render_frame_host = CreateRenderFrameHost(instance, |
| 1141 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); | 1157 MSG_ROUTING_NONE, |
| 1158 MSG_ROUTING_NONE, |
| 1159 flags); |
| 1142 RenderViewHostImpl* render_view_host = | 1160 RenderViewHostImpl* render_view_host = |
| 1143 new_render_frame_host->render_view_host(); | 1161 new_render_frame_host->render_view_host(); |
| 1144 int proxy_routing_id = MSG_ROUTING_NONE; | 1162 int proxy_routing_id = MSG_ROUTING_NONE; |
| 1145 | 1163 |
| 1146 // Prevent the process from exiting while we're trying to navigate in it. | 1164 // 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. | 1165 // Otherwise, if the new RFH is swapped out already, store it. |
| 1148 if (!swapped_out) { | 1166 if (!swapped_out) { |
| 1149 new_render_frame_host->GetProcess()->AddPendingView(); | 1167 new_render_frame_host->GetProcess()->AddPendingView(); |
| 1150 } else { | 1168 } else { |
| 1151 proxy = new RenderFrameProxyHost( | 1169 proxy = new RenderFrameProxyHost( |
| 1152 new_render_frame_host->GetSiteInstance(), frame_tree_node_); | 1170 new_render_frame_host->GetSiteInstance(), frame_tree_node_); |
| 1153 proxy_hosts_[instance->GetId()] = proxy; | 1171 proxy_hosts_[instance->GetId()] = proxy; |
| 1154 proxy_routing_id = proxy->GetRoutingID(); | 1172 proxy_routing_id = proxy->GetRoutingID(); |
| 1155 if (frame_tree_node_->IsMainFrame()) | 1173 if (frame_tree_node_->IsMainFrame()) |
| 1156 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); | 1174 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); |
| 1157 } | 1175 } |
| 1158 | 1176 |
| 1159 bool success = InitRenderView(render_view_host, | 1177 bool success = InitRenderView(render_view_host, |
| 1160 opener_route_id, | 1178 opener_route_id, |
| 1161 proxy_routing_id, | 1179 proxy_routing_id, |
| 1162 for_main_frame_navigation); | 1180 flags & FOR_MAIN_FRAME_NAVIGATION); |
| 1163 if (success) { | 1181 if (success) { |
| 1164 if (frame_tree_node_->IsMainFrame()) { | 1182 if (frame_tree_node_->IsMainFrame()) { |
| 1165 // Don't show the main frame's view until we get a DidNavigate from it. | 1183 // Don't show the main frame's view until we get a DidNavigate from it. |
| 1166 render_view_host->GetView()->Hide(); | 1184 render_view_host->GetView()->Hide(); |
| 1167 } else if (!swapped_out) { | 1185 } else if (!swapped_out) { |
| 1168 // Init the RFH, so a RenderFrame is created in the renderer. | 1186 // Init the RFH, so a RenderFrame is created in the renderer. |
| 1169 DCHECK(new_render_frame_host.get()); | 1187 DCHECK(new_render_frame_host.get()); |
| 1170 success = InitRenderFrame(new_render_frame_host.get()); | 1188 success = InitRenderFrame(new_render_frame_host.get()); |
| 1171 } | 1189 } |
| 1172 if (swapped_out) { | 1190 if (swapped_out) { |
| (...skipping 535 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1708 void RenderFrameHostManager::DeleteRenderFrameProxyHost( | 1726 void RenderFrameHostManager::DeleteRenderFrameProxyHost( |
| 1709 SiteInstance* instance) { | 1727 SiteInstance* instance) { |
| 1710 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); | 1728 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); |
| 1711 if (iter != proxy_hosts_.end()) { | 1729 if (iter != proxy_hosts_.end()) { |
| 1712 delete iter->second; | 1730 delete iter->second; |
| 1713 proxy_hosts_.erase(iter); | 1731 proxy_hosts_.erase(iter); |
| 1714 } | 1732 } |
| 1715 } | 1733 } |
| 1716 | 1734 |
| 1717 } // namespace content | 1735 } // namespace content |
| OLD | NEW |