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