Commit 8b3c17d1 authored by alexilin's avatar alexilin Committed by Commit bot

predictors: Add Manifest table to ResourcePrefetchPredictor.

The very first step to reuse Bork manifests in ResourcePrefetchPredictor. This
CL adds a new table to the predictor database.

BUG=699115

Review-Url: https://codereview.chromium.org/2738613003
Cr-Commit-Position: refs/heads/master@{#455798}
parent 55462c0b
...@@ -1483,6 +1483,7 @@ split_static_library("browser") { ...@@ -1483,6 +1483,7 @@ split_static_library("browser") {
"//components/policy:generated", "//components/policy:generated",
"//components/policy/core/browser", "//components/policy/core/browser",
"//components/policy/proto", "//components/policy/proto",
"//components/precache/core:proto",
"//components/prefs:prefs", "//components/prefs:prefs",
"//components/previews/core", "//components/previews/core",
"//components/profile_metrics", "//components/profile_metrics",
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile.h"
#include "components/history/core/browser/history_database.h" #include "components/history/core/browser/history_database.h"
#include "components/history/core/browser/history_service.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 "components/mime_util/mime_util.h"
#include "content/public/browser/browser_thread.h" #include "content/public/browser/browser_thread.h"
#include "content/public/browser/resource_request_info.h" #include "content/public/browser/resource_request_info.h"
...@@ -503,6 +504,7 @@ void ResourcePrefetchPredictor::StartInitialization() { ...@@ -503,6 +504,7 @@ void ResourcePrefetchPredictor::StartInitialization() {
auto host_data_map = base::MakeUnique<PrefetchDataMap>(); auto host_data_map = base::MakeUnique<PrefetchDataMap>();
auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>(); auto url_redirect_data_map = base::MakeUnique<RedirectDataMap>();
auto host_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 // Get raw pointers to pass to the first task. Ownership of the unique_ptrs
// will be passed to the reply task. // will be passed to the reply task.
...@@ -510,16 +512,18 @@ void ResourcePrefetchPredictor::StartInitialization() { ...@@ -510,16 +512,18 @@ void ResourcePrefetchPredictor::StartInitialization() {
auto* host_data_map_ptr = host_data_map.get(); auto* host_data_map_ptr = host_data_map.get();
auto* url_redirect_data_map_ptr = url_redirect_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* host_redirect_data_map_ptr = host_redirect_data_map.get();
auto* manifest_data_map_ptr = manifest_data_map.get();
BrowserThread::PostTaskAndReply( BrowserThread::PostTaskAndReply(
BrowserThread::DB, FROM_HERE, BrowserThread::DB, FROM_HERE,
base::Bind(&ResourcePrefetchPredictorTables::GetAllData, tables_, base::Bind(&ResourcePrefetchPredictorTables::GetAllData, tables_,
url_data_map_ptr, host_data_map_ptr, url_redirect_data_map_ptr, 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::Bind(&ResourcePrefetchPredictor::CreateCaches, AsWeakPtr(),
base::Passed(&url_data_map), base::Passed(&host_data_map), base::Passed(&url_data_map), base::Passed(&host_data_map),
base::Passed(&url_redirect_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( void ResourcePrefetchPredictor::RecordURLRequest(
...@@ -860,7 +864,8 @@ void ResourcePrefetchPredictor::CreateCaches( ...@@ -860,7 +864,8 @@ void ResourcePrefetchPredictor::CreateCaches(
std::unique_ptr<PrefetchDataMap> url_data_map, std::unique_ptr<PrefetchDataMap> url_data_map,
std::unique_ptr<PrefetchDataMap> host_data_map, std::unique_ptr<PrefetchDataMap> host_data_map,
std::unique_ptr<RedirectDataMap> url_redirect_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_CURRENTLY_ON(BrowserThread::UI);
DCHECK_EQ(INITIALIZING, initialization_state_); DCHECK_EQ(INITIALIZING, initialization_state_);
...@@ -868,12 +873,14 @@ void ResourcePrefetchPredictor::CreateCaches( ...@@ -868,12 +873,14 @@ void ResourcePrefetchPredictor::CreateCaches(
DCHECK(!host_table_cache_); DCHECK(!host_table_cache_);
DCHECK(!url_redirect_table_cache_); DCHECK(!url_redirect_table_cache_);
DCHECK(!host_redirect_table_cache_); DCHECK(!host_redirect_table_cache_);
DCHECK(!manifest_table_cache_);
DCHECK(inflight_navigations_.empty()); DCHECK(inflight_navigations_.empty());
url_table_cache_ = std::move(url_data_map); url_table_cache_ = std::move(url_data_map);
host_table_cache_ = std::move(host_data_map); host_table_cache_ = std::move(host_data_map);
url_redirect_table_cache_ = std::move(url_redirect_data_map); url_redirect_table_cache_ = std::move(url_redirect_data_map);
host_redirect_table_cache_ = std::move(host_redirect_data_map); host_redirect_table_cache_ = std::move(host_redirect_data_map);
manifest_table_cache_ = std::move(manifest_data_map);
ConnectToHistoryService(); ConnectToHistoryService();
} }
...@@ -943,6 +950,7 @@ void ResourcePrefetchPredictor::DeleteAllUrls() { ...@@ -943,6 +950,7 @@ void ResourcePrefetchPredictor::DeleteAllUrls() {
host_table_cache_->clear(); host_table_cache_->clear();
url_redirect_table_cache_->clear(); url_redirect_table_cache_->clear();
host_redirect_table_cache_->clear(); host_redirect_table_cache_->clear();
manifest_table_cache_->clear();
BrowserThread::PostTask(BrowserThread::DB, FROM_HERE, BrowserThread::PostTask(BrowserThread::DB, FROM_HERE,
base::Bind(&ResourcePrefetchPredictorTables::DeleteAllData, tables_)); base::Bind(&ResourcePrefetchPredictorTables::DeleteAllData, tables_));
...@@ -953,6 +961,7 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) { ...@@ -953,6 +961,7 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
// in the cache. // in the cache.
std::vector<std::string> urls_to_delete, hosts_to_delete; 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> url_redirects_to_delete, host_redirects_to_delete;
std::vector<std::string> manifest_hosts_to_delete;
for (const auto& it : urls) { for (const auto& it : urls) {
const std::string& url_spec = it.url().spec(); const std::string& url_spec = it.url().spec();
...@@ -978,6 +987,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) { ...@@ -978,6 +987,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
host_redirects_to_delete.push_back(host); host_redirects_to_delete.push_back(host);
host_redirect_table_cache_->erase(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()) { if (!urls_to_delete.empty() || !hosts_to_delete.empty()) {
...@@ -993,6 +1009,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) { ...@@ -993,6 +1009,13 @@ void ResourcePrefetchPredictor::DeleteUrls(const history::URLRows& urls) {
base::Bind(&ResourcePrefetchPredictorTables::DeleteRedirectData, base::Bind(&ResourcePrefetchPredictorTables::DeleteRedirectData,
tables_, url_redirects_to_delete, host_redirects_to_delete)); 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( void ResourcePrefetchPredictor::RemoveOldestEntryInPrefetchDataMap(
......
...@@ -265,6 +265,7 @@ class ResourcePrefetchPredictor ...@@ -265,6 +265,7 @@ class ResourcePrefetchPredictor
}; };
typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap; typedef ResourcePrefetchPredictorTables::PrefetchDataMap PrefetchDataMap;
typedef ResourcePrefetchPredictorTables::RedirectDataMap RedirectDataMap; typedef ResourcePrefetchPredictorTables::RedirectDataMap RedirectDataMap;
typedef ResourcePrefetchPredictorTables::ManifestDataMap ManifestDataMap;
typedef std::map<NavigationID, std::unique_ptr<PageRequestSummary>> typedef std::map<NavigationID, std::unique_ptr<PageRequestSummary>>
NavigationMap; NavigationMap;
...@@ -323,7 +324,8 @@ class ResourcePrefetchPredictor ...@@ -323,7 +324,8 @@ class ResourcePrefetchPredictor
void CreateCaches(std::unique_ptr<PrefetchDataMap> url_data_map, void CreateCaches(std::unique_ptr<PrefetchDataMap> url_data_map,
std::unique_ptr<PrefetchDataMap> host_data_map, std::unique_ptr<PrefetchDataMap> host_data_map,
std::unique_ptr<RedirectDataMap> url_redirect_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);
// Called during initialization when history is read and the predictor // Called during initialization when history is read and the predictor
// database has been read. // database has been read.
...@@ -409,6 +411,7 @@ class ResourcePrefetchPredictor ...@@ -409,6 +411,7 @@ class ResourcePrefetchPredictor
std::unique_ptr<PrefetchDataMap> host_table_cache_; std::unique_ptr<PrefetchDataMap> host_table_cache_;
std::unique_ptr<RedirectDataMap> url_redirect_table_cache_; std::unique_ptr<RedirectDataMap> url_redirect_table_cache_;
std::unique_ptr<RedirectDataMap> host_redirect_table_cache_; std::unique_ptr<RedirectDataMap> host_redirect_table_cache_;
std::unique_ptr<ManifestDataMap> manifest_table_cache_;
std::map<GURL, base::TimeTicks> inflight_prefetches_; std::map<GURL, base::TimeTicks> inflight_prefetches_;
NavigationMap inflight_navigations_; NavigationMap inflight_navigations_;
......
...@@ -24,6 +24,7 @@ const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect"; ...@@ -24,6 +24,7 @@ const char kUrlRedirectTableName[] = "resource_prefetch_predictor_url_redirect";
const char kHostResourceTableName[] = "resource_prefetch_predictor_host"; const char kHostResourceTableName[] = "resource_prefetch_predictor_host";
const char kHostRedirectTableName[] = const char kHostRedirectTableName[] =
"resource_prefetch_predictor_host_redirect"; "resource_prefetch_predictor_host_redirect";
const char kManifestTableName[] = "resource_prefetch_predictor_manifest";
const char kCreateGlobalMetadataStatementTemplate[] = const char kCreateGlobalMetadataStatementTemplate[] =
"CREATE TABLE %s ( " "CREATE TABLE %s ( "
...@@ -112,7 +113,8 @@ void ResourcePrefetchPredictorTables::GetAllData( ...@@ -112,7 +113,8 @@ void ResourcePrefetchPredictorTables::GetAllData(
PrefetchDataMap* url_data_map, PrefetchDataMap* url_data_map,
PrefetchDataMap* host_data_map, PrefetchDataMap* host_data_map,
RedirectDataMap* url_redirect_data_map, RedirectDataMap* url_redirect_data_map,
RedirectDataMap* host_redirect_data_map) { RedirectDataMap* host_redirect_data_map,
ManifestDataMap* manifest_map) {
TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData"); TRACE_EVENT0("browser", "ResourcePrefetchPredictor::GetAllData");
DCHECK_CURRENTLY_ON(BrowserThread::DB); DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase()) if (CantAccessDatabase())
...@@ -126,11 +128,13 @@ void ResourcePrefetchPredictorTables::GetAllData( ...@@ -126,11 +128,13 @@ void ResourcePrefetchPredictorTables::GetAllData(
host_data_map->clear(); host_data_map->clear();
url_redirect_data_map->clear(); url_redirect_data_map->clear();
host_redirect_data_map->clear(); host_redirect_data_map->clear();
manifest_map->clear();
GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map); GetAllResourceDataHelper(PREFETCH_KEY_TYPE_URL, url_data_map);
GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map); GetAllResourceDataHelper(PREFETCH_KEY_TYPE_HOST, host_data_map);
GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map); GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_URL, url_redirect_data_map);
GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map); GetAllRedirectDataHelper(PREFETCH_KEY_TYPE_HOST, host_redirect_data_map);
GetAllManifestDataHelper(manifest_map);
} }
void ResourcePrefetchPredictorTables::UpdateData( void ResourcePrefetchPredictorTables::UpdateData(
...@@ -168,6 +172,23 @@ void ResourcePrefetchPredictorTables::UpdateData( ...@@ -168,6 +172,23 @@ void ResourcePrefetchPredictorTables::UpdateData(
DB()->CommitTransaction(); DB()->CommitTransaction();
} }
void ResourcePrefetchPredictorTables::UpdateManifestData(
const std::string& host,
const precache::PrecacheManifest& manifest_data) {
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
DB()->BeginTransaction();
bool success = UpdateDataHelper(
PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, host, manifest_data);
if (!success)
DB()->RollbackTransaction();
else
DB()->CommitTransaction();
}
void ResourcePrefetchPredictorTables::DeleteResourceData( void ResourcePrefetchPredictorTables::DeleteResourceData(
const std::vector<std::string>& urls, const std::vector<std::string>& urls,
const std::vector<std::string>& hosts) { const std::vector<std::string>& hosts) {
...@@ -218,6 +239,15 @@ void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint( ...@@ -218,6 +239,15 @@ void ResourcePrefetchPredictorTables::DeleteSingleRedirectDataPoint(
DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key}); DeleteDataHelper(key_type, PrefetchDataType::REDIRECT, {key});
} }
void ResourcePrefetchPredictorTables::DeleteManifestData(
const std::vector<std::string>& hosts) {
DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase())
return;
DeleteDataHelper(PREFETCH_KEY_TYPE_HOST, PrefetchDataType::MANIFEST, hosts);
}
void ResourcePrefetchPredictorTables::DeleteAllData() { void ResourcePrefetchPredictorTables::DeleteAllData() {
DCHECK_CURRENTLY_ON(BrowserThread::DB); DCHECK_CURRENTLY_ON(BrowserThread::DB);
if (CantAccessDatabase()) if (CantAccessDatabase())
...@@ -226,7 +256,7 @@ void ResourcePrefetchPredictorTables::DeleteAllData() { ...@@ -226,7 +256,7 @@ void ResourcePrefetchPredictorTables::DeleteAllData() {
sql::Statement deleter; sql::Statement deleter;
for (const char* table_name : for (const char* table_name :
{kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName, {kUrlResourceTableName, kUrlRedirectTableName, kHostResourceTableName,
kHostRedirectTableName}) { kHostRedirectTableName, kManifestTableName}) {
deleter.Assign(DB()->GetUniqueStatement( deleter.Assign(DB()->GetUniqueStatement(
base::StringPrintf("DELETE FROM %s", table_name).c_str())); base::StringPrintf("DELETE FROM %s", table_name).c_str()));
deleter.Run(); deleter.Run();
...@@ -274,6 +304,18 @@ void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper( ...@@ -274,6 +304,18 @@ void ResourcePrefetchPredictorTables::GetAllRedirectDataHelper(
} }
} }
void ResourcePrefetchPredictorTables::GetAllManifestDataHelper(
ManifestDataMap* manifest_map) {
sql::Statement manifest_reader(DB()->GetUniqueStatement(
base::StringPrintf("SELECT * FROM %s", kManifestTableName).c_str()));
precache::PrecacheManifest data;
std::string key;
while (StepAndInitializeProtoData(&manifest_reader, &key, &data)) {
manifest_map->insert(std::make_pair(key, data));
}
}
bool ResourcePrefetchPredictorTables::UpdateDataHelper( bool ResourcePrefetchPredictorTables::UpdateDataHelper(
PrefetchKeyType key_type, PrefetchKeyType key_type,
PrefetchDataType data_type, PrefetchDataType data_type,
...@@ -367,8 +409,8 @@ bool ResourcePrefetchPredictorTables::DropTablesIfOutdated( ...@@ -367,8 +409,8 @@ bool ResourcePrefetchPredictorTables::DropTablesIfOutdated(
if (incompatible_version) { if (incompatible_version) {
for (const char* table_name : for (const char* table_name :
{kMetadataTableName, kUrlResourceTableName, kHostResourceTableName, {kMetadataTableName, kUrlResourceTableName, kHostResourceTableName,
kUrlRedirectTableName, kHostRedirectTableName, kUrlMetadataTableName, kUrlRedirectTableName, kHostRedirectTableName, kManifestTableName,
kHostMetadataTableName}) { kUrlMetadataTableName, kHostMetadataTableName}) {
success = success =
success && success &&
db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name) db->Execute(base::StringPrintf("DROP TABLE IF EXISTS %s", table_name)
...@@ -425,7 +467,7 @@ void ResourcePrefetchPredictorTables::CreateTableIfNonExistent() { ...@@ -425,7 +467,7 @@ void ResourcePrefetchPredictorTables::CreateTableIfNonExistent() {
for (const char* table_name : for (const char* table_name :
{kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName, {kUrlResourceTableName, kHostResourceTableName, kUrlRedirectTableName,
kHostRedirectTableName}) { kHostRedirectTableName, kManifestTableName}) {
success = success && success = success &&
(db->DoesTableExist(table_name) || (db->DoesTableExist(table_name) ||
db->Execute(base::StringPrintf( db->Execute(base::StringPrintf(
...@@ -468,7 +510,7 @@ ResourcePrefetchPredictorTables::GetTableUpdateStatement( ...@@ -468,7 +510,7 @@ ResourcePrefetchPredictorTables::GetTableUpdateStatement(
PrefetchDataType data_type, PrefetchDataType data_type,
TableOperationType op_type) { TableOperationType op_type) {
sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) | sql::StatementID id(__FILE__, key_type | (static_cast<int>(data_type) << 1) |
(static_cast<int>(op_type) << 2)); (static_cast<int>(op_type) << 3));
const char* statement_template = (op_type == TableOperationType::REMOVE const char* statement_template = (op_type == TableOperationType::REMOVE
? kDeleteProtoTableStatementTemplate ? kDeleteProtoTableStatementTemplate
: kInsertProtoTableStatementTemplate); : kInsertProtoTableStatementTemplate);
...@@ -487,6 +529,8 @@ const char* ResourcePrefetchPredictorTables::GetTableName( ...@@ -487,6 +529,8 @@ const char* ResourcePrefetchPredictorTables::GetTableName(
return is_host ? kHostResourceTableName : kUrlResourceTableName; return is_host ? kHostResourceTableName : kUrlResourceTableName;
case PrefetchDataType::REDIRECT: case PrefetchDataType::REDIRECT:
return is_host ? kHostRedirectTableName : kUrlRedirectTableName; return is_host ? kHostRedirectTableName : kUrlRedirectTableName;
case PrefetchDataType::MANIFEST:
return kManifestTableName;
} }
NOTREACHED(); NOTREACHED();
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
#include "chrome/browser/predictors/predictor_table_base.h" #include "chrome/browser/predictors/predictor_table_base.h"
#include "chrome/browser/predictors/resource_prefetch_common.h" #include "chrome/browser/predictors/resource_prefetch_common.h"
#include "chrome/browser/predictors/resource_prefetch_predictor.pb.h" #include "chrome/browser/predictors/resource_prefetch_predictor.pb.h"
#include "components/precache/core/proto/precache.pb.h"
namespace sql { namespace sql {
class Statement; class Statement;
...@@ -37,17 +38,16 @@ using RedirectStat = RedirectData_RedirectStat; ...@@ -37,17 +38,16 @@ using RedirectStat = RedirectData_RedirectStat;
// - HostRedirectTable - redirects per host. // - HostRedirectTable - redirects per host.
class ResourcePrefetchPredictorTables : public PredictorTableBase { class ResourcePrefetchPredictorTables : public PredictorTableBase {
public: public:
// Map from primary key to PrefetchData for the key.
typedef std::map<std::string, PrefetchData> PrefetchDataMap; typedef std::map<std::string, PrefetchData> PrefetchDataMap;
// Map from primary key to RedirectData for the key.
typedef std::map<std::string, RedirectData> RedirectDataMap; typedef std::map<std::string, RedirectData> RedirectDataMap;
typedef std::map<std::string, precache::PrecacheManifest> ManifestDataMap;
// Returns data for all Urls and Hosts. // Returns data for all Urls and Hosts.
virtual void GetAllData(PrefetchDataMap* url_data_map, virtual void GetAllData(PrefetchDataMap* url_data_map,
PrefetchDataMap* host_data_map, PrefetchDataMap* host_data_map,
RedirectDataMap* url_redirect_data_map, RedirectDataMap* url_redirect_data_map,
RedirectDataMap* host_redirect_data_map); RedirectDataMap* host_redirect_data_map,
ManifestDataMap* manifest_map);
// Updates data for a Url and a host. If either of the |url_data| or // Updates data for a Url and a host. If either of the |url_data| or
// |host_data| or |url_redirect_data| or |host_redirect_data| has an empty // |host_data| or |url_redirect_data| or |host_redirect_data| has an empty
...@@ -60,6 +60,11 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase { ...@@ -60,6 +60,11 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
const RedirectData& url_redirect_data, const RedirectData& url_redirect_data,
const RedirectData& host_redirect_data); const RedirectData& host_redirect_data);
// Updates manifest data for the input |host|.
virtual void UpdateManifestData(
const std::string& host,
const precache::PrecacheManifest& manifest_data);
// Delete data for the input |urls| and |hosts|. // Delete data for the input |urls| and |hosts|.
virtual void DeleteResourceData(const std::vector<std::string>& urls, virtual void DeleteResourceData(const std::vector<std::string>& urls,
const std::vector<std::string>& hosts); const std::vector<std::string>& hosts);
...@@ -76,6 +81,9 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase { ...@@ -76,6 +81,9 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
virtual void DeleteSingleRedirectDataPoint(const std::string& key, virtual void DeleteSingleRedirectDataPoint(const std::string& key,
PrefetchKeyType key_type); PrefetchKeyType key_type);
// Delete data for the input |hosts|.
virtual void DeleteManifestData(const std::vector<std::string>& hosts);
// Deletes all data in all the tables. // Deletes all data in all the tables.
virtual void DeleteAllData(); virtual void DeleteAllData();
...@@ -104,7 +112,7 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase { ...@@ -104,7 +112,7 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
private: private:
// Represents the type of information that is stored in prefetch database. // Represents the type of information that is stored in prefetch database.
enum class PrefetchDataType { RESOURCE, REDIRECT }; enum class PrefetchDataType { RESOURCE, REDIRECT, MANIFEST };
enum class TableOperationType { INSERT, REMOVE }; enum class TableOperationType { INSERT, REMOVE };
...@@ -116,7 +124,7 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase { ...@@ -116,7 +124,7 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
// Database version. Always increment it when any change is made to the data // Database version. Always increment it when any change is made to the data
// schema (including the .proto). // schema (including the .proto).
static constexpr int kDatabaseVersion = 5; static constexpr int kDatabaseVersion = 6;
// Helper functions below help perform functions on the Url and host table // Helper functions below help perform functions on the Url and host table
// using the same code. // using the same code.
...@@ -124,6 +132,8 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase { ...@@ -124,6 +132,8 @@ class ResourcePrefetchPredictorTables : public PredictorTableBase {
PrefetchDataMap* data_map); PrefetchDataMap* data_map);
void GetAllRedirectDataHelper(PrefetchKeyType key_type, void GetAllRedirectDataHelper(PrefetchKeyType key_type,
RedirectDataMap* redirect_map); RedirectDataMap* redirect_map);
void GetAllManifestDataHelper(ManifestDataMap* manifest_map);
bool UpdateDataHelper(PrefetchKeyType key_type, bool UpdateDataHelper(PrefetchKeyType key_type,
PrefetchDataType data_type, PrefetchDataType data_type,
const std::string& key, const std::string& key,
......
...@@ -43,9 +43,12 @@ class ResourcePrefetchPredictorTablesTest : public testing::Test { ...@@ -43,9 +43,12 @@ class ResourcePrefetchPredictorTablesTest : public testing::Test {
using PrefetchDataMap = ResourcePrefetchPredictorTables::PrefetchDataMap; using PrefetchDataMap = ResourcePrefetchPredictorTables::PrefetchDataMap;
using RedirectDataMap = ResourcePrefetchPredictorTables::RedirectDataMap; using RedirectDataMap = ResourcePrefetchPredictorTables::RedirectDataMap;
using ManifestDataMap = ResourcePrefetchPredictorTables::ManifestDataMap;
private: private:
// Initializes the tables, |test_url_data_| and |test_host_data_|. // Initializes the tables, |test_url_data_|, |test_host_data_|,
// |test_url_redirect_data_|, |test_host_redirect_data_| and
// |test_manifest_data_|.
void InitializeSampleData(); void InitializeSampleData();
// Checks that the input PrefetchData are the same, although the resources // Checks that the input PrefetchData are the same, although the resources
...@@ -62,13 +65,23 @@ class ResourcePrefetchPredictorTablesTest : public testing::Test { ...@@ -62,13 +65,23 @@ class ResourcePrefetchPredictorTablesTest : public testing::Test {
void TestRedirectsAreEqual(const std::vector<RedirectStat>& lhs, void TestRedirectsAreEqual(const std::vector<RedirectStat>& lhs,
const std::vector<RedirectStat>& rhs) const; const std::vector<RedirectStat>& rhs) const;
// Checks that the input ManifestData are the same, although the resources
// can be in different order.
void TestManifestDataAreEqual(const ManifestDataMap& lhs,
const ManifestDataMap& rhs) const;
void TestManifestResourcesAreEqual(
const std::vector<precache::PrecacheResource>& lhs,
const std::vector<precache::PrecacheResource>& rhs) const;
void AddKey(PrefetchDataMap* m, const std::string& key) const; void AddKey(PrefetchDataMap* m, const std::string& key) const;
void AddKey(RedirectDataMap* m, const std::string& key) const; void AddKey(RedirectDataMap* m, const std::string& key) const;
void AddKey(ManifestDataMap* m, const std::string& key) const;
PrefetchDataMap test_url_data_; PrefetchDataMap test_url_data_;
PrefetchDataMap test_host_data_; PrefetchDataMap test_host_data_;
RedirectDataMap test_url_redirect_data_; RedirectDataMap test_url_redirect_data_;
RedirectDataMap test_host_redirect_data_; RedirectDataMap test_host_redirect_data_;
ManifestDataMap test_manifest_data_;
}; };
class ResourcePrefetchPredictorTablesReopenTest class ResourcePrefetchPredictorTablesReopenTest
...@@ -106,38 +119,46 @@ void ResourcePrefetchPredictorTablesTest::TearDown() { ...@@ -106,38 +119,46 @@ void ResourcePrefetchPredictorTablesTest::TearDown() {
void ResourcePrefetchPredictorTablesTest::TestGetAllData() { void ResourcePrefetchPredictorTablesTest::TestGetAllData() {
PrefetchDataMap actual_url_data, actual_host_data; PrefetchDataMap actual_url_data, actual_host_data;
RedirectDataMap actual_url_redirect_data, actual_host_redirect_data; RedirectDataMap actual_url_redirect_data, actual_host_redirect_data;
ManifestDataMap actual_manifest_data;
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
TestPrefetchDataAreEqual(test_url_data_, actual_url_data); TestPrefetchDataAreEqual(test_url_data_, actual_url_data);
TestPrefetchDataAreEqual(test_host_data_, actual_host_data); TestPrefetchDataAreEqual(test_host_data_, actual_host_data);
TestRedirectDataAreEqual(test_url_redirect_data_, actual_url_redirect_data); TestRedirectDataAreEqual(test_url_redirect_data_, actual_url_redirect_data);
TestRedirectDataAreEqual(test_host_redirect_data_, actual_host_redirect_data); TestRedirectDataAreEqual(test_host_redirect_data_, actual_host_redirect_data);
TestManifestDataAreEqual(test_manifest_data_, actual_manifest_data);
} }
void ResourcePrefetchPredictorTablesTest::TestDeleteData() { void ResourcePrefetchPredictorTablesTest::TestDeleteData() {
std::vector<std::string> urls_to_delete = {"http://www.google.com", std::vector<std::string> urls_to_delete = {"http://www.google.com",
"http://www.yahoo.com"}; "http://www.yahoo.com"};
std::vector<std::string> hosts_to_delete = {"www.yahoo.com"}; std::vector<std::string> hosts_to_delete = {"www.yahoo.com"};
tables_->DeleteResourceData(urls_to_delete, hosts_to_delete); tables_->DeleteResourceData(urls_to_delete, hosts_to_delete);
urls_to_delete = {"http://fb.com/google", "http://google.com"}; urls_to_delete = {"http://fb.com/google", "http://google.com"};
hosts_to_delete = {"microsoft.com"}; hosts_to_delete = {"microsoft.com"};
tables_->DeleteRedirectData(urls_to_delete, hosts_to_delete); tables_->DeleteRedirectData(urls_to_delete, hosts_to_delete);
hosts_to_delete = {"en.wikipedia.org"};
tables_->DeleteManifestData(hosts_to_delete);
PrefetchDataMap actual_url_data, actual_host_data; PrefetchDataMap actual_url_data, actual_host_data;
RedirectDataMap actual_url_redirect_data, actual_host_redirect_data; RedirectDataMap actual_url_redirect_data, actual_host_redirect_data;
ManifestDataMap actual_manifest_data;
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
PrefetchDataMap expected_url_data, expected_host_data; PrefetchDataMap expected_url_data, expected_host_data;
RedirectDataMap expected_url_redirect_data, expected_host_redirect_data; RedirectDataMap expected_url_redirect_data, expected_host_redirect_data;
ManifestDataMap expected_manifest_data;
AddKey(&expected_url_data, "http://www.reddit.com"); AddKey(&expected_url_data, "http://www.reddit.com");
AddKey(&expected_host_data, "www.facebook.com"); AddKey(&expected_host_data, "www.facebook.com");
AddKey(&expected_url_redirect_data, "http://nyt.com"); AddKey(&expected_url_redirect_data, "http://nyt.com");
AddKey(&expected_host_redirect_data, "bbc.com"); AddKey(&expected_host_redirect_data, "bbc.com");
AddKey(&expected_manifest_data, "youtube.com");
TestPrefetchDataAreEqual(expected_url_data, actual_url_data); TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
TestPrefetchDataAreEqual(expected_host_data, actual_host_data); TestPrefetchDataAreEqual(expected_host_data, actual_host_data);
...@@ -145,6 +166,7 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteData() { ...@@ -145,6 +166,7 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteData() {
actual_url_redirect_data); actual_url_redirect_data);
TestRedirectDataAreEqual(expected_host_redirect_data, TestRedirectDataAreEqual(expected_host_redirect_data,
actual_host_redirect_data); actual_host_redirect_data);
TestManifestDataAreEqual(expected_manifest_data, actual_manifest_data);
} }
void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() { void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
...@@ -154,8 +176,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() { ...@@ -154,8 +176,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
PrefetchDataMap actual_url_data, actual_host_data; PrefetchDataMap actual_url_data, actual_host_data;
RedirectDataMap actual_url_redirect_data, actual_host_redirect_data; RedirectDataMap actual_url_redirect_data, actual_host_redirect_data;
ManifestDataMap actual_manifest_data;
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
PrefetchDataMap expected_url_data; PrefetchDataMap expected_url_data;
AddKey(&expected_url_data, "http://www.google.com"); AddKey(&expected_url_data, "http://www.google.com");
...@@ -173,8 +197,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() { ...@@ -173,8 +197,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
actual_host_data.clear(); actual_host_data.clear();
actual_url_redirect_data.clear(); actual_url_redirect_data.clear();
actual_host_redirect_data.clear(); actual_host_redirect_data.clear();
actual_manifest_data.clear();
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
PrefetchDataMap expected_host_data; PrefetchDataMap expected_host_data;
AddKey(&expected_host_data, "www.yahoo.com"); AddKey(&expected_host_data, "www.yahoo.com");
...@@ -191,8 +217,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() { ...@@ -191,8 +217,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
actual_host_data.clear(); actual_host_data.clear();
actual_url_redirect_data.clear(); actual_url_redirect_data.clear();
actual_host_redirect_data.clear(); actual_host_redirect_data.clear();
actual_manifest_data.clear();
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
RedirectDataMap expected_url_redirect_data; RedirectDataMap expected_url_redirect_data;
AddKey(&expected_url_redirect_data, "http://fb.com/google"); AddKey(&expected_url_redirect_data, "http://fb.com/google");
...@@ -210,8 +238,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() { ...@@ -210,8 +238,10 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteSingleDataPoint() {
actual_host_data.clear(); actual_host_data.clear();
actual_url_redirect_data.clear(); actual_url_redirect_data.clear();
actual_host_redirect_data.clear(); actual_host_redirect_data.clear();
actual_manifest_data.clear();
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
RedirectDataMap expected_host_redirect_data; RedirectDataMap expected_host_redirect_data;
AddKey(&expected_host_redirect_data, "microsoft.com"); AddKey(&expected_host_redirect_data, "microsoft.com");
...@@ -257,13 +287,22 @@ void ResourcePrefetchPredictorTablesTest::TestUpdateData() { ...@@ -257,13 +287,22 @@ void ResourcePrefetchPredictorTablesTest::TestUpdateData() {
tables_->UpdateData(google, yahoo, facebook, microsoft); tables_->UpdateData(google, yahoo, facebook, microsoft);
precache::PrecacheManifest theverge;
InitializePrecacheResource(theverge.add_resource(),
"https://www.theverge.com/main.js", 0.7);
tables_->UpdateManifestData("theverge.com", theverge);
PrefetchDataMap actual_url_data, actual_host_data; PrefetchDataMap actual_url_data, actual_host_data;
RedirectDataMap actual_url_redirect_data, actual_host_redirect_data; RedirectDataMap actual_url_redirect_data, actual_host_redirect_data;
ManifestDataMap actual_manifest_data;
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
PrefetchDataMap expected_url_data, expected_host_data; PrefetchDataMap expected_url_data, expected_host_data;
RedirectDataMap expected_url_redirect_data, expected_host_redirect_data; RedirectDataMap expected_url_redirect_data, expected_host_redirect_data;
ManifestDataMap expected_manifest_data;
AddKey(&expected_url_data, "http://www.reddit.com"); AddKey(&expected_url_data, "http://www.reddit.com");
AddKey(&expected_url_data, "http://www.yahoo.com"); AddKey(&expected_url_data, "http://www.yahoo.com");
expected_url_data.insert(std::make_pair("http://www.google.com", google)); expected_url_data.insert(std::make_pair("http://www.google.com", google));
...@@ -280,12 +319,17 @@ void ResourcePrefetchPredictorTablesTest::TestUpdateData() { ...@@ -280,12 +319,17 @@ void ResourcePrefetchPredictorTablesTest::TestUpdateData() {
expected_host_redirect_data.insert( expected_host_redirect_data.insert(
std::make_pair("microsoft.com", microsoft)); std::make_pair("microsoft.com", microsoft));
AddKey(&expected_manifest_data, "youtube.com");
AddKey(&expected_manifest_data, "en.wikipedia.org");
expected_manifest_data.insert(std::make_pair("theverge.com", theverge));
TestPrefetchDataAreEqual(expected_url_data, actual_url_data); TestPrefetchDataAreEqual(expected_url_data, actual_url_data);
TestPrefetchDataAreEqual(expected_host_data, actual_host_data); TestPrefetchDataAreEqual(expected_host_data, actual_host_data);
TestRedirectDataAreEqual(expected_url_redirect_data, TestRedirectDataAreEqual(expected_url_redirect_data,
actual_url_redirect_data); actual_url_redirect_data);
TestRedirectDataAreEqual(expected_host_redirect_data, TestRedirectDataAreEqual(expected_host_redirect_data,
actual_host_redirect_data); actual_host_redirect_data);
TestManifestDataAreEqual(expected_manifest_data, actual_manifest_data);
} }
void ResourcePrefetchPredictorTablesTest::TestDeleteAllData() { void ResourcePrefetchPredictorTablesTest::TestDeleteAllData() {
...@@ -293,12 +337,15 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteAllData() { ...@@ -293,12 +337,15 @@ void ResourcePrefetchPredictorTablesTest::TestDeleteAllData() {
PrefetchDataMap actual_url_data, actual_host_data; PrefetchDataMap actual_url_data, actual_host_data;
RedirectDataMap actual_url_redirect_data, actual_host_redirect_data; RedirectDataMap actual_url_redirect_data, actual_host_redirect_data;
ManifestDataMap actual_manifest_data;
tables_->GetAllData(&actual_url_data, &actual_host_data, tables_->GetAllData(&actual_url_data, &actual_host_data,
&actual_url_redirect_data, &actual_host_redirect_data); &actual_url_redirect_data, &actual_host_redirect_data,
&actual_manifest_data);
EXPECT_TRUE(actual_url_data.empty()); EXPECT_TRUE(actual_url_data.empty());
EXPECT_TRUE(actual_host_data.empty()); EXPECT_TRUE(actual_host_data.empty());
EXPECT_TRUE(actual_url_redirect_data.empty()); EXPECT_TRUE(actual_url_redirect_data.empty());
EXPECT_TRUE(actual_host_redirect_data.empty()); EXPECT_TRUE(actual_host_redirect_data.empty());
EXPECT_TRUE(actual_manifest_data.empty());
} }
void ResourcePrefetchPredictorTablesTest::TestPrefetchDataAreEqual( void ResourcePrefetchPredictorTablesTest::TestPrefetchDataAreEqual(
...@@ -389,6 +436,48 @@ void ResourcePrefetchPredictorTablesTest::TestRedirectsAreEqual( ...@@ -389,6 +436,48 @@ void ResourcePrefetchPredictorTablesTest::TestRedirectsAreEqual(
EXPECT_TRUE(lhs_index.empty()); EXPECT_TRUE(lhs_index.empty());
} }
void ResourcePrefetchPredictorTablesTest::TestManifestDataAreEqual(
const ManifestDataMap& lhs,
const ManifestDataMap& rhs) const {
EXPECT_EQ(lhs.size(), rhs.size());
for (const auto& m : rhs) {
const auto lhs_it = lhs.find(m.first);
ASSERT_TRUE(lhs_it != lhs.end()) << m.first;
EXPECT_EQ(lhs_it->second.id().id(), m.second.id().id());
std::vector<precache::PrecacheResource> lhs_resources(
lhs_it->second.resource().begin(), lhs_it->second.resource().end());
std::vector<precache::PrecacheResource> rhs_resources(
m.second.resource().begin(), m.second.resource().end());
TestManifestResourcesAreEqual(lhs_resources, rhs_resources);
}
}
void ResourcePrefetchPredictorTablesTest::TestManifestResourcesAreEqual(
const std::vector<precache::PrecacheResource>& lhs,
const std::vector<precache::PrecacheResource>& rhs) const {
EXPECT_EQ(lhs.size(), rhs.size());
std::map<std::string, precache::PrecacheResource> lhs_index;
// Repeated resources are not allowed.
for (const auto& r : lhs)
EXPECT_TRUE(lhs_index.insert(std::make_pair(r.url(), r)).second);
for (const auto& r : rhs) {
auto lhs_it = lhs_index.find(r.url());
if (lhs_it != lhs_index.end()) {
EXPECT_EQ(r, lhs_it->second);
lhs_index.erase(lhs_it);
} else {
ADD_FAILURE() << r.url();
}
}
EXPECT_TRUE(lhs_index.empty());
}
void ResourcePrefetchPredictorTablesTest::AddKey(PrefetchDataMap* m, void ResourcePrefetchPredictorTablesTest::AddKey(PrefetchDataMap* m,
const std::string& key) const { const std::string& key) const {
PrefetchDataMap::const_iterator it = test_url_data_.find(key); PrefetchDataMap::const_iterator it = test_url_data_.find(key);
...@@ -413,6 +502,13 @@ void ResourcePrefetchPredictorTablesTest::AddKey(RedirectDataMap* m, ...@@ -413,6 +502,13 @@ void ResourcePrefetchPredictorTablesTest::AddKey(RedirectDataMap* m,
m->insert(*it); m->insert(*it);
} }
void ResourcePrefetchPredictorTablesTest::AddKey(ManifestDataMap* m,
const std::string& key) const {
auto it = test_manifest_data_.find(key);
ASSERT_TRUE(it != test_manifest_data_.end());
m->insert(*it);
}
void ResourcePrefetchPredictorTablesTest::InitializeSampleData() { void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
PrefetchData empty_resource_data; PrefetchData empty_resource_data;
RedirectData empty_redirect_data; RedirectData empty_redirect_data;
...@@ -553,6 +649,26 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() { ...@@ -553,6 +649,26 @@ void ResourcePrefetchPredictorTablesTest::InitializeSampleData() {
tables_->UpdateData(empty_resource_data, empty_resource_data, tables_->UpdateData(empty_resource_data, empty_resource_data,
empty_redirect_data, microsoft); empty_redirect_data, microsoft);
} }
{ // Manifest data.
precache::PrecacheManifest wikipedia;
InitializePrecacheResource(wikipedia.add_resource(),
"https://en.wikipedia.org/script.js", 0.7);
InitializePrecacheResource(wikipedia.add_resource(),
"https://en.wikipedia.org/image.png", 0.3);
precache::PrecacheManifest youtube;
InitializePrecacheResource(youtube.add_resource(),
"https://youtube.com/photo.jpg", 0.5);
InitializePrecacheResource(youtube.add_resource(),
"https://youtube.com/base.js", 0.2);
test_manifest_data_.clear();
test_manifest_data_.insert(std::make_pair("en.wikipedia.org", wikipedia));
test_manifest_data_.insert(std::make_pair("youtube.com", youtube));
tables_->UpdateManifestData("en.wikipedia.org", wikipedia);
tables_->UpdateManifestData("youtube.com", youtube);
}
} }
void ResourcePrefetchPredictorTablesTest::ReopenDatabase() { void ResourcePrefetchPredictorTablesTest::ReopenDatabase() {
...@@ -649,12 +765,14 @@ TEST_F(ResourcePrefetchPredictorTablesTest, DatabaseIsResetWhenIncompatible) { ...@@ -649,12 +765,14 @@ TEST_F(ResourcePrefetchPredictorTablesTest, DatabaseIsResetWhenIncompatible) {
PrefetchDataMap url_data, host_data; PrefetchDataMap url_data, host_data;
RedirectDataMap url_redirect_data, host_redirect_data; RedirectDataMap url_redirect_data, host_redirect_data;
ManifestDataMap manifest_data;
tables_->GetAllData(&url_data, &host_data, &url_redirect_data, tables_->GetAllData(&url_data, &host_data, &url_redirect_data,
&host_redirect_data); &host_redirect_data, &manifest_data);
EXPECT_TRUE(url_data.empty()); EXPECT_TRUE(url_data.empty());
EXPECT_TRUE(host_data.empty()); EXPECT_TRUE(host_data.empty());
EXPECT_TRUE(url_redirect_data.empty()); EXPECT_TRUE(url_redirect_data.empty());
EXPECT_TRUE(host_redirect_data.empty()); EXPECT_TRUE(host_redirect_data.empty());
EXPECT_TRUE(manifest_data.empty());
} }
TEST_F(ResourcePrefetchPredictorTablesReopenTest, GetAllData) { TEST_F(ResourcePrefetchPredictorTablesReopenTest, GetAllData) {
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h" #include "chrome/browser/predictors/resource_prefetch_predictor_test_util.h"
#include <limits>
#include "chrome/browser/predictors/resource_prefetch_predictor_tables.h" #include "chrome/browser/predictors/resource_prefetch_predictor_tables.h"
namespace predictors { namespace predictors {
...@@ -44,6 +46,13 @@ void InitializeRedirectStat(RedirectStat* redirect, ...@@ -44,6 +46,13 @@ void InitializeRedirectStat(RedirectStat* redirect,
redirect->set_consecutive_misses(consecutive_misses); redirect->set_consecutive_misses(consecutive_misses);
} }
void InitializePrecacheResource(precache::PrecacheResource* resource,
const std::string& url,
double weight_ratio) {
resource->set_url(url);
resource->set_weight_ratio(weight_ratio);
}
PrefetchData CreatePrefetchData(const std::string& primary_key, PrefetchData CreatePrefetchData(const std::string& primary_key,
uint64_t last_visit_time) { uint64_t last_visit_time) {
PrefetchData data; PrefetchData data;
...@@ -220,3 +229,38 @@ bool operator==(const URLRequestSummary& lhs, const URLRequestSummary& rhs) { ...@@ -220,3 +229,38 @@ bool operator==(const URLRequestSummary& lhs, const URLRequestSummary& rhs) {
} }
} // namespace predictors } // namespace predictors
namespace precache {
std::ostream& operator<<(std::ostream& os, const PrecacheManifest& manifest) {
os << "[" << manifest.id().id() << "]" << std::endl;
for (const PrecacheResource& resource : manifest.resource())
os << "\t\t" << resource << std::endl;
return os;
}
std::ostream& operator<<(std::ostream& os, const PrecacheResource& resource) {
return os << "[" << resource.url() << "," << resource.top_host_name() << ","
<< resource.weight_ratio() << "," << resource.weight() << "]";
}
bool operator==(const PrecacheManifest& lhs, const PrecacheManifest& rhs) {
bool equal = lhs.id().id() == rhs.id().id() &&
lhs.resource_size() == rhs.resource_size();
if (!equal)
return false;
for (int i = 0; i < lhs.resource_size(); ++i)
equal = equal && lhs.resource(i) == rhs.resource(i);
return equal;
}
bool operator==(const PrecacheResource& lhs, const PrecacheResource& rhs) {
return lhs.url() == rhs.url() &&
std::fabs(lhs.weight_ratio() - rhs.weight_ratio()) <
std::numeric_limits<double>::epsilon();
}
} // namespace precache
...@@ -30,6 +30,10 @@ void InitializeRedirectStat(RedirectStat* redirect, ...@@ -30,6 +30,10 @@ void InitializeRedirectStat(RedirectStat* redirect,
int number_of_misses, int number_of_misses,
int consecutive_misses); int consecutive_misses);
void InitializePrecacheResource(precache::PrecacheResource* resource,
const std::string& url,
double weight_ratio);
PrefetchData CreatePrefetchData(const std::string& primary_key, PrefetchData CreatePrefetchData(const std::string& primary_key,
uint64_t last_visit_time = 0); uint64_t last_visit_time = 0);
RedirectData CreateRedirectData(const std::string& primary_key, RedirectData CreateRedirectData(const std::string& primary_key,
...@@ -80,4 +84,16 @@ bool operator==(const ResourcePrefetchPredictor::URLRequestSummary& lhs, ...@@ -80,4 +84,16 @@ bool operator==(const ResourcePrefetchPredictor::URLRequestSummary& lhs,
} // namespace predictors } // namespace predictors
namespace precache {
std::ostream& operator<<(std::ostream& stream,
const PrecacheManifest& manifest);
std::ostream& operator<<(std::ostream& stream,
const PrecacheResource& resource);
bool operator==(const PrecacheManifest& lhs, const PrecacheManifest& rhs);
bool operator==(const PrecacheResource& lhs, const PrecacheResource& rhs);
} // namespace precache
#endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TEST_UTIL_H_ #endif // CHROME_BROWSER_PREDICTORS_RESOURCE_PREFETCH_PREDICTOR_TEST_UTIL_H_
...@@ -41,6 +41,7 @@ using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary; ...@@ -41,6 +41,7 @@ using URLRequestSummary = ResourcePrefetchPredictor::URLRequestSummary;
using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary; using PageRequestSummary = ResourcePrefetchPredictor::PageRequestSummary;
using PrefetchDataMap = ResourcePrefetchPredictorTables::PrefetchDataMap; using PrefetchDataMap = ResourcePrefetchPredictorTables::PrefetchDataMap;
using RedirectDataMap = ResourcePrefetchPredictorTables::RedirectDataMap; using RedirectDataMap = ResourcePrefetchPredictorTables::RedirectDataMap;
using ManifestDataMap = ResourcePrefetchPredictorTables::ManifestDataMap;
scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders( scoped_refptr<net::HttpResponseHeaders> MakeResponseHeaders(
const char* headers) { const char* headers) {
...@@ -130,11 +131,12 @@ class MockResourcePrefetchPredictorTables ...@@ -130,11 +131,12 @@ class MockResourcePrefetchPredictorTables
public: public:
MockResourcePrefetchPredictorTables() { } MockResourcePrefetchPredictorTables() { }
MOCK_METHOD4(GetAllData, MOCK_METHOD5(GetAllData,
void(PrefetchDataMap* url_data_map, void(PrefetchDataMap* url_data_map,
PrefetchDataMap* host_data_map, PrefetchDataMap* host_data_map,
RedirectDataMap* url_redirect_data_map, RedirectDataMap* url_redirect_data_map,
RedirectDataMap* host_redirect_data_map)); RedirectDataMap* host_redirect_data_map,
ManifestDataMap* manifest_data_map));
MOCK_METHOD4(UpdateData, MOCK_METHOD4(UpdateData,
void(const PrefetchData& url_data, void(const PrefetchData& url_data,
const PrefetchData& host_data, const PrefetchData& host_data,
...@@ -257,6 +259,7 @@ class ResourcePrefetchPredictorTest : public testing::Test { ...@@ -257,6 +259,7 @@ class ResourcePrefetchPredictorTest : public testing::Test {
PrefetchDataMap test_host_data_; PrefetchDataMap test_host_data_;
RedirectDataMap test_url_redirect_data_; RedirectDataMap test_url_redirect_data_;
RedirectDataMap test_host_redirect_data_; RedirectDataMap test_host_redirect_data_;
ManifestDataMap test_manifest_data_;
PrefetchData empty_resource_data_; PrefetchData empty_resource_data_;
RedirectData empty_redirect_data_; RedirectData empty_redirect_data_;
...@@ -293,7 +296,8 @@ void ResourcePrefetchPredictorTest::SetUp() { ...@@ -293,7 +296,8 @@ void ResourcePrefetchPredictorTest::SetUp() {
GetAllData(Pointee(ContainerEq(PrefetchDataMap())), GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(PrefetchDataMap())), Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(RedirectDataMap())), Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(RedirectDataMap())))); Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(ManifestDataMap()))));
InitializePredictor(); InitializePredictor();
EXPECT_TRUE(predictor_->inflight_navigations_.empty()); EXPECT_TRUE(predictor_->inflight_navigations_.empty());
EXPECT_EQ(predictor_->initialization_state_, EXPECT_EQ(predictor_->initialization_state_,
...@@ -501,11 +505,13 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) { ...@@ -501,11 +505,13 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
GetAllData(Pointee(ContainerEq(PrefetchDataMap())), GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(PrefetchDataMap())), Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(RedirectDataMap())), Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(RedirectDataMap())))) Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(ManifestDataMap()))))
.WillOnce(DoAll(SetArgPointee<0>(test_url_data_), .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
SetArgPointee<1>(test_host_data_), SetArgPointee<1>(test_host_data_),
SetArgPointee<2>(test_url_redirect_data_), SetArgPointee<2>(test_url_redirect_data_),
SetArgPointee<3>(test_host_redirect_data_))); SetArgPointee<3>(test_host_redirect_data_),
SetArgPointee<4>(test_manifest_data_)));
ResetPredictor(); ResetPredictor();
InitializePredictor(); InitializePredictor();
...@@ -519,6 +525,7 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) { ...@@ -519,6 +525,7 @@ TEST_F(ResourcePrefetchPredictorTest, LazilyInitializeWithData) {
EXPECT_EQ(test_host_data_, *predictor_->host_table_cache_); EXPECT_EQ(test_host_data_, *predictor_->host_table_cache_);
EXPECT_EQ(test_url_redirect_data_, *predictor_->url_redirect_table_cache_); EXPECT_EQ(test_url_redirect_data_, *predictor_->url_redirect_table_cache_);
EXPECT_EQ(test_host_redirect_data_, *predictor_->host_redirect_table_cache_); EXPECT_EQ(test_host_redirect_data_, *predictor_->host_redirect_table_cache_);
EXPECT_EQ(test_manifest_data_, *predictor_->manifest_table_cache_);
} }
// Single navigation but history count is low, so should not record. // Single navigation but history count is low, so should not record.
...@@ -667,7 +674,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) { ...@@ -667,7 +674,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlInDB) {
GetAllData(Pointee(ContainerEq(PrefetchDataMap())), GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(PrefetchDataMap())), Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(RedirectDataMap())), Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(RedirectDataMap())))) Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(ManifestDataMap()))))
.WillOnce(DoAll(SetArgPointee<0>(test_url_data_), .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
SetArgPointee<1>(test_host_data_))); SetArgPointee<1>(test_host_data_)));
ResetPredictor(); ResetPredictor();
...@@ -772,7 +780,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) { ...@@ -772,7 +780,8 @@ TEST_F(ResourcePrefetchPredictorTest, NavigationUrlNotInDBAndDBFull) {
GetAllData(Pointee(ContainerEq(PrefetchDataMap())), GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(PrefetchDataMap())), Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(RedirectDataMap())), Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(RedirectDataMap())))) Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(ManifestDataMap()))))
.WillOnce(DoAll(SetArgPointee<0>(test_url_data_), .WillOnce(DoAll(SetArgPointee<0>(test_url_data_),
SetArgPointee<1>(test_host_data_))); SetArgPointee<1>(test_host_data_)));
ResetPredictor(); ResetPredictor();
...@@ -892,7 +901,8 @@ TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) { ...@@ -892,7 +901,8 @@ TEST_F(ResourcePrefetchPredictorTest, RedirectUrlInDB) {
GetAllData(Pointee(ContainerEq(PrefetchDataMap())), GetAllData(Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(PrefetchDataMap())), Pointee(ContainerEq(PrefetchDataMap())),
Pointee(ContainerEq(RedirectDataMap())), Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(RedirectDataMap())))) Pointee(ContainerEq(RedirectDataMap())),
Pointee(ContainerEq(ManifestDataMap()))))
.WillOnce(DoAll(SetArgPointee<2>(test_url_redirect_data_), .WillOnce(DoAll(SetArgPointee<2>(test_url_redirect_data_),
SetArgPointee<3>(test_host_redirect_data_))); SetArgPointee<3>(test_host_redirect_data_)));
ResetPredictor(); ResetPredictor();
......
...@@ -33,6 +33,8 @@ message PrecacheManifestId { ...@@ -33,6 +33,8 @@ message PrecacheManifestId {
}; };
// A manifest of cacheable resources to be precached for a specific host. // A manifest of cacheable resources to be precached for a specific host.
// CAUTION: When any change is done here, bump kDatabaseVersion in
// chrome/browser/predictors/resource_prefetch_predictor_tables.h
message PrecacheManifest { message PrecacheManifest {
// List of resources that we predict that the user will need if they are // List of resources that we predict that the user will need if they are
// likely to fetch the host. // likely to fetch the host.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment