| 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 |