summaryrefslogtreecommitdiff
path: root/chromium/components/user_prefs/tracked/tracked_preference_helper.cc
blob: fb36a2a1518f409b6b6f4b386b8a7aabb7eac340 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "components/user_prefs/tracked/tracked_preference_helper.h"

#include "base/logging.h"
#include "base/metrics/histogram.h"
#include "base/metrics/histogram_macros.h"
#include "components/user_prefs/tracked/tracked_preference_histogram_names.h"

TrackedPreferenceHelper::TrackedPreferenceHelper(
    const std::string& pref_path,
    size_t reporting_id,
    size_t reporting_ids_count,
    PrefHashFilter::EnforcementLevel enforcement_level,
    PrefHashFilter::ValueType value_type)
    : pref_path_(pref_path),
      reporting_id_(reporting_id),
      reporting_ids_count_(reporting_ids_count),
      enforce_(enforcement_level == PrefHashFilter::ENFORCE_ON_LOAD),
      personal_(value_type == PrefHashFilter::VALUE_PERSONAL) {
}

TrackedPreferenceHelper::ResetAction TrackedPreferenceHelper::GetAction(
    PrefHashStoreTransaction::ValueState value_state) const {
  switch (value_state) {
    case PrefHashStoreTransaction::UNCHANGED:
      // Desired case, nothing to do.
      return DONT_RESET;
    case PrefHashStoreTransaction::CLEARED:
      // Unfortunate case, but there is nothing we can do.
      return DONT_RESET;
    case PrefHashStoreTransaction::TRUSTED_NULL_VALUE:  // Falls through.
    case PrefHashStoreTransaction::TRUSTED_UNKNOWN_VALUE:
      // It is okay to seed the hash in this case.
      return DONT_RESET;
    case PrefHashStoreTransaction::SECURE_LEGACY:
      // Accept secure legacy device ID based hashes.
      return DONT_RESET;
    case PrefHashStoreTransaction::UNSUPPORTED:
      NOTREACHED()
          << "GetAction should not be called with an UNSUPPORTED value state";
      return DONT_RESET;
    case PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE:  // Falls through.
    case PrefHashStoreTransaction::CHANGED:
      return enforce_ ? DO_RESET : WANTED_RESET;
  }
  NOTREACHED() << "Unexpected PrefHashStoreTransaction::ValueState: "
               << value_state;
  return DONT_RESET;
}

bool TrackedPreferenceHelper::IsPersonal() const {
  return personal_;
}

void TrackedPreferenceHelper::ReportValidationResult(
    PrefHashStoreTransaction::ValueState value_state,
    base::StringPiece validation_type_suffix) const {
  const char* histogram_name = nullptr;
  switch (value_state) {
    case PrefHashStoreTransaction::UNCHANGED:
      histogram_name = user_prefs::tracked::kTrackedPrefHistogramUnchanged;
      break;
    case PrefHashStoreTransaction::CLEARED:
      histogram_name = user_prefs::tracked::kTrackedPrefHistogramCleared;
      break;
    case PrefHashStoreTransaction::SECURE_LEGACY:
      histogram_name =
          user_prefs::tracked::kTrackedPrefHistogramMigratedLegacyDeviceId;
      break;
    case PrefHashStoreTransaction::CHANGED:
      histogram_name = user_prefs::tracked::kTrackedPrefHistogramChanged;
      break;
    case PrefHashStoreTransaction::UNTRUSTED_UNKNOWN_VALUE:
      histogram_name = user_prefs::tracked::kTrackedPrefHistogramInitialized;
      break;
    case PrefHashStoreTransaction::TRUSTED_UNKNOWN_VALUE:
      histogram_name =
          user_prefs::tracked::kTrackedPrefHistogramTrustedInitialized;
      break;
    case PrefHashStoreTransaction::TRUSTED_NULL_VALUE:
      histogram_name =
          user_prefs::tracked::kTrackedPrefHistogramNullInitialized;
      break;
    case PrefHashStoreTransaction::UNSUPPORTED:
      NOTREACHED() << "ReportValidationResult should not be called with an "
                      "UNSUPPORTED value state";
      return;
  }
  DCHECK(histogram_name);

  std::string full_histogram_name(histogram_name);
  if (!validation_type_suffix.empty()) {
    full_histogram_name.push_back('.');
    validation_type_suffix.AppendToString(&full_histogram_name);
  }

  // Using FactoryGet to allow dynamic histogram names. This is equivalent to
  // UMA_HISTOGRAM_ENUMERATION(name, reporting_id_, reporting_ids_count_);
  base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
      full_histogram_name, 1, reporting_ids_count_, reporting_ids_count_ + 1,
      base::HistogramBase::kUmaTargetedHistogramFlag);
  histogram->Add(reporting_id_);
}

void TrackedPreferenceHelper::ReportAction(ResetAction reset_action) const {
  switch (reset_action) {
    case DONT_RESET:
      // No report for DONT_RESET.
      break;
    case WANTED_RESET:
      UMA_HISTOGRAM_ENUMERATION(
          user_prefs::tracked::kTrackedPrefHistogramWantedReset, reporting_id_,
          reporting_ids_count_);
      break;
    case DO_RESET:
      UMA_HISTOGRAM_ENUMERATION(user_prefs::tracked::kTrackedPrefHistogramReset,
                                reporting_id_, reporting_ids_count_);
      break;
  }
}

void TrackedPreferenceHelper::ReportSplitPreferenceChangedCount(
    size_t count) const {
  // The histogram below is an expansion of the UMA_HISTOGRAM_COUNTS_100 macro
  // adapted to allow for a dynamically suffixed histogram name.
  // Note: The factory creates and owns the histogram.
  base::HistogramBase* histogram = base::LinearHistogram::FactoryGet(
      user_prefs::tracked::kTrackedSplitPrefHistogramChanged + pref_path_, 1,
      100,  // Allow counts up to 100.
      101, base::HistogramBase::kUmaTargetedHistogramFlag);
  histogram->Add(count);
}