| Index: base/prefs/overlay_user_pref_store.cc
|
| diff --git a/base/prefs/overlay_user_pref_store.cc b/base/prefs/overlay_user_pref_store.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..dd5b68e0a636438275a3f544d0881b6a53fdb438
|
| --- /dev/null
|
| +++ b/base/prefs/overlay_user_pref_store.cc
|
| @@ -0,0 +1,186 @@
|
| +// Copyright (c) 2012 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "base/prefs/overlay_user_pref_store.h"
|
| +
|
| +#include <utility>
|
| +
|
| +#include "base/memory/scoped_ptr.h"
|
| +#include "base/values.h"
|
| +
|
| +OverlayUserPrefStore::OverlayUserPrefStore(
|
| + PersistentPrefStore* underlay)
|
| + : underlay_(underlay) {
|
| + underlay_->AddObserver(this);
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::IsSetInOverlay(const std::string& key) const {
|
| + return overlay_.GetValue(key, NULL);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::AddObserver(PrefStore::Observer* observer) {
|
| + observers_.AddObserver(observer);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::RemoveObserver(PrefStore::Observer* observer) {
|
| + observers_.RemoveObserver(observer);
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::HasObservers() const {
|
| + return observers_.might_have_observers();
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::IsInitializationComplete() const {
|
| + return underlay_->IsInitializationComplete();
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::GetValue(const std::string& key,
|
| + const base::Value** result) const {
|
| + // If the |key| shall NOT be stored in the overlay store, there must not
|
| + // be an entry.
|
| + DCHECK(ShallBeStoredInOverlay(key) || !overlay_.GetValue(key, NULL));
|
| +
|
| + if (overlay_.GetValue(key, result))
|
| + return true;
|
| + return underlay_->GetValue(GetUnderlayKey(key), result);
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::GetMutableValue(const std::string& key,
|
| + base::Value** result) {
|
| + if (!ShallBeStoredInOverlay(key))
|
| + return underlay_->GetMutableValue(GetUnderlayKey(key), result);
|
| +
|
| + if (overlay_.GetValue(key, result))
|
| + return true;
|
| +
|
| + // Try to create copy of underlay if the overlay does not contain a value.
|
| + base::Value* underlay_value = NULL;
|
| + if (!underlay_->GetMutableValue(GetUnderlayKey(key), &underlay_value))
|
| + return false;
|
| +
|
| + *result = underlay_value->DeepCopy();
|
| + overlay_.SetValue(key, make_scoped_ptr(*result));
|
| + return true;
|
| +}
|
| +
|
| +void OverlayUserPrefStore::SetValue(const std::string& key,
|
| + scoped_ptr<base::Value> value,
|
| + uint32_t flags) {
|
| + if (!ShallBeStoredInOverlay(key)) {
|
| + underlay_->SetValue(GetUnderlayKey(key), std::move(value), flags);
|
| + return;
|
| + }
|
| +
|
| + if (overlay_.SetValue(key, std::move(value)))
|
| + ReportValueChanged(key, flags);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::SetValueSilently(const std::string& key,
|
| + scoped_ptr<base::Value> value,
|
| + uint32_t flags) {
|
| + if (!ShallBeStoredInOverlay(key)) {
|
| + underlay_->SetValueSilently(GetUnderlayKey(key), std::move(value), flags);
|
| + return;
|
| + }
|
| +
|
| + overlay_.SetValue(key, std::move(value));
|
| +}
|
| +
|
| +void OverlayUserPrefStore::RemoveValue(const std::string& key, uint32_t flags) {
|
| + if (!ShallBeStoredInOverlay(key)) {
|
| + underlay_->RemoveValue(GetUnderlayKey(key), flags);
|
| + return;
|
| + }
|
| +
|
| + if (overlay_.RemoveValue(key))
|
| + ReportValueChanged(key, flags);
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::ReadOnly() const {
|
| + return false;
|
| +}
|
| +
|
| +PersistentPrefStore::PrefReadError OverlayUserPrefStore::GetReadError() const {
|
| + return PersistentPrefStore::PREF_READ_ERROR_NONE;
|
| +}
|
| +
|
| +PersistentPrefStore::PrefReadError OverlayUserPrefStore::ReadPrefs() {
|
| + // We do not read intentionally.
|
| + OnInitializationCompleted(true);
|
| + return PersistentPrefStore::PREF_READ_ERROR_NONE;
|
| +}
|
| +
|
| +void OverlayUserPrefStore::ReadPrefsAsync(
|
| + ReadErrorDelegate* error_delegate_raw) {
|
| + scoped_ptr<ReadErrorDelegate> error_delegate(error_delegate_raw);
|
| + // We do not read intentionally.
|
| + OnInitializationCompleted(true);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::CommitPendingWrite() {
|
| + underlay_->CommitPendingWrite();
|
| + // We do not write our content intentionally.
|
| +}
|
| +
|
| +void OverlayUserPrefStore::SchedulePendingLossyWrites() {
|
| + underlay_->SchedulePendingLossyWrites();
|
| +}
|
| +
|
| +void OverlayUserPrefStore::ReportValueChanged(const std::string& key,
|
| + uint32_t flags) {
|
| + FOR_EACH_OBSERVER(PrefStore::Observer, observers_, OnPrefValueChanged(key));
|
| +}
|
| +
|
| +void OverlayUserPrefStore::OnPrefValueChanged(const std::string& key) {
|
| + if (!overlay_.GetValue(GetOverlayKey(key), NULL))
|
| + ReportValueChanged(GetOverlayKey(key), DEFAULT_PREF_WRITE_FLAGS);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::OnInitializationCompleted(bool succeeded) {
|
| + FOR_EACH_OBSERVER(PrefStore::Observer, observers_,
|
| + OnInitializationCompleted(succeeded));
|
| +}
|
| +
|
| +void OverlayUserPrefStore::RegisterOverlayPref(const std::string& key) {
|
| + RegisterOverlayPref(key, key);
|
| +}
|
| +
|
| +void OverlayUserPrefStore::RegisterOverlayPref(
|
| + const std::string& overlay_key,
|
| + const std::string& underlay_key) {
|
| + DCHECK(!overlay_key.empty()) << "Overlay key is empty";
|
| + DCHECK(overlay_to_underlay_names_map_.find(overlay_key) ==
|
| + overlay_to_underlay_names_map_.end()) <<
|
| + "Overlay key already registered";
|
| + DCHECK(!underlay_key.empty()) << "Underlay key is empty";
|
| + DCHECK(underlay_to_overlay_names_map_.find(underlay_key) ==
|
| + underlay_to_overlay_names_map_.end()) <<
|
| + "Underlay key already registered";
|
| + overlay_to_underlay_names_map_[overlay_key] = underlay_key;
|
| + underlay_to_overlay_names_map_[underlay_key] = overlay_key;
|
| +}
|
| +
|
| +OverlayUserPrefStore::~OverlayUserPrefStore() {
|
| + underlay_->RemoveObserver(this);
|
| +}
|
| +
|
| +const std::string& OverlayUserPrefStore::GetOverlayKey(
|
| + const std::string& underlay_key) const {
|
| + NamesMap::const_iterator i =
|
| + underlay_to_overlay_names_map_.find(underlay_key);
|
| + return i != underlay_to_overlay_names_map_.end() ? i->second : underlay_key;
|
| +}
|
| +
|
| +const std::string& OverlayUserPrefStore::GetUnderlayKey(
|
| + const std::string& overlay_key) const {
|
| + NamesMap::const_iterator i =
|
| + overlay_to_underlay_names_map_.find(overlay_key);
|
| + return i != overlay_to_underlay_names_map_.end() ? i->second : overlay_key;
|
| +}
|
| +
|
| +bool OverlayUserPrefStore::ShallBeStoredInOverlay(
|
| + const std::string& key) const {
|
| + return overlay_to_underlay_names_map_.find(key) !=
|
| + overlay_to_underlay_names_map_.end();
|
| +}
|
|
|