1 // Copyright (c) 2012 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.
5 #include "base/prefs/overlay_user_pref_store.h"
7 #include "base/memory/scoped_ptr.h"
8 #include "base/values.h"
10 OverlayUserPrefStore::OverlayUserPrefStore(
11 PersistentPrefStore
* underlay
)
12 : underlay_(underlay
) {
13 underlay_
->AddObserver(this);
16 bool OverlayUserPrefStore::IsSetInOverlay(const std::string
& key
) const {
17 return overlay_
.GetValue(key
, NULL
);
20 void OverlayUserPrefStore::AddObserver(PrefStore::Observer
* observer
) {
21 observers_
.AddObserver(observer
);
24 void OverlayUserPrefStore::RemoveObserver(PrefStore::Observer
* observer
) {
25 observers_
.RemoveObserver(observer
);
28 bool OverlayUserPrefStore::HasObservers() const {
29 return observers_
.might_have_observers();
32 bool OverlayUserPrefStore::IsInitializationComplete() const {
33 return underlay_
->IsInitializationComplete();
36 bool OverlayUserPrefStore::GetValue(const std::string
& key
,
37 const base::Value
** result
) const {
38 // If the |key| shall NOT be stored in the overlay store, there must not
40 DCHECK(ShallBeStoredInOverlay(key
) || !overlay_
.GetValue(key
, NULL
));
42 if (overlay_
.GetValue(key
, result
))
44 return underlay_
->GetValue(GetUnderlayKey(key
), result
);
47 bool OverlayUserPrefStore::GetMutableValue(const std::string
& key
,
48 base::Value
** result
) {
49 if (!ShallBeStoredInOverlay(key
))
50 return underlay_
->GetMutableValue(GetUnderlayKey(key
), result
);
52 if (overlay_
.GetValue(key
, result
))
55 // Try to create copy of underlay if the overlay does not contain a value.
56 base::Value
* underlay_value
= NULL
;
57 if (!underlay_
->GetMutableValue(GetUnderlayKey(key
), &underlay_value
))
60 *result
= underlay_value
->DeepCopy();
61 overlay_
.SetValue(key
, make_scoped_ptr(*result
));
65 void OverlayUserPrefStore::SetValue(const std::string
& key
,
66 scoped_ptr
<base::Value
> value
,
68 if (!ShallBeStoredInOverlay(key
)) {
69 underlay_
->SetValue(GetUnderlayKey(key
), value
.Pass(), flags
);
73 if (overlay_
.SetValue(key
, value
.Pass()))
74 ReportValueChanged(key
, flags
);
77 void OverlayUserPrefStore::SetValueSilently(const std::string
& key
,
78 scoped_ptr
<base::Value
> value
,
80 if (!ShallBeStoredInOverlay(key
)) {
81 underlay_
->SetValueSilently(GetUnderlayKey(key
), value
.Pass(), flags
);
85 overlay_
.SetValue(key
, value
.Pass());
88 void OverlayUserPrefStore::RemoveValue(const std::string
& key
, uint32 flags
) {
89 if (!ShallBeStoredInOverlay(key
)) {
90 underlay_
->RemoveValue(GetUnderlayKey(key
), flags
);
94 if (overlay_
.RemoveValue(key
))
95 ReportValueChanged(key
, flags
);
98 bool OverlayUserPrefStore::ReadOnly() const {
102 PersistentPrefStore::PrefReadError
OverlayUserPrefStore::GetReadError() const {
103 return PersistentPrefStore::PREF_READ_ERROR_NONE
;
106 PersistentPrefStore::PrefReadError
OverlayUserPrefStore::ReadPrefs() {
107 // We do not read intentionally.
108 OnInitializationCompleted(true);
109 return PersistentPrefStore::PREF_READ_ERROR_NONE
;
112 void OverlayUserPrefStore::ReadPrefsAsync(
113 ReadErrorDelegate
* error_delegate_raw
) {
114 scoped_ptr
<ReadErrorDelegate
> error_delegate(error_delegate_raw
);
115 // We do not read intentionally.
116 OnInitializationCompleted(true);
119 void OverlayUserPrefStore::CommitPendingWrite() {
120 underlay_
->CommitPendingWrite();
121 // We do not write our content intentionally.
124 void OverlayUserPrefStore::SchedulePendingLossyWrites() {
125 underlay_
->SchedulePendingLossyWrites();
128 void OverlayUserPrefStore::ReportValueChanged(const std::string
& key
,
130 FOR_EACH_OBSERVER(PrefStore::Observer
, observers_
, OnPrefValueChanged(key
));
133 void OverlayUserPrefStore::OnPrefValueChanged(const std::string
& key
) {
134 if (!overlay_
.GetValue(GetOverlayKey(key
), NULL
))
135 ReportValueChanged(GetOverlayKey(key
), DEFAULT_PREF_WRITE_FLAGS
);
138 void OverlayUserPrefStore::OnInitializationCompleted(bool succeeded
) {
139 FOR_EACH_OBSERVER(PrefStore::Observer
, observers_
,
140 OnInitializationCompleted(succeeded
));
143 void OverlayUserPrefStore::RegisterOverlayPref(const std::string
& key
) {
144 RegisterOverlayPref(key
, key
);
147 void OverlayUserPrefStore::RegisterOverlayPref(
148 const std::string
& overlay_key
,
149 const std::string
& underlay_key
) {
150 DCHECK(!overlay_key
.empty()) << "Overlay key is empty";
151 DCHECK(overlay_to_underlay_names_map_
.find(overlay_key
) ==
152 overlay_to_underlay_names_map_
.end()) <<
153 "Overlay key already registered";
154 DCHECK(!underlay_key
.empty()) << "Underlay key is empty";
155 DCHECK(underlay_to_overlay_names_map_
.find(underlay_key
) ==
156 underlay_to_overlay_names_map_
.end()) <<
157 "Underlay key already registered";
158 overlay_to_underlay_names_map_
[overlay_key
] = underlay_key
;
159 underlay_to_overlay_names_map_
[underlay_key
] = overlay_key
;
162 OverlayUserPrefStore::~OverlayUserPrefStore() {
163 underlay_
->RemoveObserver(this);
166 const std::string
& OverlayUserPrefStore::GetOverlayKey(
167 const std::string
& underlay_key
) const {
168 NamesMap::const_iterator i
=
169 underlay_to_overlay_names_map_
.find(underlay_key
);
170 return i
!= underlay_to_overlay_names_map_
.end() ? i
->second
: underlay_key
;
173 const std::string
& OverlayUserPrefStore::GetUnderlayKey(
174 const std::string
& overlay_key
) const {
175 NamesMap::const_iterator i
=
176 overlay_to_underlay_names_map_
.find(overlay_key
);
177 return i
!= overlay_to_underlay_names_map_
.end() ? i
->second
: overlay_key
;
180 bool OverlayUserPrefStore::ShallBeStoredInOverlay(
181 const std::string
& key
) const {
182 return overlay_to_underlay_names_map_
.find(key
) !=
183 overlay_to_underlay_names_map_
.end();