| Index: services/preferences/public/cpp/pref_store_impl.cc
|
| diff --git a/services/preferences/public/cpp/pref_store_impl.cc b/services/preferences/public/cpp/pref_store_impl.cc
|
| index 680b264799ad739aa03d876b9d172a007c2f2420..b88e99e3aeba86ba4cb5a465b2672c2782bb3188 100644
|
| --- a/services/preferences/public/cpp/pref_store_impl.cc
|
| +++ b/services/preferences/public/cpp/pref_store_impl.cc
|
| @@ -5,11 +5,44 @@
|
| #include "services/preferences/public/cpp/pref_store_impl.h"
|
|
|
| #include <memory>
|
| +#include <unordered_set>
|
|
|
| +#include "base/stl_util.h"
|
| #include "base/values.h"
|
|
|
| namespace prefs {
|
|
|
| +class PrefStoreImpl::Observer {
|
| + public:
|
| + Observer(mojom::PrefStoreObserverPtr observer,
|
| + std::unordered_set<std::string> prefs)
|
| + : observer_(std::move(observer)), prefs_(std::move(prefs)) {}
|
| +
|
| + void OnInitializationCompleted(bool succeeded) {
|
| + observer_->OnInitializationCompleted(succeeded);
|
| + }
|
| +
|
| + void OnPrefChanged(const std::string& key, const base::Value& value) const {
|
| + if (!base::ContainsKey(prefs_, key))
|
| + return;
|
| +
|
| + observer_->OnPrefChanged(key, value.CreateDeepCopy());
|
| + }
|
| +
|
| + void OnPrefRemoved(const std::string& key) const {
|
| + if (!base::ContainsKey(prefs_, key))
|
| + return;
|
| +
|
| + observer_->OnPrefChanged(key, nullptr);
|
| + }
|
| +
|
| + private:
|
| + mojom::PrefStoreObserverPtr observer_;
|
| + const std::unordered_set<std::string> prefs_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(Observer);
|
| +};
|
| +
|
| PrefStoreImpl::PrefStoreImpl(scoped_refptr<::PrefStore> pref_store,
|
| mojom::PrefStoreRequest request)
|
| : backing_pref_store_(std::move(pref_store)),
|
| @@ -27,7 +60,7 @@ PrefStoreImpl::~PrefStoreImpl() {
|
|
|
| // static
|
| std::unique_ptr<PrefStoreImpl> PrefStoreImpl::Create(
|
| - mojom::PrefStoreRegistryPtr registry_ptr,
|
| + mojom::PrefStoreRegistry* registry_ptr,
|
| scoped_refptr<::PrefStore> pref_store,
|
| PrefValueStore::PrefStoreType type) {
|
| mojom::PrefStorePtr ptr;
|
| @@ -42,10 +75,10 @@ void PrefStoreImpl::OnPrefValueChanged(const std::string& key) {
|
| const base::Value* value = nullptr;
|
| if (backing_pref_store_->GetValue(key, &value)) {
|
| for (const auto& observer : observers_)
|
| - observer->OnPrefChanged(key, value->CreateDeepCopy());
|
| + observer->OnPrefChanged(key, *value);
|
| } else {
|
| for (const auto& observer : observers_)
|
| - observer->OnPrefChanged(key, nullptr);
|
| + observer->OnPrefRemoved(key);
|
| }
|
| }
|
|
|
| @@ -59,10 +92,15 @@ void PrefStoreImpl::OnInitializationCompleted(bool succeeded) {
|
| observer->OnInitializationCompleted(succeeded);
|
| }
|
|
|
| -void PrefStoreImpl::AddObserver(const AddObserverCallback& callback) {
|
| +void PrefStoreImpl::AddObserver(
|
| + const std::vector<std::string>& prefs_to_observe,
|
| + const AddObserverCallback& callback) {
|
| mojom::PrefStoreObserverPtr observer_ptr;
|
| auto request = mojo::MakeRequest(&observer_ptr);
|
| - observers_.push_back(std::move(observer_ptr));
|
| + observers_.push_back(base::MakeUnique<Observer>(
|
| + std::move(observer_ptr),
|
| + std::unordered_set<std::string>(prefs_to_observe.begin(),
|
| + prefs_to_observe.end())));
|
| callback.Run(mojom::PrefStoreConnection::New(
|
| std::move(request), backing_pref_store_->GetValues(),
|
| backing_pref_store_->IsInitializationComplete()));
|
|
|