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 "base/metrics/histogram.h"
6#include "chrome/browser/content_settings/permission_context_uma_util.h"
7
8namespace {
9
10// Enum for UMA purposes, make sure you update histograms.xml if you add new
11// permission actions. Never delete or reorder an entry; only add new entries
12// immediately before PERMISSION_NUM
13enum PermissionAction {
14  GRANTED = 0,
15  DENIED = 1,
16  DISMISSED = 2,
17  IGNORED = 3,
18
19  // Always keep this at the end.
20  PERMISSION_ACTION_NUM,
21};
22
23// Enum for UMA purposes, make sure you update histograms.xml if you add new
24// permission actions. Never delete or reorder an entry; only add new entries
25// immediately before PERMISSION_NUM
26enum PermissionType {
27  PERMISSION_UNKNOWN = 0,
28  PERMISSION_MIDI_SYSEX = 1,
29  PERMISSION_PUSH_MESSAGING = 2,
30  PERMISSION_NOTIFICATIONS = 3,
31
32  // Always keep this at the end.
33  PERMISSION_NUM,
34};
35
36void RecordPermissionAction(
37      ContentSettingsType permission, PermissionAction action) {
38  switch (permission) {
39      case CONTENT_SETTINGS_TYPE_GEOLOCATION:
40        // TODO(miguelg): support geolocation through
41        // the generic permission class.
42        break;
43      case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
44        UMA_HISTOGRAM_ENUMERATION(
45            "ContentSettings.PermissionActions_Notifications",
46            action,
47            PERMISSION_ACTION_NUM);
48        break;
49      case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
50        UMA_HISTOGRAM_ENUMERATION("ContentSettings.PermissionActions_MidiSysEx",
51                                  action,
52                                  PERMISSION_ACTION_NUM);
53        break;
54      case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
55        UMA_HISTOGRAM_ENUMERATION(
56            "ContentSettings.PermissionActions_PushMessaging",
57            action,
58            PERMISSION_ACTION_NUM);
59        break;
60#if defined(OS_ANDROID)
61      case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
62        // TODO(miguelg): support protected media through
63        // the generic permission class.
64        break;
65#endif
66      default:
67        NOTREACHED() << "PERMISSION " << permission << " not accounted for";
68    }
69}
70
71void RecordPermissionRequest(
72    ContentSettingsType permission) {
73  PermissionType type;
74  switch (permission) {
75    case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
76      type = PERMISSION_NOTIFICATIONS;
77      break;
78    case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
79      type = PERMISSION_MIDI_SYSEX;
80      break;
81    case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
82      type = PERMISSION_PUSH_MESSAGING;
83      break;
84    default:
85      NOTREACHED() << "PERMISSION " << permission << " not accounted for";
86      type = PERMISSION_UNKNOWN;
87  }
88  UMA_HISTOGRAM_ENUMERATION("ContentSettings.PermissionRequested", type,
89                            PERMISSION_NUM);
90}
91
92} // namespace
93
94// Make sure you update histograms.xml permission histogram_suffix if you
95// add new permission
96void PermissionContextUmaUtil::PermissionRequested(
97    ContentSettingsType permission) {
98  RecordPermissionRequest(permission);
99}
100
101void PermissionContextUmaUtil::PermissionGranted(
102    ContentSettingsType permission) {
103  RecordPermissionAction(permission, GRANTED);
104}
105
106void PermissionContextUmaUtil::PermissionDenied(
107    ContentSettingsType permission) {
108  RecordPermissionAction(permission, DENIED);
109}
110
111void PermissionContextUmaUtil::PermissionDismissed(
112    ContentSettingsType permission) {
113  RecordPermissionAction(permission, DISMISSED);
114}
115
116void PermissionContextUmaUtil::PermissionIgnored(
117    ContentSettingsType permission) {
118  RecordPermissionAction(permission, IGNORED);
119}
120