| 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 f25f57d7fa2905a2d799962ab483c2e2245bb39b..b3e5453c80cbe4e99348edcae0fc2768844a6668 100644
|
| --- a/chrome/browser/predictors/resource_prefetch_predictor.cc
|
| +++ b/chrome/browser/predictors/resource_prefetch_predictor.cc
|
| @@ -21,6 +21,7 @@
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "components/history/core/browser/history_database.h"
|
| #include "components/history/core/browser/history_service.h"
|
| +#include "components/history/core/browser/url_utils.h"
|
| #include "components/mime_util/mime_util.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "content/public/browser/resource_request_info.h"
|
| @@ -503,6 +504,7 @@ void ResourcePrefetchPredictor::StartInitialization() {
|
| auto host_data_map = base::MakeUnique<PrefetchDataMap>();
|
| auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>();
|
| auto host_redirect_data_map = base::MakeUnique<RedirectDataMap>();
|
| + auto manifest_data_map = base::MakeUnique<ManifestDataMap>();
|
|
|
| // Get raw pointers to pass to the first task. Ownership of the unique_ptrs
|
| // will be passed to the reply task.
|
| @@ -510,16 +512,18 @@ void ResourcePrefetchPredictor::StartInitialization() {
|
| auto* host_data_map_ptr = host_data_map.get();
|
| auto* url_redirect_data_map_ptr = url_redirect_data_map.get();
|
| auto* host_redirect_data_map_ptr = host_redirect_data_map.get();
|
| + auto* manifest_data_map_ptr = manifest_data_map.get();
|
|
|
| BrowserThread::PostTaskAndReply(
|
| BrowserThread::DB, FROM_HERE,
|
| base::Bind(&ResourcePrefetchPredictorTables::GetAllData, tables_,
|
| url_data_map_ptr, host_data_map_ptr, url_redirect_data_map_ptr,
|
| - host_redirect_data_map_ptr),
|
| + host_redirect_data_map_ptr, manifest_data_map_ptr),
|
| base::Bind(&ResourcePrefetchPredictor::CreateCaches, AsWeakPtr(),
|
| base::Passed(&url_data_map), base::Passed(&host_data_map),
|
| base::Passed(&url_redirect_data_map),
|
| - base::Passed(&host_redirect_data_map)));
|
| + base::Passed(&host_redirect_data_map),
|
| + base::Passed(&manifest_data_map)));
|
| }
|
|
|
| void ResourcePrefetchPredictor::RecordURLRequest(
|
| @@ -860,7 +864,8 @@ void ResourcePrefetchPredictor::CreateCaches(
|
| std::unique_ptr<PrefetchDataMap> url_data_map,
|
| std::unique_ptr<PrefetchDataMap> host_data_map,
|
| std::unique_ptr<RedirectDataMap> url_redirect_data_map,
|
| - std::unique_ptr<RedirectDataMap> host_redirect_data_map) {
|
| + std::unique_ptr<RedirectDataMap> host_redirect_data_map,
|
| + std::unique_ptr<ManifestDataMap> manifest_data_map) {
|
| DCHECK_CURRENTLY_ON(BrowserThread::UI);
|
|
|
| DCHECK_EQ(INITIALIZING, initialization_state_);
|
| @@ -868,12 +873,14 @@ void ResourcePrefetchPredictor::CreateCaches(
|
| DCHECK(!host_table_cache_);
|
| DCHECK(!url_redirect_table_cache_);
|
| DCHECK(!host_redirect_table_cache_);
|
| + DCHECK(!manifest_table_cache_);
|
| DCHECK(inflight_navigations_.empty());
|
|
|
| url_table_cache_ = std::move(url_data_map);
|
| host_table_cache_ = std::move(host_data_map);
|
| url_redirect_table_cache_ = std::move(url_redirect_data_map);
|
| host_redirect_table_cache_ = std::move(host_redirect_data_map);
|
| + manifest_table_cache_ = std::move(manifest_data_map);
|
|
|
| ConnectToHistoryService();
|
| }
|
| @@ -943,6 +950,7 @@ void ResourcePrefetchPredictor::DeleteAllUrls() {
|
| host_table_cache_->clear();
|
| url_redirect_table_cache_->clear();
|
| host_redirect_table_cache_->clear();
|
| + manifest_table_cache_->clear();
|
|
|
| BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
|
| base::Bind(&ResourcePrefetchPredictorTables::DeleteAllData, tables_));
|
| @@ -953,6 +961,7 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
|
| // in the cache.
|
| std::vector<std::string> urls_to_delete, hosts_to_delete;
|
| std::vector<std::string> url_redirects_to_delete, host_redirects_to_delete;
|
| + std::vector<std::string> manifest_hosts_to_delete;
|
|
|
| for (const auto& it : urls) {
|
| const std::string& url_spec = it.url().spec();
|
| @@ -978,6 +987,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
|
| host_redirects_to_delete.push_back(host);
|
| host_redirect_table_cache_->erase(host);
|
| }
|
| +
|
| + std::string manifest_host = history::HostForTopHosts(it.url());
|
| + if (manifest_table_cache_->find(manifest_host) !=
|
| + manifest_table_cache_->end()) {
|
| + manifest_hosts_to_delete.push_back(manifest_host);
|
| + manifest_table_cache_->erase(manifest_host);
|
| + }
|
| }
|
|
|
| if (!urls_to_delete.empty() || !hosts_to_delete.empty()) {
|
| @@ -993,6 +1009,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
|
| base::Bind(&ResourcePrefetchPredictorTables::DeleteRedirectData,
|
| tables_, url_redirects_to_delete, host_redirects_to_delete));
|
| }
|
| +
|
| + if (!manifest_hosts_to_delete.empty()) {
|
| + BrowserThread::PostTask(
|
| + BrowserThread::DB, FROM_HERE,
|
| + base::Bind(&ResourcePrefetchPredictorTables::DeleteManifestData,
|
| + tables_, manifest_hosts_to_delete));
|
| + }
|
| }
|
|
|
| void ResourcePrefetchPredictor::RemoveOldestEntryInPrefetchDataMap(
|
|
|