Index: components/precache/core/precache_fetcher.cc |
diff --git a/components/precache/core/precache_fetcher.cc b/components/precache/core/precache_fetcher.cc |
index 44d4aa6c7e318e8c239bdd58e49fe8095aaa30e4..bb5f67f28dd24e5986f593809dca23b029e0e7fe 100644 |
--- a/components/precache/core/precache_fetcher.cc |
+++ b/components/precache/core/precache_fetcher.cc |
@@ -139,6 +139,16 @@ class URLFetcherNullWriter : public net::URLFetcherResponseWriter { |
} |
}; |
+void AppendManifestURLIfNew(const std::string& prefix, |
+ const std::string& name, |
+ base::hash_set<std::string>* seen_manifest_urls, |
+ std::list<GURL>* unique_manifest_urls) { |
+ const std::string manifest_url = ConstructManifestURL(prefix, name); |
+ bool first_seen = seen_manifest_urls->insert(manifest_url).second; |
+ if (first_seen) |
+ unique_manifest_urls->push_back(GURL(manifest_url)); |
+} |
+ |
} // namespace |
PrecacheFetcher::Fetcher::Fetcher( |
@@ -271,6 +281,11 @@ PrecacheFetcher::PrecacheFetcher( |
} |
PrecacheFetcher::~PrecacheFetcher() { |
+ base::TimeDelta time_to_fetch = base::TimeTicks::Now() - start_time_; |
+ UMA_HISTOGRAM_CUSTOM_TIMES("Precache.Fetch.TimeToComplete", time_to_fetch, |
+ base::TimeDelta::FromSeconds(1), |
+ base::TimeDelta::FromHours(4), 50); |
+ |
// Number of manifests for which we have downloaded all resources. |
int manifests_completed = |
num_manifest_urls_to_fetch_ - manifest_urls_to_fetch_.size(); |
@@ -305,6 +320,7 @@ void PrecacheFetcher::Start() { |
// Fetch the precache configuration settings from the server. |
DCHECK(pool_.IsEmpty()) << "All parallel requests should be available"; |
+ VLOG(3) << "Fetching " << config_url; |
pool_.Add(scoped_ptr<Fetcher>(new Fetcher( |
request_context_.get(), config_url, |
base::Bind(&PrecacheFetcher::OnConfigFetchComplete, |
@@ -317,6 +333,7 @@ void PrecacheFetcher::StartNextResourceFetch() { |
const size_t max_bytes = |
std::min(config_->max_bytes_per_resource(), |
config_->max_bytes_total() - total_response_bytes_); |
+ VLOG(3) << "Fetching " << resource_urls_to_fetch_.front(); |
pool_.Add(scoped_ptr<Fetcher>( |
new Fetcher(request_context_.get(), resource_urls_to_fetch_.front(), |
base::Bind(&PrecacheFetcher::OnResourceFetchComplete, |
@@ -336,6 +353,7 @@ void PrecacheFetcher::StartNextManifestFetch() { |
DCHECK(pool_.IsAvailable()) |
<< "There are no available parallel requests to fetch the next manifest. " |
"Did you forget to call Delete?"; |
+ VLOG(3) << "Fetching " << manifest_urls_to_fetch_.front(); |
pool_.Add(scoped_ptr<Fetcher>(new Fetcher( |
request_context_.get(), manifest_urls_to_fetch_.front(), |
base::Bind(&PrecacheFetcher::OnManifestFetchComplete, |
@@ -348,8 +366,8 @@ void PrecacheFetcher::StartNextManifestFetch() { |
void PrecacheFetcher::StartNextFetch() { |
// If over the precache total size cap, then stop prefetching. |
if (total_response_bytes_ > config_->max_bytes_total()) { |
- resource_urls_to_fetch_.clear(); |
- manifest_urls_to_fetch_.clear(); |
+ precache_delegate_->OnDone(); |
+ return; |
} |
StartNextResourceFetch(); |
@@ -357,11 +375,6 @@ void PrecacheFetcher::StartNextFetch() { |
if (pool_.IsEmpty()) { |
// There are no more URLs to fetch, so end the precache cycle. |
- base::TimeDelta time_to_fetch = base::TimeTicks::Now() - start_time_; |
- UMA_HISTOGRAM_CUSTOM_TIMES("Precache.Fetch.TimeToComplete", time_to_fetch, |
- base::TimeDelta::FromSeconds(1), |
- base::TimeDelta::FromHours(4), 50); |
- |
precache_delegate_->OnDone(); |
// OnDone may have deleted this PrecacheFetcher, so don't do anything after |
// it is called. |
@@ -383,9 +396,9 @@ void PrecacheFetcher::OnConfigFetchComplete(const Fetcher& source) { |
DCHECK_NE(std::string(), prefix) |
<< "Could not determine the precache manifest URL prefix."; |
- // Keep track of manifest URLs that are being fetched, in order to remove |
+ // Keep track of manifest URLs that are being fetched, in order to elide |
// duplicates. |
- base::hash_set<std::string> unique_manifest_urls; |
+ base::hash_set<std::string> seen_manifest_urls; |
// Attempt to fetch manifests for starting hosts up to the maximum top sites |
// count. If a manifest does not exist for a particular starting host, then |
@@ -395,14 +408,14 @@ void PrecacheFetcher::OnConfigFetchComplete(const Fetcher& source) { |
++rank; |
if (rank > config_->top_sites_count()) |
break; |
- unique_manifest_urls.insert(ConstructManifestURL(prefix, host)); |
+ AppendManifestURLIfNew(prefix, host, &seen_manifest_urls, |
+ &manifest_urls_to_fetch_); |
} |
- for (const std::string& url : config_->forced_site()) |
- unique_manifest_urls.insert(ConstructManifestURL(prefix, url)); |
+ for (const std::string& host : config_->forced_site()) |
+ AppendManifestURLIfNew(prefix, host, &seen_manifest_urls, |
+ &manifest_urls_to_fetch_); |
- for (const std::string& manifest_url : unique_manifest_urls) |
- manifest_urls_to_fetch_.push_back(GURL(manifest_url)); |
num_manifest_urls_to_fetch_ = manifest_urls_to_fetch_.size(); |
} |
pool_.Delete(source); |