Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Unified Diff: services/preferences/public/cpp/pref_store_impl.cc

Issue 2778643002: Pref service: Filter updates from read-only pref stores. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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()));

Powered by Google App Engine
This is Rietveld 408576698