OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 // This service has two preference stores, one for "persistent" preferences, | 6 // This service has two preference stores, one for "persistent" preferences, |
7 // which get serialized for use in the next session, and one for "transient" | 7 // which get serialized for use in the next session, and one for "transient" |
8 // preferences, which are in effect for only the current session | 8 // preferences, which are in effect for only the current session |
9 // (this usually encodes things like command-line switches). | 9 // (this usually encodes things like command-line switches). |
10 // | 10 // |
11 // Calling the getter functions in this class basically looks at both the | 11 // Calling the getter functions in this class basically looks at both the |
12 // persistent and transient stores, where any corresponding value in the | 12 // persistent and transient stores, where any corresponding value in the |
13 // transient store overrides the one in the persistent store. | 13 // transient store overrides the one in the persistent store. |
14 | 14 |
15 #ifndef CHROME_COMMON_PREF_SERVICE_H_ | 15 #ifndef CHROME_COMMON_PREF_SERVICE_H_ |
16 #define CHROME_COMMON_PREF_SERVICE_H_ | 16 #define CHROME_COMMON_PREF_SERVICE_H_ |
17 | 17 |
18 #include <set> | 18 #include <set> |
19 | 19 |
20 #include "base/file_path.h" | 20 #include "base/file_path.h" |
21 #include "base/hash_tables.h" | 21 #include "base/hash_tables.h" |
22 #include "base/non_thread_safe.h" | 22 #include "base/non_thread_safe.h" |
23 #include "base/observer_list.h" | 23 #include "base/observer_list.h" |
24 #include "base/scoped_ptr.h" | 24 #include "base/scoped_ptr.h" |
25 #include "base/task.h" | |
26 #include "base/values.h" | 25 #include "base/values.h" |
27 #include "testing/gtest/include/gtest/gtest_prod.h" | 26 #include "chrome/common/important_file_writer.h" |
28 | 27 |
29 class NotificationObserver; | 28 class NotificationObserver; |
30 class Preference; | 29 class Preference; |
31 | 30 |
32 namespace base { | 31 namespace base { |
33 class Thread; | 32 class Thread; |
34 } | 33 } |
35 | 34 |
36 class PrefService : public NonThreadSafe { | 35 class PrefService : public NonThreadSafe { |
37 public: | 36 public: |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 std::wstring name_; | 69 std::wstring name_; |
71 scoped_ptr<Value> default_value_; | 70 scoped_ptr<Value> default_value_; |
72 | 71 |
73 // A reference to the pref service's persistent prefs. | 72 // A reference to the pref service's persistent prefs. |
74 DictionaryValue* root_pref_; | 73 DictionaryValue* root_pref_; |
75 | 74 |
76 DISALLOW_COPY_AND_ASSIGN(Preference); | 75 DISALLOW_COPY_AND_ASSIGN(Preference); |
77 }; | 76 }; |
78 | 77 |
79 // |pref_filename| is the path to the prefs file we will try to load or save | 78 // |pref_filename| is the path to the prefs file we will try to load or save |
80 // to. | 79 // to. Saves will be executed on |backend_thread|. It should be the file |
81 explicit PrefService(const FilePath& pref_filename); | 80 // thread in Chrome. You can pass NULL for unit tests, and then no separate |
| 81 // thread will be used. |
| 82 PrefService(const FilePath& pref_filename, |
| 83 const base::Thread* backend_thread); |
82 ~PrefService(); | 84 ~PrefService(); |
83 | 85 |
84 // Reloads the data from file. This should only be called when the importer | 86 // Reloads the data from file. This should only be called when the importer |
85 // is running during first run, and the main process may not change pref | 87 // is running during first run, and the main process may not change pref |
86 // values while the importer process is running. | 88 // values while the importer process is running. Returns true on success. |
87 void ReloadPersistentPrefs(); | 89 bool ReloadPersistentPrefs(); |
88 | 90 |
89 // Writes the data to disk on the provided thread. In Chrome, |thread| should | 91 // Writes the data to disk. The return value only reflects whether |
90 // be the file thread. The return value only reflects whether serialization | 92 // serialization was successful; we don't know whether the data actually made |
91 // was successful; we don't know whether the data actually made it on disk | 93 // it on disk (since it's on a different thread). This should only be used if |
92 // (since it's on a different thread). This should only be used if we need | 94 // we need to save immediately (basically, during shutdown). Otherwise, you |
93 // to save immediately (basically, during shutdown). Otherwise, you should | 95 // should use ScheduleSavePersistentPrefs. |
94 // use ScheduleSavePersistentPrefs. | 96 bool SavePersistentPrefs(); |
95 bool SavePersistentPrefs(base::Thread* thread) const; | |
96 | 97 |
97 // Starts a timer that ends up saving the preferences. This helps to batch | 98 // Serializes the data and schedules save using ImportantFileWriter. |
98 // together save requests that happen in a close time frame so we don't write | 99 bool ScheduleSavePersistentPrefs(); |
99 // to disk too frequently. | |
100 void ScheduleSavePersistentPrefs(base::Thread* thread); | |
101 | 100 |
102 DictionaryValue* transient() { return transient_.get(); } | 101 DictionaryValue* transient() { return transient_.get(); } |
103 | 102 |
104 // Make the PrefService aware of a pref. | 103 // Make the PrefService aware of a pref. |
105 void RegisterBooleanPref(const wchar_t* path, | 104 void RegisterBooleanPref(const wchar_t* path, |
106 bool default_value); | 105 bool default_value); |
107 void RegisterIntegerPref(const wchar_t* path, | 106 void RegisterIntegerPref(const wchar_t* path, |
108 int default_value); | 107 int default_value); |
109 void RegisterRealPref(const wchar_t* path, | 108 void RegisterRealPref(const wchar_t* path, |
110 double default_value); | 109 double default_value); |
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 } | 185 } |
187 }; | 186 }; |
188 typedef std::set<Preference*, PreferencePathComparator> PreferenceSet; | 187 typedef std::set<Preference*, PreferencePathComparator> PreferenceSet; |
189 const PreferenceSet& preference_set() const { return prefs_; } | 188 const PreferenceSet& preference_set() const { return prefs_; } |
190 | 189 |
191 // A helper method to quickly look up a preference. Returns NULL if the | 190 // A helper method to quickly look up a preference. Returns NULL if the |
192 // preference is not registered. | 191 // preference is not registered. |
193 const Preference* FindPreference(const wchar_t* pref_name) const; | 192 const Preference* FindPreference(const wchar_t* pref_name) const; |
194 | 193 |
195 private: | 194 private: |
196 FRIEND_TEST(PrefServiceTest, Basic); | |
197 FRIEND_TEST(PrefServiceTest, Overlay); | |
198 FRIEND_TEST(PrefServiceTest, Observers); | |
199 FRIEND_TEST(PrefServiceTest, LocalizedPrefs); | |
200 FRIEND_TEST(PrefServiceTest, NoObserverFire); | |
201 FRIEND_TEST(PrefServiceTest, HasPrefPath); | |
202 | |
203 FRIEND_TEST(PrefMemberTest, BasicGetAndSet); | |
204 FRIEND_TEST(PrefMemberTest, TwoPrefs); | |
205 FRIEND_TEST(PrefMemberTest, Observer); | |
206 | |
207 // This constructor is used only for some unittests. It doesn't try to load | |
208 // any existing prefs from a file. | |
209 PrefService(); | |
210 | |
211 // Reads the data from the given file, returning true on success. | |
212 bool LoadPersistentPrefs(const FilePath& file_path); | |
213 | |
214 // Add a preference to the PreferenceMap. If the pref already exists, return | 195 // Add a preference to the PreferenceMap. If the pref already exists, return |
215 // false. This method takes ownership of |pref|. | 196 // false. This method takes ownership of |pref|. |
216 void RegisterPreference(Preference* pref); | 197 void RegisterPreference(Preference* pref); |
217 | 198 |
218 // Returns a copy of the current pref value. The caller is responsible for | 199 // Returns a copy of the current pref value. The caller is responsible for |
219 // deleting the returned object. | 200 // deleting the returned object. |
220 Value* GetPrefCopy(const wchar_t* pref_name); | 201 Value* GetPrefCopy(const wchar_t* pref_name); |
221 | 202 |
222 // For the given pref_name, fire any observer of the pref. | 203 // For the given pref_name, fire any observer of the pref. |
223 void FireObservers(const wchar_t* pref_name); | 204 void FireObservers(const wchar_t* pref_name); |
224 | 205 |
225 // For the given pref_name, fire any observer of the pref only if |old_value| | 206 // For the given pref_name, fire any observer of the pref only if |old_value| |
226 // is different from the current value. | 207 // is different from the current value. |
227 void FireObserversIfChanged(const wchar_t* pref_name, | 208 void FireObserversIfChanged(const wchar_t* pref_name, |
228 const Value* old_value); | 209 const Value* old_value); |
229 | 210 |
| 211 // Serializes stored data to string. |output| is modified only |
| 212 // if serialization was successful. Returns true on success. |
| 213 bool SerializePrefData(std::string* output) const; |
| 214 |
230 scoped_ptr<DictionaryValue> persistent_; | 215 scoped_ptr<DictionaryValue> persistent_; |
231 scoped_ptr<DictionaryValue> transient_; | 216 scoped_ptr<DictionaryValue> transient_; |
232 | 217 |
233 // The filename that we're loading/saving the prefs to. | 218 // Helper for safe writing pref data. |
234 FilePath pref_filename_; | 219 ImportantFileWriter writer_; |
235 | |
236 // Task used by ScheduleSavePersistentPrefs to avoid lots of little saves. | |
237 ScopedRunnableMethodFactory<PrefService> save_preferences_factory_; | |
238 | 220 |
239 // A set of all the registered Preference objects. | 221 // A set of all the registered Preference objects. |
240 PreferenceSet prefs_; | 222 PreferenceSet prefs_; |
241 | 223 |
242 // A map from pref names to a list of observers. Observers get fired in the | 224 // A map from pref names to a list of observers. Observers get fired in the |
243 // order they are added. | 225 // order they are added. |
244 typedef ObserverList<NotificationObserver> NotificationObserverList; | 226 typedef ObserverList<NotificationObserver> NotificationObserverList; |
245 typedef base::hash_map<std::wstring, NotificationObserverList*> | 227 typedef base::hash_map<std::wstring, NotificationObserverList*> |
246 PrefObserverMap; | 228 PrefObserverMap; |
247 PrefObserverMap pref_observers_; | 229 PrefObserverMap pref_observers_; |
248 | 230 |
249 DISALLOW_COPY_AND_ASSIGN(PrefService); | 231 DISALLOW_COPY_AND_ASSIGN(PrefService); |
250 }; | 232 }; |
251 | 233 |
252 #endif // CHROME_COMMON_PREF_SERVICE_H_ | 234 #endif // CHROME_COMMON_PREF_SERVICE_H_ |
OLD | NEW |