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

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

Issue 2601873002: Add a mojo bridge for PersistentPrefStore. (Closed)
Patch Set: Created 3 years, 10 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_mojo.h"
6
7 #include "base/values.h"
8 #include "components/prefs/in_memory_pref_store.h"
9 #include "components/prefs/pref_filter.h"
10 #include "mojo/public/cpp/bindings/strong_binding.h"
11 #include "services/preferences/public/cpp/user_prefs_impl.h"
12
13 namespace prefs {
14
15 PersistentPrefStoreMojo::PersistentPrefStoreMojo(
16 mojom::PersistentPrefStoreConnectorPtr connector)
17 : connector_(std::move(connector)),
18 pref_store_request_(mojo::MakeRequest(&pref_store_)) {}
19
20 bool PersistentPrefStoreMojo::GetValue(const std::string& key,
21 const base::Value** value) const {
22 return local_prefs_->Get(key, value);
23 }
24
25 std::unique_ptr<base::DictionaryValue> PersistentPrefStoreMojo::GetValues()
26 const {
27 return local_prefs_->CreateDeepCopy();
28 }
29
30 void PersistentPrefStoreMojo::AddObserver(PrefStore::Observer* observer) {
31 observers_.AddObserver(observer);
32 }
33
34 void PersistentPrefStoreMojo::RemoveObserver(PrefStore::Observer* observer) {
35 observers_.RemoveObserver(observer);
36 }
37
38 bool PersistentPrefStoreMojo::HasObservers() const {
39 return observers_.might_have_observers();
40 }
41
42 bool PersistentPrefStoreMojo::IsInitializationComplete() const {
43 return static_cast<bool>(local_prefs_);
44 }
45
46 void PersistentPrefStoreMojo::SetValue(const std::string& key,
47 std::unique_ptr<base::Value> value,
48 uint32_t flags) {
49 base::Value* old_value = nullptr;
50 local_prefs_->Get(key, &old_value);
51 if (!old_value || !value->Equals(old_value)) {
52 local_prefs_->Set(key, std::move(value));
53 ReportValueChanged(key, flags);
54 }
55 }
56
57 void PersistentPrefStoreMojo::RemoveValue(const std::string& key,
58 uint32_t flags) {
59 if (local_prefs_->RemovePath(key, nullptr))
60 ReportValueChanged(key, flags);
61 }
62
63 bool PersistentPrefStoreMojo::GetMutableValue(const std::string& key,
64 base::Value** result) {
65 return local_prefs_->Get(key, result);
66 }
67
68 void PersistentPrefStoreMojo::ReportValueChanged(const std::string& key,
69 uint32_t flags) {
70 const base::Value* local_value = nullptr;
71 if (local_prefs_->Get(key, &local_value)) {
72 pref_store_->SetValue(key, local_value->CreateDeepCopy(), flags);
73 } else {
74 pref_store_->RemoveValue(key, flags);
75 }
76 for (PrefStore::Observer& observer : observers_)
77 observer.OnPrefValueChanged(key);
78 }
79
80 void PersistentPrefStoreMojo::SetValueSilently(
81 const std::string& key,
82 std::unique_ptr<base::Value> value,
83 uint32_t flags) {
84 pref_store_->SetValue(key, value->CreateDeepCopy(), flags);
85 local_prefs_->Set(key, std::move(value));
86 }
87
88 bool PersistentPrefStoreMojo::ReadOnly() const {
89 return read_only_;
90 }
91
92 PersistentPrefStore::PrefReadError PersistentPrefStoreMojo::GetReadError()
93 const {
94 return read_error_;
95 }
96
97 PersistentPrefStore::PrefReadError PersistentPrefStoreMojo::ReadPrefs() {
98 PrefReadError read_error = PrefReadError::PREF_READ_ERROR_NONE;
99 bool read_only = false;
100 std::unique_ptr<base::DictionaryValue> local_prefs;
101 mojom::PersistentPrefStorePtr pref_store;
102 if (!connector_->Connect(&read_error, &read_only, &local_prefs, &pref_store))
103 NOTREACHED();
104
105 OnCreateComplete(read_error, read_only, std::move(local_prefs),
106 std::move(pref_store));
107 return read_error_;
108 }
109
110 void PersistentPrefStoreMojo::ReadPrefsAsync(
111 ReadErrorDelegate* error_delegate) {
112 error_delegate_.reset(error_delegate);
113 connector_->Connect(base::Bind(&PersistentPrefStoreMojo::OnCreateComplete,
114 base::Unretained(this)));
115 }
116
117 void PersistentPrefStoreMojo::CommitPendingWrite() {
118 pref_store_->CommitPendingWrite();
119 }
120
121 void PersistentPrefStoreMojo::SchedulePendingLossyWrites() {
122 return pref_store_->SchedulePendingLossyWrites();
123 }
124
125 void PersistentPrefStoreMojo::ClearMutableValues() {
126 return pref_store_->ClearMutableValues();
127 }
128
129 PersistentPrefStoreMojo::~PersistentPrefStoreMojo() {
130 if (!pref_store_)
131 return;
132
133 pref_store_->CommitPendingWrite();
134 }
135
136 void PersistentPrefStoreMojo::OnCreateComplete(
137 PrefReadError read_error,
138 bool read_only,
139 std::unique_ptr<base::DictionaryValue> local_prefs,
140 mojom::PersistentPrefStorePtr pref_store) {
141 connector_.reset();
142 read_error_ = read_error;
143 read_only_ = read_only;
144 local_prefs_ = std::move(local_prefs);
145 mojo::FuseInterface(std::move(pref_store_request_),
146 pref_store.PassInterface());
147 if (error_delegate_ && read_error_ != PREF_READ_ERROR_NONE)
148 error_delegate_->OnError(read_error_);
149 error_delegate_.reset();
150
151 for (PrefStore::Observer& observer : observers_) {
152 observer.OnInitializationCompleted(static_cast<bool>(local_prefs_));
153 }
154 }
155
156 } // namespace prefs
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698