Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(42)

Side by Side Diff: services/preferences/pref_store_manager_impl.cc

Issue 2778643002: Pref service: Filter updates from read-only pref stores. (Closed)
Patch Set: Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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/pref_store_manager_impl.h" 5 #include "services/preferences/pref_store_manager_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/memory/ref_counted.h" 9 #include "base/memory/ref_counted.h"
10 #include "base/threading/sequenced_worker_pool.h" 10 #include "base/threading/sequenced_worker_pool.h"
(...skipping 12 matching lines...) Expand all
23 using PrefStorePtrs = 23 using PrefStorePtrs =
24 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>; 24 std::unordered_map<PrefValueStore::PrefStoreType, mojom::PrefStorePtr>;
25 25
26 // Used to make sure all pref stores have been registered before replying to any 26 // Used to make sure all pref stores have been registered before replying to any
27 // Connect calls. 27 // Connect calls.
28 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> { 28 class ConnectionBarrier : public base::RefCounted<ConnectionBarrier> {
29 public: 29 public:
30 static void Create( 30 static void Create(
31 const PrefStorePtrs& pref_store_ptrs, 31 const PrefStorePtrs& pref_store_ptrs,
32 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection, 32 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
33 const std::vector<std::string>& observed_prefs,
33 const ConnectCallback& callback); 34 const ConnectCallback& callback);
34 35
35 void Init(const PrefStorePtrs& pref_store_ptrs); 36 void Init(const PrefStorePtrs& pref_store_ptrs,
37 const std::vector<std::string>& observed_prefs);
36 38
37 private: 39 private:
38 friend class base::RefCounted<ConnectionBarrier>; 40 friend class base::RefCounted<ConnectionBarrier>;
39 ConnectionBarrier( 41 ConnectionBarrier(
40 const PrefStorePtrs& pref_store_ptrs, 42 const PrefStorePtrs& pref_store_ptrs,
41 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection, 43 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
42 const ConnectCallback& callback); 44 const ConnectCallback& callback);
43 ~ConnectionBarrier() = default; 45 ~ConnectionBarrier() = default;
44 46
45 void OnConnect(PrefValueStore::PrefStoreType type, 47 void OnConnect(PrefValueStore::PrefStoreType type,
46 mojom::PrefStoreConnectionPtr connection_ptr); 48 mojom::PrefStoreConnectionPtr connection_ptr);
47 49
48 ConnectCallback callback_; 50 ConnectCallback callback_;
49 51
50 std::unordered_map<PrefValueStore::PrefStoreType, 52 std::unordered_map<PrefValueStore::PrefStoreType,
51 mojom::PrefStoreConnectionPtr> 53 mojom::PrefStoreConnectionPtr>
52 connections_; 54 connections_;
53 55
54 const size_t expected_connections_; 56 const size_t expected_connections_;
55 57
56 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection_; 58 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection_;
57 59
58 DISALLOW_COPY_AND_ASSIGN(ConnectionBarrier); 60 DISALLOW_COPY_AND_ASSIGN(ConnectionBarrier);
59 }; 61 };
60 62
61 // static 63 // static
62 void ConnectionBarrier::Create( 64 void ConnectionBarrier::Create(
63 const PrefStorePtrs& pref_store_ptrs, 65 const PrefStorePtrs& pref_store_ptrs,
64 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection, 66 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
67 const std::vector<std::string>& observed_prefs,
65 const ConnectCallback& callback) { 68 const ConnectCallback& callback) {
66 make_scoped_refptr(new ConnectionBarrier( 69 make_scoped_refptr(new ConnectionBarrier(
67 pref_store_ptrs, 70 pref_store_ptrs,
68 std::move(persistent_pref_store_connection), callback)) 71 std::move(persistent_pref_store_connection), callback))
69 ->Init(pref_store_ptrs); 72 ->Init(pref_store_ptrs, observed_prefs);
70 } 73 }
71 74
72 void ConnectionBarrier::Init(const PrefStorePtrs& pref_store_ptrs) { 75 void ConnectionBarrier::Init(const PrefStorePtrs& pref_store_ptrs,
76 const std::vector<std::string>& observed_prefs) {
73 for (const auto& ptr : pref_store_ptrs) { 77 for (const auto& ptr : pref_store_ptrs) {
74 ptr.second->AddObserver( 78 ptr.second->AddObserver(
79 observed_prefs,
75 base::Bind(&ConnectionBarrier::OnConnect, this, ptr.first)); 80 base::Bind(&ConnectionBarrier::OnConnect, this, ptr.first));
76 } 81 }
77 } 82 }
78 83
79 ConnectionBarrier::ConnectionBarrier( 84 ConnectionBarrier::ConnectionBarrier(
80 const PrefStorePtrs& pref_store_ptrs, 85 const PrefStorePtrs& pref_store_ptrs,
81 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection, 86 mojom::PersistentPrefStoreConnectionPtr persistent_pref_store_connection,
82 const ConnectCallback& callback) 87 const ConnectCallback& callback)
83 : callback_(callback), 88 : callback_(callback),
84 expected_connections_(pref_store_ptrs.size()), 89 expected_connections_(pref_store_ptrs.size()),
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 210 }
206 211
207 void PrefStoreManagerImpl::ProcessPendingConnects() { 212 void PrefStoreManagerImpl::ProcessPendingConnects() {
208 for (auto& connect : pending_connects_) 213 for (auto& connect : pending_connects_)
209 ConnectImpl(std::move(connect.second), connect.first); 214 ConnectImpl(std::move(connect.second), connect.first);
210 pending_connects_.clear(); 215 pending_connects_.clear();
211 } 216 }
212 217
213 void PrefStoreManagerImpl::ConnectImpl(mojom::PrefRegistryPtr pref_registry, 218 void PrefStoreManagerImpl::ConnectImpl(mojom::PrefRegistryPtr pref_registry,
214 const ConnectCallback& callback) { 219 const ConnectCallback& callback) {
215 PersistentPrefStoreImpl::ObservedPrefs observed_prefs; 220 std::vector<std::string> observed_prefs;
216 for (auto& registration : pref_registry->registrations) { 221 for (auto& registration : pref_registry->registrations) {
217 observed_prefs.insert(registration.first); 222 observed_prefs.push_back(registration.first);
218 const auto& key = registration.first; 223 const auto& key = registration.first;
219 auto& default_value = registration.second->default_value; 224 auto& default_value = registration.second->default_value;
220 const base::Value* old_default = nullptr; 225 const base::Value* old_default = nullptr;
221 // TODO(sammc): Once non-owning registrations are supported, disallow 226 // TODO(sammc): Once non-owning registrations are supported, disallow
222 // multiple owners instead of just checking for consistent defaults. 227 // multiple owners instead of just checking for consistent defaults.
223 if (defaults_->GetValue(key, &old_default)) 228 if (defaults_->GetValue(key, &old_default))
224 DCHECK(old_default->Equals(default_value.get())); 229 DCHECK(old_default->Equals(default_value.get()));
225 else 230 else
226 defaults_->SetDefaultValue(key, std::move(default_value)); 231 defaults_->SetDefaultValue(key, std::move(default_value));
227 } 232 }
228 ConnectionBarrier::Create( 233 ConnectionBarrier::Create(
229 pref_store_ptrs_, 234 pref_store_ptrs_,
230 persistent_pref_store_->CreateConnection(std::move(observed_prefs)), 235 persistent_pref_store_->CreateConnection(
231 callback); 236 PersistentPrefStoreImpl::ObservedPrefs(observed_prefs.begin(),
237 observed_prefs.end())),
238 observed_prefs, callback);
232 } 239 }
233 240
234 void PrefStoreManagerImpl::OnPersistentPrefStoreReady() { 241 void PrefStoreManagerImpl::OnPersistentPrefStoreReady() {
235 DVLOG(1) << "PersistentPrefStore ready"; 242 DVLOG(1) << "PersistentPrefStore ready";
236 if (AllConnected()) { 243 if (AllConnected()) {
237 ProcessPendingConnects(); 244 ProcessPendingConnects();
238 } 245 }
239 } 246 }
240 247
241 } // namespace prefs 248 } // namespace prefs
OLDNEW
« no previous file with comments | « services/preferences/pref_service_factory_unittest.cc ('k') | services/preferences/public/cpp/pref_store_client_mixin.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698