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
5#include "ppapi/proxy/uma_private_resource.h"
6
7#include "base/bind.h"
8#include "ppapi/proxy/ppapi_messages.h"
9#include "ppapi/proxy/resource_message_params.h"
10#include "ppapi/shared_impl/var.h"
11
12namespace {
13
14std::string StringFromPPVar(const PP_Var& var) {
15  scoped_refptr<ppapi::StringVar> name_stringvar =
16      ppapi::StringVar::FromPPVar(var);
17  if (!name_stringvar.get())
18    return std::string();
19  return name_stringvar->value();
20}
21
22}
23
24namespace ppapi {
25namespace proxy {
26
27UMAPrivateResource::UMAPrivateResource(
28    Connection connection, PP_Instance instance)
29    : PluginResource(connection, instance) {
30  SendCreate(RENDERER, PpapiHostMsg_UMA_Create());
31}
32
33UMAPrivateResource::~UMAPrivateResource() {
34}
35
36thunk::PPB_UMA_Singleton_API* UMAPrivateResource::AsPPB_UMA_Singleton_API() {
37  return this;
38}
39
40void UMAPrivateResource::HistogramCustomTimes(
41    PP_Instance instance,
42    struct PP_Var name,
43    int64_t sample,
44    int64_t min,
45    int64_t max,
46    uint32_t bucket_count) {
47  if (name.type != PP_VARTYPE_STRING)
48    return;
49
50  Post(RENDERER, PpapiHostMsg_UMA_HistogramCustomTimes(StringFromPPVar(name),
51                                                       sample,
52                                                       min,
53                                                       max,
54                                                       bucket_count));
55}
56
57void UMAPrivateResource::HistogramCustomCounts(
58    PP_Instance instance,
59    struct PP_Var name,
60    int32_t sample,
61    int32_t min,
62    int32_t max,
63    uint32_t bucket_count) {
64  if (name.type != PP_VARTYPE_STRING)
65    return;
66
67  Post(RENDERER, PpapiHostMsg_UMA_HistogramCustomCounts(StringFromPPVar(name),
68                                                        sample,
69                                                        min,
70                                                        max,
71                                                        bucket_count));
72}
73
74void UMAPrivateResource::HistogramEnumeration(
75    PP_Instance instance,
76    struct PP_Var name,
77    int32_t sample,
78    int32_t boundary_value) {
79  if (name.type != PP_VARTYPE_STRING)
80    return;
81
82  Post(RENDERER, PpapiHostMsg_UMA_HistogramEnumeration(StringFromPPVar(name),
83                                                       sample,
84                                                       boundary_value));
85}
86
87int32_t UMAPrivateResource::IsCrashReportingEnabled(
88    PP_Instance instance,
89    scoped_refptr<TrackedCallback> callback) {
90  if (pending_callback_.get() != NULL)
91    return PP_ERROR_INPROGRESS;
92  pending_callback_ = callback;
93  Call<PpapiPluginMsg_UMA_IsCrashReportingEnabledReply>(
94      RENDERER,
95      PpapiHostMsg_UMA_IsCrashReportingEnabled(),
96      base::Bind(&UMAPrivateResource::OnPluginMsgIsCrashReportingEnabled,
97          this));
98  return PP_OK_COMPLETIONPENDING;
99}
100
101void UMAPrivateResource::OnPluginMsgIsCrashReportingEnabled(
102    const ResourceMessageReplyParams& params) {
103  if (TrackedCallback::IsPending(pending_callback_))
104    pending_callback_->Run(params.result());
105  pending_callback_ = NULL;
106}
107
108}  // namespace proxy
109}  // namespace ppapi
110
111