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

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

Issue 753173002: Preparation steps for adding speculative renderer creation. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Minor missing things. Created 6 years 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 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
127 ->render_manager() 127 ->render_manager()
128 ->current_frame_host() 128 ->current_frame_host()
129 ->GetSiteInstance() 129 ->GetSiteInstance()
130 ->GetId()); 130 ->GetId());
131 if (iter == proxy_hosts_.end()) 131 if (iter == proxy_hosts_.end())
132 return NULL; 132 return NULL;
133 133
134 return iter->second; 134 return iter->second;
135 } 135 }
136 136
137 void RenderFrameHostManager::SetPendingWebUI(const GURL& url, 137 void RenderFrameHostManager::SetPendingWebUI(const GURL& url, int bindings) {
138 int bindings) { 138 pending_web_ui_.reset(CreateWebUI(url, bindings));
139 pending_web_ui_.reset(
140 delegate_->CreateWebUIForRenderManager(url));
141 pending_and_current_web_ui_.reset(); 139 pending_and_current_web_ui_.reset();
140 }
141
142 WebUIImpl* RenderFrameHostManager::CreateWebUI(const GURL& url, int bindings) {
143 WebUIImpl* new_web_ui = delegate_->CreateWebUIForRenderManager(url);
142 144
143 // If we have assigned (zero or more) bindings to this NavigationEntry in the 145 // If we have assigned (zero or more) bindings to this NavigationEntry in the
144 // past, make sure we're not granting it different bindings than it had 146 // past, make sure we're not granting it different bindings than it had
145 // before. If so, note it and don't give it any bindings, to avoid a 147 // before. If so, note it and don't give it any bindings, to avoid a
146 // potential privilege escalation. 148 // potential privilege escalation.
147 if (pending_web_ui_.get() && 149 if (new_web_ui && bindings != NavigationEntryImpl::kInvalidBindings &&
148 bindings != NavigationEntryImpl::kInvalidBindings && 150 new_web_ui->GetBindings() != bindings) {
149 pending_web_ui_->GetBindings() != bindings) { 151 RecordAction(base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM"));
150 RecordAction( 152 delete new_web_ui;
151 base::UserMetricsAction("ProcessSwapBindingsMismatch_RVHM")); 153 return nullptr;
152 pending_web_ui_.reset();
153 } 154 }
155 return new_web_ui;
154 } 156 }
155 157
156 RenderFrameHostImpl* RenderFrameHostManager::Navigate( 158 RenderFrameHostImpl* RenderFrameHostManager::Navigate(
157 const NavigationEntryImpl& entry) { 159 const NavigationEntryImpl& entry) {
158 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate", 160 TRACE_EVENT1("navigation", "RenderFrameHostManager:Navigate",
159 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id()); 161 "FrameTreeNode id", frame_tree_node_->frame_tree_node_id());
160 // Create a pending RenderFrameHost to use for the navigation. 162 // Create a pending RenderFrameHost to use for the navigation.
161 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate( 163 RenderFrameHostImpl* dest_render_frame_host = UpdateStateForNavigate(
162 entry.GetURL(), 164 entry.GetURL(),
163 entry.site_instance(), 165 entry.site_instance(),
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
550 // We shouldn't get here for subframes, since we only swap subframes when 552 // We shouldn't get here for subframes, since we only swap subframes when
551 // --site-per-process is used. 553 // --site-per-process is used.
552 DCHECK(is_main_frame); 554 DCHECK(is_main_frame);
553 555
554 // The old RenderFrameHost will stay alive inside the proxy so that existing 556 // The old RenderFrameHost will stay alive inside the proxy so that existing
555 // JavaScript window references to it stay valid. 557 // JavaScript window references to it stay valid.
556 proxy->TakeFrameHostOwnership(old_render_frame_host.Pass()); 558 proxy->TakeFrameHostOwnership(old_render_frame_host.Pass());
557 } 559 }
558 } 560 }
559 561
562 void RenderFrameHostManager::DiscardRenderFrameHost(
563 scoped_ptr<RenderFrameHostImpl> render_frame_host) {
564 // TODO(carlosk): this code is very similar to what can be found in
565 // SwapOutOldFrame and we should see that these are unified at some point.
566
567 // If the SiteInstance for the pending RFH is being used by others, don't
568 // delete the RFH, just swap it out and it can be reused at a later point.
569 SiteInstanceImpl* site_instance = render_frame_host->GetSiteInstance();
570 if (site_instance->HasSite() && site_instance->active_frame_count() > 1) {
571 // Any currently suspended navigations are no longer needed.
572 render_frame_host->CancelSuspendedNavigations();
573
574 RenderFrameProxyHost* proxy =
575 new RenderFrameProxyHost(site_instance, frame_tree_node_);
576 proxy_hosts_[site_instance->GetId()] = proxy;
577 render_frame_host->SwapOut(proxy);
578 if (frame_tree_node_->IsMainFrame())
579 proxy->TakeFrameHostOwnership(render_frame_host.Pass());
580 } else {
581 // We won't be coming back, so delete this one.
582 render_frame_host.reset();
583 }
584 }
585
560 void RenderFrameHostManager::MoveToPendingDeleteHosts( 586 void RenderFrameHostManager::MoveToPendingDeleteHosts(
561 scoped_ptr<RenderFrameHostImpl> render_frame_host) { 587 scoped_ptr<RenderFrameHostImpl> render_frame_host) {
562 // |render_frame_host| will be deleted when its SwapOut ACK is received, or 588 // |render_frame_host| will be deleted when its SwapOut ACK is received, or
563 // when the timer times out, or when the RFHM itself is deleted (whichever 589 // when the timer times out, or when the RFHM itself is deleted (whichever
564 // comes first). 590 // comes first).
565 pending_delete_hosts_.push_back( 591 pending_delete_hosts_.push_back(
566 linked_ptr<RenderFrameHostImpl>(render_frame_host.release())); 592 linked_ptr<RenderFrameHostImpl>(render_frame_host.release()));
567 } 593 }
568 594
569 bool RenderFrameHostManager::IsPendingDeletion( 595 bool RenderFrameHostManager::IsPendingDeletion(
(...skipping 420 matching lines...) Expand 10 before | Expand all | Expand 10 after
990 return current_instance->GetSiteURL(); 1016 return current_instance->GetSiteURL();
991 } 1017 }
992 1018
993 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance( 1019 void RenderFrameHostManager::CreateRenderFrameHostForNewSiteInstance(
994 SiteInstance* old_instance, 1020 SiteInstance* old_instance,
995 SiteInstance* new_instance, 1021 SiteInstance* new_instance,
996 bool is_main_frame) { 1022 bool is_main_frame) {
997 int create_render_frame_flags = 0; 1023 int create_render_frame_flags = 0;
998 if (is_main_frame) 1024 if (is_main_frame)
999 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION; 1025 create_render_frame_flags |= CREATE_RF_FOR_MAIN_FRAME_NAVIGATION;
1000 // Ensure that we have created RFHs for the new RFH's opener chain if 1026 if (delegate_->IsHidden())
nasko 2014/11/24 17:00:27 nit: empty line before the if statement
carlosk 2014/11/24 18:15:29 Done.
1001 // we are staying in the same BrowsingInstance. This allows the new RFH 1027 create_render_frame_flags |= CREATE_RF_HIDDEN;
1002 // to send cross-process script calls to its opener(s). 1028 int opener_route_id =
nasko 2014/11/24 17:00:28 nit: Same here, empty line above it. Unrelated sta
carlosk 2014/11/24 18:15:29 Done.
1029 CreateOpenerRenderViewsIfNeeded(old_instance, new_instance);
1030 // TODO(carlosk): does this "earlier" call for CancelPending affects anything?
1031 // It used to happen inside the creation method iff the new RFH was
1032 // successfully created.
1033 if (pending_render_frame_host_)
1034 CancelPending();
1035 // Create a non-swapped-out RFH with the given opener.
1036 pending_render_frame_host_ =
1037 CreateRenderFrame(new_instance, opener_route_id,
1038 create_render_frame_flags, pending_web_ui(), nullptr);
1039 }
1040
1041 int RenderFrameHostManager::CreateOpenerRenderViewsIfNeeded(
1042 SiteInstance* old_instance,
1043 SiteInstance* new_instance) {
1003 int opener_route_id = MSG_ROUTING_NONE; 1044 int opener_route_id = MSG_ROUTING_NONE;
1004 if (new_instance->IsRelatedSiteInstance(old_instance)) { 1045 if (new_instance->IsRelatedSiteInstance(old_instance)) {
1005 opener_route_id = 1046 opener_route_id =
1006 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance); 1047 delegate_->CreateOpenerRenderViewsForRenderManager(new_instance);
1007 if (CommandLine::ForCurrentProcess()->HasSwitch( 1048 if (CommandLine::ForCurrentProcess()->HasSwitch(
1008 switches::kSitePerProcess)) { 1049 switches::kSitePerProcess)) {
1009 // Ensure that the frame tree has RenderFrameProxyHosts for the new 1050 // Ensure that the frame tree has RenderFrameProxyHosts for the new
1010 // SiteInstance in all nodes except the current one. 1051 // SiteInstance in all nodes except the current one.
1011 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance( 1052 frame_tree_node_->frame_tree()->CreateProxiesForSiteInstance(
1012 frame_tree_node_, new_instance); 1053 frame_tree_node_, new_instance);
1013 } 1054 }
1014 } 1055 }
1015 1056 return opener_route_id;
1016 if (delegate_->IsHidden())
1017 create_render_frame_flags |= CREATE_RF_HIDDEN;
1018
1019 // Create a non-swapped-out RFH with the given opener.
1020 int route_id = CreateRenderFrame(new_instance, opener_route_id,
1021 create_render_frame_flags);
1022 if (route_id == MSG_ROUTING_NONE) {
1023 pending_render_frame_host_.reset();
1024 return;
1025 }
1026 } 1057 }
1027 1058
1028 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost( 1059 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrameHost(
1029 SiteInstance* site_instance, 1060 SiteInstance* site_instance,
1030 int view_routing_id, 1061 int view_routing_id,
1031 int frame_routing_id, 1062 int frame_routing_id,
1032 int flags) { 1063 int flags) {
1033 if (frame_routing_id == MSG_ROUTING_NONE) 1064 if (frame_routing_id == MSG_ROUTING_NONE)
1034 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID(); 1065 frame_routing_id = site_instance->GetProcess()->GetNextRoutingID();
1035 1066
(...skipping 13 matching lines...) Expand all
1049 } 1080 }
1050 1081
1051 // TODO(creis): Pass hidden to RFH. 1082 // TODO(creis): Pass hidden to RFH.
1052 scoped_ptr<RenderFrameHostImpl> render_frame_host = 1083 scoped_ptr<RenderFrameHostImpl> render_frame_host =
1053 make_scoped_ptr(RenderFrameHostFactory::Create( 1084 make_scoped_ptr(RenderFrameHostFactory::Create(
1054 render_view_host, render_frame_delegate_, frame_tree, 1085 render_view_host, render_frame_delegate_, frame_tree,
1055 frame_tree_node_, frame_routing_id, flags).release()); 1086 frame_tree_node_, frame_routing_id, flags).release());
1056 return render_frame_host.Pass(); 1087 return render_frame_host.Pass();
1057 } 1088 }
1058 1089
1059 int RenderFrameHostManager::CreateRenderFrame(SiteInstance* instance, 1090 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::CreateRenderFrame(
1060 int opener_route_id, 1091 SiteInstance* instance,
1061 int flags) { 1092 int opener_route_id,
1093 int flags,
1094 const WebUIImpl* web_ui,
1095 int* routing_id_ptr) {
nasko 2014/11/24 17:00:27 Why take in this as param? The callers can use the
carlosk 2014/11/24 18:15:29 Because if the RFH is flagged to be created swappe
1062 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT); 1096 bool swapped_out = !!(flags & CREATE_RF_SWAPPED_OUT);
1063 CHECK(instance); 1097 CHECK(instance);
1064 // Swapped out views should always be hidden. 1098 // Swapped out views should always be hidden.
1065 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN)); 1099 DCHECK(!swapped_out || (flags & CREATE_RF_HIDDEN));
1066 1100
1067 // TODO(nasko): Remove the following CHECK once cross-site navigation no 1101 // TODO(nasko): Remove the following CHECK once cross-site navigation no
1068 // longer relies on swapped out RFH for the top-level frame. 1102 // longer relies on swapped out RFH for the top-level frame.
1069 if (!frame_tree_node_->IsMainFrame()) { 1103 if (!frame_tree_node_->IsMainFrame()) {
1070 CHECK(!swapped_out); 1104 CHECK(!swapped_out);
1071 } 1105 }
1072 1106
1073 scoped_ptr<RenderFrameHostImpl> new_render_frame_host; 1107 scoped_ptr<RenderFrameHostImpl> new_render_frame_host;
1074 RenderFrameHostImpl* frame_to_announce = NULL; 1108 bool success = true;
1075 int routing_id = MSG_ROUTING_NONE; 1109 if (routing_id_ptr)
nasko 2014/11/24 17:00:27 Not passing in this pointer as argument will also
carlosk 2014/11/24 18:15:29 I don't think that's possible as explained above.
1110 *routing_id_ptr = MSG_ROUTING_NONE;
1076 1111
1077 // We are creating a pending or swapped out RFH here. We should never create 1112 // We are creating a pending or swapped out RFH here. We should never create
1078 // it in the same SiteInstance as our current RFH. 1113 // never create it in the same SiteInstance as our current RFH.
nasko 2014/11/24 17:00:27 nit: "never create" appears twice.
carlosk 2014/11/24 18:15:29 Done.
1079 CHECK_NE(render_frame_host_->GetSiteInstance(), instance); 1114 CHECK_NE(render_frame_host_->GetSiteInstance(), instance);
1080 1115
1081 // Check if we've already created an RFH for this SiteInstance. If so, try 1116 // Check if we've already created an RFH for this SiteInstance. If so, try
1082 // to re-use the existing one, which has already been initialized. We'll 1117 // to re-use the existing one, which has already been initialized. We'll
1083 // remove it from the list of proxy hosts below if it will be active. 1118 // remove it from the list of proxy hosts below if it will be active.
1084 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1119 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1085
1086 if (proxy && proxy->render_frame_host()) { 1120 if (proxy && proxy->render_frame_host()) {
1087 routing_id = proxy->GetRenderViewHost()->GetRoutingID(); 1121 if (routing_id_ptr)
1122 *routing_id_ptr = proxy->GetRenderViewHost()->GetRoutingID();
1088 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost. 1123 // Delete the existing RenderFrameProxyHost, but reuse the RenderFrameHost.
1089 // Prevent the process from exiting while we're trying to use it. 1124 // Prevent the process from exiting while we're trying to use it.
1090 if (!swapped_out) { 1125 if (!swapped_out) {
1091 new_render_frame_host = proxy->PassFrameHostOwnership(); 1126 new_render_frame_host = proxy->PassFrameHostOwnership();
1092 new_render_frame_host->GetProcess()->AddPendingView(); 1127 new_render_frame_host->GetProcess()->AddPendingView();
1093 1128
1094 proxy_hosts_.erase(instance->GetId()); 1129 proxy_hosts_.erase(instance->GetId());
1095 delete proxy; 1130 delete proxy;
1096 1131
1097 // When a new render view is created by the renderer, the new WebContents 1132 // When a new render view is created by the renderer, the new WebContents
1098 // gets a RenderViewHost in the SiteInstance of its opener WebContents. 1133 // gets a RenderViewHost in the SiteInstance of its opener WebContents.
1099 // If not used in the first navigation, this RVH is swapped out and is not 1134 // If not used in the first navigation, this RVH is swapped out and is not
1100 // granted bindings, so we may need to grant them when swapping it in. 1135 // granted bindings, so we may need to grant them when swapping it in.
1101 if (pending_web_ui() && 1136 if (web_ui && !new_render_frame_host->GetProcess()->IsIsolatedGuest()) {
1102 !new_render_frame_host->GetProcess()->IsIsolatedGuest()) { 1137 int required_bindings = web_ui->GetBindings();
1103 int required_bindings = pending_web_ui()->GetBindings(); 1138 RenderViewHost* render_view_host =
1104 RenderViewHost* rvh = new_render_frame_host->render_view_host(); 1139 new_render_frame_host->render_view_host();
1105 if ((rvh->GetEnabledBindings() & required_bindings) != 1140 if ((render_view_host->GetEnabledBindings() & required_bindings) !=
1106 required_bindings) { 1141 required_bindings) {
1107 rvh->AllowBindings(required_bindings); 1142 render_view_host->AllowBindings(required_bindings);
1108 } 1143 }
1109 } 1144 }
1110 } 1145 }
1111 } else { 1146 } else {
1112 // Create a new RenderFrameHost if we don't find an existing one. 1147 // Create a new RenderFrameHost if we don't find an existing one.
1113 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE, 1148 new_render_frame_host = CreateRenderFrameHost(instance, MSG_ROUTING_NONE,
1114 MSG_ROUTING_NONE, flags); 1149 MSG_ROUTING_NONE, flags);
1115 RenderViewHostImpl* render_view_host = 1150 RenderViewHostImpl* render_view_host =
1116 new_render_frame_host->render_view_host(); 1151 new_render_frame_host->render_view_host();
1117 int proxy_routing_id = MSG_ROUTING_NONE; 1152 int proxy_routing_id = MSG_ROUTING_NONE;
1118 1153
1119 // Prevent the process from exiting while we're trying to navigate in it. 1154 // Prevent the process from exiting while we're trying to navigate in it.
1120 // Otherwise, if the new RFH is swapped out already, store it. 1155 // Otherwise, if the new RFH is swapped out already, store it.
1121 if (!swapped_out) { 1156 if (!swapped_out) {
1122 new_render_frame_host->GetProcess()->AddPendingView(); 1157 new_render_frame_host->GetProcess()->AddPendingView();
1123 } else { 1158 } else {
1124 proxy = new RenderFrameProxyHost( 1159 proxy = new RenderFrameProxyHost(
1125 new_render_frame_host->GetSiteInstance(), frame_tree_node_); 1160 new_render_frame_host->GetSiteInstance(), frame_tree_node_);
1126 proxy_hosts_[instance->GetId()] = proxy; 1161 proxy_hosts_[instance->GetId()] = proxy;
1127 proxy_routing_id = proxy->GetRoutingID(); 1162 proxy_routing_id = proxy->GetRoutingID();
1128 if (frame_tree_node_->IsMainFrame()) 1163 if (frame_tree_node_->IsMainFrame())
1129 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass()); 1164 proxy->TakeFrameHostOwnership(new_render_frame_host.Pass());
1130 } 1165 }
1131 1166
1132 bool success = 1167 success =
1133 InitRenderView(render_view_host, opener_route_id, proxy_routing_id, 1168 InitRenderView(render_view_host, opener_route_id, proxy_routing_id,
1134 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION)); 1169 !!(flags & CREATE_RF_FOR_MAIN_FRAME_NAVIGATION));
1135 if (success) { 1170 if (success) {
1136 if (frame_tree_node_->IsMainFrame()) { 1171 if (frame_tree_node_->IsMainFrame()) {
1137 // Don't show the main frame's view until we get a DidNavigate from it. 1172 // Don't show the main frame's view until we get a DidNavigate from it.
1138 render_view_host->GetView()->Hide(); 1173 render_view_host->GetView()->Hide();
1139 } else if (!swapped_out) { 1174 } else if (!swapped_out) {
1140 // Init the RFH, so a RenderFrame is created in the renderer. 1175 // Init the RFH, so a RenderFrame is created in the renderer.
1141 DCHECK(new_render_frame_host.get()); 1176 DCHECK(new_render_frame_host.get());
1142 success = InitRenderFrame(new_render_frame_host.get()); 1177 success = InitRenderFrame(new_render_frame_host.get());
1143 } 1178 }
1144 } else if (!swapped_out && pending_render_frame_host_) { 1179 if (success) {
1145 CancelPending(); 1180 if (routing_id_ptr)
1181 *routing_id_ptr = render_view_host->GetRoutingID();
1182 // If a brand new RFH was created, announce it to observers.
1183 // TODO(carlosk): verify there's no problem that now this RFH will only
1184 // be set as the pending one *after* this delegate call (used to be
1185 // before).
1186 if (new_render_frame_host) {
1187 render_frame_delegate_->RenderFrameCreated(
1188 new_render_frame_host.get());
1189 }
1190 }
1146 } 1191 }
1147 routing_id = render_view_host->GetRoutingID();
1148 frame_to_announce = new_render_frame_host.get();
1149 } 1192 }
1150 1193
1151 // Use this as our new pending RFH if it isn't swapped out. 1194 // Returns the new RFH if it isn't swapped out.
1152 if (!swapped_out) 1195 if (success && !swapped_out) {
1153 pending_render_frame_host_ = new_render_frame_host.Pass(); 1196 DCHECK(new_render_frame_host->GetSiteInstance() == instance);
1154 1197 return new_render_frame_host.Pass();
1155 // If a brand new RFH was created, announce it to observers. 1198 }
1156 if (frame_to_announce) 1199 return nullptr;
nasko 2014/11/24 17:00:27 Is this a valid return value for a scoped_ptr?
carlosk 2014/11/24 18:15:29 I was also in doubt but: a) the code compiled with
1157 render_frame_delegate_->RenderFrameCreated(frame_to_announce);
1158
1159 return routing_id;
1160 } 1200 }
1161 1201
1162 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) { 1202 int RenderFrameHostManager::CreateRenderFrameProxy(SiteInstance* instance) {
1163 // A RenderFrameProxyHost should never be created in the same SiteInstance as 1203 // A RenderFrameProxyHost should never be created in the same SiteInstance as
1164 // the current RFH. 1204 // the current RFH.
1165 CHECK(instance); 1205 CHECK(instance);
1166 CHECK_NE(instance, render_frame_host_->GetSiteInstance()); 1206 CHECK_NE(instance, render_frame_host_->GetSiteInstance());
1167 1207
1168 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance); 1208 RenderFrameProxyHost* proxy = GetRenderFrameProxyHost(instance);
1169 if (proxy) 1209 if (proxy)
(...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after
1551 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host = 1591 scoped_ptr<RenderFrameHostImpl> pending_render_frame_host =
1552 pending_render_frame_host_.Pass(); 1592 pending_render_frame_host_.Pass();
1553 1593
1554 RenderViewDevToolsAgentHost::OnCancelPendingNavigation( 1594 RenderViewDevToolsAgentHost::OnCancelPendingNavigation(
1555 pending_render_frame_host->render_view_host(), 1595 pending_render_frame_host->render_view_host(),
1556 render_frame_host_->render_view_host()); 1596 render_frame_host_->render_view_host());
1557 1597
1558 // We no longer need to prevent the process from exiting. 1598 // We no longer need to prevent the process from exiting.
1559 pending_render_frame_host->GetProcess()->RemovePendingView(); 1599 pending_render_frame_host->GetProcess()->RemovePendingView();
1560 1600
1561 // If the SiteInstance for the pending RFH is being used by others, don't 1601 DiscardRenderFrameHost(pending_render_frame_host.Pass());
1562 // delete the RFH, just swap it out and it can be reused at a later point.
1563 SiteInstanceImpl* site_instance =
1564 pending_render_frame_host->GetSiteInstance();
1565 if (site_instance->active_frame_count() > 1) {
1566 // Any currently suspended navigations are no longer needed.
1567 pending_render_frame_host->CancelSuspendedNavigations();
1568
1569 RenderFrameProxyHost* proxy =
1570 new RenderFrameProxyHost(site_instance, frame_tree_node_);
1571 proxy_hosts_[site_instance->GetId()] = proxy;
1572 pending_render_frame_host->SwapOut(proxy);
1573 if (frame_tree_node_->IsMainFrame())
1574 proxy->TakeFrameHostOwnership(pending_render_frame_host.Pass());
1575 } else {
1576 // We won't be coming back, so delete this one.
1577 pending_render_frame_host.reset();
1578 }
1579 1602
1580 pending_web_ui_.reset(); 1603 pending_web_ui_.reset();
1581 pending_and_current_web_ui_.reset(); 1604 pending_and_current_web_ui_.reset();
1582 } 1605 }
1583 1606
1584 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( 1607 scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost(
1585 scoped_ptr<RenderFrameHostImpl> render_frame_host) { 1608 scoped_ptr<RenderFrameHostImpl> render_frame_host) {
1586 // Swap the two. 1609 // Swap the two.
1587 scoped_ptr<RenderFrameHostImpl> old_render_frame_host = 1610 scoped_ptr<RenderFrameHostImpl> old_render_frame_host =
1588 render_frame_host_.Pass(); 1611 render_frame_host_.Pass();
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1653 void RenderFrameHostManager::DeleteRenderFrameProxyHost( 1676 void RenderFrameHostManager::DeleteRenderFrameProxyHost(
1654 SiteInstance* instance) { 1677 SiteInstance* instance) {
1655 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId()); 1678 RenderFrameProxyHostMap::iterator iter = proxy_hosts_.find(instance->GetId());
1656 if (iter != proxy_hosts_.end()) { 1679 if (iter != proxy_hosts_.end()) {
1657 delete iter->second; 1680 delete iter->second;
1658 proxy_hosts_.erase(iter); 1681 proxy_hosts_.erase(iter);
1659 } 1682 }
1660 } 1683 }
1661 1684
1662 } // namespace content 1685 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698