| Index: chrome/browser/prefs/pref_hash_filter.cc
|
| diff --git a/chrome/browser/prefs/pref_hash_filter.cc b/chrome/browser/prefs/pref_hash_filter.cc
|
| index 01ba41355bc2b6f7b5be2b3b7d99a5c2b0bb32f0..1935708f9e22ca39964f2580d8dd402d1d39d9b9 100644
|
| --- a/chrome/browser/prefs/pref_hash_filter.cc
|
| +++ b/chrome/browser/prefs/pref_hash_filter.cc
|
| @@ -9,62 +9,52 @@
|
| #include "base/prefs/pref_store.h"
|
| #include "base/time/time.h"
|
| #include "base/values.h"
|
| -#include "chrome/common/pref_names.h"
|
| -
|
| -namespace {
|
| -
|
| -void ReportValidationResult(PrefHashStore::ValueState value_state,
|
| - size_t value_index,
|
| - size_t num_values) {
|
| - switch (value_state) {
|
| - case PrefHashStore::UNCHANGED:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceUnchanged",
|
| - value_index, num_values);
|
| - return;
|
| - case PrefHashStore::CLEARED:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceCleared",
|
| - value_index, num_values);
|
| - return;
|
| - case PrefHashStore::MIGRATED:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceMigrated",
|
| - value_index, num_values);
|
| - return;
|
| - case PrefHashStore::CHANGED:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceChanged",
|
| - value_index, num_values);
|
| - return;
|
| - case PrefHashStore::UNTRUSTED_UNKNOWN_VALUE:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceInitialized",
|
| - value_index, num_values);
|
| - return;
|
| - case PrefHashStore::TRUSTED_UNKNOWN_VALUE:
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceTrustedInitialized",
|
| - value_index, num_values);
|
| - return;
|
| - }
|
| - NOTREACHED() << "Unexpected PrefHashStore::ValueState: " << value_state;
|
| -}
|
| -
|
| -} // namespace
|
| -
|
| -PrefHashFilter::PrefHashFilter(scoped_ptr<PrefHashStore> pref_hash_store,
|
| - const TrackedPreference tracked_preferences[],
|
| - size_t tracked_preferences_size,
|
| - size_t reporting_ids_count,
|
| - EnforcementLevel enforcement_level)
|
| - : pref_hash_store_(pref_hash_store.Pass()),
|
| - reporting_ids_count_(reporting_ids_count),
|
| - enforce_(enforcement_level >= ENFORCE),
|
| - no_seeding_(enforcement_level >= ENFORCE_NO_SEEDING),
|
| - no_migration_(enforcement_level >= ENFORCE_NO_SEEDING_NO_MIGRATION) {
|
| +#include "chrome/browser/prefs/tracked/tracked_atomic_preference.h"
|
| +#include "chrome/browser/prefs/tracked/tracked_split_preference.h"
|
| +
|
| +PrefHashFilter::PrefHashFilter(
|
| + scoped_ptr<PrefHashStore> pref_hash_store,
|
| + const TrackedPreferenceMetadata tracked_preferences[],
|
| + size_t tracked_preferences_size,
|
| + size_t reporting_ids_count,
|
| + EnforcementLevel enforcement_level) {
|
| + DCHECK(pref_hash_store);
|
| DCHECK_GE(reporting_ids_count, tracked_preferences_size);
|
|
|
| for (size_t i = 0; i < tracked_preferences_size; ++i) {
|
| - bool is_new = tracked_paths_.insert(std::make_pair(
|
| - std::string(tracked_preferences[i].name),
|
| - tracked_preferences[i])).second;
|
| + const TrackedPreferenceMetadata& metadata = tracked_preferences[i];
|
| +
|
| + EnforcementLevel enforcement_level_for_pref =
|
| + metadata.allow_enforcement ? enforcement_level : NO_ENFORCEMENT;
|
| +
|
| + scoped_ptr<TrackedPreference> tracked_preference;
|
| + switch (metadata.strategy) {
|
| + case TRACKING_STRATEGY_ATOMIC:
|
| + tracked_preference.reset(
|
| + new TrackedAtomicPreference(metadata.name, metadata.reporting_id,
|
| + reporting_ids_count,
|
| + enforcement_level_for_pref,
|
| + pref_hash_store.get()));
|
| + break;
|
| + case TRACKING_STRATEGY_SPLIT:
|
| + tracked_preference.reset(
|
| + new TrackedSplitPreference(metadata.name, metadata.reporting_id,
|
| + reporting_ids_count,
|
| + enforcement_level_for_pref,
|
| + pref_hash_store.get()));
|
| + break;
|
| + }
|
| + DCHECK(tracked_preference);
|
| +
|
| + bool is_new = tracked_paths_.add(metadata.name,
|
| + tracked_preference.Pass()).second;
|
| DCHECK(is_new);
|
| }
|
| +
|
| + // Retain const-ownership of |pref_hash_store| in this class, non-const access
|
| + // was granted to this class' TrackedPreferences above which should be used
|
| + // for any further interaction with the |pref_hash_store|.
|
| + pref_hash_store_ = pref_hash_store.Pass();
|
| }
|
|
|
| PrefHashFilter::~PrefHashFilter() {
|
| @@ -79,9 +69,11 @@ void PrefHashFilter::Initialize(PrefStore* pref_store) {
|
|
|
| for (TrackedPreferencesMap::const_iterator it = tracked_paths_.begin();
|
| it != tracked_paths_.end(); ++it) {
|
| + const std::string& initialized_path = it->first;
|
| + const TrackedPreference* initialized_preference = it->second;
|
| const base::Value* value = NULL;
|
| - pref_store->GetValue(it->first, &value);
|
| - pref_hash_store_->StoreHash(it->first, value);
|
| + pref_store->GetValue(initialized_path, &value);
|
| + initialized_preference->OnNewValue(value);
|
| }
|
| }
|
|
|
| @@ -92,61 +84,7 @@ void PrefHashFilter::FilterOnLoad(base::DictionaryValue* pref_store_contents) {
|
| base::TimeTicks checkpoint = base::TimeTicks::Now();
|
| for (TrackedPreferencesMap::const_iterator it = tracked_paths_.begin();
|
| it != tracked_paths_.end(); ++it) {
|
| - const std::string& pref_path = it->first;
|
| - const TrackedPreference& metadata = it->second;
|
| - const base::Value* value = NULL;
|
| - pref_store_contents->Get(pref_path, &value);
|
| -
|
| - PrefHashStore::ValueState value_state =
|
| - pref_hash_store_->CheckValue(pref_path, value);
|
| - ReportValidationResult(value_state, metadata.reporting_id,
|
| - reporting_ids_count_);
|
| -
|
| - enum {
|
| - DONT_RESET,
|
| - WANTED_RESET,
|
| - DO_RESET,
|
| - } reset_state = DONT_RESET;
|
| - if (metadata.allow_enforcement) {
|
| - switch (value_state) {
|
| - case PrefHashStore::UNCHANGED:
|
| - // Desired case, nothing to do.
|
| - break;
|
| - case PrefHashStore::CLEARED:
|
| - // Unfortunate case, but there is nothing we can do.
|
| - break;
|
| - case PrefHashStore::TRUSTED_UNKNOWN_VALUE:
|
| - // It is okay to seed the hash in this case.
|
| - break;
|
| - case PrefHashStore::MIGRATED:
|
| - reset_state = no_migration_ ? DO_RESET : WANTED_RESET;
|
| - break;
|
| - case PrefHashStore::UNTRUSTED_UNKNOWN_VALUE:
|
| - reset_state = no_seeding_ ? DO_RESET : WANTED_RESET;
|
| - break;
|
| - case PrefHashStore::CHANGED:
|
| - reset_state = enforce_ ? DO_RESET : WANTED_RESET;
|
| - break;
|
| - }
|
| - }
|
| -
|
| - if (reset_state == DO_RESET) {
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceReset",
|
| - metadata.reporting_id, reporting_ids_count_);
|
| - // TODO(gab): Store the |old_value| to provide an undo UI.
|
| - scoped_ptr<base::Value> old_value;
|
| - pref_store_contents->RemovePath(pref_path, &old_value);
|
| - } else if (reset_state == WANTED_RESET) {
|
| - UMA_HISTOGRAM_ENUMERATION("Settings.TrackedPreferenceWantedReset",
|
| - metadata.reporting_id, reporting_ids_count_);
|
| - }
|
| -
|
| - if (value_state != PrefHashStore::UNCHANGED) {
|
| - // Store the hash for the new value (whether it was reset or not).
|
| - const base::Value* new_value = NULL;
|
| - pref_store_contents->Get(pref_path, &new_value);
|
| - pref_hash_store_->StoreHash(pref_path, new_value);
|
| - }
|
| + it->second->EnforceAndReport(pref_store_contents);
|
| }
|
| // TODO(gab): Remove this histogram by Feb 21 2014; after sufficient timing
|
| // data has been gathered from the wild to be confident this doesn't
|
| @@ -158,8 +96,9 @@ void PrefHashFilter::FilterOnLoad(base::DictionaryValue* pref_store_contents) {
|
| // Marks |path| has having changed if it is part of |tracked_paths_|. A new hash
|
| // will be stored for it the next time FilterSerializeData() is invoked.
|
| void PrefHashFilter::FilterUpdate(const std::string& path) {
|
| - if (tracked_paths_.find(path) != tracked_paths_.end())
|
| - changed_paths_.insert(path);
|
| + TrackedPreferencesMap::const_iterator it = tracked_paths_.find(path);
|
| + if (it != tracked_paths_.end())
|
| + changed_paths_.insert(std::make_pair(path, it->second));
|
| }
|
|
|
| // Updates the stored hashes for |changed_paths_| before serializing data to
|
| @@ -169,12 +108,13 @@ void PrefHashFilter::FilterSerializeData(
|
| const base::DictionaryValue* pref_store_contents) {
|
| if (!changed_paths_.empty()) {
|
| base::TimeTicks checkpoint = base::TimeTicks::Now();
|
| - for (std::set<std::string>::const_iterator it = changed_paths_.begin();
|
| + for (ChangedPathsMap::const_iterator it = changed_paths_.begin();
|
| it != changed_paths_.end(); ++it) {
|
| - const std::string& changed_path = *it;
|
| + const std::string& changed_path = it->first;
|
| + const TrackedPreference* changed_preference = it->second;
|
| const base::Value* value = NULL;
|
| pref_store_contents->Get(changed_path, &value);
|
| - pref_hash_store_->StoreHash(changed_path, value);
|
| + changed_preference->OnNewValue(value);
|
| }
|
| changed_paths_.clear();
|
| // TODO(gab): Remove this histogram by Feb 21 2014; after sufficient timing
|
|
|