| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "content/browser/loader/render_view_host_tracker.h" |
| |
| #include "base/bind_helpers.h" |
| #include "base/stl_util.h" |
| #include "content/browser/loader/resource_dispatcher_host_impl.h" |
| #include "content/browser/loader/resource_scheduler.h" |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/render_process_host.h" |
| #include "content/public/browser/render_view_host.h" |
| |
| namespace content { |
| |
| RenderViewHostTracker::RenderViewHostTracker() |
| : rvh_created_callback_( |
| base::Bind(&RenderViewHostTracker::RenderViewHostCreated, |
| base::Unretained(this))) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| RenderViewHost::AddCreatedCallback(rvh_created_callback_); |
| } |
| |
| RenderViewHostTracker::~RenderViewHostTracker() { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| DCHECK(observers_.empty()); |
| RenderViewHost::RemoveCreatedCallback(rvh_created_callback_); |
| } |
| |
| void RenderViewHostTracker::RenderViewHostCreated(RenderViewHost* rvh) { |
| Observer* observer = new Observer(rvh, this); |
| observers_.insert(observer); |
| |
| int child_id = rvh->GetProcess()->GetID(); |
| int route_id = rvh->GetRoutingID(); |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated, |
| base::Unretained(ResourceDispatcherHostImpl::Get()), |
| child_id, route_id)); |
| } |
| |
| void RenderViewHostTracker::RemoveObserver(Observer* observer) { |
| DCHECK(ContainsKey(observers_, observer)); |
| observers_.erase(observer); |
| delete observer; |
| } |
| |
| RenderViewHostTracker::Observer::Observer(RenderViewHost* rvh, |
| RenderViewHostTracker* tracker) |
| : RenderViewHostObserver(rvh), |
| tracker_(tracker) { |
| } |
| |
| RenderViewHostTracker::Observer::~Observer() { |
| } |
| |
| void RenderViewHostTracker::Observer::RenderViewHostDestroyed( |
| RenderViewHost* rvh) { |
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| int child_id = rvh->GetProcess()->GetID(); |
| int route_id = rvh->GetRoutingID(); |
| |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted, |
| base::Unretained(ResourceDispatcherHostImpl::Get()), |
| child_id, route_id)); |
| |
| tracker_->RemoveObserver(this); |
| } |
| |
| } // namespace content |