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

Side by Side Diff: services/preferences/public/cpp/persistent_pref_store_client.cc

Issue 2743463002: WIP: Pref service user prefs. (Closed)
Patch Set: Created 3 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
OLDNEW
(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/persistent_pref_store_client.h"
6
7 #include <utility>
8
9 #include "base/values.h"
10
11 namespace prefs {
12
13 PersistentPrefStoreClient::PersistentPrefStoreClient(
14 mojom::PersistentPrefStoreConnectorPtr connector)
15 : connector_(std::move(connector)),
16 pref_store_request_(mojo::MakeRequest(&pref_store_)),
17 observer_binding_(this) {}
18
19 bool PersistentPrefStoreClient::GetValue(const std::string& key,
20 const base::Value** value) const {
21 return cached_prefs_->Get(key, value);
22 }
23
24 std::unique_ptr<base::DictionaryValue> PersistentPrefStoreClient::GetValues()
25 const {
26 return cached_prefs_->CreateDeepCopy();
27 }
28
29 void PersistentPrefStoreClient::AddObserver(PrefStore::Observer* observer) {
30 observers_.AddObserver(observer);
31 }
32
33 void PersistentPrefStoreClient::RemoveObserver(PrefStore::Observer* observer) {
34 observers_.RemoveObserver(observer);
35 }
36
37 bool PersistentPrefStoreClient::HasObservers() const {
38 return observers_.might_have_observers();
39 }
40
41 bool PersistentPrefStoreClient::IsInitializationComplete() const {
42 return static_cast<bool>(cached_prefs_);
43 }
44
45 void PersistentPrefStoreClient::SetValue(const std::string& key,
46 std::unique_ptr<base::Value> value,
47 uint32_t flags) {
48 base::Value* old_value = nullptr;
49 cached_prefs_->Get(key, &old_value);
50 if (!old_value || !value->Equals(old_value)) {
51 cached_prefs_->Set(key, std::move(value));
52 ReportValueChanged(key, flags);
53 }
54 }
55
56 void PersistentPrefStoreClient::RemoveValue(const std::string& key,
57 uint32_t flags) {
58 if (cached_prefs_->RemovePath(key, nullptr))
59 ReportValueChanged(key, flags);
60 }
61
62 bool PersistentPrefStoreClient::GetMutableValue(const std::string& key,
63 base::Value** result) {
64 return cached_prefs_->Get(key, result);
65 }
66
67 void PersistentPrefStoreClient::ReportValueChanged(const std::string& key,
68 uint32_t flags) {
69 const base::Value* local_value = nullptr;
70 cached_prefs_->Get(key, &local_value);
71 pref_store_->SetValue(
72 key, local_value ? local_value->CreateDeepCopy() : nullptr, flags);
73 for (PrefStore::Observer& observer : observers_)
74 observer.OnPrefValueChanged(key);
75 }
76
77 void PersistentPrefStoreClient::SetValueSilently(
78 const std::string& key,
79 std::unique_ptr<base::Value> value,
80 uint32_t flags) {
81 pref_store_->SetValue(key, value->CreateDeepCopy(), flags);
82 cached_prefs_->Set(key, std::move(value));
83 }
84
85 bool PersistentPrefStoreClient::ReadOnly() const {
86 return read_only_;
87 }
88
89 PersistentPrefStore::PrefReadError PersistentPrefStoreClient::GetReadError()
90 const {
91 return read_error_;
92 }
93
94 PersistentPrefStore::PrefReadError PersistentPrefStoreClient::ReadPrefs() {
95 PrefReadError read_error = PrefReadError::PREF_READ_ERROR_NONE;
96 bool read_only = false;
97 std::unique_ptr<base::DictionaryValue> local_prefs;
98 mojom::PersistentPrefStorePtr pref_store;
99 mojom::PrefStoreObserverRequest observer_request;
100 if (!connector_->Connect(&read_error, &read_only, &local_prefs, &pref_store,
101 &observer_request)) {
102 NOTREACHED();
103 }
104
105 OnCreateComplete(read_error, read_only, std::move(local_prefs),
106 std::move(pref_store), std::move(observer_request));
107 return read_error_;
108 }
109
110 void PersistentPrefStoreClient::ReadPrefsAsync(
111 ReadErrorDelegate* error_delegate) {
112 error_delegate_.reset(error_delegate);
113 connector_->Connect(base::Bind(&PersistentPrefStoreClient::OnCreateComplete,
114 base::Unretained(this)));
115 }
116
117 void PersistentPrefStoreClient::CommitPendingWrite() {
118 pref_store_->CommitPendingWrite();
119 }
120
121 void PersistentPrefStoreClient::SchedulePendingLossyWrites() {
122 return pref_store_->SchedulePendingLossyWrites();
123 }
124
125 void PersistentPrefStoreClient::ClearMutableValues() {
126 return pref_store_->ClearMutableValues();
127 }
128
129 PersistentPrefStoreClient::~PersistentPrefStoreClient() {
130 if (!pref_store_)
131 return;
132
133 pref_store_->CommitPendingWrite();
134 }
135
136 void PersistentPrefStoreClient::OnCreateComplete(
137 PrefReadError read_error,
138 bool read_only,
139 std::unique_ptr<base::DictionaryValue> local_prefs,
140 mojom::PersistentPrefStorePtr pref_store,
141 mojom::PrefStoreObserverRequest observer_request) {
142 connector_.reset();
143 read_error_ = read_error;
144 read_only_ = read_only;
145 cached_prefs_ = std::move(local_prefs);
146 observer_binding_.Bind(std::move(observer_request));
147 mojo::FuseInterface(std::move(pref_store_request_),
148 pref_store.PassInterface());
149 if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
150 error_delegate_->OnError(read_error_);
151 error_delegate_.reset();
152
153 for (PrefStore::Observer& observer : observers_) {
154 observer.OnInitializationCompleted(static_cast<bool>(cached_prefs_));
155 }
156 }
157
158 void PersistentPrefStoreClient::OnInitializationCompleted(bool success) {
159 NOTREACHED();
160 }
161
162 void PersistentPrefStoreClient::OnPrefChanged(
163 const std::string& key,
164 std::unique_ptr<base::Value> value) {
165 bool changed = false;
166 if (!value) { // Delete
167 if (cached_prefs_->RemovePath(key, nullptr))
168 changed = true;
169 } else {
170 const base::Value* prev;
171 if (cached_prefs_->Get(key, &prev)) {
172 if (!prev->Equals(value.get())) {
173 cached_prefs_->Set(key, std::move(value));
174 changed = true;
175 }
176 } else {
177 cached_prefs_->Set(key, std::move(value));
178 changed = true;
179 }
180 }
181 if (changed) {
182 for (Observer& observer : observers_)
183 observer.OnPrefValueChanged(key);
184 }
185 }
186
187 } // namespace prefs
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698