| OLD | NEW |
| 1 // Copyright 2017 The Chromium Authors. All rights reserved. | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "services/preferences/public/cpp/pref_store_manager_impl.h" | 5 #include "services/preferences/public/cpp/pref_store_manager_impl.h" |
| 6 | 6 |
| 7 #include "base/memory/ref_counted.h" | 7 #include "base/memory/ref_counted.h" |
| 8 #include "base/threading/sequenced_worker_pool.h" |
| 8 #include "components/prefs/pref_value_store.h" | 9 #include "components/prefs/pref_value_store.h" |
| 9 #include "mojo/public/cpp/bindings/interface_request.h" | 10 #include "mojo/public/cpp/bindings/interface_request.h" |
| 11 #include "services/preferences/user_prefs.h" |
| 12 #include "services/preferences/user_prefs_factory.h" |
| 10 #include "services/service_manager/public/cpp/interface_registry.h" | 13 #include "services/service_manager/public/cpp/interface_registry.h" |
| 11 | 14 |
| 12 namespace prefs { | 15 namespace prefs { |
| 16 namespace { |
| 13 | 17 |
| 14 using ConnectCallback = mojom::PrefStoreConnector::ConnectCallback; | 18 using ConnectCallback = mojom::PrefStoreConnector::ConnectCallback; |
| 15 using PrefStorePtrs = | 19 using PrefStorePtrs = |
| 16 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>; | 20 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>; |
| 17 | 21 |
| 18 // Used to make sure all pref stores have been registered before replying to any | 22 // Used to make sure all pref stores have been registered before replying to any |
| 19 // Connect calls. | 23 // Connect calls. |
| 20 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> { | 24 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> { |
| 21 public: | 25 public: |
| 22 static void Create(const PrefStorePtrs& pref_store_ptrs, | 26 static void Create(const PrefStorePtrs& pref_store_ptrs, |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 PrefValueStore::PrefStoreType type, | 70 PrefValueStore::PrefStoreType type, |
| 67 mojom::PrefStoreConnectionPtr connection_ptr) { | 71 mojom::PrefStoreConnectionPtr connection_ptr) { |
| 68 connections_.insert(std::make_pair(type, std::move(connection_ptr))); | 72 connections_.insert(std::make_pair(type, std::move(connection_ptr))); |
| 69 if (connections_.size() == expected_connections_) { | 73 if (connections_.size() == expected_connections_) { |
| 70 // After this method exits |this| will get destroyed so it's safe to move | 74 // After this method exits |this| will get destroyed so it's safe to move |
| 71 // out the map. | 75 // out the map. |
| 72 callback_.Run(std::move(connections_)); | 76 callback_.Run(std::move(connections_)); |
| 73 } | 77 } |
| 74 } | 78 } |
| 75 | 79 |
| 76 PrefStoreManagerImpl::PrefStoreManagerImpl(PrefStoreTypes expected_pref_stores) | 80 } // namespace |
| 77 : expected_pref_stores_(std::move(expected_pref_stores)) {} | 81 |
| 82 PrefStoreManagerImpl::PrefStoreManagerImpl( |
| 83 PrefStoreTypes expected_pref_stores, |
| 84 scoped_refptr<base::SequencedWorkerPool> worker_pool) |
| 85 : expected_pref_stores_(std::move(expected_pref_stores)), |
| 86 init_binding_(this), |
| 87 worker_pool_(std::move(worker_pool)) {} |
| 78 | 88 |
| 79 PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; | 89 PrefStoreManagerImpl::~PrefStoreManagerImpl() = default; |
| 80 | 90 |
| 81 void PrefStoreManagerImpl::Register(PrefValueStore::PrefStoreType type, | 91 void PrefStoreManagerImpl::Register(PrefValueStore::PrefStoreType type, |
| 82 mojom::PrefStorePtr pref_store_ptr) { | 92 mojom::PrefStorePtr pref_store_ptr) { |
| 83 if (expected_pref_stores_.count(type) == 0) { | 93 if (expected_pref_stores_.count(type) == 0) { |
| 84 LOG(WARNING) << "Not registering unexpected pref store: " << type; | 94 LOG(WARNING) << "Not registering unexpected pref store: " << type; |
| 85 return; | 95 return; |
| 86 } | 96 } |
| 87 DVLOG(1) << "Registering pref store: " << type; | 97 DVLOG(1) << "Registering pref store: " << type; |
| (...skipping 24 matching lines...) Expand all Loading... |
| 112 prefs::mojom::PrefStoreConnectorRequest request) { | 122 prefs::mojom::PrefStoreConnectorRequest request) { |
| 113 connector_bindings_.AddBinding(this, std::move(request)); | 123 connector_bindings_.AddBinding(this, std::move(request)); |
| 114 } | 124 } |
| 115 | 125 |
| 116 void PrefStoreManagerImpl::Create( | 126 void PrefStoreManagerImpl::Create( |
| 117 const service_manager::Identity& remote_identity, | 127 const service_manager::Identity& remote_identity, |
| 118 prefs::mojom::PrefStoreRegistryRequest request) { | 128 prefs::mojom::PrefStoreRegistryRequest request) { |
| 119 registry_bindings_.AddBinding(this, std::move(request)); | 129 registry_bindings_.AddBinding(this, std::move(request)); |
| 120 } | 130 } |
| 121 | 131 |
| 132 void PrefStoreManagerImpl::Create( |
| 133 const service_manager::Identity& remote_identity, |
| 134 prefs::mojom::PersistentPrefStoreConnectorRequest request) { |
| 135 if (!user_prefs_connector_) { |
| 136 user_prefs_connector_requests_.push_back(std::move(request)); |
| 137 return; |
| 138 } |
| 139 user_prefs_connector_bindings_.AddBinding(user_prefs_connector_.get(), |
| 140 std::move(request)); |
| 141 } |
| 142 |
| 143 void PrefStoreManagerImpl::Create( |
| 144 const service_manager::Identity& remote_identity, |
| 145 prefs::mojom::PersistentPrefStoreInitRequest request) { |
| 146 if (init_binding_.is_bound()) |
| 147 return; |
| 148 |
| 149 init_binding_.Bind(std::move(request)); |
| 150 } |
| 151 |
| 152 void PrefStoreManagerImpl::Init( |
| 153 mojom::UserPrefsConfigurationPtr configuration) { |
| 154 DCHECK(!user_prefs_connector_); |
| 155 |
| 156 user_prefs_connector_ = |
| 157 CreateUserPrefs(std::move(configuration), worker_pool_.get()); |
| 158 DCHECK(user_prefs_connector_); |
| 159 for (auto& request : user_prefs_connector_requests_) { |
| 160 user_prefs_connector_bindings_.AddBinding(user_prefs_connector_.get(), |
| 161 std::move(request)); |
| 162 } |
| 163 user_prefs_connector_requests_.clear(); |
| 164 } |
| 165 |
| 122 void PrefStoreManagerImpl::OnStart() {} | 166 void PrefStoreManagerImpl::OnStart() {} |
| 123 | 167 |
| 124 bool PrefStoreManagerImpl::OnConnect( | 168 bool PrefStoreManagerImpl::OnConnect( |
| 125 const service_manager::ServiceInfo& remote_info, | 169 const service_manager::ServiceInfo& remote_info, |
| 126 service_manager::InterfaceRegistry* registry) { | 170 service_manager::InterfaceRegistry* registry) { |
| 127 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); | 171 registry->AddInterface<prefs::mojom::PrefStoreConnector>(this); |
| 128 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); | 172 registry->AddInterface<prefs::mojom::PrefStoreRegistry>(this); |
| 173 registry->AddInterface<prefs::mojom::PersistentPrefStoreConnector>(this); |
| 174 registry->AddInterface<prefs::mojom::PersistentPrefStoreInit>(this); |
| 129 return true; | 175 return true; |
| 130 } | 176 } |
| 131 | 177 |
| 132 void PrefStoreManagerImpl::OnPrefStoreDisconnect( | 178 void PrefStoreManagerImpl::OnPrefStoreDisconnect( |
| 133 PrefValueStore::PrefStoreType type) { | 179 PrefValueStore::PrefStoreType type) { |
| 134 DVLOG(1) << "Deregistering pref store: " << type; | 180 DVLOG(1) << "Deregistering pref store: " << type; |
| 135 pref_store_ptrs_.erase(type); | 181 pref_store_ptrs_.erase(type); |
| 136 } | 182 } |
| 137 | 183 |
| 138 bool PrefStoreManagerImpl::AllConnected() const { | 184 bool PrefStoreManagerImpl::AllConnected() const { |
| 139 return pref_store_ptrs_.size() == expected_pref_stores_.size(); | 185 return pref_store_ptrs_.size() == expected_pref_stores_.size(); |
| 140 } | 186 } |
| 141 | 187 |
| 142 } // namespace prefs | 188 } // namespace prefs |
| OLD | NEW |