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

Unified Diff: services/preferences/persistent_pref_store_impl.cc

Issue 2767743003: Pref service: Merge connectors and send a PrefRegistry in Connect(). (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/persistent_pref_store_impl.cc
diff --git a/services/preferences/persistent_pref_store_impl.cc b/services/preferences/persistent_pref_store_impl.cc
index 65e2444a3790a7ed9e796575e8491e0fa3f659c6..275f8a0b2260d8cbe3038993343acbf783a27fb7 100644
--- a/services/preferences/persistent_pref_store_impl.cc
+++ b/services/preferences/persistent_pref_store_impl.cc
@@ -8,6 +8,7 @@
#include "base/auto_reset.h"
#include "base/memory/ptr_util.h"
+#include "base/stl_util.h"
#include "base/values.h"
#include "components/prefs/persistent_pref_store.h"
#include "mojo/public/cpp/bindings/binding.h"
@@ -18,10 +19,12 @@ class PersistentPrefStoreImpl::Connection : public mojom::PersistentPrefStore {
public:
Connection(PersistentPrefStoreImpl* pref_store,
mojom::PersistentPrefStoreRequest request,
- mojom::PrefStoreObserverPtr observer)
+ mojom::PrefStoreObserverPtr observer,
+ mojom::PrefRegistryPtr pref_registry)
: pref_store_(pref_store),
binding_(this, std::move(request)),
- observer_(std::move(observer)) {
+ observer_(std::move(observer)),
+ pref_registry_(std::move(pref_registry)) {
auto error_callback =
base::Bind(&PersistentPrefStoreImpl::Connection::OnConnectionError,
base::Unretained(this));
@@ -35,6 +38,9 @@ class PersistentPrefStoreImpl::Connection : public mojom::PersistentPrefStore {
if (write_in_progress_)
return;
+ if (!IsKeyObserved(key))
+ return;
+
observer_->OnPrefChanged(key, value ? value->CreateDeepCopy() : nullptr);
}
@@ -55,11 +61,16 @@ class PersistentPrefStoreImpl::Connection : public mojom::PersistentPrefStore {
void OnConnectionError() { pref_store_->OnConnectionError(this); }
+ bool IsKeyObserved(const std::string& key) {
+ return base::ContainsKey(pref_registry_->registrations, key);
+ }
+
// Owns |this|.
PersistentPrefStoreImpl* pref_store_;
mojo::Binding<mojom::PersistentPrefStore> binding_;
mojom::PrefStoreObserverPtr observer_;
+ mojom::PrefRegistryPtr pref_registry_;
// If true then a write is in progress and any update notifications should be
// ignored, as those updates would originate from ourselves.
@@ -70,11 +81,13 @@ class PersistentPrefStoreImpl::Connection : public mojom::PersistentPrefStore {
PersistentPrefStoreImpl::PersistentPrefStoreImpl(
scoped_refptr<PersistentPrefStore> backing_pref_store,
- mojom::TrackedPreferenceValidationDelegatePtr validation_delegate)
+ mojom::TrackedPreferenceValidationDelegatePtr validation_delegate,
+ base::Closure on_initialized)
: backing_pref_store_(backing_pref_store),
validation_delegate_(std::move(validation_delegate)) {
backing_pref_store_->AddObserver(this);
if (!backing_pref_store_->IsInitializationComplete()) {
+ on_initialized_ = std::move(on_initialized);
initializing_ = true;
backing_pref_store_->ReadPrefsAsync(nullptr);
}
@@ -85,12 +98,28 @@ PersistentPrefStoreImpl::~PersistentPrefStoreImpl() {
}
// mojom::PersistentPrefStoreConnector override:
-void PersistentPrefStoreImpl::Connect(const ConnectCallback& callback) {
- if (initializing_) {
- pending_connect_callbacks_.push_back(callback);
- return;
+mojom::PersistentPrefStoreConnectionPtr PersistentPrefStoreImpl::Connect(
+ mojom::PrefRegistryPtr pref_registry) {
+ DCHECK(!initializing_);
+ if (!backing_pref_store_->IsInitializationComplete()) {
+ return mojom::PersistentPrefStoreConnection::New(
+ nullptr, nullptr, backing_pref_store_->GetReadError(),
+ backing_pref_store_->ReadOnly());
}
- CallConnectCallback(callback);
+ mojom::PersistentPrefStorePtr pref_store_ptr;
+ mojom::PrefStoreObserverPtr observer;
+ mojom::PrefStoreObserverRequest observer_request =
+ mojo::MakeRequest(&observer);
+ auto connection = base::MakeUnique<Connection>(
+ this, mojo::MakeRequest(&pref_store_ptr), std::move(observer),
+ std::move(pref_registry));
+ auto* connection_ptr = connection.get();
+ connections_.insert(std::make_pair(connection_ptr, std::move(connection)));
+ return mojom::PersistentPrefStoreConnection::New(
+ mojom::PrefStoreConnection::New(std::move(observer_request),
+ backing_pref_store_->GetValues(), true),
+ std::move(pref_store_ptr), backing_pref_store_->GetReadError(),
+ backing_pref_store_->ReadOnly());
}
void PersistentPrefStoreImpl::OnPrefValueChanged(const std::string& key) {
@@ -109,32 +138,7 @@ void PersistentPrefStoreImpl::OnPrefValueChanged(const std::string& key) {
void PersistentPrefStoreImpl::OnInitializationCompleted(bool succeeded) {
DCHECK(initializing_);
initializing_ = false;
- for (const auto& callback : pending_connect_callbacks_) {
- CallConnectCallback(callback);
- }
- pending_connect_callbacks_.clear();
-}
-
-void PersistentPrefStoreImpl::CallConnectCallback(
- const mojom::PersistentPrefStoreConnector::ConnectCallback& callback) {
- DCHECK(!initializing_);
- if (!backing_pref_store_->IsInitializationComplete()) {
- callback.Run(backing_pref_store_->GetReadError(),
- backing_pref_store_->ReadOnly(), nullptr, nullptr, nullptr);
- return;
- }
- mojom::PersistentPrefStorePtr pref_store_ptr;
- mojom::PrefStoreObserverPtr observer;
- mojom::PrefStoreObserverRequest observer_request =
- mojo::MakeRequest(&observer);
- auto connection = base::MakeUnique<Connection>(
- this, mojo::MakeRequest(&pref_store_ptr), std::move(observer));
- auto* connection_ptr = connection.get();
- connections_.insert(std::make_pair(connection_ptr, std::move(connection)));
- callback.Run(backing_pref_store_->GetReadError(),
- backing_pref_store_->ReadOnly(),
- backing_pref_store_->GetValues(), std::move(pref_store_ptr),
- std::move(observer_request));
+ base::ResetAndReturn(&on_initialized_).Run();
}
void PersistentPrefStoreImpl::SetValue(const std::string& key,
« no previous file with comments | « services/preferences/persistent_pref_store_impl.h ('k') | services/preferences/persistent_pref_store_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698