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.
5 #include "base/metrics/histogram.h"
6 #include "chrome/browser/content_settings/permission_context_uma_util.h"
7 #include "content/public/browser/permission_type.h"
10 // UMA keys need to be statically initialized so plain function would not
11 // work. Use a Macro instead.
12 #define PERMISSION_ACTION_UMA(secure_origin, \
13 permission, permission_secure, permission_insecure, action) \
14 UMA_HISTOGRAM_ENUMERATION( \
17 PERMISSION_ACTION_NUM); \
18 if (secure_origin) { \
19 UMA_HISTOGRAM_ENUMERATION(permission_secure, \
21 PERMISSION_ACTION_NUM); \
23 UMA_HISTOGRAM_ENUMERATION(permission_insecure, \
25 PERMISSION_ACTION_NUM); \
31 // Enum for UMA purposes, make sure you update histograms.xml if you add new
32 // permission actions. Never delete or reorder an entry; only add new entries
33 // immediately before PERMISSION_NUM
34 enum PermissionAction {
40 // Always keep this at the end.
41 PERMISSION_ACTION_NUM,
44 void RecordPermissionAction(
45 ContentSettingsType permission,
46 PermissionAction action,
49 case CONTENT_SETTINGS_TYPE_GEOLOCATION:
50 PERMISSION_ACTION_UMA(
52 "ContentSettings.PermissionActions_Geolocation",
53 "ContentSettings.PermissionActionsSecureOrigin_Geolocation",
54 "ContentSettings.PermissionActionsInsecureOrigin_Geolocation",
57 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
58 PERMISSION_ACTION_UMA(
60 "ContentSettings.PermissionActions_Notifications",
61 "ContentSettings.PermissionActionsSecureOrigin_Notifications",
62 "ContentSettings.PermissionActionsInsecureOrigin_Notifications",
65 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
66 PERMISSION_ACTION_UMA(
68 "ContentSettings.PermissionActions_MidiSysEx",
69 "ContentSettings.PermissionActionsSecureOrigin_MidiSysEx",
70 "ContentSettings.PermissionActionsInsecureOrigin_MidiSysEx",
73 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
74 PERMISSION_ACTION_UMA(
76 "ContentSettings.PermissionActions_PushMessaging",
77 "ContentSettings.PermissionActionsSecureOrigin_PushMessaging",
78 "ContentSettings.PermissionActionsInsecureOrigin_PushMessaging",
81 #if defined(OS_ANDROID)
82 case CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER:
83 // TODO(miguelg): support protected media through
84 // the generic permission class.
88 NOTREACHED() << "PERMISSION " << permission << " not accounted for";
92 void RecordPermissionRequest(
93 ContentSettingsType permission, bool secure_origin) {
94 content::PermissionType type;
96 case CONTENT_SETTINGS_TYPE_GEOLOCATION:
97 type = content::PERMISSION_GEOLOCATION;
99 case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
100 type = content::PERMISSION_NOTIFICATIONS;
102 case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
103 type = content::PERMISSION_MIDI_SYSEX;
105 case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
106 type = content::PERMISSION_PUSH_MESSAGING;
109 NOTREACHED() << "PERMISSION " << permission << " not accounted for";
112 UMA_HISTOGRAM_ENUMERATION(
113 "ContentSettings.PermissionRequested", type, content::PERMISSION_NUM);
115 UMA_HISTOGRAM_ENUMERATION(
116 "ContentSettings.PermissionRequested_SecureOrigin",
118 content::PERMISSION_NUM);
120 UMA_HISTOGRAM_ENUMERATION(
121 "ContentSettings.PermissionRequested_InsecureOrigin",
123 content::PERMISSION_NUM);
129 // Make sure you update histograms.xml permission histogram_suffix if you
130 // add new permission
131 void PermissionContextUmaUtil::PermissionRequested(
132 ContentSettingsType permission, const GURL& requesting_origin) {
133 RecordPermissionRequest(permission, requesting_origin.SchemeIsSecure());
136 void PermissionContextUmaUtil::PermissionGranted(
137 ContentSettingsType permission, const GURL& requesting_origin) {
138 RecordPermissionAction(permission, GRANTED,
139 requesting_origin.SchemeIsSecure());
142 void PermissionContextUmaUtil::PermissionDenied(
143 ContentSettingsType permission, const GURL& requesting_origin) {
144 RecordPermissionAction(permission, DENIED,
145 requesting_origin.SchemeIsSecure());
148 void PermissionContextUmaUtil::PermissionDismissed(
149 ContentSettingsType permission, const GURL& requesting_origin) {
150 RecordPermissionAction(permission, DISMISSED,
151 requesting_origin.SchemeIsSecure());
154 void PermissionContextUmaUtil::PermissionIgnored(
155 ContentSettingsType permission, const GURL& requesting_origin) {
156 RecordPermissionAction(permission, IGNORED,
157 requesting_origin.SchemeIsSecure());