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

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: 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 1008 matching lines...) Expand 10 before | Expand all | Expand 10 after
1019 // SiteInstance to a RenderViewHost (if it is different than our current 1019 // SiteInstance to a RenderViewHost (if it is different than our current
1020 // SiteInstance), so that it is ref counted. This will happen in 1020 // SiteInstance), so that it is ref counted. This will happen in
1021 // CreateRenderView. 1021 // CreateRenderView.
1022 return current_instance->GetRelatedSiteInstance(dest_url); 1022 return current_instance->GetRelatedSiteInstance(dest_url);
1023 } 1023 }
1024 1024
1025 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( 1025 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
1026 SiteInstance* old_instance, 1026 SiteInstance* old_instance,
1027 SiteInstance* new_instance, 1027 SiteInstance* new_instance,
1028 bool is_main_frame) { 1028 bool is_main_frame) {
1029 int create_render_frame_flags = is_main_frame ? FOR_MAIN_FRAME_NAVIGATION : 0;
1029 // Ensure that we have created RFHs for the new RFH's opener chain if 1030 // Ensure that we have created RFHs for the new RFH's opener chain if
1030 // we are staying in the same BrowsingInstance. This allows the new RFH 1031 // we are staying in the same BrowsingInstance. This allows the new RFH
1031 // to send cross-process script calls to its opener(s). 1032 // to send cross-process script calls to its opener(s).
1032 int opener_route_id = MSG_ROUTING_NONE; 1033 int opener_route_id = MSG_ROUTING_NONE;
1033 if (new_instance->IsRelatedSiteInstance(old_instance)) { 1034 if (new_instance->IsRelatedSiteInstance(old_instance)) {
1034 opener_route_id = 1035 opener_route_id =
1035 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); 1036 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance);
1036 if (CommandLine::ForCurrentProcess()->HasSwitch( 1037 if (CommandLine::ForCurrentProcess()->HasSwitch(
1037 switches::kSitePerProcess)) { 1038 switches::kSitePerProcess)) {
1038 // Ensure that the frame tree has RenderFrameProxyHosts for the new 1039 // Ensure that the frame tree has RenderFrameProxyHosts for the new
1039 // SiteInstance in all nodes except the current one. 1040 // SiteInstance in all nodes except the current one.
1040 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( 1041 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
1041 frame_tree_node_, new_instance); 1042 frame_tree_node_, new_instance);
1043 // RenderFrames in different processes from their parent RenderFrames
nasko 2014/10/01 16:37:14 nit: s/different processes/different SiteInstance/
Charlie Reis 2014/10/01 17:01:08 nit: s/RenderFrames/RenderFrame(Host)s/
kenrb 2014/10/01 19:27:51 Changed RenderWidget(Host)s to just RenderWidgets.
kenrb 2014/10/01 19:27:51 Might processes be better? We use SiteInstance rig
Charlie Reis 2014/10/02 00:06:57 I think we do want to say SiteInstance here. If t
kenrb 2014/10/02 20:20:47 I'm not sure I agree. If a non-protected SiteInsta
Charlie Reis 2014/10/08 21:21:13 I'm skeptical about that. It doesn't make sense t
1044 // in the frame tree require RenderWidget(Host)s for rendering
1045 // and processing input events.
1046 if (frame_tree_node_->parent() &&
1047 frame_tree_node_->parent()->render_manager()->
1048 current_frame_host()->GetSiteInstance() == new_instance)
nasko 2014/10/01 16:37:14 Shouldn't this be "!=" instead of "=="?
kenrb 2014/10/01 19:27:51 Yes! That explains a lot about some of the problem
1049 create_render_frame_flags |= CREATE_RENDER_WIDGET_HOST;
1042 } 1050 }
1043 } 1051 }
1044 1052
1053 create_render_frame_flags |= delegate_->IsHidden() ? HIDDEN : 0;
1054
1045 // Create a non-swapped-out RFH with the given opener. 1055 // Create a non-swapped-out RFH with the given opener.
1046 int route_id = CreateRenderFrame( 1056 int route_id = CreateRenderFrame(
1047 new_instance, opener_route_id, false, is_main_frame, 1057 new_instance, opener_route_id, create_render_frame_flags);
1048 delegate_->IsHidden());
1049 if (route_id == MSG_ROUTING_NONE) { 1058 if (route_id == MSG_ROUTING_NONE) {
1050 pending_render_frame_host_.reset(); 1059 pending_render_frame_host_.reset();
1051 return; 1060 return;
1052 } 1061 }
1053 } 1062 }
1054 1063
1055 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( 1064 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
1056 SiteInstance* site_instance, 1065 SiteInstance* site_instance,
1057 int view_routing_id, 1066 int view_routing_id,
1058 int frame_routing_id, 1067 int frame_routing_id,
(...skipping 20 matching lines...) Expand all
1079 render_frame_delegate_, 1088 render_frame_delegate_,
1080 frame_tree, 1089 frame_tree,
1081 frame_tree_node_, 1090 frame_tree_node_,
1082 frame_routing_id, 1091 frame_routing_id,
1083 swapped_out).release()); 1092 swapped_out).release());
1084 return render_frame_host.Pass(); 1093 return render_frame_host.Pass();
1085 } 1094 }
1086 1095
1087 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, 1096 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance,
1088 int opener_route_id, 1097 int opener_route_id,
1089 bool swapped_out, 1098 int flags) {
1090 bool for_main_frame_navigation, 1099 bool swapped_out = flags & SWAPPED_OUT;
1091 bool hidden) {
1092 CHECK(instance); 1100 CHECK(instance);
1093 DCHECK(!swapped_out || hidden); // Swapped out views should always be hidden. 1101 // Swapped out views should always be hidden.
1102 DCHECK(!swapped_out || (flags & HIDDEN));
1094 1103
1095 // TODO(nasko): Remove the following CHECK once cross-site navigation no 1104 // TODO(nasko): Remove the following CHECK once cross-site navigation no
1096 // longer relies on swapped out RFH for the top-level frame. 1105 // longer relies on swapped out RFH for the top-level frame.
1097 if (!frame_tree_node_->IsMainFrame()) { 1106 if (!frame_tree_node_->IsMainFrame()) {
1098 CHECK(!swapped_out); 1107 CHECK(!swapped_out);
1099 } 1108 }
1100 1109
1101 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; 1110 scoped_ptr<RenderFrameHostImpl> new_render_frame_host;
1102 RenderFrameHostImpl* frame_to_announce = NULL; 1111 RenderFrameHostImpl* frame_to_announce = NULL;
1103 int routing_id = MSG_ROUTING_NONE; 1112 int routing_id = MSG_ROUTING_NONE;
(...skipping 27 matching lines...) Expand all
1131 int required_bindings = pending_web_ui()->GetBindings(); 1140 int required_bindings = pending_web_ui()->GetBindings();
1132 RenderViewHost* rvh = new_render_frame_host->render_view_host(); 1141 RenderViewHost* rvh = new_render_frame_host->render_view_host();
1133 if ((rvh->GetEnabledBindings() & required_bindings) != 1142 if ((rvh->GetEnabledBindings() & required_bindings) !=
1134 required_bindings) { 1143 required_bindings) {
1135 rvh->AllowBindings(required_bindings); 1144 rvh->AllowBindings(required_bindings);
1136 } 1145 }
1137 } 1146 }
1138 } 1147 }
1139 } else { 1148 } else {
1140 // Create a new RenderFrameHost if we don't find an existing one. 1149 // Create a new RenderFrameHost if we don't find an existing one.
1141 new_render_frame_host = CreateRenderFrameHost( 1150 new_render_frame_host = CreateRenderFrameHost(instance,
1142 instance, MSG_ROUTING_NONE, MSG_ROUTING_NONE, swapped_out, hidden); 1151 MSG_ROUTING_NONE,
1152 MSG_ROUTING_NONE,
1153 swapped_out,
1154 flags & HIDDEN);
1143 RenderViewHostImpl* render_view_host = 1155 RenderViewHostImpl* render_view_host =
1144 new_render_frame_host->render_view_host(); 1156 new_render_frame_host->render_view_host();
1145 int proxy_routing_id = MSG_ROUTING_NONE; 1157 int proxy_routing_id = MSG_ROUTING_NONE;
1146 1158
1147 // Prevent the process from exiting while we're trying to navigate in it. 1159 // Prevent the process from exiting while we're trying to navigate in it.
1148 // Otherwise, if the new RFH is swapped out already, store it. 1160 // Otherwise, if the new RFH is swapped out already, store it.
1149 if (!swapped_out) { 1161 if (!swapped_out) {
1150 new_render_frame_host->GetProcess()->AddPendingView(); 1162 new_render_frame_host->GetProcess()->AddPendingView();
1151 } else { 1163 } else {
1152 proxy = new RenderFrameProxyHost( 1164 proxy = new RenderFrameProxyHost(
1153 new_render_frame_host->GetSiteInstance(), frame_tree_node_); 1165 new_render_frame_host->GetSiteInstance(), frame_tree_node_);
1154 proxy_hosts_[instance->GetId()] = proxy; 1166 proxy_hosts_[instance->GetId()] = proxy;
1155 proxy_routing_id = proxy->GetRoutingID(); 1167 proxy_routing_id = proxy->GetRoutingID();
1156 if (frame_tree_node_->IsMainFrame()) 1168 if (frame_tree_node_->IsMainFrame())
1157 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1169 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1158 } 1170 }
1159 1171
1160 bool success = InitRenderView(render_view_host, 1172 bool success = InitRenderView(render_view_host,
1161 opener_route_id, 1173 opener_route_id,
1162 proxy_routing_id, 1174 proxy_routing_id,
1163 for_main_frame_navigation); 1175 flags & FOR_MAIN_FRAME_NAVIGATION);
1164 if (success) { 1176 if (success) {
1165 if (frame_tree_node_->IsMainFrame()) { 1177 if (frame_tree_node_->IsMainFrame()) {
1166 // Don't show the main frame's view until we get a DidNavigate from it. 1178 // Don't show the main frame's view until we get a DidNavigate from it.
1167 render_view_host->GetView()->Hide(); 1179 render_view_host->GetView()->Hide();
1168 } else if (!swapped_out) { 1180 } else if (!swapped_out) {
1169 // Init the RFH, so a RenderFrame is created in the renderer. 1181 // Init the RFH, so a RenderFrame is created in the renderer.
1170 DCHECK(new_render_frame_host.get()); 1182 DCHECK(new_render_frame_host.get());
1171 success = InitRenderFrame(new_render_frame_host.get()); 1183 success = InitRenderFrame(new_render_frame_host.get());
1172 } 1184 }
1173 if (swapped_out) { 1185 if (swapped_out) {
1174 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy(); 1186 proxy_hosts_[instance->GetId()]->InitRenderFrameProxy();
1175 } 1187 }
1176 } else if (!swapped_out && pending_render_frame_host_) { 1188 } else if (!swapped_out && pending_render_frame_host_) {
1177 CancelPending(); 1189 CancelPending();
1178 } 1190 }
1179 routing_id = render_view_host->GetRoutingID(); 1191 routing_id = render_view_host->GetRoutingID();
1180 frame_to_announce = new_render_frame_host.get(); 1192 frame_to_announce = new_render_frame_host.get();
1181 } 1193 }
1182 1194
1195 if (flags & CREATE_RENDER_WIDGET_HOST)
1196 new_render_frame_host->CreateRenderWidgetHost(render_widget_delegate_,
nasko 2014/10/01 16:37:14 Is there ever a case where we need to create a Ren
Charlie Reis 2014/10/01 17:01:08 +1. We do something similar for creating the Rend
kenrb 2014/10/01 19:27:51 I had thought of this, but the comment in line 112
Charlie Reis 2014/10/02 00:06:57 That's only for main frames, which store their RFH
kenrb 2014/10/02 20:20:48 Probably not. This is good to know, I have made th
1197 flags & HIDDEN);
1198
1183 // Use this as our new pending RFH if it isn't swapped out. 1199 // Use this as our new pending RFH if it isn't swapped out.
1184 if (!swapped_out) 1200 if (!swapped_out)
1185 pending_render_frame_host_ = new_render_frame_host.Pass(); 1201 pending_render_frame_host_ = new_render_frame_host.Pass();
1186 1202
1187 // If a brand new RFH was created, announce it to observers. 1203 // If a brand new RFH was created, announce it to observers.
1188 if (frame_to_announce) 1204 if (frame_to_announce)
1189 render_frame_delegate_->RenderFrameCreated(frame_to_announce); 1205 render_frame_delegate_->RenderFrameCreated(frame_to_announce);
1190 1206
1191 return routing_id; 1207 return routing_id;
1192 } 1208 }
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after
1717 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1733 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1718 SiteInstance* instance) { 1734 SiteInstance* instance) {
1719 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1735 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1720 if (iter != proxy_hosts_.end()) { 1736 if (iter != proxy_hosts_.end()) {
1721 delete iter->second; 1737 delete iter->second;
1722 proxy_hosts_.erase(iter); 1738 proxy_hosts_.erase(iter);
1723 } 1739 }
1724 } 1740 }
1725 1741
1726 } // namespace content 1742 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698