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

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

Issue 166533002: [wip] Introduce SiteInstanceKeepAlive. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 6 years, 10 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 | Annotate | Revision Log
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 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
117 delegate_->IsHidden()); 117 delegate_->IsHidden());
118 118
119 // Keep track of renderer processes as they start to shut down or are 119 // Keep track of renderer processes as they start to shut down or are
120 // crashed/killed. 120 // crashed/killed.
121 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED, 121 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSED,
122 NotificationService::AllSources()); 122 NotificationService::AllSources());
123 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING, 123 registrar_.Add(this, NOTIFICATION_RENDERER_PROCESS_CLOSING,
124 NotificationService::AllSources()); 124 NotificationService::AllSources());
125 } 125 }
126 126
127 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance(
128 int32 site_instance_id) {
129 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts
130 // in the SiteInstance, then tell their respective FrameTrees to remove all
131 // swapped out RenderFrameHosts corresponding to them.
132 // TODO(creis): Replace this with a RenderFrameHostIterator that protects
133 // against use-after-frees if a later element is deleted before getting to it.
134 scoped_ptr<RenderWidgetHostIterator> widgets(
135 RenderWidgetHostImpl::GetAllRenderWidgetHosts());
136 while (RenderWidgetHost* widget = widgets->GetNextHost()) {
137 if (!widget->IsRenderView())
138 continue;
139 RenderViewHostImpl* rvh =
140 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget));
141 if (site_instance_id == rvh->GetSiteInstance()->GetId()) {
142 // This deletes all RenderFrameHosts using the |rvh|, which then causes
143 // |rvh| to Shutdown.
144 FrameTree* tree = rvh->GetDelegate()->GetFrameTree();
145 tree->ForEach(base::Bind(
146 &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance,
147 site_instance_id));
148 }
149 }
150 }
151
127 RenderViewHostImpl* RenderFrameHostManager::current_host() const { 152 RenderViewHostImpl* RenderFrameHostManager::current_host() const {
128 if (!render_frame_host_) 153 if (!render_frame_host_)
129 return NULL; 154 return NULL;
130 return render_frame_host_->render_view_host(); 155 return render_frame_host_->render_view_host();
131 } 156 }
132 157
133 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const { 158 RenderViewHostImpl* RenderFrameHostManager::pending_render_view_host() const {
134 if (!pending_render_frame_host_) 159 if (!pending_render_frame_host_)
135 return NULL; 160 return NULL;
136 return pending_render_frame_host_->render_view_host(); 161 return pending_render_frame_host_->render_view_host();
(...skipping 1012 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 active_view_count()) { 1174 active_view_count()) {
1150 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id); 1175 ShutdownRenderFrameHostsInSiteInstance(old_site_instance_id);
1151 // This is deleted while cleaning up the SiteInstance's views. 1176 // This is deleted while cleaning up the SiteInstance's views.
1152 old_render_frame_host = NULL; 1177 old_render_frame_host = NULL;
1153 } 1178 }
1154 } else { 1179 } else {
1155 delete old_render_frame_host; 1180 delete old_render_frame_host;
1156 } 1181 }
1157 } 1182 }
1158 1183
1159 void RenderFrameHostManager::ShutdownRenderFrameHostsInSiteInstance(
1160 int32 site_instance_id) {
1161 // First remove any swapped out RFH for this SiteInstance from our own list.
1162 ClearSwappedOutRFHsInSiteInstance(site_instance_id, frame_tree_node_);
sadrul 2014/02/14 13:20:51 I removed this line when making this a static func
1163
1164 // Use the safe RenderWidgetHost iterator for now to find all RenderViewHosts
1165 // in the SiteInstance, then tell their respective FrameTrees to remove all
1166 // swapped out RenderFrameHosts corresponding to them.
1167 // TODO(creis): Replace this with a RenderFrameHostIterator that protects
1168 // against use-after-frees if a later element is deleted before getting to it.
1169 scoped_ptr<RenderWidgetHostIterator> widgets(
1170 RenderWidgetHostImpl::GetAllRenderWidgetHosts());
1171 while (RenderWidgetHost* widget = widgets->GetNextHost()) {
1172 if (!widget->IsRenderView())
1173 continue;
1174 RenderViewHostImpl* rvh =
1175 static_cast<RenderViewHostImpl*>(RenderViewHost::From(widget));
1176 if (site_instance_id == rvh->GetSiteInstance()->GetId()) {
1177 // This deletes all RenderFrameHosts using the |rvh|, which then causes
1178 // |rvh| to Shutdown.
1179 FrameTree* tree = rvh->GetDelegate()->GetFrameTree();
1180 tree->ForEach(base::Bind(
1181 &RenderFrameHostManager::ClearSwappedOutRFHsInSiteInstance,
1182 site_instance_id));
1183 }
1184 }
1185 }
1186
1187 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate( 1184 RenderFrameHostImpl* RenderFrameHostManager::UpdateRendererStateForNavigate(
1188 const NavigationEntryImpl& entry) { 1185 const NavigationEntryImpl& entry) {
1189 // If we are currently navigating cross-process, we want to get back to normal 1186 // If we are currently navigating cross-process, we want to get back to normal
1190 // and then navigate as usual. 1187 // and then navigate as usual.
1191 if (cross_navigation_pending_) { 1188 if (cross_navigation_pending_) {
1192 if (pending_render_frame_host_) 1189 if (pending_render_frame_host_)
1193 CancelPending(); 1190 CancelPending();
1194 cross_navigation_pending_ = false; 1191 cross_navigation_pending_ = false;
1195 } 1192 }
1196 1193
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
1441 SiteInstance* instance) const { 1438 SiteInstance* instance) const {
1442 RenderFrameHostMap::const_iterator iter = 1439 RenderFrameHostMap::const_iterator iter =
1443 swapped_out_hosts_.find(instance->GetId()); 1440 swapped_out_hosts_.find(instance->GetId());
1444 if (iter != swapped_out_hosts_.end()) 1441 if (iter != swapped_out_hosts_.end())
1445 return iter->second; 1442 return iter->second;
1446 1443
1447 return NULL; 1444 return NULL;
1448 } 1445 }
1449 1446
1450 } // namespace content 1447 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698