Chromium Code Reviews| Index: services/preferences/pref_store_manager_impl.cc |
| diff --git a/services/preferences/pref_store_manager_impl.cc b/services/preferences/pref_store_manager_impl.cc |
| index 32dbf4c1b0a789e742bba2cb80f4ab0a271fd98d..7e8dcbc543f106a778cd04d5a3e200eba224bae1 100644 |
| --- a/services/preferences/pref_store_manager_impl.cc |
| +++ b/services/preferences/pref_store_manager_impl.cc |
| @@ -15,6 +15,7 @@ |
| #include "mojo/public/cpp/bindings/interface_request.h" |
| #include "services/preferences/persistent_pref_store_factory.h" |
| #include "services/preferences/persistent_pref_store_impl.h" |
| +#include "services/preferences/public/cpp/pref_store_client.h" |
| #include "services/preferences/public/cpp/pref_store_impl.h" |
| #include "services/service_manager/public/cpp/bind_source_info.h" |
| @@ -121,9 +122,13 @@ PrefStoreManagerImpl::PrefStoreManagerImpl( |
| base::ContainsValue(expected_pref_stores_, PrefValueStore::DEFAULT_STORE)) |
| << "expected_pref_stores must always include PrefValueStore::USER_STORE " |
| "and PrefValueStore::DEFAULT_STORE."; |
| - // The user store is not actually connected to in the implementation, but |
| - // accessed directly. |
| + // The user store is not actually registered or connected to in the |
| + // implementation, but accessed directly. |
| expected_pref_stores_.erase(PrefValueStore::USER_STORE); |
| + DVLOG(1) << "Expecting " << expected_pref_stores_.size() |
| + << " pref store(s) to register"; |
| + // This store is done in-process so it's already "registered": |
|
Sam McNally
2017/05/10 01:22:16
in-service
|
| + DVLOG(1) << "Registering pref store: " << PrefValueStore::DEFAULT_STORE; |
| registry_.AddInterface<prefs::mojom::PrefStoreConnector>( |
| base::Bind(&PrefStoreManagerImpl::BindPrefStoreConnectorRequest, |
| base::Unretained(this))); |
| @@ -135,7 +140,10 @@ PrefStoreManagerImpl::PrefStoreManagerImpl( |
| base::Unretained(this))); |
| } |
| -PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; |
| +PrefStoreManagerImpl::~PrefStoreManagerImpl() { |
| + // For logging consistency: |
| + DVLOG(1) << "Deregistering pref store: " << PrefValueStore::DEFAULT_STORE; |
| +} |
| struct PrefStoreManagerImpl::PendingConnect { |
| mojom::PrefRegistryPtr pref_registry; |
| @@ -169,6 +177,15 @@ void PrefStoreManagerImpl::Connect( |
| mojom::PrefRegistryPtr pref_registry, |
| const std::vector<PrefValueStore::PrefStoreType>& already_connected_types, |
| const ConnectCallback& callback) { |
| + DVLOG(1) << "Will connect to " |
| + << expected_pref_stores_.size() - already_connected_types.size() |
| + << " pref store(s)"; |
| + if (incognito_connector_ && |
| + !base::ContainsValue(already_connected_types, |
| + PrefValueStore::INCOGNITO_STORE)) { |
| + incognito_connector_->ConnectToUserPrefStore( |
|
Sam McNally
2017/05/10 01:22:16
Move this to Init() and remove |incognito_connecto
|
| + mojo::MakeRequest(&pref_store_ptrs_[PrefValueStore::INCOGNITO_STORE])); |
| + } |
| if (AllConnected()) { |
| ConnectImpl(std::move(pref_registry), already_connected_types, callback); |
| } else { |
| @@ -177,6 +194,13 @@ void PrefStoreManagerImpl::Connect( |
| } |
| } |
| +void PrefStoreManagerImpl::ConnectToUserPrefStore( |
| + mojom::PrefStoreRequest request) { |
| + pending_ro_persistent_pref_store_requests_.push_back(std::move(request)); |
| + if (AllConnected()) |
| + ProcessPendingConnects(); |
| +} |
| + |
| void PrefStoreManagerImpl::BindPrefStoreConnectorRequest( |
| const service_manager::BindSourceInfo& source_info, |
| prefs::mojom::PrefStoreConnectorRequest request) { |
| @@ -206,6 +230,13 @@ void PrefStoreManagerImpl::Init( |
| mojom::PersistentPrefStoreConfigurationPtr configuration) { |
| DCHECK(!persistent_pref_store_); |
| + if (configuration->is_incognito_configuration()) { |
| + DCHECK(expected_pref_stores_.count(PrefValueStore::INCOGNITO_STORE)) |
| + << "expected_pref_stores must include PrefValueStore::INCOGNITO_STORE " |
| + << "when creating an incognito instance"; |
| + incognito_connector_ = |
| + std::move(configuration->get_incognito_configuration()->connector); |
| + } |
| persistent_pref_store_ = CreatePersistentPrefStore( |
| std::move(configuration), worker_pool_.get(), |
| base::Bind(&PrefStoreManagerImpl::OnPersistentPrefStoreReady, |
| @@ -232,21 +263,28 @@ void PrefStoreManagerImpl::OnPrefStoreDisconnect( |
| } |
| bool PrefStoreManagerImpl::AllConnected() const { |
| + DCHECK_LE(pref_store_ptrs_.size(), expected_pref_stores_.size()); |
| return pref_store_ptrs_.size() == expected_pref_stores_.size() && |
| persistent_pref_store_ && persistent_pref_store_->initialized(); |
| } |
| void PrefStoreManagerImpl::ProcessPendingConnects() { |
| + DCHECK(persistent_pref_store_); |
| for (auto& connect : pending_connects_) |
| ConnectImpl(std::move(connect.pref_registry), |
| connect.already_connected_types, connect.callback); |
| pending_connects_.clear(); |
| + ro_persistent_pref_store_bindings_.reset( |
| + new mojo::BindingSet<mojom::PrefStore>()); |
| + for (auto& request : pending_ro_persistent_pref_store_requests_) { |
| + ro_persistent_pref_store_bindings_->AddBinding(persistent_pref_store_.get(), |
| + std::move(request)); |
| + } |
| + pending_ro_persistent_pref_store_requests_.clear(); |
| } |
| -void PrefStoreManagerImpl::ConnectImpl( |
| - mojom::PrefRegistryPtr pref_registry, |
| - const std::vector<PrefValueStore::PrefStoreType>& already_connected_types, |
| - const ConnectCallback& callback) { |
| +std::vector<std::string> PrefStoreManagerImpl::RegisterPrefs( |
| + mojom::PrefRegistryPtr pref_registry) { |
| std::vector<std::string> observed_prefs; |
| for (auto& registration : pref_registry->registrations) { |
| observed_prefs.push_back(registration.first); |
| @@ -260,7 +298,15 @@ void PrefStoreManagerImpl::ConnectImpl( |
| else |
| defaults_->SetDefaultValue(key, std::move(default_value)); |
| } |
| + return observed_prefs; |
| +} |
| +void PrefStoreManagerImpl::ConnectImpl( |
| + mojom::PrefRegistryPtr pref_registry, |
| + const std::vector<PrefValueStore::PrefStoreType>& already_connected_types, |
| + const ConnectCallback& callback) { |
| + std::vector<std::string> observed_prefs = |
| + RegisterPrefs(std::move(pref_registry)); |
| // Only connect to pref stores the client isn't already connected to. |
| PrefStorePtrs ptrs; |
| for (const auto& entry : pref_store_ptrs_) { |