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

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: Fixed output surface problems, combined RenderFrame and RenderWidget creation 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 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698