Chromium Code Reviews| 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..3f1c927a46e9357eaf49c21a59d4ae518c15ec34 100644 |
| --- a/services/preferences/public/cpp/pref_store_impl.cc |
| +++ b/services/preferences/public/cpp/pref_store_impl.cc |
| @@ -5,11 +5,47 @@ |
| #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)) {} |
| + |
| + Observer(Observer&& other) = default; |
| + Observer& operator=(Observer&& other) = default; |
| + |
| + void OnInitializationCompleted(bool succeeded) { |
| + observer_->OnInitializationCompleted(succeeded); |
| + } |
| + |
| + void OnPrefChanged(const std::string& key, const base::Value& value) { |
| + if (!base::ContainsKey(prefs_, key)) |
| + return; |
| + |
| + observer_->OnPrefChanged(key, value.CreateDeepCopy()); |
| + } |
| + |
| + void OnPrefRemoved(const std::string& key) { |
| + 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 +63,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; |
| @@ -41,11 +77,11 @@ void PrefStoreImpl::OnPrefValueChanged(const std::string& key) { |
| auto dictionary = base::MakeUnique<base::DictionaryValue>(); |
| const base::Value* value = nullptr; |
| if (backing_pref_store_->GetValue(key, &value)) { |
| - for (const auto& observer : observers_) |
| - observer->OnPrefChanged(key, value->CreateDeepCopy()); |
| + for (auto& observer : observers_) |
|
tibell
2017/03/27 03:37:56
const
Sam McNally
2017/03/27 06:44:40
Done.
|
| + observer.OnPrefChanged(key, *value); |
| } else { |
| - for (const auto& observer : observers_) |
| - observer->OnPrefChanged(key, nullptr); |
| + for (auto& observer : observers_) |
|
tibell
2017/03/27 03:37:56
const
Sam McNally
2017/03/27 06:44:40
Done.
|
| + observer.OnPrefRemoved(key); |
| } |
| } |
| @@ -55,14 +91,19 @@ void PrefStoreImpl::OnInitializationCompleted(bool succeeded) { |
| if (backing_pref_store_initialized_) |
| DCHECK(succeeded); |
| backing_pref_store_initialized_ = succeeded; |
| - for (const auto& observer : observers_) |
| - observer->OnInitializationCompleted(succeeded); |
| + for (auto& observer : observers_) |
|
tibell
2017/03/27 03:37:56
const
Sam McNally
2017/03/27 06:44:40
Done.
|
| + 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_.emplace_back( |
| + 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())); |