blob: 2f006e8e990aa47df9f45adaf42be82a61aea791 [file] [log] [blame]
// 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