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

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

Issue 2815513011: predictors: Remove resources marked as unused. (Closed)
Patch Set: Remove unused constants. Created 3 years, 8 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
(...skipping 1619 matching lines...) Expand 10 before | Expand all | Expand 10 after
1630 } 1630 }
1631 } 1631 }
1632 1632
1633 void ResourcePrefetchPredictor::OnManifestFetched( 1633 void ResourcePrefetchPredictor::OnManifestFetched(
1634 const std::string& host, 1634 const std::string& host,
1635 const precache::PrecacheManifest& manifest) { 1635 const precache::PrecacheManifest& manifest) {
1636 DCHECK_CURRENTLY_ON(BrowserThread::UI); 1636 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1637 if (initialization_state_ != INITIALIZED) 1637 if (initialization_state_ != INITIALIZED)
1638 return; 1638 return;
1639 1639
1640 if (!config_.is_manifests_enabled || 1640 if (!config_.is_manifests_enabled)
1641 host.length() > ResourcePrefetchPredictorTables::kMaxStringLength || 1641 return;
1642
1643 // The manifest host has "www." prefix stripped, the manifest host could
1644 // correspond to two different hosts in the prefetch database.
1645 UpdatePrefetchDataByManifest(host, PREFETCH_KEY_TYPE_HOST,
1646 host_table_cache_.get(), manifest);
1647 UpdatePrefetchDataByManifest("www." + host, PREFETCH_KEY_TYPE_HOST,
1648 host_table_cache_.get(), manifest);
1649
1650 // The manifest is too large to store.
1651 if (host.length() > ResourcePrefetchPredictorTables::kMaxStringLength ||
1642 static_cast<uint32_t>(manifest.ByteSize()) > kMaxManifestByteSize) { 1652 static_cast<uint32_t>(manifest.ByteSize()) > kMaxManifestByteSize) {
1643 return; 1653 return;
1644 } 1654 }
1645 1655
1646 auto cache_entry = manifest_table_cache_->find(host); 1656 auto cache_entry = manifest_table_cache_->find(host);
1647 if (cache_entry == manifest_table_cache_->end()) { 1657 if (cache_entry == manifest_table_cache_->end()) {
1648 if (manifest_table_cache_->size() >= config_.max_hosts_to_track) 1658 if (manifest_table_cache_->size() >= config_.max_hosts_to_track)
1649 RemoveOldestEntryInManifestDataMap(manifest_table_cache_.get()); 1659 RemoveOldestEntryInManifestDataMap(manifest_table_cache_.get());
1650 cache_entry = 1660 cache_entry =
1651 manifest_table_cache_->insert(std::make_pair(host, manifest)).first; 1661 manifest_table_cache_->insert(std::make_pair(host, manifest)).first;
1652 } else { 1662 } else {
1653 cache_entry->second = manifest; 1663 cache_entry->second = manifest;
1654 } 1664 }
1655 1665
1656 precache::RemoveUnknownFields(&cache_entry->second); 1666 precache::RemoveUnknownFields(&cache_entry->second);
1657 1667
1658 BrowserThread::PostTask( 1668 BrowserThread::PostTask(
1659 BrowserThread::DB, FROM_HERE, 1669 BrowserThread::DB, FROM_HERE,
1660 base::Bind(&ResourcePrefetchPredictorTables::UpdateManifestData, tables_, 1670 base::Bind(&ResourcePrefetchPredictorTables::UpdateManifestData, tables_,
1661 host, cache_entry->second)); 1671 host, cache_entry->second));
1662 } 1672 }
1663 1673
1674 void ResourcePrefetchPredictor::UpdatePrefetchDataByManifest(
1675 const std::string& key,
1676 PrefetchKeyType key_type,
1677 PrefetchDataMap* data_map,
1678 const precache::PrecacheManifest& manifest) {
1679 DCHECK_CURRENTLY_ON(BrowserThread::UI);
1680 DCHECK_EQ(INITIALIZED, initialization_state_);
1681
1682 auto resource_entry = data_map->find(key);
1683 if (resource_entry == data_map->end())
1684 return;
1685
1686 PrefetchData& data = resource_entry->second;
1687 std::map<std::string, int> manifest_index;
1688 for (int i = 0; i < manifest.resource_size(); ++i)
1689 manifest_index.insert({manifest.resource(i).url(), i});
1690
1691 bool was_updated = false;
1692 base::Optional<std::vector<bool>> unused_bitset =
1693 precache::GetResourceBitset(manifest, internal::kUnusedRemovedExperiment);
1694 if (unused_bitset.has_value()) {
1695 // Remove unused resources from |data|.
1696 auto new_end = std::remove_if(
1697 data.mutable_resources()->begin(), data.mutable_resources()->end(),
1698 [&](const ResourceData& x) {
1699 auto it = manifest_index.find(x.resource_url());
1700 if (it == manifest_index.end())
1701 return false;
1702 return !unused_bitset.value()[it->second];
1703 });
1704 was_updated = new_end != data.mutable_resources()->end();
1705 data.mutable_resources()->erase(new_end, data.mutable_resources()->end());
1706 }
1707
1708 if (was_updated) {
1709 BrowserThread::PostTask(
1710 BrowserThread::DB, FROM_HERE,
1711 base::Bind(&ResourcePrefetchPredictorTables::UpdateResourceData,
1712 tables_, data, key_type));
1713 }
1714 }
1715
1664 void ResourcePrefetchPredictor::ConnectToHistoryService() { 1716 void ResourcePrefetchPredictor::ConnectToHistoryService() {
1665 // Register for HistoryServiceLoading if it is not ready. 1717 // Register for HistoryServiceLoading if it is not ready.
1666 history::HistoryService* history_service = 1718 history::HistoryService* history_service =
1667 HistoryServiceFactory::GetForProfile(profile_, 1719 HistoryServiceFactory::GetForProfile(profile_,
1668 ServiceAccessType::EXPLICIT_ACCESS); 1720 ServiceAccessType::EXPLICIT_ACCESS);
1669 if (!history_service) 1721 if (!history_service)
1670 return; 1722 return;
1671 DCHECK(!history_service_observer_.IsObserving(history_service)); 1723 DCHECK(!history_service_observer_.IsObserving(history_service));
1672 history_service_observer_.Add(history_service); 1724 history_service_observer_.Add(history_service);
1673 if (history_service->BackendLoaded()) { 1725 if (history_service->BackendLoaded()) {
1674 // HistoryService is already loaded. Continue with Initialization. 1726 // HistoryService is already loaded. Continue with Initialization.
1675 OnHistoryAndCacheLoaded(); 1727 OnHistoryAndCacheLoaded();
1676 } 1728 }
1677 } 1729 }
1678 1730
1679 //////////////////////////////////////////////////////////////////////////////// 1731 ////////////////////////////////////////////////////////////////////////////////
1680 // TestObserver. 1732 // TestObserver.
1681 1733
1682 TestObserver::~TestObserver() { 1734 TestObserver::~TestObserver() {
1683 predictor_->SetObserverForTesting(nullptr); 1735 predictor_->SetObserverForTesting(nullptr);
1684 } 1736 }
1685 1737
1686 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor) 1738 TestObserver::TestObserver(ResourcePrefetchPredictor* predictor)
1687 : predictor_(predictor) { 1739 : predictor_(predictor) {
1688 predictor_->SetObserverForTesting(this); 1740 predictor_->SetObserverForTesting(this);
1689 } 1741 }
1690 1742
1691 } // namespace predictors 1743 } // namespace predictors
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698