Index: content/browser/frame_host/render_frame_host_manager.cc |
diff --git a/content/browser/frame_host/render_frame_host_manager.cc b/content/browser/frame_host/render_frame_host_manager.cc |
index 2dfc2218b3e1e47ee2cfc82be509192a4b15e1b9..c12ed45cb9c2fa0d49861dab9e74514f5c2492c1 100644 |
--- a/content/browser/frame_host/render_frame_host_manager.cc |
+++ b/content/browser/frame_host/render_frame_host_manager.cc |
@@ -88,7 +88,7 @@ RenderFrameHostManager::~RenderFrameHostManager() { |
delete cross_process_frame_connector_; |
// We should always have a current RenderFrameHost except in some tests. |
- render_frame_host_.reset(); |
+ SetRenderFrameHost(scoped_ptr<RenderFrameHostImpl>()); |
// Delete any swapped out RenderFrameHosts. |
for (RenderFrameProxyHostMap::iterator iter = proxy_hosts_.begin(); |
@@ -108,11 +108,11 @@ void RenderFrameHostManager::Init(BrowserContext* browser_context, |
if (!site_instance) |
site_instance = SiteInstance::Create(browser_context); |
- render_frame_host_ = CreateRenderFrameHost(site_instance, |
- view_routing_id, |
- frame_routing_id, |
- false, |
- delegate_->IsHidden()); |
+ SetRenderFrameHost(CreateRenderFrameHost(site_instance, |
+ view_routing_id, |
+ frame_routing_id, |
+ false, |
+ delegate_->IsHidden())); |
// Keep track of renderer processes as they start to shut down or are |
// crashed/killed. |
@@ -1028,8 +1028,7 @@ void RenderFrameHostManager::CommitPending() { |
// Swap in the pending frame and make it active. Also ensure the FrameTree |
// stays in sync. |
scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
- render_frame_host_.Pass(); |
- render_frame_host_ = pending_render_frame_host_.Pass(); |
+ SetRenderFrameHost(pending_render_frame_host_.Pass()); |
if (is_main_frame) |
render_frame_host_->render_view_host()->AttachToFrameTree(); |
@@ -1361,6 +1360,31 @@ void RenderFrameHostManager::CancelPending() { |
pending_and_current_web_ui_.reset(); |
} |
+scoped_ptr<RenderFrameHostImpl> RenderFrameHostManager::SetRenderFrameHost( |
+ scoped_ptr<RenderFrameHostImpl> render_frame_host) { |
+ // Swap the two. |
+ scoped_ptr<RenderFrameHostImpl> old_render_frame_host = |
+ render_frame_host_.Pass(); |
+ render_frame_host_ = render_frame_host.Pass(); |
+ |
+ if (frame_tree_node_->IsMainFrame()) { |
+ // Update the count of WebContents objects using this SiteInstance. All |
+ // subframes are in the same BrowsingInstance as the main frame, so we only |
+ // do this for the top-level frame. This makes the value easier for |
+ // consumers to interpret. |
+ if (render_frame_host_) { |
+ static_cast<SiteInstanceImpl*>(render_frame_host_->GetSiteInstance())-> |
+ IncrementRelatedActiveContentsCount(); |
+ } |
+ if (old_render_frame_host) { |
+ static_cast<SiteInstanceImpl*>(old_render_frame_host->GetSiteInstance())-> |
+ DecrementRelatedActiveContentsCount(); |
+ } |
+ } |
+ |
+ return old_render_frame_host.Pass(); |
+} |
+ |
void RenderFrameHostManager::RenderViewDeleted(RenderViewHost* rvh) { |
// We are doing this in order to work around and to track a crasher |
// (http://crbug.com/23411) where it seems that pending_render_frame_host_ is |