| 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 1619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 |
| OLD | NEW |