OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2017 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "services/preferences/public/cpp/pref_store_client_mixin.h" | |
6 | |
7 #include "base/values.h" | |
8 #include "services/preferences/public/cpp/pref_store_client.h" | |
9 | |
10 namespace prefs { | |
11 | |
12 template <typename BasePrefStore> | |
13 PrefStoreClientMixin<BasePrefStore>::PrefStoreClientMixin() | |
14 : observer_binding_(this) {} | |
15 | |
16 template <typename BasePrefStore> | |
17 void PrefStoreClientMixin<BasePrefStore>::AddObserver( | |
18 PrefStore::Observer* observer) { | |
19 observers_.AddObserver(observer); | |
20 } | |
21 | |
22 template <typename BasePrefStore> | |
23 void PrefStoreClientMixin<BasePrefStore>::RemoveObserver( | |
24 PrefStore::Observer* observer) { | |
25 observers_.RemoveObserver(observer); | |
26 } | |
27 | |
28 template <typename BasePrefStore> | |
29 bool PrefStoreClientMixin<BasePrefStore>::HasObservers() const { | |
30 return observers_.might_have_observers(); | |
31 } | |
32 | |
33 template <typename BasePrefStore> | |
34 bool PrefStoreClientMixin<BasePrefStore>::IsInitializationComplete() const { | |
35 return initialized_ && static_cast<bool>(cached_prefs_); | |
36 } | |
37 | |
38 template <typename BasePrefStore> | |
39 bool PrefStoreClientMixin<BasePrefStore>::GetValue( | |
40 const std::string& key, | |
41 const base::Value** result) const { | |
42 DCHECK(initialized_); | |
tibell
2017/03/10 02:18:27
Also DCHECK cached_prefs_ here and elsewhere.
Sam McNally
2017/03/10 02:43:25
Done.
| |
43 return cached_prefs_->Get(key, result); | |
44 } | |
45 | |
46 template <typename BasePrefStore> | |
47 std::unique_ptr<base::DictionaryValue> | |
48 PrefStoreClientMixin<BasePrefStore>::GetValues() const { | |
49 DCHECK(initialized_); | |
50 return cached_prefs_->CreateDeepCopy(); | |
51 } | |
52 | |
53 template <typename BasePrefStore> | |
54 PrefStoreClientMixin<BasePrefStore>::~PrefStoreClientMixin() = default; | |
55 | |
56 template <typename BasePrefStore> | |
57 void PrefStoreClientMixin<BasePrefStore>::Init( | |
58 std::unique_ptr<base::DictionaryValue> initial_prefs, | |
59 bool initialized, | |
60 mojom::PrefStoreObserverRequest observer_request) { | |
61 cached_prefs_ = std::move(initial_prefs); | |
62 observer_binding_.Bind(std::move(observer_request)); | |
63 if (initialized) | |
64 OnInitializationCompleted(static_cast<bool>(cached_prefs_)); | |
65 } | |
66 | |
67 template <typename BasePrefStore> | |
68 base::DictionaryValue& PrefStoreClientMixin<BasePrefStore>::GetMutableValues() { | |
69 DCHECK(cached_prefs_); | |
70 return *cached_prefs_; | |
71 } | |
72 | |
73 template <typename BasePrefStore> | |
74 void PrefStoreClientMixin<BasePrefStore>::ReportPrefValueChanged( | |
75 const std::string& key) { | |
76 for (auto& observer : observers_) | |
77 observer.OnPrefValueChanged(key); | |
78 } | |
79 | |
80 template <typename BasePrefStore> | |
81 void PrefStoreClientMixin<BasePrefStore>::OnPrefChanged( | |
82 const std::string& key, | |
83 std::unique_ptr<base::Value> value) { | |
84 bool changed = false; | |
85 if (!value) { // Delete | |
86 if (cached_prefs_->RemovePath(key, nullptr)) | |
87 changed = true; | |
88 } else { | |
89 const base::Value* prev; | |
90 if (cached_prefs_->Get(key, &prev)) { | |
91 if (!prev->Equals(value.get())) { | |
92 cached_prefs_->Set(key, std::move(value)); | |
93 changed = true; | |
94 } | |
95 } else { | |
96 cached_prefs_->Set(key, std::move(value)); | |
97 changed = true; | |
98 } | |
99 } | |
100 if (changed) | |
101 ReportPrefValueChanged(key); | |
102 } | |
103 | |
104 template <typename BasePrefStore> | |
105 void PrefStoreClientMixin<BasePrefStore>::OnInitializationCompleted( | |
106 bool succeeded) { | |
107 if (!initialized_) { | |
108 initialized_ = true; | |
109 for (auto& observer : observers_) | |
110 observer.OnInitializationCompleted(succeeded); | |
111 } | |
112 } | |
113 | |
114 template class PrefStoreClientMixin<::PrefStore>; | |
115 template class PrefStoreClientMixin<::PersistentPrefStore>; | |
116 | |
117 } // namespace prefs | |
OLD | NEW |