| 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,
|
|
|