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
|
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "chrome/browser/ui/webui/metrics_handler.h"
#include "base/functional/bind.h"
#include "base/functional/callback_helpers.h"
#include "base/metrics/histogram_functions.h"
#include "base/metrics/histogram_macros.h"
#include "base/metrics/user_metrics.h"
#include "base/notreached.h"
#include "base/values.h"
#include "build/build_config.h"
#include "chrome/browser/ui/tab_contents/core_tab_helper.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_ui.h"
MetricsHandler::MetricsHandler() = default;
MetricsHandler::~MetricsHandler() = default;
void MetricsHandler::RegisterMessages() {
web_ui()->RegisterMessageCallback(
"metricsHandler:recordAction",
base::BindRepeating(&MetricsHandler::HandleRecordAction,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"metricsHandler:recordInHistogram",
base::BindRepeating(&MetricsHandler::HandleRecordInHistogram,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"metricsHandler:recordBooleanHistogram",
base::BindRepeating(&MetricsHandler::HandleRecordBooleanHistogram,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"metricsHandler:recordTime",
base::BindRepeating(&MetricsHandler::HandleRecordTime,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"metricsHandler:recordMediumTime",
base::BindRepeating(&MetricsHandler::HandleRecordMediumTime,
base::Unretained(this)));
web_ui()->RegisterMessageCallback(
"metricsHandler:recordSparseHistogram",
base::BindRepeating(&MetricsHandler::HandleRecordSparseHistogram,
base::Unretained(this)));
}
void MetricsHandler::HandleRecordAction(const base::Value::List& args) {
CHECK_EQ(1U, args.size());
std::string string_action = args[0].GetString();
base::RecordComputedAction(string_action);
}
void MetricsHandler::HandleRecordInHistogram(const base::Value::List& args) {
const std::string& histogram_name = args[0].GetString();
int int_value = static_cast<int>(args[1].GetDouble());
int int_boundary_value = static_cast<int>(args[2].GetDouble());
DCHECK_GE(int_value, 0);
DCHECK_LE(int_value, int_boundary_value);
DCHECK_LT(int_boundary_value, 4000);
int bucket_count = int_boundary_value;
while (bucket_count >= 100) {
bucket_count /= 10;
}
// As |histogram_name| may change between calls, the UMA_HISTOGRAM_ENUMERATION
// macro cannot be used here.
base::HistogramBase* counter = base::LinearHistogram::FactoryGet(
histogram_name, 1, int_boundary_value, bucket_count + 1,
base::HistogramBase::kUmaTargetedHistogramFlag);
counter->Add(int_value);
}
void MetricsHandler::HandleRecordBooleanHistogram(
const base::Value::List& args) {
if (args.size() < 2 || !args[0].is_string() || !args[1].is_bool()) {
NOTREACHED();
}
const std::string histogram_name = args[0].GetString();
const bool value = args[1].GetBool();
base::HistogramBase* counter = base::BooleanHistogram::FactoryGet(
histogram_name, base::HistogramBase::kUmaTargetedHistogramFlag);
counter->AddBoolean(value);
}
void MetricsHandler::HandleRecordTime(const base::Value::List& args) {
const std::string& histogram_name = args[0].GetString();
double value = args[1].GetDouble();
DCHECK_GE(value, 0);
base::TimeDelta time_value = base::Milliseconds(value);
base::HistogramBase* counter = base::Histogram::FactoryTimeGet(
histogram_name, base::Milliseconds(1), base::Seconds(10), 50,
base::HistogramBase::kUmaTargetedHistogramFlag);
counter->AddTime(time_value);
}
void MetricsHandler::HandleRecordMediumTime(const base::Value::List& args) {
const std::string& histogram_name = args[0].GetString();
double value = args[1].GetDouble();
DCHECK_GE(value, 0);
base::UmaHistogramMediumTimes(histogram_name, base::Milliseconds(value));
}
void MetricsHandler::HandleRecordSparseHistogram(
const base::Value::List& args) {
const std::string& histogram_name = args[0].GetString();
int sample = args[1].GetInt();
base::UmaHistogramSparse(histogram_name, sample);
}
|