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 |