blob: ddc47c8f351d58320c3dc836c3208271a38b510e [file] [log] [blame]
[email protected]32c3c752012-01-05 17:33:471// Copyright (c) 2012 The Chromium Authors. All rights reserved.
[email protected]39565dd2011-11-14 12:09:272// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
brettwf00b9b42016-02-01 22:11:385#include "components/prefs/overlay_user_pref_store.h"
[email protected]39565dd2011-11-14 12:09:276
dcheng5f043bc2016-04-22 19:09:067#include <memory>
danakj0c8d4aa2015-11-25 05:29:588#include <utility>
9
dcheng5f043bc2016-04-22 19:09:0610#include "base/memory/ptr_util.h"
[email protected]39565dd2011-11-14 12:09:2711#include "base/values.h"
12
13OverlayUserPrefStore::OverlayUserPrefStore(
14 PersistentPrefStore* underlay)
15 : underlay_(underlay) {
16 underlay_->AddObserver(this);
17}
18
[email protected]39565dd2011-11-14 12:09:2719bool OverlayUserPrefStore::IsSetInOverlay(const std::string& key) const {
20 return overlay_.GetValue(key, NULL);
21}
22
23void OverlayUserPrefStore::AddObserver(PrefStore::Observer* observer) {
24 observers_.AddObserver(observer);
25}
26
27void OverlayUserPrefStore::RemoveObserver(PrefStore::Observer* observer) {
28 observers_.RemoveObserver(observer);
29}
30
[email protected]14e0ec62013-08-26 22:01:3931bool OverlayUserPrefStore::HasObservers() const {
32 return observers_.might_have_observers();
[email protected]d3b05ea2012-01-24 22:57:0533}
34
[email protected]39565dd2011-11-14 12:09:2735bool OverlayUserPrefStore::IsInitializationComplete() const {
36 return underlay_->IsInitializationComplete();
37}
38
[email protected]892f1d62012-11-08 18:24:3439bool OverlayUserPrefStore::GetValue(const std::string& key,
[email protected]a43a667b2013-06-14 17:56:0840 const base::Value** result) const {
[email protected]39565dd2011-11-14 12:09:2741 // If the |key| shall NOT be stored in the overlay store, there must not
42 // be an entry.
43 DCHECK(ShallBeStoredInOverlay(key) || !overlay_.GetValue(key, NULL));
44
45 if (overlay_.GetValue(key, result))
[email protected]892f1d62012-11-08 18:24:3446 return true;
[email protected]39565dd2011-11-14 12:09:2747 return underlay_->GetValue(GetUnderlayKey(key), result);
48}
49
tibelle23659b42017-02-23 01:44:1350std::unique_ptr<base::DictionaryValue> OverlayUserPrefStore::GetValues() const {
51 auto values = underlay_->GetValues();
52 auto overlay_values = overlay_.AsDictionaryValue();
53 for (const auto& overlay_mapping : overlay_to_underlay_names_map_) {
54 const std::string& overlay_key = overlay_mapping.first;
55 const std::string& underlay_key = overlay_mapping.second;
56 std::unique_ptr<base::Value> out_value;
57 if (overlay_key != underlay_key) {
58 values->Remove(underlay_key, &out_value);
59 }
60 overlay_values->Remove(overlay_key, &out_value);
61 if (out_value) {
62 values->Set(overlay_key, std::move(out_value));
63 }
64 }
65 return values;
66}
67
[email protected]892f1d62012-11-08 18:24:3468bool OverlayUserPrefStore::GetMutableValue(const std::string& key,
[email protected]a43a667b2013-06-14 17:56:0869 base::Value** result) {
[email protected]39565dd2011-11-14 12:09:2770 if (!ShallBeStoredInOverlay(key))
71 return underlay_->GetMutableValue(GetUnderlayKey(key), result);
72
73 if (overlay_.GetValue(key, result))
[email protected]892f1d62012-11-08 18:24:3474 return true;
[email protected]39565dd2011-11-14 12:09:2775
76 // Try to create copy of underlay if the overlay does not contain a value.
[email protected]a43a667b2013-06-14 17:56:0877 base::Value* underlay_value = NULL;
[email protected]892f1d62012-11-08 18:24:3478 if (!underlay_->GetMutableValue(GetUnderlayKey(key), &underlay_value))
79 return false;
[email protected]39565dd2011-11-14 12:09:2780
81 *result = underlay_value->DeepCopy();
dcheng5f043bc2016-04-22 19:09:0682 overlay_.SetValue(key, base::WrapUnique(*result));
[email protected]892f1d62012-11-08 18:24:3483 return true;
[email protected]39565dd2011-11-14 12:09:2784}
85
86void OverlayUserPrefStore::SetValue(const std::string& key,
dcheng5f043bc2016-04-22 19:09:0687 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:3688 uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:2789 if (!ShallBeStoredInOverlay(key)) {
danakj0c8d4aa2015-11-25 05:29:5890 underlay_->SetValue(GetUnderlayKey(key), std::move(value), flags);
[email protected]39565dd2011-11-14 12:09:2791 return;
92 }
93
danakj0c8d4aa2015-11-25 05:29:5894 if (overlay_.SetValue(key, std::move(value)))
raymes76de1af2015-05-06 03:22:2195 ReportValueChanged(key, flags);
[email protected]39565dd2011-11-14 12:09:2796}
97
98void OverlayUserPrefStore::SetValueSilently(const std::string& key,
dcheng5f043bc2016-04-22 19:09:0699 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:36100 uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:27101 if (!ShallBeStoredInOverlay(key)) {
danakj0c8d4aa2015-11-25 05:29:58102 underlay_->SetValueSilently(GetUnderlayKey(key), std::move(value), flags);
[email protected]39565dd2011-11-14 12:09:27103 return;
104 }
105
danakj0c8d4aa2015-11-25 05:29:58106 overlay_.SetValue(key, std::move(value));
[email protected]39565dd2011-11-14 12:09:27107}
108
avi9ef8bb02015-12-24 05:29:36109void OverlayUserPrefStore::RemoveValue(const std::string& key, uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:27110 if (!ShallBeStoredInOverlay(key)) {
raymes76de1af2015-05-06 03:22:21111 underlay_->RemoveValue(GetUnderlayKey(key), flags);
[email protected]39565dd2011-11-14 12:09:27112 return;
113 }
114
115 if (overlay_.RemoveValue(key))
raymes76de1af2015-05-06 03:22:21116 ReportValueChanged(key, flags);
[email protected]39565dd2011-11-14 12:09:27117}
118
119bool OverlayUserPrefStore::ReadOnly() const {
120 return false;
121}
122
[email protected]59c10712012-03-13 02:10:34123PersistentPrefStore::PrefReadError OverlayUserPrefStore::GetReadError() const {
124 return PersistentPrefStore::PREF_READ_ERROR_NONE;
125}
126
[email protected]39565dd2011-11-14 12:09:27127PersistentPrefStore::PrefReadError OverlayUserPrefStore::ReadPrefs() {
128 // We do not read intentionally.
129 OnInitializationCompleted(true);
130 return PersistentPrefStore::PREF_READ_ERROR_NONE;
131}
132
133void OverlayUserPrefStore::ReadPrefsAsync(
134 ReadErrorDelegate* error_delegate_raw) {
dcheng5f043bc2016-04-22 19:09:06135 std::unique_ptr<ReadErrorDelegate> error_delegate(error_delegate_raw);
[email protected]39565dd2011-11-14 12:09:27136 // We do not read intentionally.
137 OnInitializationCompleted(true);
138}
139
[email protected]39565dd2011-11-14 12:09:27140void OverlayUserPrefStore::CommitPendingWrite() {
141 underlay_->CommitPendingWrite();
142 // We do not write our content intentionally.
143}
144
benwells26730592015-05-28 13:08:08145void OverlayUserPrefStore::SchedulePendingLossyWrites() {
146 underlay_->SchedulePendingLossyWrites();
147}
148
raymes76de1af2015-05-06 03:22:21149void OverlayUserPrefStore::ReportValueChanged(const std::string& key,
avi9ef8bb02015-12-24 05:29:36150 uint32_t flags) {
ericwilligers42b92c12016-10-24 20:21:13151 for (PrefStore::Observer& observer : observers_)
152 observer.OnPrefValueChanged(key);
[email protected]39565dd2011-11-14 12:09:27153}
154
[email protected]2dea5c02012-04-25 07:01:07155void OverlayUserPrefStore::OnPrefValueChanged(const std::string& key) {
156 if (!overlay_.GetValue(GetOverlayKey(key), NULL))
raymes76de1af2015-05-06 03:22:21157 ReportValueChanged(GetOverlayKey(key), DEFAULT_PREF_WRITE_FLAGS);
[email protected]2dea5c02012-04-25 07:01:07158}
159
160void OverlayUserPrefStore::OnInitializationCompleted(bool succeeded) {
ericwilligers42b92c12016-10-24 20:21:13161 for (PrefStore::Observer& observer : observers_)
162 observer.OnInitializationCompleted(succeeded);
[email protected]2dea5c02012-04-25 07:01:07163}
164
[email protected]32c3c752012-01-05 17:33:47165void OverlayUserPrefStore::RegisterOverlayPref(const std::string& key) {
166 RegisterOverlayPref(key, key);
[email protected]39565dd2011-11-14 12:09:27167}
168
[email protected]32c3c752012-01-05 17:33:47169void OverlayUserPrefStore::RegisterOverlayPref(
[email protected]39565dd2011-11-14 12:09:27170 const std::string& overlay_key,
171 const std::string& underlay_key) {
172 DCHECK(!overlay_key.empty()) << "Overlay key is empty";
173 DCHECK(overlay_to_underlay_names_map_.find(overlay_key) ==
174 overlay_to_underlay_names_map_.end()) <<
175 "Overlay key already registered";
176 DCHECK(!underlay_key.empty()) << "Underlay key is empty";
177 DCHECK(underlay_to_overlay_names_map_.find(underlay_key) ==
178 underlay_to_overlay_names_map_.end()) <<
179 "Underlay key already registered";
180 overlay_to_underlay_names_map_[overlay_key] = underlay_key;
181 underlay_to_overlay_names_map_[underlay_key] = overlay_key;
182}
183
dvadym53fc0d42016-02-05 13:34:57184void OverlayUserPrefStore::ClearMutableValues() {
185 overlay_.Clear();
186}
187
[email protected]2dea5c02012-04-25 07:01:07188OverlayUserPrefStore::~OverlayUserPrefStore() {
189 underlay_->RemoveObserver(this);
[email protected]39565dd2011-11-14 12:09:27190}
191
192const std::string& OverlayUserPrefStore::GetOverlayKey(
193 const std::string& underlay_key) const {
194 NamesMap::const_iterator i =
195 underlay_to_overlay_names_map_.find(underlay_key);
196 return i != underlay_to_overlay_names_map_.end() ? i->second : underlay_key;
197}
198
199const std::string& OverlayUserPrefStore::GetUnderlayKey(
200 const std::string& overlay_key) const {
201 NamesMap::const_iterator i =
202 overlay_to_underlay_names_map_.find(overlay_key);
203 return i != overlay_to_underlay_names_map_.end() ? i->second : overlay_key;
204}
205
206bool OverlayUserPrefStore::ShallBeStoredInOverlay(
207 const std::string& key) const {
208 return overlay_to_underlay_names_map_.find(key) !=
209 overlay_to_underlay_names_map_.end();
210}