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..f20e15702c6625b1afb11475e84eb9245d2f3363 |
| --- /dev/null |
| +++ b/chrome/browser/predictors/resource_prefetcher_manager.cc |
| @@ -0,0 +1,112 @@ |
| +// 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 "base/stl_util.h" |
| +#include "chrome/browser/predictors/resource_prefetch_predictor.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( |
| + ResourcePrefetchPredictor* predcitor, |
|
dominich
2012/08/02 15:00:50
nit: predictor
Shishir
2012/08/02 22:06:54
Done.
|
| + const ResourcePrefetchPredictorConfig& config, |
| + net::URLRequestContextGetter* context_getter) |
| + : predictor_(predcitor), |
| + config_(config), |
| + context_getter_(context_getter), |
| + prefetcher_map_deleter_(&prefetcher_map_) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + CHECK(predictor_); |
| + CHECK(context_getter_); |
| +} |
| + |
| +ResourcePrefetcherManager::~ResourcePrefetcherManager() { |
| +} |
| + |
| +void ResourcePrefetcherManager::ShutdownOnUIThread() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + predictor_ = NULL; |
| + BrowserThread::PostTask(BrowserThread::IO, FROM_HERE, |
| + base::Bind(&ResourcePrefetcherManager::ShutdownOnIOThread, |
| + this)); |
| +} |
| + |
| +void ResourcePrefetcherManager::ShutdownOnIOThread() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| +} |
| + |
| +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 (prefetcher_map_.find(main_frame_url) != prefetcher_map_.end()) |
|
dominich
2012/08/02 15:00:50
Avoiding the double lookup:
PrefetcherMap::iterat
Shishir
2012/08/02 22:06:54
Done.
|
| + return; |
| + |
| + ResourcePrefetcher* prefetcher = new ResourcePrefetcher( |
| + this, config_, navigation_id, requests.Pass()); |
| + prefetcher_map_[main_frame_url] = prefetcher; |
| + prefetcher->Start(); |
| +} |
| + |
| +void ResourcePrefetcherManager::MaybeRemovePrefetch( |
| + const NavigationID& navigation_id) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + PrefetcherMap::iterator it = prefetcher_map_.find( |
| + navigation_id.main_frame_url); |
| + if (it != prefetcher_map_.end() && |
| + it->second->navigation_id() == navigation_id) { |
| + it->second->Stop(); |
| + } |
| +} |
| + |
| +void ResourcePrefetcherManager::ResourcePrefetcherFinished( |
| + ResourcePrefetcher* resource_prefetcher, |
| + ResourcePrefetcher::RequestVector* requests) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + // 'predictor_' can only be accessed from the UI thread. |
|
dominich
2012/08/02 15:00:50
nit: variable refs in comments use || in chromium
Shishir
2012/08/02 22:06:54
Done.
|
| + scoped_ptr<ResourcePrefetcher::RequestVector> requests_ptr(requests); |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + base::Bind(&ResourcePrefetcherManager::ResourcePrefetcherFinishedOnUI, |
| + this, |
| + resource_prefetcher->navigation_id(), |
| + base::Passed(requests_ptr.Pass()))); |
|
dominich
2012/08/02 15:00:50
i believe &requests_ptr might be less verbose
Shishir
2012/08/02 22:06:54
Ah syntactic sugar.
|
| + |
| + const GURL& main_frame_url = |
| + resource_prefetcher->navigation_id().main_frame_url; |
| + PrefetcherMap::iterator it = prefetcher_map_.find(main_frame_url); |
| + DCHECK(it != prefetcher_map_.end()); |
| + delete it->second; |
| + prefetcher_map_.erase(main_frame_url); |
| +} |
| + |
| +void ResourcePrefetcherManager::ResourcePrefetcherFinishedOnUI( |
| + const NavigationID& navigation_id, |
| + scoped_ptr<ResourcePrefetcher::RequestVector> requests) { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + |
| + // Notify the 'predictor_'. |
|
dominich
2012/08/02 15:00:50
nit: variable name in comment uses ||
Shishir
2012/08/02 22:06:54
Done.
|
| + if (predictor_) |
| + predictor_->FinishedPrefetchForNavigation(navigation_id, |
| + requests.Pass()); |
| +} |
| + |
| +net::URLRequestContext* ResourcePrefetcherManager::GetURLRequestContext() { |
| + CHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| + |
| + return context_getter_->GetURLRequestContext(); |
| +} |
| + |
| +} // namespace predictors |