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 // This provides a way to access the application's current preferences. | 5 // This provides a way to access the application's current preferences. |
6 | 6 |
7 #ifndef CHROME_BROWSER_PREFS_PREF_SERVICE_H_ | 7 #ifndef CHROME_BROWSER_PREFS_PREF_SERVICE_H_ |
8 #define CHROME_BROWSER_PREFS_PREF_SERVICE_H_ | 8 #define CHROME_BROWSER_PREFS_PREF_SERVICE_H_ |
9 #pragma once | 9 #pragma once |
10 | 10 |
11 #include <set> | 11 #include <set> |
12 #include <string> | 12 #include <string> |
13 | 13 |
14 #include "base/non_thread_safe.h" | 14 #include "base/non_thread_safe.h" |
15 #include "base/ref_counted.h" | 15 #include "base/ref_counted.h" |
16 #include "base/scoped_ptr.h" | 16 #include "base/scoped_ptr.h" |
17 #include "base/values.h" | 17 #include "base/values.h" |
18 #include "chrome/common/pref_store.h" | |
19 | 18 |
20 class DefaultPrefStore; | 19 class DefaultPrefStore; |
21 class FilePath; | 20 class FilePath; |
22 class NotificationObserver; | 21 class NotificationObserver; |
| 22 class PersistentPrefStore; |
23 class PrefChangeObserver; | 23 class PrefChangeObserver; |
24 class PrefNotifier; | 24 class PrefNotifier; |
25 class PrefNotifierImpl; | 25 class PrefNotifierImpl; |
| 26 class PrefStore; |
26 class PrefValueStore; | 27 class PrefValueStore; |
27 class Profile; | 28 class Profile; |
28 | 29 |
29 namespace subtle { | 30 namespace subtle { |
30 class PrefMemberBase; | 31 class PrefMemberBase; |
31 }; | 32 }; |
32 | 33 |
33 class PrefService : public NonThreadSafe { | 34 class PrefService : public NonThreadSafe { |
34 public: | 35 public: |
35 // A helper class to store all the information associated with a preference. | 36 // A helper class to store all the information associated with a preference. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
94 // Reference to the PrefService in which this pref was created. | 95 // Reference to the PrefService in which this pref was created. |
95 const PrefService* pref_service_; | 96 const PrefService* pref_service_; |
96 | 97 |
97 DISALLOW_COPY_AND_ASSIGN(Preference); | 98 DISALLOW_COPY_AND_ASSIGN(Preference); |
98 }; | 99 }; |
99 | 100 |
100 // Factory method that creates a new instance of a PrefService with the | 101 // Factory method that creates a new instance of a PrefService with the |
101 // applicable PrefStores. The |pref_filename| points to the user preference | 102 // applicable PrefStores. The |pref_filename| points to the user preference |
102 // file. The |profile| is the one to which these preferences apply; it may be | 103 // file. The |profile| is the one to which these preferences apply; it may be |
103 // NULL if we're dealing with the local state. This is the usual way to create | 104 // NULL if we're dealing with the local state. This is the usual way to create |
104 // a new PrefService. | 105 // a new PrefService. |extension_pref_store| is used as the source for |
| 106 // extension-controlled preferences and may be NULL. The PrefService takes |
| 107 // ownership of |extension_pref_store|. |
105 static PrefService* CreatePrefService(const FilePath& pref_filename, | 108 static PrefService* CreatePrefService(const FilePath& pref_filename, |
| 109 PrefStore* extension_pref_store, |
106 Profile* profile); | 110 Profile* profile); |
107 | 111 |
108 // Convenience factory method for use in unit tests. Creates a new | |
109 // PrefService that uses a PrefValueStore with user preferences at the given | |
110 // |pref_filename|, a default PrefStore, and no other PrefStores (i.e., no | |
111 // other types of preferences). | |
112 static PrefService* CreateUserPrefService(const FilePath& pref_filename); | |
113 | |
114 virtual ~PrefService(); | 112 virtual ~PrefService(); |
115 | 113 |
116 // Reloads the data from file. This should only be called when the importer | 114 // Reloads the data from file. This should only be called when the importer |
117 // is running during first run, and the main process may not change pref | 115 // is running during first run, and the main process may not change pref |
118 // values while the importer process is running. Returns true on success. | 116 // values while the importer process is running. Returns true on success. |
119 bool ReloadPersistentPrefs(); | 117 bool ReloadPersistentPrefs(); |
120 | 118 |
121 // Returns true if the preference for the given preference name is available | 119 // Returns true if the preference for the given preference name is available |
122 // and is managed. | 120 // and is managed. |
123 bool IsManagedPreference(const char* pref_name) const; | 121 bool IsManagedPreference(const char* pref_name) const; |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 // A helper method to quickly look up a preference. Returns NULL if the | 214 // A helper method to quickly look up a preference. Returns NULL if the |
217 // preference is not registered. | 215 // preference is not registered. |
218 const Preference* FindPreference(const char* pref_name) const; | 216 const Preference* FindPreference(const char* pref_name) const; |
219 | 217 |
220 bool ReadOnly() const; | 218 bool ReadOnly() const; |
221 | 219 |
222 // TODO(mnissler): This should not be public. Change client code to call a | 220 // TODO(mnissler): This should not be public. Change client code to call a |
223 // preference setter or use ScopedPrefUpdate. | 221 // preference setter or use ScopedPrefUpdate. |
224 PrefNotifier* pref_notifier() const; | 222 PrefNotifier* pref_notifier() const; |
225 | 223 |
226 // Get the extension PrefStore. | |
227 PrefStore* GetExtensionPrefStore(); | |
228 | |
229 protected: | 224 protected: |
230 // Construct a new pref service, specifying the pref sources as explicit | 225 // Construct a new pref service, specifying the pref sources as explicit |
231 // PrefStore pointers. This constructor is what CreatePrefService() ends up | 226 // PrefStore pointers. This constructor is what CreatePrefService() ends up |
232 // calling. It's also used for unit tests. | 227 // calling. It's also used for unit tests. |
233 PrefService(PrefStore* managed_platform_prefs, | 228 PrefService(PrefStore* managed_platform_prefs, |
234 PrefStore* device_management_prefs, | 229 PrefStore* device_management_prefs, |
235 PrefStore* extension_prefs, | 230 PrefStore* extension_prefs, |
236 PrefStore* command_line_prefs, | 231 PrefStore* command_line_prefs, |
237 PrefStore* user_prefs, | 232 PersistentPrefStore* user_prefs, |
238 PrefStore* recommended_prefs, | 233 PrefStore* recommended_prefs, |
239 Profile* profile); | 234 Profile* profile); |
240 | 235 |
241 // The PrefNotifier handles registering and notifying preference observers. | 236 // The PrefNotifier handles registering and notifying preference observers. |
242 // It is created and owned by this PrefService. Subclasses may access it for | 237 // It is created and owned by this PrefService. Subclasses may access it for |
243 // unit testing. | 238 // unit testing. |
244 scoped_ptr<PrefNotifierImpl> pref_notifier_; | 239 scoped_ptr<PrefNotifierImpl> pref_notifier_; |
245 | 240 |
246 private: | 241 private: |
247 friend class TestingPrefService; | 242 friend class PrefServiceMockBuilder; |
248 | 243 |
249 // Registration of pref change observers must be done using the | 244 // Registration of pref change observers must be done using the |
250 // PrefChangeRegistrar, which is declared as a friend here to grant it | 245 // PrefChangeRegistrar, which is declared as a friend here to grant it |
251 // access to the otherwise protected members Add/RemovePrefObserver. | 246 // access to the otherwise protected members Add/RemovePrefObserver. |
252 // PrefMember registers for preferences changes notification directly to | 247 // PrefMember registers for preferences changes notification directly to |
253 // avoid the storage overhead of the registrar, so its base class must be | 248 // avoid the storage overhead of the registrar, so its base class must be |
254 // declared as a friend, too. | 249 // declared as a friend, too. |
255 friend class PrefChangeRegistrar; | 250 friend class PrefChangeRegistrar; |
256 friend class subtle::PrefMemberBase; | 251 friend class subtle::PrefMemberBase; |
257 | 252 |
258 // If the pref at the given path changes, we call the observer's Observe | 253 // If the pref at the given path changes, we call the observer's Observe |
259 // method with PREF_CHANGED. Note that observers should not call these methods | 254 // method with PREF_CHANGED. Note that observers should not call these methods |
260 // directly but rather use a PrefChangeRegistrar to make sure the observer | 255 // directly but rather use a PrefChangeRegistrar to make sure the observer |
261 // gets cleaned up properly. | 256 // gets cleaned up properly. |
262 virtual void AddPrefObserver(const char* path, NotificationObserver* obs); | 257 virtual void AddPrefObserver(const char* path, NotificationObserver* obs); |
263 virtual void RemovePrefObserver(const char* path, NotificationObserver* obs); | 258 virtual void RemovePrefObserver(const char* path, NotificationObserver* obs); |
264 | 259 |
265 // Add a preference to the PreferenceMap. If the pref already exists, return | 260 // Add a preference to the PreferenceMap. If the pref already exists, return |
266 // false. This method takes ownership of |default_value|. | 261 // false. This method takes ownership of |default_value|. |
267 void RegisterPreference(const char* path, Value* default_value); | 262 void RegisterPreference(const char* path, Value* default_value); |
268 | 263 |
269 // Returns a copy of the current pref value. The caller is responsible for | |
270 // deleting the returned object. | |
271 Value* GetPrefCopy(const char* pref_name); | |
272 | |
273 // Sets the value for this pref path in the user pref store and informs the | 264 // Sets the value for this pref path in the user pref store and informs the |
274 // PrefNotifier of the change. | 265 // PrefNotifier of the change. |
275 void SetUserPrefValue(const char* path, Value* new_value); | 266 void SetUserPrefValue(const char* path, Value* new_value); |
276 | 267 |
277 // Load from disk. Returns a non-zero error code on failure. | |
278 PrefStore::PrefReadError LoadPersistentPrefs(); | |
279 | |
280 // Load preferences from storage, attempting to diagnose and handle errors. | 268 // Load preferences from storage, attempting to diagnose and handle errors. |
281 // This should only be called from the constructor. | 269 // This should only be called from the constructor. |
282 void InitFromStorage(); | 270 void InitFromStorage(); |
283 | 271 |
284 // The PrefValueStore provides prioritized preference values. It is created | 272 // The PrefValueStore provides prioritized preference values. It is created |
285 // and owned by this PrefService. Subclasses may access it for unit testing. | 273 // and owned by this PrefService. Subclasses may access it for unit testing. |
286 scoped_refptr<PrefValueStore> pref_value_store_; | 274 scoped_refptr<PrefValueStore> pref_value_store_; |
287 | 275 |
288 // The extension pref store registered with the PrefValueStore. | 276 // The persistent pref store used for actual user data. |
289 PrefStore* extension_store_; | 277 PersistentPrefStore* user_pref_store_; |
290 | 278 |
291 // Points to the default pref store we passed to the PrefValueStore. | 279 // Points to the default pref store we passed to the PrefValueStore. |
292 PrefStore* default_store_; | 280 DefaultPrefStore* default_store_; |
293 | 281 |
294 // A set of all the registered Preference objects. | 282 // A set of all the registered Preference objects. |
295 PreferenceSet prefs_; | 283 PreferenceSet prefs_; |
296 | 284 |
297 DISALLOW_COPY_AND_ASSIGN(PrefService); | 285 DISALLOW_COPY_AND_ASSIGN(PrefService); |
298 }; | 286 }; |
299 | 287 |
300 #endif // CHROME_BROWSER_PREFS_PREF_SERVICE_H_ | 288 #endif // CHROME_BROWSER_PREFS_PREF_SERVICE_H_ |
OLD | NEW |