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 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1198 } | 1198 } |
1199 | 1199 |
1200 void ResourcePrefetchPredictor::OnVisitCountLookup( | 1200 void ResourcePrefetchPredictor::OnVisitCountLookup( |
1201 size_t url_visit_count, | 1201 size_t url_visit_count, |
1202 const PageRequestSummary& summary) { | 1202 const PageRequestSummary& summary) { |
1203 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 1203 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
1204 | 1204 |
1205 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl", | 1205 UMA_HISTOGRAM_COUNTS("ResourcePrefetchPredictor.HistoryVisitCountForUrl", |
1206 url_visit_count); | 1206 url_visit_count); |
1207 | 1207 |
1208 // TODO(alexilin): make only one request to DB thread. | |
1209 | |
1210 if (config_.is_url_learning_enabled) { | 1208 if (config_.is_url_learning_enabled) { |
1211 // URL level data - merge only if we already saved the data, or it | 1209 // URL level data - merge only if we already saved the data, or it |
1212 // meets the cutoff requirement. | 1210 // meets the cutoff requirement. |
1213 const std::string url_spec = summary.main_frame_url.spec(); | 1211 const std::string url_spec = summary.main_frame_url.spec(); |
1214 bool already_tracking = | 1212 bool already_tracking = |
1215 url_table_cache_->find(url_spec) != url_table_cache_->end(); | 1213 url_table_cache_->find(url_spec) != url_table_cache_->end(); |
1216 bool should_track_url = | 1214 bool should_track_url = |
1217 already_tracking || (url_visit_count >= config_.min_url_visit_count); | 1215 already_tracking || (url_visit_count >= config_.min_url_visit_count); |
1218 | 1216 |
1219 if (should_track_url) { | 1217 if (should_track_url) { |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1380 // If the row has no resources, remove it from the cache and delete the | 1378 // If the row has no resources, remove it from the cache and delete the |
1381 // entry in the database. Else update the database. | 1379 // entry in the database. Else update the database. |
1382 if (data.resources_size() == 0) { | 1380 if (data.resources_size() == 0) { |
1383 data_map->erase(key); | 1381 data_map->erase(key); |
1384 BrowserThread::PostTask( | 1382 BrowserThread::PostTask( |
1385 BrowserThread::DB, FROM_HERE, | 1383 BrowserThread::DB, FROM_HERE, |
1386 base::Bind( | 1384 base::Bind( |
1387 &ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint, | 1385 &ResourcePrefetchPredictorTables::DeleteSingleResourceDataPoint, |
1388 tables_, key, key_type)); | 1386 tables_, key, key_type)); |
1389 } else { | 1387 } else { |
1390 PrefetchData empty_data; | |
1391 RedirectData empty_redirect_data; | |
1392 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | |
1393 const PrefetchData& host_data = is_host ? data : empty_data; | |
1394 const PrefetchData& url_data = is_host ? empty_data : data; | |
1395 BrowserThread::PostTask( | 1388 BrowserThread::PostTask( |
1396 BrowserThread::DB, FROM_HERE, | 1389 BrowserThread::DB, FROM_HERE, |
1397 base::Bind(&ResourcePrefetchPredictorTables::UpdateData, tables_, | 1390 base::Bind(&ResourcePrefetchPredictorTables::UpdateResourceData, |
1398 url_data, host_data, empty_redirect_data, | 1391 tables_, data, key_type)); |
1399 empty_redirect_data)); | |
1400 } | 1392 } |
1401 | 1393 |
1402 // Predictor learns about both redirected and non-redirected destinations to | 1394 // Predictor learns about both redirected and non-redirected destinations to |
1403 // estimate whether the endpoint is permanent. | 1395 // estimate whether the endpoint is permanent. |
1404 LearnRedirect(key_before_redirects, key_type, key, max_data_map_size, | 1396 LearnRedirect(key_before_redirects, key_type, key, max_data_map_size, |
1405 redirect_map); | 1397 redirect_map); |
1406 } | 1398 } |
1407 | 1399 |
1408 void ResourcePrefetchPredictor::LearnRedirect(const std::string& key, | 1400 void ResourcePrefetchPredictor::LearnRedirect(const std::string& key, |
1409 PrefetchKeyType key_type, | 1401 PrefetchKeyType key_type, |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1457 &data, config_.max_redirect_consecutive_misses); | 1449 &data, config_.max_redirect_consecutive_misses); |
1458 | 1450 |
1459 if (data.redirect_endpoints_size() == 0) { | 1451 if (data.redirect_endpoints_size() == 0) { |
1460 redirect_map->erase(cache_entry); | 1452 redirect_map->erase(cache_entry); |
1461 BrowserThread::PostTask( | 1453 BrowserThread::PostTask( |
1462 BrowserThread::DB, FROM_HERE, | 1454 BrowserThread::DB, FROM_HERE, |
1463 base::Bind( | 1455 base::Bind( |
1464 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint, | 1456 &ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint, |
1465 tables_, key, key_type)); | 1457 tables_, key, key_type)); |
1466 } else { | 1458 } else { |
1467 RedirectData empty_redirect_data; | |
1468 PrefetchData empty_data; | |
1469 bool is_host = key_type == PREFETCH_KEY_TYPE_HOST; | |
1470 const RedirectData& host_redirect_data = | |
1471 is_host ? data : empty_redirect_data; | |
1472 const RedirectData& url_redirect_data = | |
1473 is_host ? empty_redirect_data : data; | |
1474 BrowserThread::PostTask( | 1459 BrowserThread::PostTask( |
1475 BrowserThread::DB, FROM_HERE, | 1460 BrowserThread::DB, FROM_HERE, |
1476 base::Bind(&ResourcePrefetchPredictorTables::UpdateData, tables_, | 1461 base::Bind(&ResourcePrefetchPredictorTables::UpdateRedirectData, |
1477 empty_data, empty_data, url_redirect_data, | 1462 tables_, data, key_type)); |
1478 host_redirect_data)); | |
1479 } | 1463 } |
1480 } | 1464 } |
1481 | 1465 |
1482 void ResourcePrefetchPredictor::LearnOrigins( | 1466 void ResourcePrefetchPredictor::LearnOrigins( |
1483 const std::string& host, | 1467 const std::string& host, |
1484 const std::map<GURL, OriginRequestSummary>& summaries, | 1468 const std::map<GURL, OriginRequestSummary>& summaries, |
1485 size_t max_data_map_size, | 1469 size_t max_data_map_size, |
1486 OriginDataMap* data_map) { | 1470 OriginDataMap* data_map) { |
1487 if (host.size() > ResourcePrefetchPredictorTables::kMaxStringLength) | 1471 if (host.size() > ResourcePrefetchPredictorTables::kMaxStringLength) |
1488 return; | 1472 return; |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1698 TestObserver::~TestObserver() { | 1682 TestObserver::~TestObserver() { |
1699 predictor_->SetObserverForTesting(nullptr); | 1683 predictor_->SetObserverForTesting(nullptr); |
1700 } | 1684 } |
1701 | 1685 |
1702 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) | 1686 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) |
1703 : predictor_(predictor) { | 1687 : predictor_(predictor) { |
1704 predictor_->SetObserverForTesting(this); | 1688 predictor_->SetObserverForTesting(this); |
1705 } | 1689 } |
1706 | 1690 |
1707 } // namespace predictors | 1691 } // namespace predictors |
OLD | NEW |