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 |