Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" | 5 #include "chrome/browser/predictors/resource_prefetch_predictor.h" |
| 6 | 6 |
| 7 #include <map> | 7 #include <map> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 1069 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1080 } | 1080 } |
| 1081 | 1081 |
| 1082 data_map->erase(key_to_delete); | 1082 data_map->erase(key_to_delete); |
| 1083 BrowserThread::PostTask( | 1083 BrowserThread::PostTask( |
| 1084 BrowserThread::DB, FROM_HERE, | 1084 BrowserThread::DB, FROM_HERE, |
| 1085 base::Bind( | 1085 base::Bind( |
| 1086 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint, | 1086 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint, |
| 1087 tables_, key_to_delete, key_type)); | 1087 tables_, key_to_delete, key_type)); |
| 1088 } | 1088 } |
| 1089 | 1089 |
| 1090 void ResourcePrefetchPredictor::RemoveOldestEntryInManifestDataMap( | |
| 1091 ManifestDataMap* data_map) { | |
| 1092 if (data_map->empty()) | |
| 1093 return; | |
| 1094 | |
| 1095 auto oldest_entry = std::min_element( | |
| 1096 data_map->begin(), data_map->end(), | |
| 1097 [](const std::pair<const std::string, precache::PrecacheManifest>& lhs, | |
| 1098 const std::pair<const std::string, precache::PrecacheManifest>& rhs) { | |
| 1099 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
| |
| 1100 }); | |
| 1101 | |
| 1102 std::string key_to_delete = oldest_entry->first; | |
| 1103 data_map->erase(oldest_entry); | |
| 1104 BrowserThread::PostTask( | |
| 1105 BrowserThread::DB, FROM_HERE, | |
| 1106 base::Bind(&ResourcePrefetchPredictorTables::DeleteManifestData, tables_, | |
| 1107 std::vector<std::string>({key_to_delete}))); | |
| 1108 } | |
| 1109 | |
| 1090 void ResourcePrefetchPredictor::OnVisitCountLookup( | 1110 void ResourcePrefetchPredictor::OnVisitCountLookup( |
| 1091 size_t url_visit_count, | 1111 size_t url_visit_count, |
| 1092 const PageRequestSummary& summary) { | 1112 const PageRequestSummary& summary) { |
| 1093 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1113 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 1094 | 1114 |
| 1095 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl", | 1115 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl", |
| 1096 url_visit_count); | 1116 url_visit_count); |
| 1097 | 1117 |
| 1098 // TODO(alexilin): make only one request to DB thread. | 1118 // TODO(alexilin): make only one request to DB thread. |
| 1099 | 1119 |
| (...skipping 316 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1416 } | 1436 } |
| 1417 } | 1437 } |
| 1418 | 1438 |
| 1419 void ResourcePrefetchPredictor::OnHistoryServiceLoaded( | 1439 void ResourcePrefetchPredictor::OnHistoryServiceLoaded( |
| 1420 history::HistoryService* history_service) { | 1440 history::HistoryService* history_service) { |
| 1421 if (initialization_state_ == INITIALIZING) { | 1441 if (initialization_state_ == INITIALIZING) { |
| 1422 OnHistoryAndCacheLoaded(); | 1442 OnHistoryAndCacheLoaded(); |
| 1423 } | 1443 } |
| 1424 } | 1444 } |
| 1425 | 1445 |
| 1446 void ResourcePrefetchPredictor::OnManifestFetched( | |
| 1447 const std::string& host, | |
| 1448 const precache::PrecacheManifest& manifest) { | |
| 1449 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 1450 if (initialization_state_ != INITIALIZED) | |
| 1451 return; | |
| 1452 | |
| 1453 if (host.length() > ResourcePrefetchPredictorTables::kMaxStringLength || | |
| 1454 static_cast<uint32_t>(manifest.ByteSize()) > | |
| 1455 ResourcePrefetchPredictorTables::kMaxManifestByteSize) { | |
| 1456 return; | |
| 1457 } | |
| 1458 | |
| 1459 auto cache_entry = manifest_table_cache_->find(host); | |
| 1460 if (cache_entry == manifest_table_cache_->end()) { | |
| 1461 if (manifest_table_cache_->size() >= config_.max_hosts_to_track) | |
| 1462 RemoveOldestEntryInManifestDataMap(manifest_table_cache_.get()); | |
| 1463 cache_entry = | |
| 1464 manifest_table_cache_->insert(std::make_pair(host, manifest)).first; | |
| 1465 } else { | |
| 1466 cache_entry->second = manifest; | |
| 1467 } | |
| 1468 | |
| 1469 BrowserThread::PostTask( | |
| 1470 BrowserThread::DB, FROM_HERE, | |
| 1471 base::Bind(&ResourcePrefetchPredictorTables::UpdateManifestData, tables_, | |
| 1472 host, cache_entry->second)); | |
| 1473 } | |
| 1474 | |
| 1426 void ResourcePrefetchPredictor::ConnectToHistoryService() { | 1475 void ResourcePrefetchPredictor::ConnectToHistoryService() { |
| 1427 // Register for HistoryServiceLoading if it is not ready. | 1476 // Register for HistoryServiceLoading if it is not ready. |
| 1428 history::HistoryService* history_service = | 1477 history::HistoryService* history_service = |
| 1429 HistoryServiceFactory::GetForProfile(profile_, | 1478 HistoryServiceFactory::GetForProfile(profile_, |
| 1430 ServiceAccessType::EXPLICIT_ACCESS); | 1479 ServiceAccessType::EXPLICIT_ACCESS); |
| 1431 if (!history_service) | 1480 if (!history_service) |
| 1432 return; | 1481 return; |
| 1433 DCHECK(!history_service_observer_.IsObserving(history_service)); | 1482 DCHECK(!history_service_observer_.IsObserving(history_service)); |
| 1434 history_service_observer_.Add(history_service); | 1483 history_service_observer_.Add(history_service); |
| 1435 if (history_service->BackendLoaded()) { | 1484 if (history_service->BackendLoaded()) { |
| 1436 // HistoryService is already loaded. Continue with Initialization. | 1485 // HistoryService is already loaded. Continue with Initialization. |
| 1437 OnHistoryAndCacheLoaded(); | 1486 OnHistoryAndCacheLoaded(); |
| 1438 } | 1487 } |
| 1439 } | 1488 } |
| 1440 | 1489 |
| 1441 //////////////////////////////////////////////////////////////////////////////// | 1490 //////////////////////////////////////////////////////////////////////////////// |
| 1442 // TestObserver. | 1491 // TestObserver. |
| 1443 | 1492 |
| 1444 TestObserver::~TestObserver() { | 1493 TestObserver::~TestObserver() { |
| 1445 predictor_->SetObserverForTesting(nullptr); | 1494 predictor_->SetObserverForTesting(nullptr); |
| 1446 } | 1495 } |
| 1447 | 1496 |
| 1448 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) | 1497 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) |
| 1449 : predictor_(predictor) { | 1498 : predictor_(predictor) { |
| 1450 predictor_->SetObserverForTesting(this); | 1499 predictor_->SetObserverForTesting(this); |
| 1451 } | 1500 } |
| 1452 | 1501 |
| 1453 } // namespace predictors | 1502 } // namespace predictors |
| OLD | NEW |