Home | History | Annotate | Download | only in pepper
      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 
     12 using ppapi::StringVar;
     13 
     14 namespace content {
     15 
     16 namespace {
     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 
     28 void 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 
     47 void 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 
     66 void 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 
     86 const PPB_UMA_Private ppb_uma = {
     87   &HistogramCustomTimes,
     88   &HistogramCustomCounts,
     89   &HistogramEnumeration,
     90 };
     91 
     92 // static
     93 const PPB_UMA_Private* PPB_UMA_Private_Impl::GetInterface() {
     94   return &ppb_uma;
     95 }
     96 
     97 }  // namespace content
     98