Index: services/preferences/public/cpp/pref_store_manager_impl.cc |
diff --git a/services/preferences/public/cpp/pref_store_manager_impl.cc b/services/preferences/public/cpp/pref_store_manager_impl.cc |
index 5a72b2cc0f536ee56498959c6c32dac25085f142..56846c39ca2b6ed880235fb5da690edd39839ecc 100644 |
--- a/services/preferences/public/cpp/pref_store_manager_impl.cc |
+++ b/services/preferences/public/cpp/pref_store_manager_impl.cc |
@@ -4,12 +4,18 @@ |
#include "services/preferences/public/cpp/pref_store_manager_impl.h" |
+#include <utility> |
+ |
#include "base/memory/ref_counted.h" |
+#include "base/threading/sequenced_worker_pool.h" |
#include "components/prefs/pref_value_store.h" |
#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/service_manager/public/cpp/interface_registry.h" |
namespace prefs { |
+namespace { |
using ConnectCallback = mojom::PrefStoreConnector::ConnectCallback; |
using PrefStorePtrs = |
@@ -73,8 +79,14 @@ void ConnectionBarrier::OnConnect( |
} |
} |
-PrefStoreManagerImpl::PrefStoreManagerImpl(PrefStoreTypes expected_pref_stores) |
- : expected_pref_stores_(std::move(expected_pref_stores)) {} |
+} // namespace |
+ |
+PrefStoreManagerImpl::PrefStoreManagerImpl( |
+ PrefStoreTypes expected_pref_stores, |
+ scoped_refptr<base::SequencedWorkerPool> worker_pool) |
+ : expected_pref_stores_(std::move(expected_pref_stores)), |
+ init_binding_(this), |
+ worker_pool_(std::move(worker_pool)) {} |
PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; |
@@ -119,6 +131,44 @@ void PrefStoreManagerImpl::Create( |
registry_bindings_.AddBinding(this, std::move(request)); |
} |
+void PrefStoreManagerImpl::Create( |
+ const service_manager::Identity& remote_identity, |
+ prefs::mojom::PersistentPrefStoreConnectorRequest request) { |
+ if (!persistent_pref_store_) { |
+ pending_persistent_pref_store_requests_.push_back(std::move(request)); |
+ return; |
+ } |
+ persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(), |
+ std::move(request)); |
+} |
+ |
+void PrefStoreManagerImpl::Create( |
+ const service_manager::Identity& remote_identity, |
+ prefs::mojom::PrefServiceControlRequest request) { |
+ if (init_binding_.is_bound()) { |
+ LOG(ERROR) |
+ << "Pref service received unexpected control interface connection from " |
+ << remote_identity.name(); |
+ return; |
+ } |
+ |
+ init_binding_.Bind(std::move(request)); |
+} |
+ |
+void PrefStoreManagerImpl::Init( |
+ mojom::PersistentPrefStoreConfigurationPtr configuration) { |
+ DCHECK(!persistent_pref_store_); |
+ |
+ persistent_pref_store_ = |
+ CreatePersistentPrefStore(std::move(configuration), worker_pool_.get()); |
+ DCHECK(persistent_pref_store_); |
+ for (auto& request : pending_persistent_pref_store_requests_) { |
+ persistent_pref_store_bindings_.AddBinding(persistent_pref_store_.get(), |
+ std::move(request)); |
+ } |
+ pending_persistent_pref_store_requests_.clear(); |
+} |
+ |
void PrefStoreManagerImpl::OnStart() {} |
bool PrefStoreManagerImpl::OnConnect( |
@@ -126,6 +176,8 @@ bool PrefStoreManagerImpl::OnConnect( |
service_manager::InterfaceRegistry* registry) { |
registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); |
registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); |
+ registry->AddInterface<prefs::mojom::PersistentPrefStoreConnector>(this); |
+ registry->AddInterface<prefs::mojom::PrefServiceControl>(this); |
return true; |
} |