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

Side by Side Diff: chrome/browser/predictors/resource_prefetch_predictor.cc

Issue 2738613003: predictors: Add Manifest table to ResourcePrefetchPredictor. (Closed)
Patch Set: Add caution message. Created 3 years, 9 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 unified diff | Download patch
OLDNEW
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
11 #include "base/macros.h" 11 #include "base/macros.h"
12 #include "base/memory/ptr_util.h" 12 #include "base/memory/ptr_util.h"
13 #include "base/metrics/histogram_macros.h" 13 #include "base/metrics/histogram_macros.h"
14 #include "base/rand_util.h" 14 #include "base/rand_util.h"
15 #include "base/time/time.h" 15 #include "base/time/time.h"
16 #include "base/trace_event/trace_event.h" 16 #include "base/trace_event/trace_event.h"
17 #include "chrome/browser/history/history_service_factory.h" 17 #include "chrome/browser/history/history_service_factory.h"
18 #include "chrome/browser/predictors/predictor_database.h" 18 #include "chrome/browser/predictors/predictor_database.h"
19 #include "chrome/browser/predictors/predictor_database_factory.h" 19 #include "chrome/browser/predictors/predictor_database_factory.h"
20 #include "chrome/browser/predictors/resource_prefetcher_manager.h" 20 #include "chrome/browser/predictors/resource_prefetcher_manager.h"
21 #include "chrome/browser/profiles/profile.h" 21 #include "chrome/browser/profiles/profile.h"
22 #include "components/history/core/browser/history_database.h" 22 #include "components/history/core/browser/history_database.h"
23 #include "components/history/core/browser/history_service.h" 23 #include "components/history/core/browser/history_service.h"
24 #include "components/history/core/browser/url_utils.h"
24 #include "components/mime_util/mime_util.h" 25 #include "components/mime_util/mime_util.h"
25 #include "content/public/browser/browser_thread.h" 26 #include "content/public/browser/browser_thread.h"
26 #include "content/public/browser/resource_request_info.h" 27 #include "content/public/browser/resource_request_info.h"
27 #include "content/public/browser/web_contents.h" 28 #include "content/public/browser/web_contents.h"
28 #include "net/http/http_response_headers.h" 29 #include "net/http/http_response_headers.h"
29 #include "net/url_request/url_request.h" 30 #include "net/url_request/url_request.h"
30 31
31 using content::BrowserThread; 32 using content::BrowserThread;
32 33
33 namespace predictors { 34 namespace predictors {
(...skipping 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
496 497
497 if (initialization_state_ != NOT_INITIALIZED) 498 if (initialization_state_ != NOT_INITIALIZED)
498 return; 499 return;
499 initialization_state_ = INITIALIZING; 500 initialization_state_ = INITIALIZING;
500 501
501 // Create local caches using the database as loaded. 502 // Create local caches using the database as loaded.
502 auto url_data_map = base::MakeUnique<PrefetchDataMap>(); 503 auto url_data_map = base::MakeUnique<PrefetchDataMap>();
503 auto host_data_map = base::MakeUnique<PrefetchDataMap>(); 504 auto host_data_map = base::MakeUnique<PrefetchDataMap>();
504 auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>(); 505 auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>();
505 auto host_redirect_data_map = base::MakeUnique<RedirectDataMap>(); 506 auto host_redirect_data_map = base::MakeUnique<RedirectDataMap>();
507 auto manifest_data_map = base::MakeUnique<ManifestDataMap>();
506 508
507 // Get raw pointers to pass to the first task. Ownership of the unique_ptrs 509 // Get raw pointers to pass to the first task. Ownership of the unique_ptrs
508 // will be passed to the reply task. 510 // will be passed to the reply task.
509 auto* url_data_map_ptr = url_data_map.get(); 511 auto* url_data_map_ptr = url_data_map.get();
510 auto* host_data_map_ptr = host_data_map.get(); 512 auto* host_data_map_ptr = host_data_map.get();
511 auto* url_redirect_data_map_ptr = url_redirect_data_map.get(); 513 auto* url_redirect_data_map_ptr = url_redirect_data_map.get();
512 auto* host_redirect_data_map_ptr = host_redirect_data_map.get(); 514 auto* host_redirect_data_map_ptr = host_redirect_data_map.get();
515 auto* manifest_data_map_ptr = manifest_data_map.get();
513 516
514 BrowserThread::PostTaskAndReply( 517 BrowserThread::PostTaskAndReply(
515 BrowserThread::DB, FROM_HERE, 518 BrowserThread::DB, FROM_HERE,
516 base::Bind(&ResourcePrefetchPredictorTables::GetAllData, tables_, 519 base::Bind(&ResourcePrefetchPredictorTables::GetAllData, tables_,
517 url_data_map_ptr, host_data_map_ptr, url_redirect_data_map_ptr, 520 url_data_map_ptr, host_data_map_ptr, url_redirect_data_map_ptr,
518 host_redirect_data_map_ptr), 521 host_redirect_data_map_ptr, manifest_data_map_ptr),
519 base::Bind(&ResourcePrefetchPredictor::CreateCaches, AsWeakPtr(), 522 base::Bind(&ResourcePrefetchPredictor::CreateCaches, AsWeakPtr(),
520 base::Passed(&url_data_map), base::Passed(&host_data_map), 523 base::Passed(&url_data_map), base::Passed(&host_data_map),
521 base::Passed(&url_redirect_data_map), 524 base::Passed(&url_redirect_data_map),
522 base::Passed(&host_redirect_data_map))); 525 base::Passed(&host_redirect_data_map),
526 base::Passed(&manifest_data_map)));
523 } 527 }
524 528
525 void ResourcePrefetchPredictor::RecordURLRequest( 529 void ResourcePrefetchPredictor::RecordURLRequest(
526 const URLRequestSummary& request) { 530 const URLRequestSummary& request) {
527 DCHECK_CURRENTLY_ON(BrowserThread::UI); 531 DCHECK_CURRENTLY_ON(BrowserThread::UI);
528 if (initialization_state_ != INITIALIZED) 532 if (initialization_state_ != INITIALIZED)
529 return; 533 return;
530 534
531 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME); 535 CHECK_EQ(request.resource_type, content::RESOURCE_TYPE_MAIN_FRAME);
532 OnMainFrameRequest(request); 536 OnMainFrameRequest(request);
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after
853 } 857 }
854 } 858 }
855 859
856 return has_prefetchable_resource; 860 return has_prefetchable_resource;
857 } 861 }
858 862
859 void ResourcePrefetchPredictor::CreateCaches( 863 void ResourcePrefetchPredictor::CreateCaches(
860 std::unique_ptr<PrefetchDataMap> url_data_map, 864 std::unique_ptr<PrefetchDataMap> url_data_map,
861 std::unique_ptr<PrefetchDataMap> host_data_map, 865 std::unique_ptr<PrefetchDataMap> host_data_map,
862 std::unique_ptr<RedirectDataMap> url_redirect_data_map, 866 std::unique_ptr<RedirectDataMap> url_redirect_data_map,
863 std::unique_ptr<RedirectDataMap> host_redirect_data_map) { 867 std::unique_ptr<RedirectDataMap> host_redirect_data_map,
868 std::unique_ptr<ManifestDataMap> manifest_data_map) {
864 DCHECK_CURRENTLY_ON(BrowserThread::UI); 869 DCHECK_CURRENTLY_ON(BrowserThread::UI);
865 870
866 DCHECK_EQ(INITIALIZING, initialization_state_); 871 DCHECK_EQ(INITIALIZING, initialization_state_);
867 DCHECK(!url_table_cache_); 872 DCHECK(!url_table_cache_);
868 DCHECK(!host_table_cache_); 873 DCHECK(!host_table_cache_);
869 DCHECK(!url_redirect_table_cache_); 874 DCHECK(!url_redirect_table_cache_);
870 DCHECK(!host_redirect_table_cache_); 875 DCHECK(!host_redirect_table_cache_);
876 DCHECK(!manifest_table_cache_);
871 DCHECK(inflight_navigations_.empty()); 877 DCHECK(inflight_navigations_.empty());
872 878
873 url_table_cache_ = std::move(url_data_map); 879 url_table_cache_ = std::move(url_data_map);
874 host_table_cache_ = std::move(host_data_map); 880 host_table_cache_ = std::move(host_data_map);
875 url_redirect_table_cache_ = std::move(url_redirect_data_map); 881 url_redirect_table_cache_ = std::move(url_redirect_data_map);
876 host_redirect_table_cache_ = std::move(host_redirect_data_map); 882 host_redirect_table_cache_ = std::move(host_redirect_data_map);
883 manifest_table_cache_ = std::move(manifest_data_map);
877 884
878 ConnectToHistoryService(); 885 ConnectToHistoryService();
879 } 886 }
880 887
881 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() { 888 void ResourcePrefetchPredictor::OnHistoryAndCacheLoaded() {
882 DCHECK_CURRENTLY_ON(BrowserThread::UI); 889 DCHECK_CURRENTLY_ON(BrowserThread::UI);
883 DCHECK_EQ(INITIALIZING, initialization_state_); 890 DCHECK_EQ(INITIALIZING, initialization_state_);
884 891
885 // Initialize the prefetch manager only if prefetching is enabled. 892 // Initialize the prefetch manager only if prefetching is enabled.
886 if (config_.IsPrefetchingEnabledForSomeOrigin(profile_)) { 893 if (config_.IsPrefetchingEnabledForSomeOrigin(profile_)) {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
936 } 943 }
937 } 944 }
938 } 945 }
939 946
940 void ResourcePrefetchPredictor::DeleteAllUrls() { 947 void ResourcePrefetchPredictor::DeleteAllUrls() {
941 inflight_navigations_.clear(); 948 inflight_navigations_.clear();
942 url_table_cache_->clear(); 949 url_table_cache_->clear();
943 host_table_cache_->clear(); 950 host_table_cache_->clear();
944 url_redirect_table_cache_->clear(); 951 url_redirect_table_cache_->clear();
945 host_redirect_table_cache_->clear(); 952 host_redirect_table_cache_->clear();
953 manifest_table_cache_->clear();
946 954
947 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, 955 BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
948 base::Bind(&ResourcePrefetchPredictorTables::DeleteAllData, tables_)); 956 base::Bind(&ResourcePrefetchPredictorTables::DeleteAllData, tables_));
949 } 957 }
950 958
951 void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) { 959 void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
952 // Check all the urls in the database and pick out the ones that are present 960 // Check all the urls in the database and pick out the ones that are present
953 // in the cache. 961 // in the cache.
954 std::vector<std::string> urls_to_delete, hosts_to_delete; 962 std::vector<std::string> urls_to_delete, hosts_to_delete;
955 std::vector<std::string> url_redirects_to_delete, host_redirects_to_delete; 963 std::vector<std::string> url_redirects_to_delete, host_redirects_to_delete;
964 std::vector<std::string> manifest_hosts_to_delete;
956 965
957 for (const auto& it : urls) { 966 for (const auto& it : urls) {
958 const std::string& url_spec = it.url().spec(); 967 const std::string& url_spec = it.url().spec();
959 if (url_table_cache_->find(url_spec) != url_table_cache_->end()) { 968 if (url_table_cache_->find(url_spec) != url_table_cache_->end()) {
960 urls_to_delete.push_back(url_spec); 969 urls_to_delete.push_back(url_spec);
961 url_table_cache_->erase(url_spec); 970 url_table_cache_->erase(url_spec);
962 } 971 }
963 972
964 if (url_redirect_table_cache_->find(url_spec) != 973 if (url_redirect_table_cache_->find(url_spec) !=
965 url_redirect_table_cache_->end()) { 974 url_redirect_table_cache_->end()) {
966 url_redirects_to_delete.push_back(url_spec); 975 url_redirects_to_delete.push_back(url_spec);
967 url_redirect_table_cache_->erase(url_spec); 976 url_redirect_table_cache_->erase(url_spec);
968 } 977 }
969 978
970 const std::string& host = it.url().host(); 979 const std::string& host = it.url().host();
971 if (host_table_cache_->find(host) != host_table_cache_->end()) { 980 if (host_table_cache_->find(host) != host_table_cache_->end()) {
972 hosts_to_delete.push_back(host); 981 hosts_to_delete.push_back(host);
973 host_table_cache_->erase(host); 982 host_table_cache_->erase(host);
974 } 983 }
975 984
976 if (host_redirect_table_cache_->find(host) != 985 if (host_redirect_table_cache_->find(host) !=
977 host_redirect_table_cache_->end()) { 986 host_redirect_table_cache_->end()) {
978 host_redirects_to_delete.push_back(host); 987 host_redirects_to_delete.push_back(host);
979 host_redirect_table_cache_->erase(host); 988 host_redirect_table_cache_->erase(host);
980 } 989 }
990
991 std::string manifest_host = history::HostForTopHosts(it.url());
992 if (manifest_table_cache_->find(manifest_host) !=
993 manifest_table_cache_->end()) {
994 manifest_hosts_to_delete.push_back(manifest_host);
995 manifest_table_cache_->erase(manifest_host);
996 }
981 } 997 }
982 998
983 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) { 999 if (!urls_to_delete.empty() || !hosts_to_delete.empty()) {
984 BrowserThread::PostTask( 1000 BrowserThread::PostTask(
985 BrowserThread::DB, FROM_HERE, 1001 BrowserThread::DB, FROM_HERE,
986 base::Bind(&ResourcePrefetchPredictorTables::DeleteResourceData, 1002 base::Bind(&ResourcePrefetchPredictorTables::DeleteResourceData,
987 tables_, urls_to_delete, hosts_to_delete)); 1003 tables_, urls_to_delete, hosts_to_delete));
988 } 1004 }
989 1005
990 if (!url_redirects_to_delete.empty() || !host_redirects_to_delete.empty()) { 1006 if (!url_redirects_to_delete.empty() || !host_redirects_to_delete.empty()) {
991 BrowserThread::PostTask( 1007 BrowserThread::PostTask(
992 BrowserThread::DB, FROM_HERE, 1008 BrowserThread::DB, FROM_HERE,
993 base::Bind(&ResourcePrefetchPredictorTables::DeleteRedirectData, 1009 base::Bind(&ResourcePrefetchPredictorTables::DeleteRedirectData,
994 tables_, url_redirects_to_delete, host_redirects_to_delete)); 1010 tables_, url_redirects_to_delete, host_redirects_to_delete));
995 } 1011 }
1012
1013 if (!manifest_hosts_to_delete.empty()) {
1014 BrowserThread::PostTask(
1015 BrowserThread::DB, FROM_HERE,
1016 base::Bind(&ResourcePrefetchPredictorTables::DeleteManifestData,
1017 tables_, manifest_hosts_to_delete));
1018 }
996 } 1019 }
997 1020
998 void ResourcePrefetchPredictor::RemoveOldestEntryInPrefetchDataMap( 1021 void ResourcePrefetchPredictor::RemoveOldestEntryInPrefetchDataMap(
999 PrefetchKeyType key_type, 1022 PrefetchKeyType key_type,
1000 PrefetchDataMap* data_map) { 1023 PrefetchDataMap* data_map) {
1001 if (data_map->empty()) 1024 if (data_map->empty())
1002 return; 1025 return;
1003 1026
1004 uint64_t oldest_time = UINT64_MAX; 1027 uint64_t oldest_time = UINT64_MAX;
1005 std::string key_to_delete; 1028 std::string key_to_delete;
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
1409 TestObserver::~TestObserver() { 1432 TestObserver::~TestObserver() {
1410 predictor_->SetObserverForTesting(nullptr); 1433 predictor_->SetObserverForTesting(nullptr);
1411 } 1434 }
1412 1435
1413 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) 1436 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor)
1414 : predictor_(predictor) { 1437 : predictor_(predictor) {
1415 predictor_->SetObserverForTesting(this); 1438 predictor_->SetObserverForTesting(this);
1416 } 1439 }
1417 1440
1418 } // namespace predictors 1441 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698