Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2585)

Unified Diff: chrome/browser/predictors/resource_prefetch_predictor.cc

Issue 2815513011: predictors: Remove resources marked as unused. (Closed)
Patch Set: Remove unused constants. Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 76719aeb8c5c20a55eca09d9f2227a5af61662cf..4d9a4759e411794eca109d20b7924e882832d443 100644
--- a/chrome/browser/predictors/resource_prefetch_predictor.cc
+++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
@@ -1637,8 +1637,18 @@ void ResourcePrefetchPredictor::OnManifestFetched(
if (initialization_state_ != INITIALIZED)
return;
- if (!config_.is_manifests_enabled ||
- host.length() > ResourcePrefetchPredictorTables::kMaxStringLength ||
+ if (!config_.is_manifests_enabled)
+ return;
+
+ // The manifest host has "www." prefix stripped, the manifest host could
+ // correspond to two different hosts in the prefetch database.
+ UpdatePrefetchDataByManifest(host, PREFETCH_KEY_TYPE_HOST,
+ host_table_cache_.get(), manifest);
+ UpdatePrefetchDataByManifest("www." + host, PREFETCH_KEY_TYPE_HOST,
+ host_table_cache_.get(), manifest);
+
+ // The manifest is too large to store.
+ if (host.length() > ResourcePrefetchPredictorTables::kMaxStringLength ||
static_cast<uint32_t>(manifest.ByteSize()) > kMaxManifestByteSize) {
return;
}
@@ -1661,6 +1671,48 @@ void ResourcePrefetchPredictor::OnManifestFetched(
host, cache_entry->second));
}
+void ResourcePrefetchPredictor::UpdatePrefetchDataByManifest(
+ const std::string& key,
+ PrefetchKeyType key_type,
+ PrefetchDataMap* data_map,
+ const precache::PrecacheManifest& manifest) {
+ DCHECK_CURRENTLY_ON(BrowserThread::UI);
+ DCHECK_EQ(INITIALIZED, initialization_state_);
+
+ auto resource_entry = data_map->find(key);
+ if (resource_entry == data_map->end())
+ return;
+
+ PrefetchData& data = resource_entry->second;
+ std::map<std::string, int> manifest_index;
+ 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);
+ if (unused_bitset.has_value()) {
+ // Remove unused resources from |data|.
+ auto new_end = std::remove_if(
+ data.mutable_resources()->begin(), data.mutable_resources()->end(),
+ [&](const ResourceData& x) {
+ auto it = manifest_index.find(x.resource_url());
+ if (it == manifest_index.end())
+ return false;
+ return !unused_bitset.value()[it->second];
+ });
+ was_updated = new_end != data.mutable_resources()->end();
+ data.mutable_resources()->erase(new_end, data.mutable_resources()->end());
+ }
+
+ if (was_updated) {
+ BrowserThread::PostTask(
+ BrowserThread::DB, FROM_HERE,
+ base::Bind(&ResourcePrefetchPredictorTables::UpdateResourceData,
+ tables_, data, key_type));
+ }
+}
+
void ResourcePrefetchPredictor::ConnectToHistoryService() {
// Register for HistoryServiceLoading if it is not ready.
history::HistoryService* history_service =

Powered by Google App Engine
This is Rietveld 408576698