tracked_atomic_preference.cc 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2014 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "services/preferences/tracked/tracked_atomic_preference.h"
  5. #include "base/values.h"
  6. #include "services/preferences/public/mojom/tracked_preference_validation_delegate.mojom.h"
  7. #include "services/preferences/tracked/pref_hash_store_transaction.h"
  8. using ValueState =
  9. prefs::mojom::TrackedPreferenceValidationDelegate::ValueState;
  10. TrackedAtomicPreference::TrackedAtomicPreference(
  11. const std::string& pref_path,
  12. size_t reporting_id,
  13. size_t reporting_ids_count,
  14. prefs::mojom::TrackedPreferenceMetadata::EnforcementLevel enforcement_level,
  15. prefs::mojom::TrackedPreferenceMetadata::ValueType value_type,
  16. prefs::mojom::TrackedPreferenceValidationDelegate* delegate)
  17. : pref_path_(pref_path),
  18. helper_(pref_path,
  19. reporting_id,
  20. reporting_ids_count,
  21. enforcement_level,
  22. value_type),
  23. delegate_(delegate) {}
  24. TrackedPreferenceType TrackedAtomicPreference::GetType() const {
  25. return TrackedPreferenceType::ATOMIC;
  26. }
  27. void TrackedAtomicPreference::OnNewValue(
  28. const base::Value* value,
  29. PrefHashStoreTransaction* transaction) const {
  30. transaction->StoreHash(pref_path_, value);
  31. }
  32. bool TrackedAtomicPreference::EnforceAndReport(
  33. base::DictionaryValue* pref_store_contents,
  34. PrefHashStoreTransaction* transaction,
  35. PrefHashStoreTransaction* external_validation_transaction) const {
  36. const base::Value* value = pref_store_contents->FindPath(pref_path_);
  37. ValueState value_state = transaction->CheckValue(pref_path_, value);
  38. helper_.ReportValidationResult(value_state, transaction->GetStoreUMASuffix());
  39. ValueState external_validation_value_state = ValueState::UNSUPPORTED;
  40. if (external_validation_transaction) {
  41. external_validation_value_state =
  42. external_validation_transaction->CheckValue(pref_path_, value);
  43. helper_.ReportValidationResult(
  44. external_validation_value_state,
  45. external_validation_transaction->GetStoreUMASuffix());
  46. }
  47. if (delegate_) {
  48. delegate_->OnAtomicPreferenceValidation(
  49. pref_path_, value ? absl::make_optional(value->Clone()) : absl::nullopt,
  50. value_state, external_validation_value_state, helper_.IsPersonal());
  51. }
  52. TrackedPreferenceHelper::ResetAction reset_action =
  53. helper_.GetAction(value_state);
  54. helper_.ReportAction(reset_action);
  55. bool was_reset = false;
  56. if (reset_action == TrackedPreferenceHelper::DO_RESET) {
  57. pref_store_contents->RemovePath(pref_path_);
  58. was_reset = true;
  59. }
  60. if (value_state != ValueState::UNCHANGED) {
  61. // Store the hash for the new value (whether it was reset or not).
  62. const base::Value* new_value = pref_store_contents->FindPath(pref_path_);
  63. transaction->StoreHash(pref_path_, new_value);
  64. }
  65. // Update MACs in the external store if there is one and there either was a
  66. // reset or external validation failed.
  67. if (external_validation_transaction &&
  68. (was_reset || external_validation_value_state != ValueState::UNCHANGED)) {
  69. const base::Value* new_value = pref_store_contents->FindPath(pref_path_);
  70. external_validation_transaction->StoreHash(pref_path_, new_value);
  71. }
  72. return was_reset;
  73. }