Home | History | Annotate | Download | only in loader
      1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "content/browser/loader/render_view_host_tracker.h"
      6 
      7 #include "base/bind_helpers.h"
      8 #include "base/stl_util.h"
      9 #include "content/browser/loader/resource_dispatcher_host_impl.h"
     10 #include "content/browser/loader/resource_scheduler.h"
     11 #include "content/public/browser/browser_thread.h"
     12 #include "content/public/browser/render_process_host.h"
     13 #include "content/public/browser/render_view_host.h"
     14 
     15 namespace content {
     16 
     17 RenderViewHostTracker::RenderViewHostTracker()
     18     : rvh_created_callback_(
     19           base::Bind(&RenderViewHostTracker::RenderViewHostCreated,
     20                      base::Unretained(this))) {
     21   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     22   RenderViewHost::AddCreatedCallback(rvh_created_callback_);
     23 }
     24 
     25 RenderViewHostTracker::~RenderViewHostTracker() {
     26   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     27   DCHECK(observers_.empty());
     28   RenderViewHost::RemoveCreatedCallback(rvh_created_callback_);
     29 }
     30 
     31 void RenderViewHostTracker::RenderViewHostCreated(RenderViewHost* rvh) {
     32   Observer* observer = new Observer(rvh, this);
     33   observers_.insert(observer);
     34 
     35   int child_id = rvh->GetProcess()->GetID();
     36   int route_id = rvh->GetRoutingID();
     37   BrowserThread::PostTask(
     38       BrowserThread::IO, FROM_HERE,
     39       base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostCreated,
     40                  base::Unretained(ResourceDispatcherHostImpl::Get()),
     41                  child_id, route_id));
     42 }
     43 
     44 void RenderViewHostTracker::RemoveObserver(Observer* observer) {
     45   DCHECK(ContainsKey(observers_, observer));
     46   observers_.erase(observer);
     47   delete observer;
     48 }
     49 
     50 RenderViewHostTracker::Observer::Observer(RenderViewHost* rvh,
     51                                           RenderViewHostTracker* tracker)
     52     : RenderViewHostObserver(rvh),
     53       tracker_(tracker) {
     54 }
     55 
     56 RenderViewHostTracker::Observer::~Observer() {
     57 }
     58 
     59 void RenderViewHostTracker::Observer::RenderViewHostDestroyed(
     60     RenderViewHost* rvh) {
     61   DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
     62   int child_id = rvh->GetProcess()->GetID();
     63   int route_id = rvh->GetRoutingID();
     64 
     65   BrowserThread::PostTask(
     66       BrowserThread::IO, FROM_HERE,
     67       base::Bind(&ResourceDispatcherHostImpl::OnRenderViewHostDeleted,
     68                  base::Unretained(ResourceDispatcherHostImpl::Get()),
     69                  child_id, route_id));
     70 
     71   tracker_->RemoveObserver(this);
     72 }
     73 
     74 }  // namespace content
     75