Upstream version 11.40.277.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / content_settings / permission_context_uma_util.cc
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 #include "content/public/browser/permission_type.h"
8 #include "url/gurl.h"
9
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(                                                 \
15         permission,                                                            \
16         action,                                                                \
17         PERMISSION_ACTION_NUM);                                                \
18     if (secure_origin) {                                                       \
19         UMA_HISTOGRAM_ENUMERATION(permission_secure,                           \
20                                   action,                                      \
21                                   PERMISSION_ACTION_NUM);                      \
22     } else {                                                                   \
23         UMA_HISTOGRAM_ENUMERATION(permission_insecure,                         \
24                                   action,                                      \
25                                   PERMISSION_ACTION_NUM);                      \
26     }
27
28
29 namespace {
30
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 {
35   GRANTED = 0,
36   DENIED = 1,
37   DISMISSED = 2,
38   IGNORED = 3,
39
40   // Always keep this at the end.
41   PERMISSION_ACTION_NUM,
42 };
43
44 void RecordPermissionAction(
45       ContentSettingsType permission,
46       PermissionAction action,
47       bool secure_origin) {
48   switch (permission) {
49       case CONTENT_SETTINGS_TYPE_GEOLOCATION:
50         PERMISSION_ACTION_UMA(
51             secure_origin,
52             "ContentSettings.PermissionActions_Geolocation",
53             "ContentSettings.PermissionActionsSecureOrigin_Geolocation",
54             "ContentSettings.PermissionActionsInsecureOrigin_Geolocation",
55             action);
56         break;
57       case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
58         PERMISSION_ACTION_UMA(
59             secure_origin,
60             "ContentSettings.PermissionActions_Notifications",
61             "ContentSettings.PermissionActionsSecureOrigin_Notifications",
62             "ContentSettings.PermissionActionsInsecureOrigin_Notifications",
63             action);
64         break;
65       case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
66         PERMISSION_ACTION_UMA(
67             secure_origin,
68             "ContentSettings.PermissionActions_MidiSysEx",
69             "ContentSettings.PermissionActionsSecureOrigin_MidiSysEx",
70             "ContentSettings.PermissionActionsInsecureOrigin_MidiSysEx",
71             action);
72         break;
73       case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
74         PERMISSION_ACTION_UMA(
75             secure_origin,
76             "ContentSettings.PermissionActions_PushMessaging",
77             "ContentSettings.PermissionActionsSecureOrigin_PushMessaging",
78             "ContentSettings.PermissionActionsInsecureOrigin_PushMessaging",
79             action);
80         break;
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.
85         break;
86 #endif
87       default:
88         NOTREACHED() << "PERMISSION " << permission << " not accounted for";
89     }
90 }
91
92 void RecordPermissionRequest(
93     ContentSettingsType permission, bool secure_origin) {
94   content::PermissionType type;
95   switch (permission) {
96     case CONTENT_SETTINGS_TYPE_GEOLOCATION:
97       type = content::PERMISSION_GEOLOCATION;
98       break;
99     case CONTENT_SETTINGS_TYPE_NOTIFICATIONS:
100       type = content::PERMISSION_NOTIFICATIONS;
101       break;
102     case CONTENT_SETTINGS_TYPE_MIDI_SYSEX:
103       type = content::PERMISSION_MIDI_SYSEX;
104       break;
105     case CONTENT_SETTINGS_TYPE_PUSH_MESSAGING:
106       type = content::PERMISSION_PUSH_MESSAGING;
107       break;
108     default:
109       NOTREACHED() << "PERMISSION " << permission << " not accounted for";
110       return;
111   }
112   UMA_HISTOGRAM_ENUMERATION(
113       "ContentSettings.PermissionRequested", type, content::PERMISSION_NUM);
114   if (secure_origin) {
115     UMA_HISTOGRAM_ENUMERATION(
116         "ContentSettings.PermissionRequested_SecureOrigin",
117         type,
118         content::PERMISSION_NUM);
119   } else {
120     UMA_HISTOGRAM_ENUMERATION(
121         "ContentSettings.PermissionRequested_InsecureOrigin",
122         type,
123         content::PERMISSION_NUM);
124   }
125 }
126
127 } // namespace
128
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());
134 }
135
136 void PermissionContextUmaUtil::PermissionGranted(
137     ContentSettingsType permission, const GURL& requesting_origin) {
138   RecordPermissionAction(permission, GRANTED,
139                          requesting_origin.SchemeIsSecure());
140 }
141
142 void PermissionContextUmaUtil::PermissionDenied(
143     ContentSettingsType permission, const GURL& requesting_origin) {
144   RecordPermissionAction(permission, DENIED,
145                          requesting_origin.SchemeIsSecure());
146 }
147
148 void PermissionContextUmaUtil::PermissionDismissed(
149     ContentSettingsType permission, const GURL& requesting_origin) {
150   RecordPermissionAction(permission, DISMISSED,
151                          requesting_origin.SchemeIsSecure());
152 }
153
154 void PermissionContextUmaUtil::PermissionIgnored(
155     ContentSettingsType permission, const GURL& requesting_origin) {
156   RecordPermissionAction(permission, IGNORED,
157                          requesting_origin.SchemeIsSecure());
158 }