| 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" | 17 #include "base/scoped_ptr.h" |
| 18 #include "base/values.h" | 18 #include "base/values.h" |
| 19 #include "chrome/browser/browser_thread.h" | 19 #include "chrome/browser/browser_thread.h" |
| 20 #include "chrome/common/notification_observer.h" | 20 #include "chrome/common/notification_observer.h" |
| 21 #include "chrome/common/notification_registrar.h" | 21 #include "chrome/common/notification_registrar.h" |
| 22 #include "chrome/common/pref_store.h" | 22 #include "chrome/common/pref_store.h" |
| 23 | 23 |
| 24 class FilePath; | 24 class FilePath; |
| 25 class PrefNotifier; | 25 class PrefNotifier; |
| 26 class PrefStore; | 26 class PrefStore; |
| 27 class Profile; | 27 class Profile; |
| 28 | 28 |
| 29 // TODO(danno, mnissler): Remove after policy refresh cleanup. |
| 30 namespace policy { |
| 31 class ConfigurationPolicyPrefStore; |
| 32 } |
| 33 |
| 29 // The PrefValueStore manages various sources of values for Preferences | 34 // The PrefValueStore manages various sources of values for Preferences |
| 30 // (e.g., configuration policies, extensions, and user settings). It returns | 35 // (e.g., configuration policies, extensions, and user settings). It returns |
| 31 // the value of a Preference from the source with the highest priority, and | 36 // the value of a Preference from the source with the highest priority, and |
| 32 // allows setting user-defined values for preferences that are not managed. | 37 // allows setting user-defined values for preferences that are not managed. |
| 33 // | 38 // |
| 34 // Unless otherwise explicitly noted, all of the methods of this class must | 39 // Unless otherwise explicitly noted, all of the methods of this class must |
| 35 // be called on the UI thread. | 40 // be called on the UI thread. |
| 36 class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore>, | 41 class PrefValueStore : public base::RefCountedThreadSafe<PrefValueStore>, |
| 37 public NotificationObserver { | 42 public NotificationObserver { |
| 38 public: | 43 public: |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 72 Profile* profile); | 77 Profile* profile); |
| 73 virtual ~PrefValueStore(); | 78 virtual ~PrefValueStore(); |
| 74 | 79 |
| 75 // Gets the value for the given preference name that has a valid value type; | 80 // Gets the value for the given preference name that has a valid value type; |
| 76 // that is, the same type the preference was registered with, or NULL for | 81 // that is, the same type the preference was registered with, or NULL for |
| 77 // default values of Dictionaries and Lists. Returns true if a valid value | 82 // default values of Dictionaries and Lists. Returns true if a valid value |
| 78 // was found in any of the available PrefStores. Most callers should use | 83 // was found in any of the available PrefStores. Most callers should use |
| 79 // Preference::GetValue() instead of calling this method directly. | 84 // Preference::GetValue() instead of calling this method directly. |
| 80 bool GetValue(const std::string& name, Value** out_value) const; | 85 bool GetValue(const std::string& name, Value** out_value) const; |
| 81 | 86 |
| 82 // Same as GetValue but only searches the user store. | |
| 83 bool GetUserValue(const std::string& name, Value** out_value) const; | |
| 84 | |
| 85 // Adds a preference to the mapping of names to types. | 87 // Adds a preference to the mapping of names to types. |
| 86 void RegisterPreferenceType(const std::string& name, Value::ValueType type); | 88 void RegisterPreferenceType(const std::string& name, Value::ValueType type); |
| 87 | 89 |
| 88 // Gets the registered value type for the given preference name. Returns | 90 // Gets the registered value type for the given preference name. Returns |
| 89 // Value::TYPE_NULL if the preference has never been registered. | 91 // Value::TYPE_NULL if the preference has never been registered. |
| 90 Value::ValueType GetRegisteredType(const std::string& name) const; | 92 Value::ValueType GetRegisteredType(const std::string& name) const; |
| 91 | 93 |
| 92 // Read preference values into the three PrefStores so that they are available | |
| 93 // through the GetValue method. Return the first error that occurs (but | |
| 94 // continue reading the remaining PrefStores). | |
| 95 PrefStore::PrefReadError ReadPrefs(); | |
| 96 | |
| 97 // Persists prefs (to disk or elsewhere). Returns true if writing values was | |
| 98 // successful. In practice, only the user prefs are expected to be written | |
| 99 // out. | |
| 100 // TODO(mnissler, danno): Handle writes through PrefService and remove. | |
| 101 bool WritePrefs(); | |
| 102 | |
| 103 // Calls the method ScheduleWritePrefs on the PrefStores. In practice, only | |
| 104 // the user prefs are expected to be written out. | |
| 105 // TODO(mnissler, danno): Handle writes through PrefService and remove. | |
| 106 void ScheduleWritePrefs(); | |
| 107 | |
| 108 // Returns true if the PrefValueStore contains the given preference (i.e., | 94 // Returns true if the PrefValueStore contains the given preference (i.e., |
| 109 // it's been registered), and a value with the correct type has been actively | 95 // it's been registered), and a value with the correct type has been actively |
| 110 // set in some pref store. The application default specified when the pref was | 96 // set in some pref store. The application default specified when the pref was |
| 111 // registered does not count as an "actively set" value, but another pref | 97 // registered does not count as an "actively set" value, but another pref |
| 112 // store setting a value that happens to be equal to the default does. | 98 // store setting a value that happens to be equal to the default does. |
| 113 bool HasPrefPath(const char* name) const; | 99 bool HasPrefPath(const char* name) const; |
| 114 | 100 |
| 115 // Returns true if the PrefValueStore is read-only. Because the managed | |
| 116 // platform, device management and recommended PrefStores are always | |
| 117 // read-only, the PrefValueStore as a whole is read-only if the PrefStore | |
| 118 // containing the user preferences is read-only. | |
| 119 bool ReadOnly() const; | |
| 120 | |
| 121 // Alters the user-defined value of a preference. Even if the preference is | |
| 122 // managed this method allows the user-defined value of the preference to be | |
| 123 // set. However, GetValue calls will not return this value as long as the | |
| 124 // preference is overriden by a store of higher precedence. Note that the | |
| 125 // PrefValueStore takes the ownership of the value referenced by |in_value|. | |
| 126 // It is an error to call this when no user PrefStore has been set. Triggers | |
| 127 // notifications if the user-visible value changes. | |
| 128 // TODO(mnissler, danno): Handle writes in PrefService and notifications in | |
| 129 // the pref store implementation, so we can remove this call. | |
| 130 void SetUserPrefValue(const char* name, Value* in_value); | |
| 131 | |
| 132 // Like SetUserPrefValue, but silently puts the value without triggering | |
| 133 // notifications. | |
| 134 // TODO(mnissler, danno): Handle writes in PrefService and notifications in | |
| 135 // the pref store implementation, so we can remove this call. | |
| 136 void SetUserPrefValueSilently(const char* name, Value* in_value); | |
| 137 | |
| 138 // Removes a value from the user PrefStore. If a preference is overriden by a | |
| 139 // store of higher precedence, this function will have no immediately visible | |
| 140 // effect. Triggers notifications if the user-visible value changes. | |
| 141 // TODO(mnissler, danno): Handle writes in PrefService and notifications in | |
| 142 // the pref store implementation, so we can remove this call. | |
| 143 void RemoveUserPrefValue(const char* name); | |
| 144 | |
| 145 // These methods return true if a preference with the given name is in the | 101 // These methods return true if a preference with the given name is in the |
| 146 // indicated pref store, even if that value is currently being overridden by | 102 // indicated pref store, even if that value is currently being overridden by |
| 147 // a higher-priority source. | 103 // a higher-priority source. |
| 148 bool PrefValueInManagedPlatformStore(const char* name) const; | 104 bool PrefValueInManagedPlatformStore(const char* name) const; |
| 149 bool PrefValueInDeviceManagementStore(const char* name) const; | 105 bool PrefValueInDeviceManagementStore(const char* name) const; |
| 150 bool PrefValueInExtensionStore(const char* name) const; | 106 bool PrefValueInExtensionStore(const char* name) const; |
| 151 bool PrefValueInUserStore(const char* name) const; | 107 bool PrefValueInUserStore(const char* name) const; |
| 152 | 108 |
| 153 // These methods return true if a preference with the given name is actually | 109 // These methods return true if a preference with the given name is actually |
| 154 // being controlled by the indicated pref store and not being overridden by | 110 // being controlled by the indicated pref store and not being overridden by |
| 155 // a higher-priority source. | 111 // a higher-priority source. |
| 156 bool PrefValueFromExtensionStore(const char* name) const; | 112 bool PrefValueFromExtensionStore(const char* name) const; |
| 157 bool PrefValueFromUserStore(const char* name) const; | 113 bool PrefValueFromUserStore(const char* name) const; |
| 158 bool PrefValueFromDefaultStore(const char* name) const; | 114 bool PrefValueFromDefaultStore(const char* name) const; |
| 159 | 115 |
| 160 // Check whether a Preference value is modifiable by the user, i.e. whether | 116 // Check whether a Preference value is modifiable by the user, i.e. whether |
| 161 // there is no higher-priority source controlling it. | 117 // there is no higher-priority source controlling it. |
| 162 bool PrefValueUserModifiable(const char* name) const; | 118 bool PrefValueUserModifiable(const char* name) const; |
| 163 | 119 |
| 164 // Returns true if there are proxy preferences in user-modifiable | |
| 165 // preference stores (e.g. CommandLinePrefStore, ExtensionPrefStore) | |
| 166 // that conflict with proxy settings specified by proxy policy. | |
| 167 bool HasPolicyConflictingUserProxySettings() const; | |
| 168 | |
| 169 private: | 120 private: |
| 170 // PrefStores must be listed here in order from highest to lowest priority. | 121 // PrefStores must be listed here in order from highest to lowest priority. |
| 171 // MANAGED_PLATFORM contains all managed preference values that are | 122 // MANAGED_PLATFORM contains all managed preference values that are |
| 172 // provided by a platform-specific policy mechanism (e.g. Windows | 123 // provided by a platform-specific policy mechanism (e.g. Windows |
| 173 // Group Policy). | 124 // Group Policy). |
| 174 // DEVICE_MANAGEMENT contains all managed preference values supplied | 125 // DEVICE_MANAGEMENT contains all managed preference values supplied |
| 175 // by the device management server (cloud policy). | 126 // by the device management server (cloud policy). |
| 176 // EXTENSION contains preference values set by extensions. | 127 // EXTENSION contains preference values set by extensions. |
| 177 // COMMAND_LINE contains preference values set by command-line switches. | 128 // COMMAND_LINE contains preference values set by command-line switches. |
| 178 // USER contains all user-set preference values. | 129 // USER contains all user-set preference values. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 189 USER_STORE, | 140 USER_STORE, |
| 190 RECOMMENDED_STORE, | 141 RECOMMENDED_STORE, |
| 191 DEFAULT_STORE, | 142 DEFAULT_STORE, |
| 192 PREF_STORE_TYPE_MAX = DEFAULT_STORE | 143 PREF_STORE_TYPE_MAX = DEFAULT_STORE |
| 193 }; | 144 }; |
| 194 | 145 |
| 195 // Keeps a PrefStore reference on behalf of the PrefValueStore and monitors | 146 // Keeps a PrefStore reference on behalf of the PrefValueStore and monitors |
| 196 // the PrefStore for changes, forwarding notifications to PrefValueStore. This | 147 // the PrefStore for changes, forwarding notifications to PrefValueStore. This |
| 197 // indirection is here for the sake of disambiguating notifications from the | 148 // indirection is here for the sake of disambiguating notifications from the |
| 198 // individual PrefStores. | 149 // individual PrefStores. |
| 199 class PrefStoreKeeper : public PrefStore::ObserverInterface { | 150 class PrefStoreKeeper : public PrefStore::Observer { |
| 200 public: | 151 public: |
| 201 PrefStoreKeeper(); | 152 PrefStoreKeeper(); |
| 202 virtual ~PrefStoreKeeper(); | 153 virtual ~PrefStoreKeeper(); |
| 203 | 154 |
| 204 // Takes ownership of |pref_store|. | 155 // Takes ownership of |pref_store|. |
| 205 void Initialize(PrefValueStore* store, | 156 void Initialize(PrefValueStore* store, |
| 206 PrefStore* pref_store, | 157 PrefStore* pref_store, |
| 207 PrefStoreType type); | 158 PrefStoreType type); |
| 208 | 159 |
| 209 PrefStore* store() { return pref_store_.get(); } | 160 PrefStore* store() { return pref_store_.get(); } |
| 210 const PrefStore* store() const { return pref_store_.get(); } | 161 const PrefStore* store() const { return pref_store_.get(); } |
| 211 | 162 |
| 212 private: | 163 private: |
| 213 // PrefStore::ObserverInterface implementation. | 164 // PrefStore::Observer implementation. |
| 214 virtual void OnPrefValueChanged(const std::string& key); | 165 virtual void OnPrefValueChanged(const std::string& key); |
| 215 virtual void OnInitializationCompleted(); | 166 virtual void OnInitializationCompleted(); |
| 216 | 167 |
| 217 // PrefValueStore this keeper is part of. | 168 // PrefValueStore this keeper is part of. |
| 218 PrefValueStore* pref_value_store_; | 169 PrefValueStore* pref_value_store_; |
| 219 | 170 |
| 220 // The PrefStore managed by this keeper. | 171 // The PrefStore managed by this keeper. |
| 221 scoped_ptr<PrefStore> pref_store_; | 172 scoped_ptr<PrefStore> pref_store_; |
| 222 | 173 |
| 223 // Type of the pref store. | 174 // Type of the pref store. |
| 224 PrefStoreType type_; | 175 PrefStoreType type_; |
| 225 | 176 |
| 226 DISALLOW_COPY_AND_ASSIGN(PrefStoreKeeper); | 177 DISALLOW_COPY_AND_ASSIGN(PrefStoreKeeper); |
| 227 }; | 178 }; |
| 228 | 179 |
| 229 typedef std::map<std::string, Value::ValueType> PrefTypeMap; | 180 typedef std::map<std::string, Value::ValueType> PrefTypeMap; |
| 230 | 181 |
| 231 friend class PrefValueStoreTest; | 182 friend class PrefValueStorePolicyRefreshTest; |
| 232 FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest, TestPolicyRefresh); | 183 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, TestPolicyRefresh); |
| 233 FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest, | 184 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, |
| 234 TestRefreshPolicyPrefsCompletion); | 185 TestRefreshPolicyPrefsCompletion); |
| 235 FRIEND_TEST_ALL_PREFIXES(PrefValueStoreTest, | 186 FRIEND_TEST_ALL_PREFIXES(PrefValueStorePolicyRefreshTest, |
| 236 TestConcurrentPolicyRefresh); | 187 TestConcurrentPolicyRefresh); |
| 237 | 188 |
| 238 // Returns true if the actual type is a valid type for the expected type when | 189 // Returns true if the actual type is a valid type for the expected type when |
| 239 // found in the given store. | 190 // found in the given store. |
| 240 static bool IsValidType(Value::ValueType expected, | 191 static bool IsValidType(Value::ValueType expected, |
| 241 Value::ValueType actual, | 192 Value::ValueType actual, |
| 242 PrefStoreType store); | 193 PrefStoreType store); |
| 243 | 194 |
| 244 // Returns true if the preference with the given name has a value in the | 195 // Returns true if the preference with the given name has a value in the |
| 245 // given PrefStoreType, of the same value type as the preference was | 196 // given PrefStoreType, of the same value type as the preference was |
| (...skipping 28 matching lines...) Expand all Loading... |
| 274 | 225 |
| 275 // Called as a result of a notification of policy change. Triggers a reload of | 226 // Called as a result of a notification of policy change. Triggers a reload of |
| 276 // managed platform, device management and recommended preferences from policy | 227 // managed platform, device management and recommended preferences from policy |
| 277 // from a Task on the FILE thread. | 228 // from a Task on the FILE thread. |
| 278 void RefreshPolicyPrefs(); | 229 void RefreshPolicyPrefs(); |
| 279 | 230 |
| 280 // Called during policy refresh after ReadPrefs completes on the thread | 231 // Called during policy refresh after ReadPrefs completes on the thread |
| 281 // that initiated the policy refresh. RefreshPolicyPrefsCompletion takes | 232 // that initiated the policy refresh. RefreshPolicyPrefsCompletion takes |
| 282 // ownership of the |callback| object. | 233 // ownership of the |callback| object. |
| 283 void RefreshPolicyPrefsCompletion( | 234 void RefreshPolicyPrefsCompletion( |
| 284 PrefStore* new_managed_platform_pref_store, | 235 policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store, |
| 285 PrefStore* new_device_management_pref_store, | 236 policy::ConfigurationPolicyPrefStore* new_device_management_pref_store, |
| 286 PrefStore* new_recommended_pref_store); | 237 policy::ConfigurationPolicyPrefStore* new_recommended_pref_store); |
| 287 | 238 |
| 288 // Called during policy refresh to do the ReadPrefs on the FILE thread. | 239 // Called during policy refresh to do the ReadPrefs on the FILE thread. |
| 289 // RefreshPolicyPrefsOnFileThread takes ownership of the |callback| object. | 240 // RefreshPolicyPrefsOnFileThread takes ownership of the |callback| object. |
| 290 void RefreshPolicyPrefsOnFileThread( | 241 void RefreshPolicyPrefsOnFileThread( |
| 291 BrowserThread::ID calling_thread_id, | 242 BrowserThread::ID calling_thread_id, |
| 292 PrefStore* new_managed_platform_pref_store, | 243 policy::ConfigurationPolicyPrefStore* new_managed_platform_pref_store, |
| 293 PrefStore* new_device_management_pref_store, | 244 policy::ConfigurationPolicyPrefStore* new_device_management_pref_store, |
| 294 PrefStore* new_recommended_pref_store); | 245 policy::ConfigurationPolicyPrefStore* new_recommended_pref_store); |
| 295 | 246 |
| 296 // NotificationObserver methods: | 247 // NotificationObserver methods: |
| 297 virtual void Observe(NotificationType type, | 248 virtual void Observe(NotificationType type, |
| 298 const NotificationSource& source, | 249 const NotificationSource& source, |
| 299 const NotificationDetails& details); | 250 const NotificationDetails& details); |
| 300 | 251 |
| 301 // Called from the PrefStoreKeeper implementation when a pref value for |key| | 252 // Called from the PrefStoreKeeper implementation when a pref value for |key| |
| 302 // changed in the pref store for |type|. | 253 // changed in the pref store for |type|. |
| 303 void OnPrefValueChanged(PrefStoreType type, const std::string& key); | 254 void OnPrefValueChanged(PrefStoreType type, const std::string& key); |
| 304 | 255 |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 // upon policy refresh. | 289 // upon policy refresh. |
| 339 Profile* profile_; | 290 Profile* profile_; |
| 340 | 291 |
| 341 // TODO(mnissler): Remove this after cleaning up policy refresh handling. | 292 // TODO(mnissler): Remove this after cleaning up policy refresh handling. |
| 342 NotificationRegistrar registrar_; | 293 NotificationRegistrar registrar_; |
| 343 | 294 |
| 344 DISALLOW_COPY_AND_ASSIGN(PrefValueStore); | 295 DISALLOW_COPY_AND_ASSIGN(PrefValueStore); |
| 345 }; | 296 }; |
| 346 | 297 |
| 347 #endif // CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ | 298 #endif // CHROME_BROWSER_PREFS_PREF_VALUE_STORE_H_ |
| OLD | NEW |