| Index: chrome/browser/safe_browsing/safe_browsing_database.cc
|
| diff --git a/chrome/browser/safe_browsing/safe_browsing_database.cc b/chrome/browser/safe_browsing/safe_browsing_database.cc
|
| index 918644073cf3e689e34be7ea557edabe9245bdc7..c54d38fa62353d3ecdf3eebb32ce695f2cebdace 100644
|
| --- a/chrome/browser/safe_browsing/safe_browsing_database.cc
|
| +++ b/chrome/browser/safe_browsing/safe_browsing_database.cc
|
| @@ -228,27 +228,42 @@ void RecordPrefixSetInfo(PrefixSetEvent event_type) {
|
| PREFIX_SET_EVENT_MAX);
|
| }
|
|
|
| -// Verify that |GetPrefixes()| returns the same set of prefixes as
|
| -// |prefixes|. This is necessary so that the
|
| +// Generate a |PrefixSet| instance from the contents of
|
| +// |add_prefixes|. Additionally performs various checks to make sure
|
| +// that the resulting prefix set is valid, so that the
|
| // PREFIX_SET_EVENT_BLOOM_MISS_PREFIX_HIT_INVALID histogram in
|
| // ContainsBrowseUrl() can be trustworthy.
|
| -void CheckPrefixSet(const safe_browsing::PrefixSet& prefix_set,
|
| - const std::vector<SBPrefix>& prefixes) {
|
| - std::vector<SBPrefix> restored;
|
| - prefix_set.GetPrefixes(&restored);
|
| +safe_browsing::PrefixSet* PrefixSetFromAddPrefixes(
|
| + const std::vector<SBAddPrefix>& add_prefixes) {
|
| + // TODO(shess): If |add_prefixes| were sorted by the prefix, it
|
| + // could be passed directly to |PrefixSet()|, removing the need for
|
| + // |prefixes|. For now, |prefixes| is useful while debugging
|
| + // things.
|
| + std::vector<SBPrefix> prefixes;
|
| + for (size_t i = 0; i < add_prefixes.size(); ++i) {
|
| + prefixes.push_back(add_prefixes[i].prefix);
|
| + }
|
|
|
| - const std::set<SBPrefix> unique(prefixes.begin(), prefixes.end());
|
| + std::sort(prefixes.begin(), prefixes.end());
|
| + prefixes.erase(std::unique(prefixes.begin(), prefixes.end()),
|
| + prefixes.end());
|
| +
|
| + scoped_ptr<safe_browsing::PrefixSet>
|
| + prefix_set(new safe_browsing::PrefixSet(prefixes));
|
| +
|
| + std::vector<SBPrefix> restored;
|
| + prefix_set->GetPrefixes(&restored);
|
|
|
| // Expect them to be equal.
|
| - if (restored.size() == unique.size() &&
|
| - std::equal(unique.begin(), unique.end(), restored.begin()))
|
| - return;
|
| + if (restored.size() == prefixes.size() &&
|
| + std::equal(prefixes.begin(), prefixes.end(), restored.begin()))
|
| + return prefix_set.release();
|
|
|
| // Log BROKEN for continuity with previous release, and SIZE to
|
| // distinguish which test failed.
|
| NOTREACHED();
|
| RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN);
|
| - if (restored.size() != unique.size())
|
| + if (restored.size() != prefixes.size())
|
| RecordPrefixSetInfo(PREFIX_SET_GETPREFIXES_BROKEN_SIZE);
|
|
|
| // Try to distinguish between updates from one broken user and a
|
| @@ -263,6 +278,8 @@ void CheckPrefixSet(const safe_browsing::PrefixSet& prefix_set,
|
| // it could explain why GetPrefixes() seemed broken.
|
| if (sizeof(int) != sizeof(int32))
|
| RecordPrefixSetInfo(PREFIX_SET_SBPREFIX_WAS_BROKEN);
|
| +
|
| + return prefix_set.release();
|
| }
|
|
|
| } // namespace
|
| @@ -1005,15 +1022,8 @@ void SafeBrowsingDatabaseNew::UpdateBrowseStore() {
|
| filter->Insert(add_prefixes[i].prefix);
|
| }
|
|
|
| - std::vector<SBPrefix> prefixes;
|
| - for (size_t i = 0; i < add_prefixes.size(); ++i) {
|
| - prefixes.push_back(add_prefixes[i].prefix);
|
| - }
|
| - std::sort(prefixes.begin(), prefixes.end());
|
| scoped_ptr<safe_browsing::PrefixSet>
|
| - prefix_set(new safe_browsing::PrefixSet(prefixes));
|
| -
|
| - CheckPrefixSet(*(prefix_set.get()), prefixes);
|
| + prefix_set(PrefixSetFromAddPrefixes(add_prefixes));
|
|
|
| // This needs to be in sorted order by prefix for efficient access.
|
| std::sort(add_full_hashes.begin(), add_full_hashes.end(),
|
| @@ -1121,13 +1131,7 @@ void SafeBrowsingDatabaseNew::LoadBloomFilter() {
|
| // TODO(shess): Write/read for prefix set.
|
| std::vector<SBAddPrefix> add_prefixes;
|
| browse_store_->GetAddPrefixes(&add_prefixes);
|
| - std::vector<SBPrefix> prefixes;
|
| - for (size_t i = 0; i < add_prefixes.size(); ++i) {
|
| - prefixes.push_back(add_prefixes[i].prefix);
|
| - }
|
| - std::sort(prefixes.begin(), prefixes.end());
|
| - prefix_set_.reset(new safe_browsing::PrefixSet(prefixes));
|
| - CheckPrefixSet(*(prefix_set_.get()), prefixes);
|
| + prefix_set_.reset(PrefixSetFromAddPrefixes(add_prefixes));
|
| }
|
|
|
| bool SafeBrowsingDatabaseNew::Delete() {
|
|
|