| Index: chrome/browser/prefs/pref_value_store.cc
|
| diff --git a/chrome/browser/prefs/pref_value_store.cc b/chrome/browser/prefs/pref_value_store.cc
|
| index 3ad6c44f009bc614e641d271d666f9f7e0237c9f..f55c5d4798a37249dda26adcf90acd5426e05820 100644
|
| --- a/chrome/browser/prefs/pref_value_store.cc
|
| +++ b/chrome/browser/prefs/pref_value_store.cc
|
| @@ -21,13 +21,13 @@ PrefValueStore::PrefStoreKeeper::~PrefStoreKeeper() {
|
|
|
| void PrefValueStore::PrefStoreKeeper::Initialize(
|
| PrefValueStore* store,
|
| - PrefStore* pref_store,
|
| + scoped_refptr<PrefStore> pref_store,
|
| PrefValueStore::PrefStoreType type) {
|
| if (pref_store_.get())
|
| pref_store_->RemoveObserver(this);
|
| type_ = type;
|
| pref_value_store_ = store;
|
| - pref_store_.reset(pref_store);
|
| + pref_store_ = pref_store;
|
| if (pref_store_.get())
|
| pref_store_->AddObserver(this);
|
| }
|
| @@ -41,13 +41,13 @@ void PrefValueStore::PrefStoreKeeper::OnInitializationCompleted() {
|
| pref_value_store_->OnInitializationCompleted(type_);
|
| }
|
|
|
| -PrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs,
|
| - PrefStore* device_management_prefs,
|
| - PrefStore* extension_prefs,
|
| - PrefStore* command_line_prefs,
|
| - PrefStore* user_prefs,
|
| - PrefStore* recommended_prefs,
|
| - PrefStore* default_prefs,
|
| +PrefValueStore::PrefValueStore(scoped_refptr<PrefStore> managed_platform_prefs,
|
| + scoped_refptr<PrefStore> device_management_prefs,
|
| + scoped_refptr<PrefStore> extension_prefs,
|
| + scoped_refptr<PrefStore> command_line_prefs,
|
| + scoped_refptr<PrefStore> user_prefs,
|
| + scoped_refptr<PrefStore> recommended_prefs,
|
| + scoped_refptr<PrefStore> default_prefs,
|
| PrefNotifier* pref_notifier,
|
| Profile* profile)
|
| : pref_notifier_(pref_notifier),
|
| @@ -70,49 +70,46 @@ PrefValueStore::PrefValueStore(PrefStore* managed_platform_prefs,
|
|
|
| PrefValueStore::~PrefValueStore() {}
|
|
|
| +PrefValueStore* PrefValueStore::Derive(scoped_refptr<PrefStore> extension_prefs,
|
| + scoped_refptr<PrefStore> user_prefs,
|
| + PrefNotifier* pref_notifier) {
|
| + return new PrefValueStore(GetPrefStore(MANAGED_PLATFORM_STORE),
|
| + GetPrefStore(DEVICE_MANAGEMENT_STORE),
|
| + extension_prefs,
|
| + GetPrefStore(COMMAND_LINE_STORE),
|
| + user_prefs,
|
| + GetPrefStore(RECOMMENDED_STORE),
|
| + GetPrefStore(DEFAULT_STORE),
|
| + pref_notifier,
|
| + profile_);
|
| +}
|
| +
|
| bool PrefValueStore::GetValue(const std::string& name,
|
| + Value::ValueType type,
|
| Value** out_value) const {
|
| + *out_value = NULL;
|
| // Check the |PrefStore|s in order of their priority from highest to lowest
|
| // to find the value of the preference described by the given preference name.
|
| for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
|
| if (GetValueFromStore(name.c_str(), static_cast<PrefStoreType>(i),
|
| - out_value))
|
| + out_value)) {
|
| + if (!(*out_value)->IsType(type)) {
|
| + LOG(WARNING) << "Expected type for " << name << " is " << type
|
| + << " but got " << (*out_value)->GetType()
|
| + << " in store " << i;
|
| + continue;
|
| + }
|
| return true;
|
| + }
|
| }
|
| return false;
|
| }
|
|
|
| -void PrefValueStore::RegisterPreferenceType(const std::string& name,
|
| - Value::ValueType type) {
|
| - pref_types_[name] = type;
|
| -}
|
| -
|
| -Value::ValueType PrefValueStore::GetRegisteredType(
|
| - const std::string& name) const {
|
| - PrefTypeMap::const_iterator found = pref_types_.find(name);
|
| - if (found == pref_types_.end())
|
| - return Value::TYPE_NULL;
|
| - return found->second;
|
| -}
|
| -
|
| -bool PrefValueStore::HasPrefPath(const char* path) const {
|
| - Value* tmp_value = NULL;
|
| - const std::string name(path);
|
| - bool rv = GetValue(name, &tmp_value);
|
| - // Merely registering a pref doesn't count as "having" it: we require a
|
| - // non-default value set.
|
| - return rv && !PrefValueFromDefaultStore(path);
|
| -}
|
| -
|
| void PrefValueStore::NotifyPrefChanged(
|
| const char* path,
|
| PrefValueStore::PrefStoreType new_store) {
|
| DCHECK(new_store != INVALID_STORE);
|
|
|
| - // If this pref is not registered, just discard the notification.
|
| - if (!pref_types_.count(path))
|
| - return;
|
| -
|
| bool changed = true;
|
| // Replying that the pref has changed in case the new store is invalid may
|
| // cause problems, but it's the safer choice.
|
| @@ -165,24 +162,6 @@ bool PrefValueStore::PrefValueUserModifiable(const char* name) const {
|
| effective_store == INVALID_STORE;
|
| }
|
|
|
| -// Returns true if the actual value is a valid type for the expected type when
|
| -// found in the given store.
|
| -bool PrefValueStore::IsValidType(Value::ValueType expected,
|
| - Value::ValueType actual,
|
| - PrefValueStore::PrefStoreType store) {
|
| - if (expected == actual)
|
| - return true;
|
| -
|
| - // Dictionaries and lists are allowed to hold TYPE_NULL values too, but only
|
| - // in the default pref store.
|
| - if (store == DEFAULT_STORE &&
|
| - actual == Value::TYPE_NULL &&
|
| - (expected == Value::TYPE_DICTIONARY || expected == Value::TYPE_LIST)) {
|
| - return true;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| bool PrefValueStore::PrefValueInStore(
|
| const char* name,
|
| PrefValueStore::PrefStoreType store) const {
|
| @@ -223,7 +202,8 @@ bool PrefValueStore::GetValueFromStore(const char* name,
|
| Value** out_value) const {
|
| // Only return true if we find a value and it is the correct type, so stale
|
| // values with the incorrect type will be ignored.
|
| - const PrefStore* store = GetPrefStore(static_cast<PrefStoreType>(store_type));
|
| + scoped_refptr<PrefStore> store =
|
| + GetPrefStore(static_cast<PrefStoreType>(store_type));
|
| if (store) {
|
| switch (store->GetValue(name, out_value)) {
|
| case PrefStore::READ_USE_DEFAULT:
|
| @@ -234,12 +214,7 @@ bool PrefValueStore::GetValueFromStore(const char* name,
|
| }
|
| // Fall through...
|
| case PrefStore::READ_OK:
|
| - if (IsValidType(GetRegisteredType(name),
|
| - (*out_value)->GetType(),
|
| - store_type)) {
|
| - return true;
|
| - }
|
| - break;
|
| + return true;
|
| case PrefStore::READ_NO_VALUE:
|
| break;
|
| }
|
| @@ -252,24 +227,21 @@ bool PrefValueStore::GetValueFromStore(const char* name,
|
|
|
| void PrefValueStore::RefreshPolicyPrefsOnFileThread(
|
| BrowserThread::ID calling_thread_id,
|
| - policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store,
|
| - policy::ConfigurationPolicyPrefStore* new_device_management_pref_store,
|
| - policy::ConfigurationPolicyPrefStore* new_recommended_pref_store) {
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_managed_platform_pref_store,
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_device_management_pref_store,
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_recommended_pref_store) {
|
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE));
|
| - scoped_ptr<policy::ConfigurationPolicyPrefStore> managed_platform_pref_store(
|
| - new_managed_platform_pref_store);
|
| - scoped_ptr<policy::ConfigurationPolicyPrefStore> device_management_pref_store(
|
| - new_device_management_pref_store);
|
| - scoped_ptr<policy::ConfigurationPolicyPrefStore> recommended_pref_store(
|
| - new_recommended_pref_store);
|
|
|
| BrowserThread::PostTask(
|
| calling_thread_id, FROM_HERE,
|
| NewRunnableMethod(this,
|
| &PrefValueStore::RefreshPolicyPrefsCompletion,
|
| - managed_platform_pref_store.release(),
|
| - device_management_pref_store.release(),
|
| - recommended_pref_store.release()));
|
| + new_managed_platform_pref_store,
|
| + new_device_management_pref_store,
|
| + new_recommended_pref_store));
|
| }
|
|
|
| void PrefValueStore::RefreshPolicyPrefs() {
|
| @@ -281,12 +253,12 @@ void PrefValueStore::RefreshPolicyPrefs() {
|
| // created and the refreshed policy read into them. The new stores
|
| // are swapped with the old from a Task on the UI thread after the
|
| // load is complete.
|
| - ConfigurationPolicyPrefStore* new_managed_platform_pref_store(
|
| + scoped_refptr<ConfigurationPolicyPrefStore> new_managed_platform_pref_store(
|
| ConfigurationPolicyPrefStore::CreateManagedPlatformPolicyPrefStore());
|
| - ConfigurationPolicyPrefStore* new_device_management_pref_store(
|
| + scoped_refptr<ConfigurationPolicyPrefStore> new_device_management_pref_store(
|
| ConfigurationPolicyPrefStore::CreateDeviceManagementPolicyPrefStore(
|
| profile_));
|
| - ConfigurationPolicyPrefStore* new_recommended_pref_store(
|
| + scoped_refptr<ConfigurationPolicyPrefStore> new_recommended_pref_store(
|
| ConfigurationPolicyPrefStore::CreateRecommendedPolicyPrefStore());
|
| BrowserThread::ID current_thread_id;
|
| CHECK(BrowserThread::GetCurrentThreadIdentifier(¤t_thread_id));
|
| @@ -301,25 +273,28 @@ void PrefValueStore::RefreshPolicyPrefs() {
|
| }
|
|
|
| void PrefValueStore::RefreshPolicyPrefsCompletion(
|
| - policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store,
|
| - policy::ConfigurationPolicyPrefStore* new_device_management_pref_store,
|
| - policy::ConfigurationPolicyPrefStore* new_recommended_pref_store) {
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_managed_platform_pref_store,
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_device_management_pref_store,
|
| + scoped_refptr<policy::ConfigurationPolicyPrefStore>
|
| + new_recommended_pref_store) {
|
| // Determine the paths of all the changed preferences values in the three
|
| // policy-related stores (managed platform, device management and
|
| // recommended).
|
| DictionaryValue* managed_platform_prefs_before(
|
| static_cast<policy::ConfigurationPolicyPrefStore*>(
|
| - GetPrefStore(MANAGED_PLATFORM_STORE))->prefs());
|
| + GetPrefStore(MANAGED_PLATFORM_STORE).get())->prefs());
|
| DictionaryValue* managed_platform_prefs_after(
|
| new_managed_platform_pref_store->prefs());
|
| DictionaryValue* device_management_prefs_before(
|
| static_cast<policy::ConfigurationPolicyPrefStore*>(
|
| - GetPrefStore(DEVICE_MANAGEMENT_STORE))->prefs());
|
| + GetPrefStore(DEVICE_MANAGEMENT_STORE).get())->prefs());
|
| DictionaryValue* device_management_prefs_after(
|
| new_device_management_pref_store->prefs());
|
| DictionaryValue* recommended_prefs_before(
|
| static_cast<policy::ConfigurationPolicyPrefStore*>(
|
| - GetPrefStore(RECOMMENDED_STORE))->prefs());
|
| + GetPrefStore(RECOMMENDED_STORE).get())->prefs());
|
| DictionaryValue* recommended_prefs_after(new_recommended_pref_store->prefs());
|
|
|
| std::vector<std::string> changed_managed_platform_paths;
|
| @@ -397,13 +372,14 @@ void PrefValueStore::OnInitializationCompleted(
|
| }
|
|
|
| void PrefValueStore::InitPrefStore(PrefValueStore::PrefStoreType type,
|
| - PrefStore* pref_store) {
|
| + scoped_refptr<PrefStore> pref_store) {
|
| pref_stores_[type].Initialize(this, pref_store, type);
|
| }
|
|
|
| void PrefValueStore::CheckInitializationCompleted() {
|
| for (size_t i = 0; i <= PREF_STORE_TYPE_MAX; ++i) {
|
| - PrefStore* store = GetPrefStore(static_cast<PrefStoreType>(i));
|
| + scoped_refptr<PrefStore> store =
|
| + GetPrefStore(static_cast<PrefStoreType>(i));
|
| if (store && !store->IsInitializationComplete())
|
| return;
|
| }
|
|
|