tracked_preference_helper.cc 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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_preference_helper.h"
  5. #include "base/check.h"
  6. #include "base/metrics/histogram.h"
  7. #include "base/metrics/histogram_macros.h"
  8. #include "base/notreached.h"
  9. #include "base/strings/strcat.h"
  10. #include "services/preferences/public/cpp/tracked/tracked_preference_histogram_names.h"
  11. using ValueState =
  12. prefs::mojom::TrackedPreferenceValidationDelegate::ValueState;
  13. TrackedPreferenceHelper::TrackedPreferenceHelper(
  14. const std::string& pref_path,
  15. size_t reporting_id,
  16. size_t reporting_ids_count,
  17. prefs::mojom::TrackedPreferenceMetadata::EnforcementLevel enforcement_level,
  18. prefs::mojom::TrackedPreferenceMetadata::ValueType value_type)
  19. : pref_path_(pref_path),
  20. reporting_id_(reporting_id),
  21. reporting_ids_count_(reporting_ids_count),
  22. enforce_(enforcement_level == prefs::mojom::TrackedPreferenceMetadata::
  23. EnforcementLevel::ENFORCE_ON_LOAD),
  24. personal_(value_type ==
  25. prefs::mojom::TrackedPreferenceMetadata::ValueType::PERSONAL) {}
  26. TrackedPreferenceHelper::ResetAction TrackedPreferenceHelper::GetAction(
  27. ValueState value_state) const {
  28. switch (value_state) {
  29. case ValueState::UNCHANGED:
  30. // Desired case, nothing to do.
  31. return DONT_RESET;
  32. case ValueState::CLEARED:
  33. // Unfortunate case, but there is nothing we can do.
  34. return DONT_RESET;
  35. case ValueState::TRUSTED_NULL_VALUE: // Falls through.
  36. case ValueState::TRUSTED_UNKNOWN_VALUE:
  37. // It is okay to seed the hash in this case.
  38. return DONT_RESET;
  39. case ValueState::SECURE_LEGACY:
  40. // Accept secure legacy device ID based hashes.
  41. return DONT_RESET;
  42. case ValueState::UNSUPPORTED:
  43. NOTREACHED()
  44. << "GetAction should not be called with an UNSUPPORTED value state";
  45. return DONT_RESET;
  46. case ValueState::UNTRUSTED_UNKNOWN_VALUE: // Falls through.
  47. case ValueState::CHANGED:
  48. return enforce_ ? DO_RESET : WANTED_RESET;
  49. }
  50. NOTREACHED() << "Unexpected ValueState: " << value_state;
  51. return DONT_RESET;
  52. }
  53. bool TrackedPreferenceHelper::IsPersonal() const {
  54. return personal_;
  55. }
  56. void TrackedPreferenceHelper::ReportValidationResult(
  57. ValueState value_state,
  58. base::StringPiece validation_type_suffix) const {
  59. const char* histogram_name = nullptr;
  60. switch (value_state) {
  61. case ValueState::UNCHANGED:
  62. histogram_name = user_prefs::tracked::kTrackedPrefHistogramUnchanged;
  63. break;
  64. case ValueState::CLEARED:
  65. histogram_name = user_prefs::tracked::kTrackedPrefHistogramCleared;
  66. break;
  67. case ValueState::SECURE_LEGACY:
  68. histogram_name =
  69. user_prefs::tracked::kTrackedPrefHistogramMigratedLegacyDeviceId;
  70. break;
  71. case ValueState::CHANGED:
  72. histogram_name = user_prefs::tracked::kTrackedPrefHistogramChanged;
  73. break;
  74. case ValueState::UNTRUSTED_UNKNOWN_VALUE:
  75. histogram_name = user_prefs::tracked::kTrackedPrefHistogramInitialized;
  76. break;
  77. case ValueState::TRUSTED_UNKNOWN_VALUE:
  78. histogram_name =
  79. user_prefs::tracked::kTrackedPrefHistogramTrustedInitialized;
  80. break;
  81. case ValueState::TRUSTED_NULL_VALUE:
  82. histogram_name =
  83. user_prefs::tracked::kTrackedPrefHistogramNullInitialized;
  84. break;
  85. case ValueState::UNSUPPORTED:
  86. NOTREACHED() << "ReportValidationResult should not be called with an "
  87. "UNSUPPORTED value state";
  88. return;
  89. }
  90. DCHECK(histogram_name);
  91. std::string full_histogram_name(histogram_name);
  92. if (!validation_type_suffix.empty()) {
  93. base::StrAppend(&full_histogram_name, {".", validation_type_suffix});
  94. }
  95. // Using FactoryGet to allow dynamic histogram names. This is equivalent to
  96. // UMA_HISTOGRAM_ENUMERATION(name, reporting_id_, reporting_ids_count_);
  97. base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
  98. full_histogram_name, 1, reporting_ids_count_, reporting_ids_count_ + 1,
  99. base::HistogramBase::kUmaTargetedHistogramFlag);
  100. histogram->Add(reporting_id_);
  101. }
  102. void TrackedPreferenceHelper::ReportAction(ResetAction reset_action) const {
  103. switch (reset_action) {
  104. case DONT_RESET:
  105. // No report for DONT_RESET.
  106. break;
  107. case WANTED_RESET:
  108. UMA_HISTOGRAM_EXACT_LINEAR(
  109. user_prefs::tracked::kTrackedPrefHistogramWantedReset, reporting_id_,
  110. reporting_ids_count_);
  111. break;
  112. case DO_RESET:
  113. UMA_HISTOGRAM_EXACT_LINEAR(
  114. user_prefs::tracked::kTrackedPrefHistogramReset, reporting_id_,
  115. reporting_ids_count_);
  116. break;
  117. }
  118. }