| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 #ifndef CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ | 5 #ifndef CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ |
| 6 #define CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ | 6 #define CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ |
| 7 #pragma once | 7 #pragma once |
| 8 | 8 |
| 9 #include <map> | 9 #include <map> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <vector> | 11 #include <vector> |
| 12 | 12 |
| 13 #include "base/basictypes.h" | 13 #include "base/basictypes.h" |
| 14 #include "base/callback.h" | 14 #include "base/callback.h" |
| 15 #include "base/gtest_prod_util.h" | 15 #include "base/gtest_prod_util.h" |
| 16 #include "base/ref_counted.h" | 16 #include "base/ref_counted.h" |
| 17 #include "base/scoped_ptr.h" | |
| 18 #include "base/values.h" | 17 #include "base/values.h" |
| 19 #include "chrome/browser/browser_thread.h" | 18 #include "chrome/browser/browser_thread.h" |
| 20 #include "chrome/common/notification_observer.h" | 19 #include "chrome/common/notification_observer.h" |
| 21 #include "chrome/common/notification_registrar.h" | 20 #include "chrome/common/notification_registrar.h" |
| 22 #include "chrome/common/pref_store.h" | 21 #include "chrome/common/pref_store.h" |
| 23 | 22 |
| 24 class FilePath; | 23 class FilePath; |
| 25 class PrefNotifier; | 24 class PrefNotifier; |
| 26 class PrefStore; | 25 class PrefStore; |
| 27 class Profile; | 26 class Profile; |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 59 // | 58 // |
| 60 // The |profile| parameter is used to construct a replacement device | 59 // The |profile| parameter is used to construct a replacement device |
| 61 // management pref store. This is done after policy refresh when we swap out | 60 // management pref store. This is done after policy refresh when we swap out |
| 62 // the policy pref stores for new ones, so the |profile| pointer needs to be | 61 // the policy pref stores for new ones, so the |profile| pointer needs to be |
| 63 // kept around for then. It is safe to pass a NULL pointer for local state | 62 // kept around for then. It is safe to pass a NULL pointer for local state |
| 64 // preferences. | 63 // preferences. |
| 65 // | 64 // |
| 66 // TODO(mnissler, danno): Refactor the pref store interface and refresh logic | 65 // TODO(mnissler, danno): Refactor the pref store interface and refresh logic |
| 67 // so refreshes can be handled by the pref store itself without swapping | 66 // so refreshes can be handled by the pref store itself without swapping |
| 68 // stores. This way we can get rid of the profile pointer here. | 67 // stores. This way we can get rid of the profile pointer here. |
| 69 PrefValueStore(PrefStore* managed_platform_prefs, | 68 PrefValueStore(scoped_refptr<PrefStore> managed_platform_prefs, |
| 70 PrefStore* device_management_prefs, | 69 scoped_refptr<PrefStore> device_management_prefs, |
| 71 PrefStore* extension_prefs, | 70 scoped_refptr<PrefStore> extension_prefs, |
| 72 PrefStore* command_line_prefs, | 71 scoped_refptr<PrefStore> command_line_prefs, |
| 73 PrefStore* user_prefs, | 72 scoped_refptr<PrefStore> user_prefs, |
| 74 PrefStore* recommended_prefs, | 73 scoped_refptr<PrefStore> recommended_prefs, |
| 75 PrefStore* default_prefs, | 74 scoped_refptr<PrefStore> default_prefs, |
| 76 PrefNotifier* pref_notifier, | 75 PrefNotifier* pref_notifier, |
| 77 Profile* profile); | 76 Profile* profile); |
| 78 virtual ~PrefValueStore(); | 77 virtual ~PrefValueStore(); |
| 79 | 78 |
| 80 // Gets the value for the given preference name that has a valid value type; | 79 // Derives a new PrefValueStore that overrides the specified attributes. |
| 81 // that is, the same type the preference was registered with, or NULL for | 80 PrefValueStore* Derive(scoped_refptr<PrefStore> extension_prefs, |
| 82 // default values of Dictionaries and Lists. Returns true if a valid value | 81 scoped_refptr<PrefStore> user_prefs, |
| 83 // was found in any of the available PrefStores. Most callers should use | 82 PrefNotifier* pref_notifier); |
| 84 // Preference::GetValue() instead of calling this method directly. | |
| 85 bool GetValue(const std::string& name, Value** out_value) const; | |
| 86 | 83 |
| 87 // Adds a preference to the mapping of names to types. | 84 // Gets the value for the given preference name that has the specified value |
| 88 void RegisterPreferenceType(const std::string& name, Value::ValueType type); | 85 // type. Returns true if a valid value was found in any of the available |
| 89 | 86 // PrefStores. Most callers should use Preference::GetValue() instead of |
| 90 // Gets the registered value type for the given preference name. Returns | 87 // calling this method directly. |
| 91 // Value::TYPE_NULL if the preference has never been registered. | 88 bool GetValue(const std::string& name, |
| 92 Value::ValueType GetRegisteredType(const std::string& name) const; | 89 Value::ValueType type, |
| 93 | 90 Value** out_value) const; |
| 94 // Returns true if the PrefValueStore contains the given preference (i.e., | |
| 95 // it's been registered), and a value with the correct type has been actively | |
| 96 // set in some pref store. The application default specified when the pref was | |
| 97 // registered does not count as an "actively set" value, but another pref | |
| 98 // store setting a value that happens to be equal to the default does. | |
| 99 bool HasPrefPath(const char* name) const; | |
| 100 | 91 |
| 101 // These methods return true if a preference with the given name is in the | 92 // These methods return true if a preference with the given name is in the |
| 102 // indicated pref store, even if that value is currently being overridden by | 93 // indicated pref store, even if that value is currently being overridden by |
| 103 // a higher-priority source. | 94 // a higher-priority source. |
| 104 bool PrefValueInManagedPlatformStore(const char* name) const; | 95 bool PrefValueInManagedPlatformStore(const char* name) const; |
| 105 bool PrefValueInDeviceManagementStore(const char* name) const; | 96 bool PrefValueInDeviceManagementStore(const char* name) const; |
| 106 bool PrefValueInExtensionStore(const char* name) const; | 97 bool PrefValueInExtensionStore(const char* name) const; |
| 107 bool PrefValueInUserStore(const char* name) const; | 98 bool PrefValueInUserStore(const char* name) const; |
| 108 | 99 |
| 109 // These methods return true if a preference with the given name is actually | 100 // These methods return true if a preference with the given name is actually |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 // the PrefStore for changes, forwarding notifications to PrefValueStore. This | 138 // the PrefStore for changes, forwarding notifications to PrefValueStore. This |
| 148 // indirection is here for the sake of disambiguating notifications from the | 139 // indirection is here for the sake of disambiguating notifications from the |
| 149 // individual PrefStores. | 140 // individual PrefStores. |
| 150 class PrefStoreKeeper : public PrefStore::Observer { | 141 class PrefStoreKeeper : public PrefStore::Observer { |
| 151 public: | 142 public: |
| 152 PrefStoreKeeper(); | 143 PrefStoreKeeper(); |
| 153 virtual ~PrefStoreKeeper(); | 144 virtual ~PrefStoreKeeper(); |
| 154 | 145 |
| 155 // Takes ownership of |pref_store|. | 146 // Takes ownership of |pref_store|. |
| 156 void Initialize(PrefValueStore* store, | 147 void Initialize(PrefValueStore* store, |
| 157 PrefStore* pref_store, | 148 scoped_refptr<PrefStore> pref_store, |
| 158 PrefStoreType type); | 149 PrefStoreType type); |
| 159 | 150 |
| 160 PrefStore* store() { return pref_store_.get(); } | 151 scoped_refptr<PrefStore> store() { return pref_store_; } |
| 161 const PrefStore* store() const { return pref_store_.get(); } | 152 const scoped_refptr<PrefStore> store() const { return pref_store_; } |
| 162 | 153 |
| 163 private: | 154 private: |
| 164 // PrefStore::Observer implementation. | 155 // PrefStore::Observer implementation. |
| 165 virtual void OnPrefValueChanged(const std::string& key); | 156 virtual void OnPrefValueChanged(const std::string& key); |
| 166 virtual void OnInitializationCompleted(); | 157 virtual void OnInitializationCompleted(); |
| 167 | 158 |
| 168 // PrefValueStore this keeper is part of. | 159 // PrefValueStore this keeper is part of. |
| 169 PrefValueStore* pref_value_store_; | 160 PrefValueStore* pref_value_store_; |
| 170 | 161 |
| 171 // The PrefStore managed by this keeper. | 162 // The PrefStore managed by this keeper. |
| 172 scoped_ptr<PrefStore> pref_store_; | 163 scoped_refptr<PrefStore> pref_store_; |
| 173 | 164 |
| 174 // Type of the pref store. | 165 // Type of the pref store. |
| 175 PrefStoreType type_; | 166 PrefStoreType type_; |
| 176 | 167 |
| 177 DISALLOW_COPY_AND_ASSIGN(PrefStoreKeeper); | 168 DISALLOW_COPY_AND_ASSIGN(PrefStoreKeeper); |
| 178 }; | 169 }; |
| 179 | 170 |
| 180 typedef std::map<std::string, Value::ValueType> PrefTypeMap; | 171 typedef std::map<std::string, Value::ValueType> PrefTypeMap; |
| 181 | 172 |
| 182 friend class PrefValueStorePolicyRefreshTest; | 173 friend class PrefValueStorePolicyRefreshTest; |
| 183 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, TestPolicyRefresh); | 174 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, TestPolicyRefresh); |
| 184 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, | 175 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, |
| 185 TestRefreshPolicyPrefsCompletion); | 176 TestRefreshPolicyPrefsCompletion); |
| 186 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, | 177 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, |
| 187 TestConcurrentPolicyRefresh); | 178 TestConcurrentPolicyRefresh); |
| 188 | 179 |
| 189 // Returns true if the actual type is a valid type for the expected type when | |
| 190 // found in the given store. | |
| 191 static bool IsValidType(Value::ValueType expected, | |
| 192 Value::ValueType actual, | |
| 193 PrefStoreType store); | |
| 194 | |
| 195 // Returns true if the preference with the given name has a value in the | 180 // Returns true if the preference with the given name has a value in the |
| 196 // given PrefStoreType, of the same value type as the preference was | 181 // given PrefStoreType, of the same value type as the preference was |
| 197 // registered with. | 182 // registered with. |
| 198 bool PrefValueInStore(const char* name, PrefStoreType store) const; | 183 bool PrefValueInStore(const char* name, PrefStoreType store) const; |
| 199 | 184 |
| 200 // Returns true if a preference has an explicit value in any of the | 185 // Returns true if a preference has an explicit value in any of the |
| 201 // stores in the range specified by |first_checked_store| and | 186 // stores in the range specified by |first_checked_store| and |
| 202 // |last_checked_store|, even if that value is currently being | 187 // |last_checked_store|, even if that value is currently being |
| 203 // overridden by a higher-priority store. | 188 // overridden by a higher-priority store. |
| 204 bool PrefValueInStoreRange(const char* name, | 189 bool PrefValueInStoreRange(const char* name, |
| (...skipping 20 matching lines...) Expand all Loading... |
| 225 | 210 |
| 226 // Called as a result of a notification of policy change. Triggers a reload of | 211 // Called as a result of a notification of policy change. Triggers a reload of |
| 227 // managed platform, device management and recommended preferences from policy | 212 // managed platform, device management and recommended preferences from policy |
| 228 // from a Task on the FILE thread. | 213 // from a Task on the FILE thread. |
| 229 void RefreshPolicyPrefs(); | 214 void RefreshPolicyPrefs(); |
| 230 | 215 |
| 231 // Called during policy refresh after ReadPrefs completes on the thread | 216 // Called during policy refresh after ReadPrefs completes on the thread |
| 232 // that initiated the policy refresh. RefreshPolicyPrefsCompletion takes | 217 // that initiated the policy refresh. RefreshPolicyPrefsCompletion takes |
| 233 // ownership of the |callback| object. | 218 // ownership of the |callback| object. |
| 234 void RefreshPolicyPrefsCompletion( | 219 void RefreshPolicyPrefsCompletion( |
| 235 policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store, | 220 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 236 policy::ConfigurationPolicyPrefStore* new_device_management_pref_store, | 221 new_managed_platform_pref_store, |
| 237 policy::ConfigurationPolicyPrefStore* new_recommended_pref_store); | 222 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 223 new_device_management_pref_store, |
| 224 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 225 new_recommended_pref_store); |
| 238 | 226 |
| 239 // Called during policy refresh to do the ReadPrefs on the FILE thread. | 227 // Called during policy refresh to do the ReadPrefs on the FILE thread. |
| 240 // RefreshPolicyPrefsOnFileThread takes ownership of the |callback| object. | 228 // RefreshPolicyPrefsOnFileThread takes ownership of the |callback| object. |
| 241 void RefreshPolicyPrefsOnFileThread( | 229 void RefreshPolicyPrefsOnFileThread( |
| 242 BrowserThread::ID calling_thread_id, | 230 BrowserThread::ID calling_thread_id, |
| 243 policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store, | 231 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 244 policy::ConfigurationPolicyPrefStore* new_device_management_pref_store, | 232 new_managed_platform_pref_store, |
| 245 policy::ConfigurationPolicyPrefStore* new_recommended_pref_store); | 233 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 234 new_device_management_pref_store, |
| 235 scoped_refptr<policy::ConfigurationPolicyPrefStore> |
| 236 new_recommended_pref_store); |
| 246 | 237 |
| 247 // NotificationObserver methods: | 238 // NotificationObserver methods: |
| 248 virtual void Observe(NotificationType type, | 239 virtual void Observe(NotificationType type, |
| 249 const NotificationSource& source, | 240 const NotificationSource& source, |
| 250 const NotificationDetails& details); | 241 const NotificationDetails& details); |
| 251 | 242 |
| 252 // Called from the PrefStoreKeeper implementation when a pref value for |key| | 243 // Called from the PrefStoreKeeper implementation when a pref value for |key| |
| 253 // changed in the pref store for |type|. | 244 // changed in the pref store for |type|. |
| 254 void OnPrefValueChanged(PrefStoreType type, const std::string& key); | 245 void OnPrefValueChanged(PrefStoreType type, const std::string& key); |
| 255 | 246 |
| 256 // Handle the event that the store for |type| has completed initialization. | 247 // Handle the event that the store for |type| has completed initialization. |
| 257 void OnInitializationCompleted(PrefStoreType type); | 248 void OnInitializationCompleted(PrefStoreType type); |
| 258 | 249 |
| 259 // Initializes a pref store keeper. Sets up a PrefStoreKeeper that will take | 250 // Initializes a pref store keeper. Sets up a PrefStoreKeeper that will take |
| 260 // ownership of the passed |pref_store|. | 251 // ownership of the passed |pref_store|. |
| 261 void InitPrefStore(PrefStoreType type, PrefStore* pref_store); | 252 void InitPrefStore(PrefStoreType type, scoped_refptr<PrefStore> pref_store); |
| 262 | 253 |
| 263 // Checks whether initialization is completed and tells the notifier if that | 254 // Checks whether initialization is completed and tells the notifier if that |
| 264 // is the case. | 255 // is the case. |
| 265 void CheckInitializationCompleted(); | 256 void CheckInitializationCompleted(); |
| 266 | 257 |
| 267 // Get the PrefStore pointer for the given type. May return NULL if there is | 258 // Get the PrefStore pointer for the given type. May return NULL if there is |
| 268 // no PrefStore for that type. | 259 // no PrefStore for that type. |
| 269 PrefStore* GetPrefStore(PrefStoreType type) { | 260 scoped_refptr<PrefStore> GetPrefStore(PrefStoreType type) { |
| 270 return pref_stores_[type].store(); | 261 return pref_stores_[type].store(); |
| 271 } | 262 } |
| 272 const PrefStore* GetPrefStore(PrefStoreType type) const { | 263 const scoped_refptr<PrefStore> GetPrefStore(PrefStoreType type) const { |
| 273 return pref_stores_[type].store(); | 264 return pref_stores_[type].store(); |
| 274 } | 265 } |
| 275 | 266 |
| 276 // Keeps the PrefStore references in order of precedence. | 267 // Keeps the PrefStore references in order of precedence. |
| 277 PrefStoreKeeper pref_stores_[PREF_STORE_TYPE_MAX + 1]; | 268 PrefStoreKeeper pref_stores_[PREF_STORE_TYPE_MAX + 1]; |
| 278 | 269 |
| 279 // Used for generating PREF_CHANGED and PREF_INITIALIZATION_COMPLETED | 270 // Used for generating PREF_CHANGED and PREF_INITIALIZATION_COMPLETED |
| 280 // notifications. This is a weak reference, since the notifier is owned by the | 271 // notifications. This is a weak reference, since the notifier is owned by the |
| 281 // corresponding PrefService. | 272 // corresponding PrefService. |
| 282 PrefNotifier* pref_notifier_; | 273 PrefNotifier* pref_notifier_; |
| 283 | 274 |
| 284 // A mapping of preference names to their registered types. | |
| 285 PrefTypeMap pref_types_; | |
| 286 | |
| 287 // The associated profile, in case this value store is associated with a | 275 // The associated profile, in case this value store is associated with a |
| 288 // profile pref service. Used for recreating the device management pref store | 276 // profile pref service. Used for recreating the device management pref store |
| 289 // upon policy refresh. | 277 // upon policy refresh. |
| 290 Profile* profile_; | 278 Profile* profile_; |
| 291 | 279 |
| 292 // TODO(mnissler): Remove this after cleaning up policy refresh handling. | 280 // TODO(mnissler): Remove this after cleaning up policy refresh handling. |
| 293 NotificationRegistrar registrar_; | 281 NotificationRegistrar registrar_; |
| 294 | 282 |
| 295 DISALLOW_COPY_AND_ASSIGN(PrefValueStore); | 283 DISALLOW_COPY_AND_ASSIGN(PrefValueStore); |
| 296 }; | 284 }; |
| 297 | 285 |
| 298 #endif // CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ | 286 #endif // CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ |
| OLD | NEW |