Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: content/browser/frame_host/render_frame_host_manager.cc

Issue 616133002: Make RenderFrame(Host) own a RenderWidget(Host). (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comments addressed Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698