blob: 48271fb01eb0d4792addf5ca847edbb30f03efbe [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;
Johan Tibell6566c8ac2017-05-11 03:22:1747 return underlay_->GetValue(key, result);
[email protected]39565dd2011-11-14 12:09:2748}
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();
Johan Tibell6566c8ac2017-05-11 03:22:1753 for (const auto& key : overlay_names_set_) {
tibelle23659b42017-02-23 01:44:1354 std::unique_ptr<base::Value> out_value;
Johan Tibell6566c8ac2017-05-11 03:22:1755 overlay_values->Remove(key, &out_value);
tibelle23659b42017-02-23 01:44:1356 if (out_value) {
Johan Tibell6566c8ac2017-05-11 03:22:1757 values->Set(key, std::move(out_value));
tibelle23659b42017-02-23 01:44:1358 }
59 }
60 return values;
61}
62
[email protected]892f1d62012-11-08 18:24:3463bool OverlayUserPrefStore::GetMutableValue(const std::string& key,
[email protected]a43a667b2013-06-14 17:56:0864 base::Value** result) {
[email protected]39565dd2011-11-14 12:09:2765 if (!ShallBeStoredInOverlay(key))
Johan Tibell6566c8ac2017-05-11 03:22:1766 return underlay_->GetMutableValue(key, result);
[email protected]39565dd2011-11-14 12:09:2767
68 if (overlay_.GetValue(key, result))
[email protected]892f1d62012-11-08 18:24:3469 return true;
[email protected]39565dd2011-11-14 12:09:2770
71 // Try to create copy of underlay if the overlay does not contain a value.
[email protected]a43a667b2013-06-14 17:56:0872 base::Value* underlay_value = NULL;
Johan Tibell6566c8ac2017-05-11 03:22:1773 if (!underlay_->GetMutableValue(key, &underlay_value))
[email protected]892f1d62012-11-08 18:24:3474 return false;
[email protected]39565dd2011-11-14 12:09:2775
76 *result = underlay_value->DeepCopy();
dcheng5f043bc2016-04-22 19:09:0677 overlay_.SetValue(key, base::WrapUnique(*result));
[email protected]892f1d62012-11-08 18:24:3478 return true;
[email protected]39565dd2011-11-14 12:09:2779}
80
81void OverlayUserPrefStore::SetValue(const std::string& key,
dcheng5f043bc2016-04-22 19:09:0682 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:3683 uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:2784 if (!ShallBeStoredInOverlay(key)) {
Johan Tibell6566c8ac2017-05-11 03:22:1785 underlay_->SetValue(key, std::move(value), flags);
[email protected]39565dd2011-11-14 12:09:2786 return;
87 }
88
danakj0c8d4aa2015-11-25 05:29:5889 if (overlay_.SetValue(key, std::move(value)))
raymes76de1af2015-05-06 03:22:2190 ReportValueChanged(key, flags);
[email protected]39565dd2011-11-14 12:09:2791}
92
93void OverlayUserPrefStore::SetValueSilently(const std::string& key,
dcheng5f043bc2016-04-22 19:09:0694 std::unique_ptr<base::Value> value,
avi9ef8bb02015-12-24 05:29:3695 uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:2796 if (!ShallBeStoredInOverlay(key)) {
Johan Tibell6566c8ac2017-05-11 03:22:1797 underlay_->SetValueSilently(key, std::move(value), flags);
[email protected]39565dd2011-11-14 12:09:2798 return;
99 }
100
danakj0c8d4aa2015-11-25 05:29:58101 overlay_.SetValue(key, std::move(value));
[email protected]39565dd2011-11-14 12:09:27102}
103
avi9ef8bb02015-12-24 05:29:36104void OverlayUserPrefStore::RemoveValue(const std::string& key, uint32_t flags) {
[email protected]39565dd2011-11-14 12:09:27105 if (!ShallBeStoredInOverlay(key)) {
Johan Tibell6566c8ac2017-05-11 03:22:17106 underlay_->RemoveValue(key, flags);
[email protected]39565dd2011-11-14 12:09:27107 return;
108 }
109
110 if (overlay_.RemoveValue(key))
raymes76de1af2015-05-06 03:22:21111 ReportValueChanged(key, flags);
[email protected]39565dd2011-11-14 12:09:27112}
113
114bool OverlayUserPrefStore::ReadOnly() const {
115 return false;
116}
117
[email protected]59c10712012-03-13 02:10:34118PersistentPrefStore::PrefReadError OverlayUserPrefStore::GetReadError() const {
119 return PersistentPrefStore::PREF_READ_ERROR_NONE;
120}
121
[email protected]39565dd2011-11-14 12:09:27122PersistentPrefStore::PrefReadError OverlayUserPrefStore::ReadPrefs() {
123 // We do not read intentionally.
124 OnInitializationCompleted(true);
125 return PersistentPrefStore::PREF_READ_ERROR_NONE;
126}
127
128void OverlayUserPrefStore::ReadPrefsAsync(
129 ReadErrorDelegate* error_delegate_raw) {
dcheng5f043bc2016-04-22 19:09:06130 std::unique_ptr<ReadErrorDelegate> error_delegate(error_delegate_raw);
[email protected]39565dd2011-11-14 12:09:27131 // We do not read intentionally.
132 OnInitializationCompleted(true);
133}
134
[email protected]39565dd2011-11-14 12:09:27135void OverlayUserPrefStore::CommitPendingWrite() {
136 underlay_->CommitPendingWrite();
137 // We do not write our content intentionally.
138}
139
benwells26730592015-05-28 13:08:08140void OverlayUserPrefStore::SchedulePendingLossyWrites() {
141 underlay_->SchedulePendingLossyWrites();
142}
143
raymes76de1af2015-05-06 03:22:21144void OverlayUserPrefStore::ReportValueChanged(const std::string& key,
avi9ef8bb02015-12-24 05:29:36145 uint32_t flags) {
ericwilligers42b92c12016-10-24 20:21:13146 for (PrefStore::Observer& observer : observers_)
147 observer.OnPrefValueChanged(key);
[email protected]39565dd2011-11-14 12:09:27148}
149
[email protected]2dea5c02012-04-25 07:01:07150void OverlayUserPrefStore::OnPrefValueChanged(const std::string& key) {
Johan Tibell6566c8ac2017-05-11 03:22:17151 if (!overlay_.GetValue(key, NULL))
152 ReportValueChanged(key, DEFAULT_PREF_WRITE_FLAGS);
[email protected]2dea5c02012-04-25 07:01:07153}
154
155void OverlayUserPrefStore::OnInitializationCompleted(bool succeeded) {
ericwilligers42b92c12016-10-24 20:21:13156 for (PrefStore::Observer& observer : observers_)
157 observer.OnInitializationCompleted(succeeded);
[email protected]2dea5c02012-04-25 07:01:07158}
159
[email protected]32c3c752012-01-05 17:33:47160void OverlayUserPrefStore::RegisterOverlayPref(const std::string& key) {
Johan Tibell6566c8ac2017-05-11 03:22:17161 DCHECK(!key.empty()) << "Key is empty";
162 DCHECK(overlay_names_set_.find(key) == overlay_names_set_.end())
163 << "Key already registered";
164 overlay_names_set_.insert(key);
[email protected]39565dd2011-11-14 12:09:27165}
166
dvadym53fc0d42016-02-05 13:34:57167void OverlayUserPrefStore::ClearMutableValues() {
168 overlay_.Clear();
169}
170
[email protected]2dea5c02012-04-25 07:01:07171OverlayUserPrefStore::~OverlayUserPrefStore() {
172 underlay_->RemoveObserver(this);
[email protected]39565dd2011-11-14 12:09:27173}
174
[email protected]39565dd2011-11-14 12:09:27175bool OverlayUserPrefStore::ShallBeStoredInOverlay(
176 const std::string& key) const {
Johan Tibell6566c8ac2017-05-11 03:22:17177 return overlay_names_set_.find(key) != overlay_names_set_.end();
[email protected]39565dd2011-11-14 12:09:27178}