Chromium Code Reviews| Index: chrome/browser/predictors/resource_prefetch_predictor.cc |
| diff --git a/chrome/browser/predictors/resource_prefetch_predictor.cc b/chrome/browser/predictors/resource_prefetch_predictor.cc |
| index 65f3f90a68533dc541111e060820f3b160dcd2b4..a8f9f64f211f3ab05468a5075bb6159e5398043d 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor.cc |
| @@ -100,6 +100,12 @@ void InitializeOriginStatFromOriginRequestSummary( |
| origin->set_accessed_network(summary.accessed_network); |
| } |
| +bool IsManifestTooOld(const precache::PrecacheManifest& manifest) { |
| + const base::TimeDelta kMaxManifestAge = base::TimeDelta::FromDays(5); |
|
alexilin
2017/04/18 07:05:03
I don't feel strongly about this.
Probably, it wo
|
| + return base::Time::Now() - base::Time::FromDoubleT(manifest.id().id()) > |
| + kMaxManifestAge; |
| +} |
| + |
| // Used to fetch the visit count for a URL from the History database. |
| class GetUrlVisitCountTask : public history::HistoryDBTask { |
| public: |
| @@ -898,16 +904,33 @@ bool ResourcePrefetchPredictor::GetPrefetchData( |
| // Use host data if the URL-based prediction isn't available. |
| std::string main_frame_url_host = main_frame_url.host(); |
| if (GetRedirectEndpoint(main_frame_url_host, *host_redirect_table_cache_, |
| - &redirect_endpoint) && |
| - PopulatePrefetcherRequest(redirect_endpoint, *host_table_cache_, urls)) { |
| - if (prediction) { |
| - prediction->is_host = true; |
| - prediction->main_frame_key = redirect_endpoint; |
| - prediction->is_redirected = (redirect_endpoint != main_frame_url_host); |
| + &redirect_endpoint)) { |
| + if (PopulatePrefetcherRequest(redirect_endpoint, *host_table_cache_, |
| + urls)) { |
| + if (prediction) { |
| + prediction->is_host = true; |
| + prediction->main_frame_key = redirect_endpoint; |
| + prediction->is_redirected = (redirect_endpoint != main_frame_url_host); |
| + } |
| + return true; |
| } |
| - return true; |
| - } |
| + if (config_.is_manifests_enabled) { |
| + // Use manifest data for host if available. |
| + std::string manifest_host = redirect_endpoint; |
| + if (base::StartsWith(manifest_host, "www.", base::CompareCase::SENSITIVE)) |
|
Benoit L
2017/04/18 16:28:39
is www systematically stripped from the manifest k
alexilin
2017/04/19 07:59:25
Yes. (See history::HostForTopHosts and how it's us
|
| + manifest_host.assign(manifest_host, 4, std::string::npos); |
| + if (PopulatePrefetcherRequestByManifest(manifest_host, urls)) { |
| + if (prediction) { |
| + prediction->is_host = true; |
| + prediction->main_frame_key = redirect_endpoint; |
| + prediction->is_redirected = |
| + (redirect_endpoint != main_frame_url_host); |
| + } |
| + return true; |
| + } |
| + } |
| + } |
| return false; |
| } |
| @@ -931,6 +954,45 @@ bool ResourcePrefetchPredictor::PopulatePrefetcherRequest( |
| return has_prefetchable_resource; |
| } |
| +bool ResourcePrefetchPredictor::PopulatePrefetcherRequestByManifest( |
| + const std::string& manifest_host, |
| + std::vector<GURL>* urls) const { |
| + auto it = manifest_table_cache_->find(manifest_host); |
| + if (it == manifest_table_cache_->end()) |
| + return false; |
| + |
| + const precache::PrecacheManifest& manifest = it->second; |
| + |
| + if (IsManifestTooOld(manifest)) |
| + return false; |
| + |
| + const float kMinPrecacheResourceWeightToTriggerPrefetch = 0.7f; |
|
Benoit L
2017/04/18 16:28:39
Have you looked at the practical meaning of this t
alexilin
2017/04/19 07:59:25
Roughly speaking, it's percentage of host pages wh
Benoit L
2017/04/19 14:48:54
Ok, so can you add a comment saying that this is r
alexilin
2017/04/19 15:35:11
Done.
|
| + |
| + base::Optional<std::vector<bool>> unused_bitset = |
| + precache::GetResourceBitset(manifest, internal::kUnusedRemovedExperiment); |
| + base::Optional<std::vector<bool>> versioned_bitset = |
| + precache::GetResourceBitset(manifest, |
| + internal::kVersionedRemovedExperiment); |
| + base::Optional<std::vector<bool>> no_store_bitset = |
| + precache::GetResourceBitset(manifest, |
| + internal::kNoStoreRemovedExperiment); |
| + |
| + bool has_prefetchable_resource = false; |
| + for (int i = 0; i < manifest.resource_size(); ++i) { |
| + const precache::PrecacheResource& resource = manifest.resource(i); |
| + if (resource.weight_ratio() > kMinPrecacheResourceWeightToTriggerPrefetch && |
| + (!unused_bitset.has_value() || unused_bitset.value()[i]) && |
|
Benoit L
2017/04/18 16:28:39
what is the meaning of the bits?
if unused, versi
alexilin
2017/04/19 07:59:25
Renamed and commented.
Done.
|
| + (!versioned_bitset.has_value() || versioned_bitset.value()[i]) && |
| + (!no_store_bitset.has_value() || no_store_bitset.value()[i])) { |
| + has_prefetchable_resource = true; |
| + if (urls) |
| + urls->push_back(GURL(resource.url())); |
|
Benoit L
2017/04/18 16:28:39
useless_nit: emplace_back?
alexilin
2017/04/19 07:59:25
Done.
|
| + } |
| + } |
| + |
| + return has_prefetchable_resource; |
| +} |
| + |
| void ResourcePrefetchPredictor::CreateCaches( |
| std::unique_ptr<PrefetchDataMap> url_data_map, |
| std::unique_ptr<PrefetchDataMap> host_data_map, |
| @@ -1637,7 +1699,7 @@ void ResourcePrefetchPredictor::OnManifestFetched( |
| if (initialization_state_ != INITIALIZED) |
| return; |
| - if (!config_.is_manifests_enabled) |
| + if (!config_.is_manifests_enabled || IsManifestTooOld(manifest)) |
| return; |
| // The manifest host has "www." prefix stripped, the manifest host could |
| @@ -1688,9 +1750,10 @@ void ResourcePrefetchPredictor::UpdatePrefetchDataByManifest( |
| for (int i = 0; i < manifest.resource_size(); ++i) |
| manifest_index.insert({manifest.resource(i).url(), i}); |
| - bool was_updated = false; |
| base::Optional<std::vector<bool>> unused_bitset = |
| precache::GetResourceBitset(manifest, internal::kUnusedRemovedExperiment); |
| + |
| + bool was_updated = false; |
| if (unused_bitset.has_value()) { |
| // Remove unused resources from |data|. |
| auto new_end = std::remove_if( |