Chromium Code Reviews| Index: chrome/browser/predictors/resource_prefetcher_manager.cc |
| diff --git a/chrome/browser/predictors/resource_prefetcher_manager.cc b/chrome/browser/predictors/resource_prefetcher_manager.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..76ee7bf36b14e34995756aac60efc25ec9eb492c |
| --- /dev/null |
| +++ b/chrome/browser/predictors/resource_prefetcher_manager.cc |
| @@ -0,0 +1,109 @@ |
| +// Copyright (c) 2012 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 "chrome/browser/predictors/resource_prefetcher_manager.h" |
| + |
| +#include "base/bind.h" |
| +#include "content/public/browser/browser_thread.h" |
| +#include "net/url_request/url_request.h" |
| +#include "net/url_request/url_request_context_getter.h" |
| + |
| +using content::BrowserThread; |
| + |
| +namespace predictors { |
| + |
| +ResourcePrefetcherManager::ResourcePrefetcherManager( |
| + Delegate* delegate, |
| + const ResourcePrefetchPredictorConfig& config, |
| + net::URLRequestContextGetter* context_getter) |
| + : delegate_(delegate), |
| + config_(config), |
| + context_getter_(context_getter) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CHECK(delegate_); |
| + CHECK(context_getter_); |
| +} |
| + |
| +ResourcePrefetcherManager::~ResourcePrefetcherManager() { |
| +} |
| + |
| +void ResourcePrefetcherManager::ShutdownOnUIThread() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + delegate_ = NULL; |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ResourcePrefetcherManager::ShutdownOnIOThread, |
| + this)); |
| +} |
| + |
| +void ResourcePrefetcherManager::ShutdownOnIOThread() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + prefetchers_.clear(); |
|
dominich
2012/07/23 16:04:41
you're relying on linked_ptr to delete these? Is t
Shishir
2012/08/01 22:35:24
Nope, no ScopedMap in codebase. Using a ElementDel
|
| +} |
| + |
| +void ResourcePrefetcherManager::MaybeAddPrefetch( |
| + const NavigationID& navigation_id, |
| + scoped_ptr<ResourcePrefetcher::RequestVector> requests) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + const GURL& main_frame_url = navigation_id.main_frame_url; |
| + if (prefetchers_.find(main_frame_url) != prefetchers_.end()) |
| + return; |
| + |
| + ResourcePrefetcher* prefetcher = new ResourcePrefetcher( |
| + this, config_, navigation_id, requests.Pass()); |
| + prefetchers_[main_frame_url] = make_linked_ptr(prefetcher); |
|
dominich
2012/07/23 16:04:41
double lookup.
Shishir
2012/08/01 22:35:24
I can't combine them unless I create the prefetche
|
| + prefetcher->Start(); |
| +} |
| + |
| +void ResourcePrefetcherManager::MaybeRemovePrefetch( |
| + const NavigationID& navigation_id) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + const GURL& main_frame_url = navigation_id.main_frame_url; |
| + if (prefetchers_.find(main_frame_url) != prefetchers_.end()) { |
| + ResourcePrefetcher* prefetcher = prefetchers_[main_frame_url].get(); |
|
dominich
2012/07/23 16:04:41
double lookup.
Shishir
2012/08/01 22:35:24
Done.
|
| + if (prefetcher->navigation_id() == navigation_id) |
| + prefetcher->Stop(); |
| + } |
| +} |
| + |
| +void ResourcePrefetcherManager::ResourcePrefetcherFinished( |
| + ResourcePrefetcher* resource_prefetcher, |
| + scoped_ptr<ResourcePrefetcher::RequestVector> requests) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + const GURL& main_frame_url = |
| + resource_prefetcher->navigation_id().main_frame_url; |
| + DCHECK(prefetchers_.find(main_frame_url) != prefetchers_.end()); |
| + |
| + // Our delegate can only be accessed from the UI thread. |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(&ResourcePrefetcherManager::ResourcePrefetcherFinishedOnUI, |
| + this, |
| + resource_prefetcher->navigation_id(), |
| + base::Passed(requests.Pass()))); |
| + |
| + prefetchers_.erase(main_frame_url); |
|
dominich
2012/07/23 16:04:41
i think an explicit delete here is better than lin
Shishir
2012/08/01 22:35:24
Done. Although I should point out we are looking a
|
| +} |
| + |
| +void ResourcePrefetcherManager::ResourcePrefetcherFinishedOnUI( |
| + const NavigationID& navigation_id, |
| + scoped_ptr<ResourcePrefetcher::RequestVector> requests) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + // Notify our delegate. |
| + if (delegate_) |
|
dominich
2012/07/23 16:04:41
you CHECK(delegate_) in the ctor. this is unnecess
Shishir
2012/08/01 22:35:24
Its required because the predictor_ is set to null
|
| + delegate_->FinishedPrefetchForNavigation(navigation_id, |
| + requests.Pass()); |
| +} |
| + |
| +net::URLRequestContext* ResourcePrefetcherManager::GetURLRequestContext() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + return context_getter_->GetURLRequestContext(); |
| +} |
| + |
| +} // namespace predictors |