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

Side by Side Diff: chrome/browser/supervised_user/supervised_user_settings_service.cc

Issue 960233003: Handle unsucessful JsonPrefStore initialization in SupervisedUserSettingsService. (Closed) Base URL: https://chromium.googlesource.com/chromium/src@master
Patch Set: Created 5 years, 9 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
« no previous file with comments | « chrome/browser/supervised_user/supervised_user_settings_service.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/supervised_user/supervised_user_settings_service.h" 5 #include "chrome/browser/supervised_user/supervised_user_settings_service.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/json/json_reader.h" 8 #include "base/json/json_reader.h"
9 #include "base/json/json_writer.h" 9 #include "base/json/json_writer.h"
10 #include "base/prefs/json_pref_store.h" 10 #include "base/prefs/json_pref_store.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 43
44 namespace { 44 namespace {
45 45
46 bool SettingShouldApplyToPrefs(const std::string& name) { 46 bool SettingShouldApplyToPrefs(const std::string& name) {
47 return !StartsWithASCII(name, kSupervisedUserInternalItemPrefix, false); 47 return !StartsWithASCII(name, kSupervisedUserInternalItemPrefix, false);
48 } 48 }
49 49
50 } // namespace 50 } // namespace
51 51
52 SupervisedUserSettingsService::SupervisedUserSettingsService() 52 SupervisedUserSettingsService::SupervisedUserSettingsService()
53 : active_(false), local_settings_(new base::DictionaryValue) {} 53 : active_(false),
54 initialization_failed_(false),
55 local_settings_(new base::DictionaryValue) {
56 }
54 57
55 SupervisedUserSettingsService::~SupervisedUserSettingsService() {} 58 SupervisedUserSettingsService::~SupervisedUserSettingsService() {}
56 59
57 void SupervisedUserSettingsService::Init( 60 void SupervisedUserSettingsService::Init(
58 base::FilePath profile_path, 61 base::FilePath profile_path,
59 base::SequencedTaskRunner* sequenced_task_runner, 62 base::SequencedTaskRunner* sequenced_task_runner,
60 bool load_synchronously) { 63 bool load_synchronously) {
61 base::FilePath path = 64 base::FilePath path =
62 profile_path.Append(chrome::kSupervisedUserSettingsFilename); 65 profile_path.Append(chrome::kSupervisedUserSettingsFilename);
63 PersistentPrefStore* store = new JsonPrefStore( 66 PersistentPrefStore* store = new JsonPrefStore(
64 path, sequenced_task_runner, scoped_ptr<PrefFilter>()); 67 path, sequenced_task_runner, scoped_ptr<PrefFilter>());
65 Init(store); 68 Init(store);
66 if (load_synchronously) { 69 if (load_synchronously) {
67 store_->ReadPrefs(); 70 store_->ReadPrefs();
68 // TODO(bauerb): Temporary CHECK while investigating 71 // TODO(bauerb): Temporary CHECK while investigating
69 // https://crbug.com/425785. Remove (or change to DCHECK) once the bug 72 // https://crbug.com/425785. Remove (or change to DCHECK) once the bug
70 // is fixed. 73 // is fixed.
71 CHECK(store_->IsInitializationComplete()); 74 CHECK(store_->IsInitializationComplete());
Marc Treib 2015/02/27 15:51:43 Do you need to handle a failing PrefStore initiali
Bernhard Bauer 2015/02/27 16:03:44 Interestingly enough, this CHECK does not seem to
Marc Treib 2015/02/27 16:08:32 Okay, fair enough. LGTM then.
72 } else { 75 } else {
73 store_->ReadPrefsAsync(NULL); 76 store_->ReadPrefsAsync(NULL);
74 } 77 }
75 } 78 }
76 79
77 void SupervisedUserSettingsService::Init( 80 void SupervisedUserSettingsService::Init(
78 scoped_refptr<PersistentPrefStore> store) { 81 scoped_refptr<PersistentPrefStore> store) {
79 DCHECK(!store_.get()); 82 DCHECK(!store_.get());
80 store_ = store; 83 store_ = store;
81 store_->AddObserver(this); 84 store_->AddObserver(this);
82 } 85 }
83 86
84 void SupervisedUserSettingsService::Subscribe( 87 void SupervisedUserSettingsService::Subscribe(
85 const SettingsCallback& callback) { 88 const SettingsCallback& callback) {
86 if (IsReady()) { 89 if (IsReady()) {
87 scoped_ptr<base::DictionaryValue> settings = GetSettings(); 90 scoped_ptr<base::DictionaryValue> settings = GetSettings();
88 callback.Run(settings.get()); 91 callback.Run(settings.get());
89 } 92 }
90 93
91 subscribers_.push_back(callback); 94 subscribers_.push_back(callback);
92 } 95 }
93 96
94 void SupervisedUserSettingsService::SetActive(bool active) { 97 void SupervisedUserSettingsService::SetActive(bool active) {
95 active_ = active; 98 active_ = active;
96 InformSubscribers(); 99 InformSubscribers();
97 } 100 }
98 101
99 bool SupervisedUserSettingsService::IsReady() { 102 bool SupervisedUserSettingsService::IsReady() {
100 return store_->IsInitializationComplete(); 103 // Initialization cannot be complete but have failed at the same time.
104 DCHECK(!(store_->IsInitializationComplete() && initialization_failed_));
105 return initialization_failed_ || store_->IsInitializationComplete();
101 } 106 }
102 107
103 void SupervisedUserSettingsService::Clear() { 108 void SupervisedUserSettingsService::Clear() {
104 store_->RemoveValue(kAtomicSettings); 109 store_->RemoveValue(kAtomicSettings);
105 store_->RemoveValue(kSplitSettings); 110 store_->RemoveValue(kSplitSettings);
106 } 111 }
107 112
108 // static 113 // static
109 std::string SupervisedUserSettingsService::MakeSplitSettingKey( 114 std::string SupervisedUserSettingsService::MakeSplitSettingKey(
110 const std::string& prefix, 115 const std::string& prefix,
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 InformSubscribers(); 297 InformSubscribers();
293 298
294 SyncError error; 299 SyncError error;
295 return error; 300 return error;
296 } 301 }
297 302
298 void SupervisedUserSettingsService::OnPrefValueChanged(const std::string& key) { 303 void SupervisedUserSettingsService::OnPrefValueChanged(const std::string& key) {
299 } 304 }
300 305
301 void SupervisedUserSettingsService::OnInitializationCompleted(bool success) { 306 void SupervisedUserSettingsService::OnInitializationCompleted(bool success) {
307 if (!success) {
308 // If this happens, it means the profile directory was not found. There is
309 // not much we can do, but the whole profile will probably be useless
310 // anyway. Just mark initialization as failed and continue otherwise,
311 // because subscribers might still expect to be called back.
312 initialization_failed_ = true;
313 }
314
302 // TODO(bauerb): Temporary CHECK while investigating https://crbug.com/425785. 315 // TODO(bauerb): Temporary CHECK while investigating https://crbug.com/425785.
303 // Remove (or change back to DCHECK) once the bug is fixed. 316 // Remove (or change back to DCHECK) once the bug is fixed.
304 CHECK(success);
305 CHECK(IsReady()); 317 CHECK(IsReady());
306 InformSubscribers(); 318 InformSubscribers();
307 } 319 }
308 320
309 base::DictionaryValue* SupervisedUserSettingsService::GetOrCreateDictionary( 321 base::DictionaryValue* SupervisedUserSettingsService::GetOrCreateDictionary(
310 const std::string& key) const { 322 const std::string& key) const {
311 base::Value* value = NULL; 323 base::Value* value = NULL;
312 base::DictionaryValue* dict = NULL; 324 base::DictionaryValue* dict = NULL;
313 if (store_->GetMutableValue(key, &value)) { 325 if (store_->GetMutableValue(key, &value)) {
314 bool success = value->GetAsDictionary(&dict); 326 bool success = value->GetAsDictionary(&dict);
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 dict = new base::DictionaryValue; 359 dict = new base::DictionaryValue;
348 DCHECK(!split_settings->HasKey(prefix)); 360 DCHECK(!split_settings->HasKey(prefix));
349 split_settings->Set(prefix, dict); 361 split_settings->Set(prefix, dict);
350 } 362 }
351 key->erase(0, pos + 1); 363 key->erase(0, pos + 1);
352 return dict; 364 return dict;
353 } 365 }
354 366
355 scoped_ptr<base::DictionaryValue> SupervisedUserSettingsService::GetSettings() { 367 scoped_ptr<base::DictionaryValue> SupervisedUserSettingsService::GetSettings() {
356 DCHECK(IsReady()); 368 DCHECK(IsReady());
357 if (!active_) 369 if (!active_ || initialization_failed_)
358 return scoped_ptr<base::DictionaryValue>(); 370 return scoped_ptr<base::DictionaryValue>();
359 371
360 scoped_ptr<base::DictionaryValue> settings(local_settings_->DeepCopy()); 372 scoped_ptr<base::DictionaryValue> settings(local_settings_->DeepCopy());
361 373
362 base::DictionaryValue* atomic_settings = GetAtomicSettings(); 374 base::DictionaryValue* atomic_settings = GetAtomicSettings();
363 for (base::DictionaryValue::Iterator it(*atomic_settings); !it.IsAtEnd(); 375 for (base::DictionaryValue::Iterator it(*atomic_settings); !it.IsAtEnd();
364 it.Advance()) { 376 it.Advance()) {
365 if (!SettingShouldApplyToPrefs(it.key())) 377 if (!SettingShouldApplyToPrefs(it.key()))
366 continue; 378 continue;
367 379
(...skipping 13 matching lines...) Expand all
381 } 393 }
382 394
383 void SupervisedUserSettingsService::InformSubscribers() { 395 void SupervisedUserSettingsService::InformSubscribers() {
384 if (!IsReady()) 396 if (!IsReady())
385 return; 397 return;
386 398
387 scoped_ptr<base::DictionaryValue> settings = GetSettings(); 399 scoped_ptr<base::DictionaryValue> settings = GetSettings();
388 for (const auto& callback : subscribers_) 400 for (const auto& callback : subscribers_)
389 callback.Run(settings.get()); 401 callback.Run(settings.get());
390 } 402 }
OLDNEW
« no previous file with comments | « chrome/browser/supervised_user/supervised_user_settings_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698