| 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/user_prefs_impl.h" | 5 #include "services/preferences/public/cpp/user_prefs_impl.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <set> | 8 #include <set> |
| 9 #include <utility> | 9 #include <utility> |
| 10 | 10 |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 return std::make_pair( | 127 return std::make_pair( |
| 128 base::MakeUnique<PrefHashStoreImpl>(seed, legacy_device_id, | 128 base::MakeUnique<PrefHashStoreImpl>(seed, legacy_device_id, |
| 129 false /* use_super_mac */), | 129 false /* use_super_mac */), |
| 130 base::MakeUnique<RegistryHashStoreContentsWin>( | 130 base::MakeUnique<RegistryHashStoreContentsWin>( |
| 131 registry_path, prefs_path.DirName().BaseName().LossyDisplayName())); | 131 registry_path, prefs_path.DirName().BaseName().LossyDisplayName())); |
| 132 #else | 132 #else |
| 133 return std::make_pair(nullptr, nullptr); | 133 return std::make_pair(nullptr, nullptr); |
| 134 #endif | 134 #endif |
| 135 } | 135 } |
| 136 | 136 |
| 137 void ForwardToResetOnLoadObserver(mojom::ResetOnLoadObserverPtr observer) { |
| 138 if (observer) |
| 139 observer->OnResetOnLoad(); |
| 140 } |
| 141 |
| 137 class PersistentPrefStoreConnectorImpl | 142 class PersistentPrefStoreConnectorImpl |
| 138 : public mojom::PersistentPrefStoreConnector, | 143 : public mojom::PersistentPrefStoreConnector, |
| 139 public PrefStore::Observer { | 144 public PrefStore::Observer { |
| 140 public: | 145 public: |
| 141 PersistentPrefStoreConnectorImpl( | 146 PersistentPrefStoreConnectorImpl( |
| 142 scoped_refptr<PersistentPrefStore> backing_pref_store, | 147 scoped_refptr<PersistentPrefStore> backing_pref_store, |
| 143 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate) | 148 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate) |
| 144 : backing_pref_store_(backing_pref_store), | 149 : backing_pref_store_(backing_pref_store), |
| 145 validation_delegate_holder_(std::move(validation_delegate)) {} | 150 validation_delegate_holder_(std::move(validation_delegate)) {} |
| 146 | 151 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 167 mojom::PersistentPrefStoreConnectorRequest request) { | 172 mojom::PersistentPrefStoreConnectorRequest request) { |
| 168 mojo::MakeStrongBinding( | 173 mojo::MakeStrongBinding( |
| 169 base::MakeUnique<PersistentPrefStoreConnectorImpl>( | 174 base::MakeUnique<PersistentPrefStoreConnectorImpl>( |
| 170 new JsonPrefStore(pref_filename, io_task_runner, nullptr), nullptr), | 175 new JsonPrefStore(pref_filename, io_task_runner, nullptr), nullptr), |
| 171 std::move(request)); | 176 std::move(request)); |
| 172 } | 177 } |
| 173 | 178 |
| 174 static void CreateSegregatedUserPrefs( | 179 static void CreateSegregatedUserPrefs( |
| 175 const base::FilePath& unprotected_pref_filename, | 180 const base::FilePath& unprotected_pref_filename, |
| 176 const base::FilePath& protected_pref_filename, | 181 const base::FilePath& protected_pref_filename, |
| 177 const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& | 182 std::vector<mojom::TrackedPreferenceMetadataPtr> tracking_configuration, |
| 178 tracking_configuration, | |
| 179 size_t reporting_ids_count, | 183 size_t reporting_ids_count, |
| 180 const std::string& seed, | 184 const std::string& seed, |
| 181 const std::string& legacy_device_id, | 185 const std::string& legacy_device_id, |
| 182 const base::string16& registry_path, | 186 const base::string16& registry_path, |
| 183 mojom::TrackedPreferenceValidationDelegatePtrInfo | 187 mojom::TrackedPreferenceValidationDelegatePtr validation_delegate, |
| 184 validation_delegate_info, | 188 mojom::ResetOnLoadObserverPtr reset_on_load_observer, |
| 185 const base::Closure& on_reset_on_load, | |
| 186 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, | 189 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, |
| 187 mojom::PersistentPrefStoreConnectorRequest request) { | 190 mojom::PersistentPrefStoreConnectorRequest request) { |
| 188 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate_holder( | 191 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate_holder( |
| 189 new ValidationDelegatePtrHolder( | 192 new ValidationDelegatePtrHolder(std::move(validation_delegate))); |
| 190 mojo::MakeProxy(std::move(validation_delegate_info)))); | |
| 191 std::vector<PrefHashFilter::TrackedPreferenceMetadata> | 193 std::vector<PrefHashFilter::TrackedPreferenceMetadata> |
| 192 unprotected_configuration; | 194 unprotected_configuration; |
| 193 std::vector<PrefHashFilter::TrackedPreferenceMetadata> | 195 std::vector<PrefHashFilter::TrackedPreferenceMetadata> |
| 194 protected_configuration; | 196 protected_configuration; |
| 195 std::set<std::string> protected_pref_names; | 197 std::set<std::string> protected_pref_names; |
| 196 std::set<std::string> unprotected_pref_names; | 198 std::set<std::string> unprotected_pref_names; |
| 197 for (const auto& metadata : tracking_configuration) { | 199 for (const auto& metadata : tracking_configuration) { |
| 198 if (metadata.enforcement_level > PrefHashFilter::NO_ENFORCEMENT) { | 200 PrefHashFilter::TrackedPreferenceMetadata metadata_view = { |
| 199 protected_configuration.push_back(metadata); | 201 metadata->reporting_id, metadata->name.c_str(), |
| 200 protected_pref_names.insert(metadata.name); | 202 metadata->enforcement_level, metadata->strategy, |
| 203 metadata->value_type, |
| 204 }; |
| 205 if (metadata->enforcement_level > |
| 206 mojom::TrackedPreferenceMetadata::EnforcementLevel::NO_ENFORCEMENT) { |
| 207 protected_configuration.push_back(metadata_view); |
| 208 protected_pref_names.insert(metadata->name); |
| 201 } else { | 209 } else { |
| 202 unprotected_configuration.push_back(metadata); | 210 unprotected_configuration.push_back(metadata_view); |
| 203 unprotected_pref_names.insert(metadata.name); | 211 unprotected_pref_names.insert(metadata->name); |
| 204 } | 212 } |
| 205 } | 213 } |
| 206 | 214 |
| 207 std::unique_ptr<PrefHashFilter> unprotected_pref_hash_filter( | 215 std::unique_ptr<PrefHashFilter> unprotected_pref_hash_filter( |
| 208 new PrefHashFilter(CreatePrefHashStore(seed, legacy_device_id, false), | 216 new PrefHashFilter(CreatePrefHashStore(seed, legacy_device_id, false), |
| 209 GetExternalVerificationPrefHashStorePair( | 217 GetExternalVerificationPrefHashStorePair( |
| 210 seed, legacy_device_id, registry_path, | 218 seed, legacy_device_id, registry_path, |
| 211 unprotected_pref_filename), | 219 unprotected_pref_filename), |
| 212 unprotected_configuration, base::Closure(), | 220 unprotected_configuration, base::Closure(), |
| 213 validation_delegate_holder->get(), | 221 validation_delegate_holder->get(), |
| 214 reporting_ids_count, false)); | 222 reporting_ids_count, false)); |
| 215 std::unique_ptr<PrefHashFilter> protected_pref_hash_filter( | 223 std::unique_ptr<PrefHashFilter> protected_pref_hash_filter( |
| 216 new PrefHashFilter(CreatePrefHashStore(seed, legacy_device_id, true), | 224 new PrefHashFilter(CreatePrefHashStore(seed, legacy_device_id, true), |
| 217 GetExternalVerificationPrefHashStorePair( | 225 GetExternalVerificationPrefHashStorePair( |
| 218 seed, legacy_device_id, registry_path, | 226 seed, legacy_device_id, registry_path, |
| 219 unprotected_pref_filename), | 227 unprotected_pref_filename), |
| 220 protected_configuration, on_reset_on_load, | 228 protected_configuration, |
| 229 base::Bind(&ForwardToResetOnLoadObserver, |
| 230 base::Passed(&reset_on_load_observer)), |
| 221 validation_delegate_holder->get(), | 231 validation_delegate_holder->get(), |
| 222 reporting_ids_count, true)); | 232 reporting_ids_count, true)); |
| 223 | 233 |
| 224 PrefHashFilter* raw_unprotected_pref_hash_filter = | 234 PrefHashFilter* raw_unprotected_pref_hash_filter = |
| 225 unprotected_pref_hash_filter.get(); | 235 unprotected_pref_hash_filter.get(); |
| 226 PrefHashFilter* raw_protected_pref_hash_filter = | 236 PrefHashFilter* raw_protected_pref_hash_filter = |
| 227 protected_pref_hash_filter.get(); | 237 protected_pref_hash_filter.get(); |
| 228 | 238 |
| 229 scoped_refptr<JsonPrefStore> unprotected_pref_store( | 239 scoped_refptr<JsonPrefStore> unprotected_pref_store( |
| 230 new JsonPrefStore(unprotected_pref_filename, io_task_runner.get(), | 240 new JsonPrefStore(unprotected_pref_filename, io_task_runner.get(), |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 267 | 277 |
| 268 scoped_refptr<PersistentPrefStore> backing_pref_store_; | 278 scoped_refptr<PersistentPrefStore> backing_pref_store_; |
| 269 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate_holder_; | 279 scoped_refptr<ValidationDelegatePtrHolder> validation_delegate_holder_; |
| 270 | 280 |
| 271 bool loading_ = false; | 281 bool loading_ = false; |
| 272 std::vector<ConnectCallback> connect_callbacks_; | 282 std::vector<ConnectCallback> connect_callbacks_; |
| 273 | 283 |
| 274 DISALLOW_COPY_AND_ASSIGN(PersistentPrefStoreConnectorImpl); | 284 DISALLOW_COPY_AND_ASSIGN(PersistentPrefStoreConnectorImpl); |
| 275 }; | 285 }; |
| 276 | 286 |
| 287 class UserPrefsPrefService : public mojom::PersistentPrefStoreInit { |
| 288 public: |
| 289 UserPrefsPrefService( |
| 290 scoped_refptr<base::SequencedTaskRunner> io_task_runner, |
| 291 mojom::PersistentPrefStoreConnectorRequest connector_request) |
| 292 : io_task_runner_(std::move(io_task_runner)), |
| 293 connector_request_(std::move(connector_request)) {} |
| 294 |
| 295 void Init(mojom::UserPrefsConfigurationPtr configuration) override { |
| 296 if (configuration->is_simple_configuration()) { |
| 297 auto& simple_configuration = configuration->get_simple_configuration(); |
| 298 PersistentPrefStoreConnectorImpl::CreateUserPrefs( |
| 299 simple_configuration->pref_filename, io_task_runner_, |
| 300 std::move(connector_request_)); |
| 301 return; |
| 302 } |
| 303 if (configuration->is_segregated_configuration()) { |
| 304 auto& segregated_configuration = |
| 305 configuration->get_segregated_configuration(); |
| 306 PersistentPrefStoreConnectorImpl::CreateSegregatedUserPrefs( |
| 307 segregated_configuration->unprotected_pref_filename, |
| 308 segregated_configuration->protected_pref_filename, |
| 309 std::move(segregated_configuration->tracking_configuration), |
| 310 segregated_configuration->reporting_ids_count, |
| 311 segregated_configuration->seed, |
| 312 segregated_configuration->legacy_device_id, |
| 313 segregated_configuration->registry_path, |
| 314 std::move(segregated_configuration->validation_delegate), |
| 315 std::move(segregated_configuration->reset_on_load_observer), |
| 316 io_task_runner_, std::move(connector_request_)); |
| 317 return; |
| 318 } |
| 319 NOTREACHED(); |
| 320 } |
| 321 |
| 322 private: |
| 323 scoped_refptr<base::SequencedTaskRunner> io_task_runner_; |
| 324 mojom::PersistentPrefStoreConnectorRequest connector_request_; |
| 325 }; |
| 326 |
| 327 std::vector<mojom::TrackedPreferenceMetadataPtr> WrapTrackedPreferenceMetadata( |
| 328 const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& input) { |
| 329 std::vector<mojom::TrackedPreferenceMetadataPtr> output; |
| 330 for (const auto& metadata : input) { |
| 331 output.emplace_back(base::in_place, metadata.reporting_id, metadata.name, |
| 332 metadata.enforcement_level, metadata.strategy, |
| 333 metadata.value_type); |
| 334 } |
| 335 return output; |
| 336 } |
| 337 |
| 338 // Simulates connecting to the pref service. |
| 339 // TODO(sammc): Replace with connecting to the real pref service. |
| 340 void ConnectToFakePrefService( |
| 341 const scoped_refptr<base::SingleThreadTaskRunner>& connection_task_runner, |
| 342 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, |
| 343 mojom::PersistentPrefStoreInitRequest init_request, |
| 344 mojom::PersistentPrefStoreConnectorRequest connector_request) { |
| 345 if (!connection_task_runner->RunsTasksOnCurrentThread()) { |
| 346 connection_task_runner->PostTask( |
| 347 FROM_HERE, base::Bind(&ConnectToFakePrefService, connection_task_runner, |
| 348 io_task_runner, base::Passed(&init_request), |
| 349 base::Passed(&connector_request))); |
| 350 return; |
| 351 } |
| 352 mojo::MakeStrongBinding(base::MakeUnique<UserPrefsPrefService>( |
| 353 io_task_runner, std::move(connector_request)), |
| 354 std::move(init_request)); |
| 355 } |
| 356 |
| 277 } // namespace | 357 } // namespace |
| 278 | 358 |
| 279 void CreateUserPrefs( | 359 void CreateUserPrefs( |
| 280 const base::FilePath& pref_filename, | 360 const base::FilePath& pref_filename, |
| 281 const scoped_refptr<base::SingleThreadTaskRunner>& connection_task_runner, | 361 const scoped_refptr<base::SingleThreadTaskRunner>& connection_task_runner, |
| 282 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, | 362 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, |
| 283 mojom::PersistentPrefStoreConnectorRequest request) { | 363 mojom::PersistentPrefStoreConnectorRequest request) { |
| 284 connection_task_runner->PostTask( | 364 mojom::PersistentPrefStoreInitPtr init_ptr; |
| 285 FROM_HERE, | 365 ConnectToFakePrefService(connection_task_runner, io_task_runner, |
| 286 base::Bind(&PersistentPrefStoreConnectorImpl::CreateUserPrefs, | 366 mojo::MakeRequest(&init_ptr), std::move(request)); |
| 287 pref_filename, io_task_runner, base::Passed(&request))); | 367 auto config = mojom::UserPrefsConfiguration::New(); |
| 368 config->set_simple_configuration( |
| 369 mojom::SimpleUserPrefsConfiguration::New(pref_filename)); |
| 370 init_ptr->Init(std::move(config)); |
| 288 } | 371 } |
| 289 | 372 |
| 290 void CreateSegregatedUserPrefs( | 373 void CreateSegregatedUserPrefs( |
| 291 const base::FilePath& unprotected_pref_filename, | 374 const base::FilePath& unprotected_pref_filename, |
| 292 const base::FilePath& protected_pref_filename, | 375 const base::FilePath& protected_pref_filename, |
| 293 const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& | 376 const std::vector<PrefHashFilter::TrackedPreferenceMetadata>& |
| 294 tracking_configuration, | 377 tracking_configuration, |
| 295 size_t reporting_ids_count, | 378 size_t reporting_ids_count, |
| 296 const std::string& seed, | 379 const std::string& seed, |
| 297 const std::string& legacy_device_id, | 380 const std::string& legacy_device_id, |
| 298 const base::string16& registry_path, | 381 const base::string16& registry_path, |
| 299 mojom::TrackedPreferenceValidationDelegatePtr validation_delegate, | 382 mojom::TrackedPreferenceValidationDelegatePtr validation_delegate, |
| 300 const base::Closure& on_reset_on_load, | 383 mojom::ResetOnLoadObserverPtr reset_on_load_observer, |
| 301 const scoped_refptr<base::SingleThreadTaskRunner>& connection_task_runner, | 384 const scoped_refptr<base::SingleThreadTaskRunner>& connection_task_runner, |
| 302 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, | 385 const scoped_refptr<base::SequencedTaskRunner>& io_task_runner, |
| 303 mojom::PersistentPrefStoreConnectorRequest request) { | 386 mojom::PersistentPrefStoreConnectorRequest request) { |
| 304 connection_task_runner->PostTask( | 387 mojom::PersistentPrefStoreInitPtr init_ptr; |
| 305 FROM_HERE, | 388 ConnectToFakePrefService(connection_task_runner, io_task_runner, |
| 306 base::Bind(&PersistentPrefStoreConnectorImpl::CreateSegregatedUserPrefs, | 389 mojo::MakeRequest(&init_ptr), std::move(request)); |
| 307 unprotected_pref_filename, protected_pref_filename, | 390 auto config = mojom::UserPrefsConfiguration::New(); |
| 308 tracking_configuration, reporting_ids_count, seed, | 391 config->set_segregated_configuration( |
| 309 legacy_device_id, registry_path, | 392 mojom::SegregatedUserPrefsConfiguration::New( |
| 310 base::Passed(validation_delegate.PassInterface()), | 393 unprotected_pref_filename, protected_pref_filename, |
| 311 on_reset_on_load, io_task_runner, base::Passed(&request))); | 394 WrapTrackedPreferenceMetadata(tracking_configuration), |
| 395 reporting_ids_count, seed, legacy_device_id, registry_path, |
| 396 std::move(validation_delegate), std::move(reset_on_load_observer))); |
| 397 init_ptr->Init(std::move(config)); |
| 312 } | 398 } |
| 313 | 399 |
| 314 } // namespace prefs | 400 } // namespace prefs |
| OLD | NEW |