1// Copyright (c) 2011 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
5#include "content/renderer/pepper/ppb_uma_private_impl.h"
6
7#include "base/metrics/histogram.h"
8#include "ppapi/c/pp_var.h"
9#include "ppapi/c/private/ppb_uma_private.h"
10#include "ppapi/shared_impl/var.h"
11
12using ppapi::StringVar;
13
14namespace content {
15
16namespace {
17
18#define RETURN_IF_BAD_ARGS(_name, _sample, _min, _max, _bucket_count) \
19  do { \
20    if (_name.type != PP_VARTYPE_STRING || _name.value.as_id == 0) \
21      return; \
22    if (_min >= _max) \
23      return; \
24    if (_bucket_count <= 1) \
25      return; \
26  } while (0)
27
28void HistogramCustomTimes(PP_Var name,
29                          int64_t sample,
30                          int64_t min, int64_t max,
31                          uint32_t bucket_count) {
32  RETURN_IF_BAD_ARGS(name, sample, min, max, bucket_count);
33
34  StringVar* name_string = StringVar::FromPPVar(name);
35  if (name_string == NULL)
36    return;
37  base::HistogramBase* counter =
38      base::Histogram::FactoryTimeGet(
39          name_string->value(),
40          base::TimeDelta::FromMilliseconds(min),
41          base::TimeDelta::FromMilliseconds(max),
42          bucket_count,
43          base::HistogramBase::kUmaTargetedHistogramFlag);
44  counter->AddTime(base::TimeDelta::FromMilliseconds(sample));
45}
46
47void HistogramCustomCounts(PP_Var name,
48                           int32_t sample,
49                           int32_t min, int32_t max,
50                           uint32_t bucket_count) {
51  RETURN_IF_BAD_ARGS(name, sample, min, max, bucket_count);
52
53  StringVar* name_string = StringVar::FromPPVar(name);
54  if (name_string == NULL)
55    return;
56  base::HistogramBase* counter =
57      base::Histogram::FactoryGet(
58          name_string->value(),
59          min,
60          max,
61          bucket_count,
62          base::HistogramBase::kUmaTargetedHistogramFlag);
63  counter->Add(sample);
64}
65
66void HistogramEnumeration(PP_Var name,
67                          int32_t sample,
68                          int32_t boundary_value) {
69  RETURN_IF_BAD_ARGS(name, sample, 1, boundary_value, boundary_value + 1);
70
71  StringVar* name_string = StringVar::FromPPVar(name);
72  if (name_string == NULL)
73    return;
74  base::HistogramBase* counter =
75      base::LinearHistogram::FactoryGet(
76          name_string->value(),
77          1,
78          boundary_value,
79          boundary_value + 1,
80          base::HistogramBase::kUmaTargetedHistogramFlag);
81  counter->Add(sample);
82}
83
84}  // namespace
85
86const PPB_UMA_Private ppb_uma = {
87  &HistogramCustomTimes,
88  &HistogramCustomCounts,
89  &HistogramEnumeration,
90};
91
92// static
93const PPB_UMA_Private* PPB_UMA_Private_Impl::GetInterface() {
94  return &ppb_uma;
95}
96
97}  // namespace content
98