| OLD | NEW |
| 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 Loading... |
| 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( |
| (...skipping 26 matching lines...) Expand all Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |