Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: chrome/browser/prefs/pref_service.cc

Issue 6894020: Adds async interface method to PersistentPrefStore. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Use Notifications. Created 9 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 #include "chrome/browser/prefs/pref_service.h" 5 #include "chrome/browser/prefs/pref_service.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <string> 8 #include <string>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
79 // MessageLoop to run. 79 // MessageLoop to run.
80 void NotifyReadError(PrefService* pref, int message_id) { 80 void NotifyReadError(PrefService* pref, int message_id) {
81 ShowProfileErrorDialog(message_id); 81 ShowProfileErrorDialog(message_id);
82 } 82 }
83 83
84 } // namespace 84 } // namespace
85 85
86 // static 86 // static
87 PrefService* PrefService::CreatePrefService(const FilePath& pref_filename, 87 PrefService* PrefService::CreatePrefService(const FilePath& pref_filename,
88 PrefStore* extension_prefs, 88 PrefStore* extension_prefs,
89 Profile* profile) { 89 Profile* profile,
90 return CreatePrefServiceAsync(pref_filename, extension_prefs, profile, NULL); 90 bool async) {
91 }
92
93 // static
94 PrefService* PrefService::CreatePrefServiceAsync(
95 const FilePath& pref_filename,
96 PrefStore* extension_prefs,
97 Profile* profile,
98 PrefServiceDelegate* delegate) {
99 using policy::ConfigurationPolicyPrefStore; 91 using policy::ConfigurationPolicyPrefStore;
100 92
101 #if defined(OS_LINUX) 93 #if defined(OS_LINUX)
102 // We'd like to see what fraction of our users have the preferences 94 // We'd like to see what fraction of our users have the preferences
103 // stored on a network file system, as we've had no end of troubles 95 // stored on a network file system, as we've had no end of troubles
104 // with NFS/AFS. 96 // with NFS/AFS.
105 // TODO(evanm): remove this once we've collected state. 97 // TODO(evanm): remove this once we've collected state.
106 file_util::FileSystemType fstype; 98 file_util::FileSystemType fstype;
107 if (file_util::GetFileSystemType(pref_filename.DirName(), &fstype)) { 99 if (file_util::GetFileSystemType(pref_filename.DirName(), &fstype)) {
108 UMA_HISTOGRAM_ENUMERATION("PrefService.FileSystemType", 100 UMA_HISTOGRAM_ENUMERATION("PrefService.FileSystemType",
(...skipping 11 matching lines...) Expand all
120 JsonPrefStore* user = new JsonPrefStore( 112 JsonPrefStore* user = new JsonPrefStore(
121 pref_filename, 113 pref_filename,
122 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE)); 114 BrowserThread::GetMessageLoopProxyForThread(BrowserThread::FILE));
123 ConfigurationPolicyPrefStore* recommended_platform = 115 ConfigurationPolicyPrefStore* recommended_platform =
124 ConfigurationPolicyPrefStore::CreateRecommendedPlatformPolicyPrefStore(); 116 ConfigurationPolicyPrefStore::CreateRecommendedPlatformPolicyPrefStore();
125 ConfigurationPolicyPrefStore* recommended_cloud = 117 ConfigurationPolicyPrefStore* recommended_cloud =
126 ConfigurationPolicyPrefStore::CreateRecommendedCloudPolicyPrefStore( 118 ConfigurationPolicyPrefStore::CreateRecommendedCloudPolicyPrefStore(
127 profile); 119 profile);
128 DefaultPrefStore* default_pref_store = new DefaultPrefStore(); 120 DefaultPrefStore* default_pref_store = new DefaultPrefStore();
129 121
130 return new PrefService(managed_platform, managed_cloud, extension_prefs, 122 PrefService* service = new PrefService(
131 command_line, user, recommended_platform, 123 managed_platform, managed_cloud, extension_prefs,
132 recommended_cloud, default_pref_store, delegate); 124 command_line, user, recommended_platform,
125 recommended_cloud, default_pref_store);
126 service->InitFromStorage(async);
127 return service;
133 } 128 }
134 129
135 PrefService* PrefService::CreateIncognitoPrefService( 130 PrefService* PrefService::CreateIncognitoPrefService(
136 PrefStore* incognito_extension_prefs) { 131 PrefStore* incognito_extension_prefs) {
137 return new PrefService(*this, incognito_extension_prefs); 132 PrefService* service = new PrefService(*this, incognito_extension_prefs);
133 service->InitFromStorage(false);
134 return service;
138 } 135 }
139 136
140 PrefService::PrefService(PrefStore* managed_platform_prefs, 137 PrefService::PrefService(PrefStore* managed_platform_prefs,
141 PrefStore* managed_cloud_prefs, 138 PrefStore* managed_cloud_prefs,
142 PrefStore* extension_prefs, 139 PrefStore* extension_prefs,
143 PrefStore* command_line_prefs, 140 PrefStore* command_line_prefs,
144 PersistentPrefStore* user_prefs, 141 PersistentPrefStore* user_prefs,
145 PrefStore* recommended_platform_prefs, 142 PrefStore* recommended_platform_prefs,
146 PrefStore* recommended_cloud_prefs, 143 PrefStore* recommended_cloud_prefs,
147 DefaultPrefStore* default_store, 144 DefaultPrefStore* default_store)
148 PrefServiceDelegate* delegate)
149 : user_pref_store_(user_prefs), 145 : user_pref_store_(user_prefs),
150 default_store_(default_store), 146 default_store_(default_store) {
151 delegate_(delegate) {
152 pref_notifier_.reset(new PrefNotifierImpl(this)); 147 pref_notifier_.reset(new PrefNotifierImpl(this));
153 pref_value_store_.reset( 148 pref_value_store_.reset(
154 new PrefValueStore(managed_platform_prefs, 149 new PrefValueStore(managed_platform_prefs,
155 managed_cloud_prefs, 150 managed_cloud_prefs,
156 extension_prefs, 151 extension_prefs,
157 command_line_prefs, 152 command_line_prefs,
158 user_pref_store_, 153 user_pref_store_,
159 recommended_platform_prefs, 154 recommended_platform_prefs,
160 recommended_cloud_prefs, 155 recommended_cloud_prefs,
161 default_store, 156 default_store,
162 pref_notifier_.get())); 157 pref_notifier_.get()));
163 InitFromStorage();
164 } 158 }
165 159
166 PrefService::PrefService(const PrefService& original, 160 PrefService::PrefService(const PrefService& original,
167 PrefStore* incognito_extension_prefs) 161 PrefStore* incognito_extension_prefs)
168 : user_pref_store_( 162 : user_pref_store_(
169 new OverlayPersistentPrefStore(original.user_pref_store_.get())), 163 new OverlayPersistentPrefStore(original.user_pref_store_.get())),
170 default_store_(original.default_store_.get()), 164 default_store_(original.default_store_.get()) {
171 delegate_(NULL) {
172 pref_notifier_.reset(new PrefNotifierImpl(this)); 165 pref_notifier_.reset(new PrefNotifierImpl(this));
173 pref_value_store_.reset(original.pref_value_store_->CloneAndSpecialize( 166 pref_value_store_.reset(original.pref_value_store_->CloneAndSpecialize(
174 NULL, // managed_platform_prefs 167 NULL, // managed_platform_prefs
175 NULL, // managed_cloud_prefs 168 NULL, // managed_cloud_prefs
176 incognito_extension_prefs, 169 incognito_extension_prefs,
177 NULL, // command_line_prefs 170 NULL, // command_line_prefs
178 user_pref_store_.get(), 171 user_pref_store_.get(),
179 NULL, // recommended_platform_prefs 172 NULL, // recommended_platform_prefs
180 NULL, // recommended_cloud_prefs 173 NULL, // recommended_cloud_prefs
181 default_store_.get(), 174 default_store_.get(),
182 pref_notifier_.get())); 175 pref_notifier_.get()));
183 InitFromStorage();
184 } 176 }
185 177
186 PrefService::~PrefService() { 178 PrefService::~PrefService() {
187 DCHECK(CalledOnValidThread()); 179 DCHECK(CalledOnValidThread());
188 STLDeleteContainerPointers(prefs_.begin(), prefs_.end()); 180 STLDeleteContainerPointers(prefs_.begin(), prefs_.end());
189 prefs_.clear(); 181 prefs_.clear();
190 182
191 // Reset pointers so accesses after destruction reliably crash. 183 // Reset pointers so accesses after destruction reliably crash.
192 pref_value_store_.reset(); 184 pref_value_store_.reset();
193 user_pref_store_ = NULL; 185 user_pref_store_ = NULL;
194 default_store_ = NULL; 186 default_store_ = NULL;
195 } 187 }
196 188
197 void PrefService::OnPrefsRead(PersistentPrefStore::PrefReadError error, 189 void PrefService::OnInitializationCompleted() {
198 bool no_dir) { 190 // This is the only message PrefService is waiting for, so remove us from the
199 if (no_dir) { 191 // observers list.
192 user_pref_store_->RemoveObserver(this);
193
194 PersistentPrefStore::PrefReadError error;
195 bool is_fatal;
196 user_pref_store_->GetErrors(&error, &is_fatal);
197 if (is_fatal) {
200 // Bad news. When profile is created, the process that creates the directory 198 // Bad news. When profile is created, the process that creates the directory
201 // is explicitly started. So if directory is missing it probably means that 199 // is explicitly started. So if directory is missing it probably means that
202 // Chromium hasn't sufficient privileges. 200 // Chromium hasn't sufficient privileges.
203 CHECK(delegate_); 201 pref_notifier_->OnPersistentPrefsRead(false);
204 delegate_->OnPrefsLoaded(this, false);
205 return; 202 return;
206 } 203 }
207 204
208 if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) { 205 if (error != PersistentPrefStore::PREF_READ_ERROR_NONE) {
209 // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for 206 // Failing to load prefs on startup is a bad thing(TM). See bug 38352 for
210 // an example problem that this can cause. 207 // an example problem that this can cause.
211 // Do some diagnosis and try to avoid losing data. 208 // Do some diagnosis and try to avoid losing data.
212 int message_id = 0; 209 int message_id = 0;
213 if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) { 210 if (error <= PersistentPrefStore::PREF_READ_ERROR_JSON_TYPE) {
214 message_id = IDS_PREFERENCES_CORRUPT_ERROR; 211 message_id = IDS_PREFERENCES_CORRUPT_ERROR;
215 } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) { 212 } else if (error != PersistentPrefStore::PREF_READ_ERROR_NO_FILE) {
216 message_id = IDS_PREFERENCES_UNREADABLE_ERROR; 213 message_id = IDS_PREFERENCES_UNREADABLE_ERROR;
217 } 214 }
218 215
219 if (message_id) { 216 if (message_id) {
220 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 217 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
221 NewRunnableFunction(&NotifyReadError, this, message_id)); 218 NewRunnableFunction(&NotifyReadError, this, message_id));
222 } 219 }
223 UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 20); 220 UMA_HISTOGRAM_ENUMERATION("PrefService.ReadError", error, 20);
224 } 221 }
225 222 pref_notifier_->OnPersistentPrefsRead(true);
226 if (delegate_)
227 delegate_->OnPrefsLoaded(this, true);
228 } 223 }
229 224
230 void PrefService::InitFromStorage() { 225 void PrefService::InitFromStorage(bool async) {
231 if (!delegate_) { 226 user_pref_store_->AddObserver(this);
232 const PersistentPrefStore::PrefReadError error = 227 if (!async) {
233 user_pref_store_->ReadPrefs(); 228 user_pref_store_->ReadPrefs();
234 OnPrefsRead(error, false);
235 } else { 229 } else {
236 // todo(altimofeev): move this method to PersistentPrefStore interface. 230 user_pref_store_.get()->ReadPrefsAsync();
237 (static_cast<JsonPrefStore*>(user_pref_store_.get()))->ReadPrefs(this);
238 } 231 }
239 } 232 }
240 233
241 bool PrefService::ReloadPersistentPrefs() { 234 bool PrefService::ReloadPersistentPrefs() {
242 return user_pref_store_->ReadPrefs() == 235 return user_pref_store_->ReadPrefs() ==
243 PersistentPrefStore::PREF_READ_ERROR_NONE; 236 PersistentPrefStore::PREF_READ_ERROR_NONE;
244 } 237 }
245 238
246 bool PrefService::SavePersistentPrefs() { 239 bool PrefService::SavePersistentPrefs() {
247 DCHECK(CalledOnValidThread()); 240 DCHECK(CalledOnValidThread());
(...skipping 451 matching lines...) Expand 10 before | Expand all | Expand 10 after
699 return pref_value_store()->PrefValueFromDefaultStore(name_.c_str()); 692 return pref_value_store()->PrefValueFromDefaultStore(name_.c_str());
700 } 693 }
701 694
702 bool PrefService::Preference::IsUserModifiable() const { 695 bool PrefService::Preference::IsUserModifiable() const {
703 return pref_value_store()->PrefValueUserModifiable(name_.c_str()); 696 return pref_value_store()->PrefValueUserModifiable(name_.c_str());
704 } 697 }
705 698
706 bool PrefService::Preference::IsExtensionModifiable() const { 699 bool PrefService::Preference::IsExtensionModifiable() const {
707 return pref_value_store()->PrefValueExtensionModifiable(name_.c_str()); 700 return pref_value_store()->PrefValueExtensionModifiable(name_.c_str());
708 } 701 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698