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 920674e28eb4cb03054289fee6a3e9749e466e4f..dd91ff4a216bb4886348e2074f452e6dff453caa 100644 |
| --- a/chrome/browser/predictors/resource_prefetch_predictor.cc |
| +++ b/chrome/browser/predictors/resource_prefetch_predictor.cc |
| @@ -1087,6 +1087,26 @@ void ResourcePrefetchPredictor::RemoveOldestEntryInRedirectDataMap( |
| tables_, key_to_delete, key_type)); |
| } |
| +void ResourcePrefetchPredictor::RemoveOldestEntryInManifestDataMap( |
| + ManifestDataMap* data_map) { |
| + if (data_map->empty()) |
| + return; |
| + |
| + auto oldest_entry = std::min_element( |
| + data_map->begin(), data_map->end(), |
| + [](const std::pair<const std::string, precache::PrecacheManifest>& lhs, |
| + const std::pair<const std::string, precache::PrecacheManifest>& rhs) { |
| + return lhs.second.id().id() < rhs.second.id().id(); |
|
Benoit L
2017/03/21 13:24:15
This means that there is now a constraint that the
alexilin
2017/03/21 15:32:13
ID = creation time. So yes, it's always increasing
|
| + }); |
| + |
| + std::string key_to_delete = oldest_entry->first; |
| + data_map->erase(oldest_entry); |
| + BrowserThread::PostTask( |
| + BrowserThread::DB, FROM_HERE, |
| + base::Bind(&ResourcePrefetchPredictorTables::DeleteManifestData, tables_, |
| + std::vector<std::string>({key_to_delete}))); |
| +} |
| + |
| void ResourcePrefetchPredictor::OnVisitCountLookup( |
| size_t url_visit_count, |
| const PageRequestSummary& summary) { |
| @@ -1423,6 +1443,35 @@ void ResourcePrefetchPredictor::OnHistoryServiceLoaded( |
| } |
| } |
| +void ResourcePrefetchPredictor::OnManifestFetched( |
| + const std::string& host, |
| + const precache::PrecacheManifest& manifest) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| + if (initialization_state_ != INITIALIZED) |
| + return; |
| + |
| + if (host.length() > ResourcePrefetchPredictorTables::kMaxStringLength || |
| + static_cast<uint32_t>(manifest.ByteSize()) > |
| + ResourcePrefetchPredictorTables::kMaxManifestByteSize) { |
| + return; |
| + } |
| + |
| + auto cache_entry = manifest_table_cache_->find(host); |
| + if (cache_entry == manifest_table_cache_->end()) { |
| + if (manifest_table_cache_->size() >= config_.max_hosts_to_track) |
| + RemoveOldestEntryInManifestDataMap(manifest_table_cache_.get()); |
| + cache_entry = |
| + manifest_table_cache_->insert(std::make_pair(host, manifest)).first; |
| + } else { |
| + cache_entry->second = manifest; |
| + } |
| + |
| + BrowserThread::PostTask( |
| + BrowserThread::DB, FROM_HERE, |
| + base::Bind(&ResourcePrefetchPredictorTables::UpdateManifestData, tables_, |
| + host, cache_entry->second)); |
| +} |
| + |
| void ResourcePrefetchPredictor::ConnectToHistoryService() { |
| // Register for HistoryServiceLoading if it is not ready. |
| history::HistoryService* history_service = |