OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/permissions/permission_uma_util.h" | 5 #include "chrome/browser/permissions/permission_uma_util.h" |
6 | 6 |
7 #include <utility> | 7 #include <utility> |
8 | 8 |
9 #include "base/command_line.h" | 9 #include "base/command_line.h" |
10 #include "base/metrics/histogram.h" | |
10 #include "base/metrics/histogram_macros.h" | 11 #include "base/metrics/histogram_macros.h" |
11 #include "base/strings/stringprintf.h" | 12 #include "base/strings/stringprintf.h" |
12 #include "chrome/browser/browser_process.h" | 13 #include "chrome/browser/browser_process.h" |
13 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" | 14 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" |
14 #include "chrome/browser/permissions/permission_manager.h" | 15 #include "chrome/browser/permissions/permission_manager.h" |
15 #include "chrome/browser/permissions/permission_request.h" | 16 #include "chrome/browser/permissions/permission_request.h" |
16 #include "chrome/browser/permissions/permission_util.h" | 17 #include "chrome/browser/permissions/permission_util.h" |
17 #include "chrome/browser/profiles/profile.h" | 18 #include "chrome/browser/profiles/profile.h" |
18 #include "chrome/browser/safe_browsing/safe_browsing_service.h" | 19 #include "chrome/browser/safe_browsing/safe_browsing_service.h" |
19 #include "chrome/browser/safe_browsing/ui_manager.h" | 20 #include "chrome/browser/safe_browsing/ui_manager.h" |
(...skipping 161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
181 const char PermissionUmaUtil::kPermissionsPromptShown[] = | 182 const char PermissionUmaUtil::kPermissionsPromptShown[] = |
182 "Permissions.Prompt.Shown"; | 183 "Permissions.Prompt.Shown"; |
183 const char PermissionUmaUtil::kPermissionsPromptShownGesture[] = | 184 const char PermissionUmaUtil::kPermissionsPromptShownGesture[] = |
184 "Permissions.Prompt.Shown.Gesture"; | 185 "Permissions.Prompt.Shown.Gesture"; |
185 const char PermissionUmaUtil::kPermissionsPromptShownNoGesture[] = | 186 const char PermissionUmaUtil::kPermissionsPromptShownNoGesture[] = |
186 "Permissions.Prompt.Shown.NoGesture"; | 187 "Permissions.Prompt.Shown.NoGesture"; |
187 const char PermissionUmaUtil::kPermissionsPromptAccepted[] = | 188 const char PermissionUmaUtil::kPermissionsPromptAccepted[] = |
188 "Permissions.Prompt.Accepted"; | 189 "Permissions.Prompt.Accepted"; |
189 const char PermissionUmaUtil::kPermissionsPromptAcceptedGesture[] = | 190 const char PermissionUmaUtil::kPermissionsPromptAcceptedGesture[] = |
190 "Permissions.Prompt.Accepted.Gesture"; | 191 "Permissions.Prompt.Accepted.Gesture"; |
192 const char | |
193 PermissionUmaUtil::kPermissionsPromptAcceptedPriorDismissCountPrefix[] = | |
194 "Permissions.Prompt.Accepted.PriorDismissCount."; | |
195 const char | |
196 PermissionUmaUtil::kPermissionsPromptAcceptedPriorIgnoreCountPrefix[] = | |
197 "Permissions.Prompt.Accepted.PriorIgnoreCount."; | |
191 const char PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture[] = | 198 const char PermissionUmaUtil::kPermissionsPromptAcceptedNoGesture[] = |
192 "Permissions.Prompt.Accepted.NoGesture"; | 199 "Permissions.Prompt.Accepted.NoGesture"; |
193 const char PermissionUmaUtil::kPermissionsPromptDenied[] = | 200 const char PermissionUmaUtil::kPermissionsPromptDenied[] = |
194 "Permissions.Prompt.Denied"; | 201 "Permissions.Prompt.Denied"; |
195 const char PermissionUmaUtil::kPermissionsPromptDeniedGesture[] = | 202 const char PermissionUmaUtil::kPermissionsPromptDeniedGesture[] = |
196 "Permissions.Prompt.Denied.Gesture"; | 203 "Permissions.Prompt.Denied.Gesture"; |
204 const char | |
205 PermissionUmaUtil::kPermissionsPromptDeniedPriorDismissCountPrefix[] = | |
206 "Permissions.Prompt.Denied.PriorDismissCount."; | |
207 const char | |
208 PermissionUmaUtil::kPermissionsPromptDeniedPriorIgnoreCountPrefix[] = | |
209 "Permissions.Prompt.Denied.PriorIgnoreCount."; | |
197 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] = | 210 const char PermissionUmaUtil::kPermissionsPromptDeniedNoGesture[] = |
198 "Permissions.Prompt.Denied.NoGesture"; | 211 "Permissions.Prompt.Denied.NoGesture"; |
212 const char | |
213 PermissionUmaUtil::kPermissionsPromptDismissedPriorDismissCountPrefix[] = | |
214 "Permissions.Prompt.Dismissed.PriorDismissCount."; | |
215 const char | |
216 PermissionUmaUtil::kPermissionsPromptDismissedPriorIgnoreCountPrefix[] = | |
217 "Permissions.Prompt.Dismissed.PriorIgnoreCount."; | |
218 const char | |
219 PermissionUmaUtil::kPermissionsPromptIgnoredPriorDismissCountPrefix[] = | |
220 "Permissions.Prompt.Ignored.PriorDismissCount."; | |
221 const char | |
222 PermissionUmaUtil::kPermissionsPromptIgnoredPriorIgnoreCountPrefix[] = | |
223 "Permissions.Prompt.Ignored.PriorIgnoreCount."; | |
raymes
2016/08/22 02:55:09
Can we group together the strings related to this
dominickn
2016/08/22 22:40:51
Done.
| |
199 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = | 224 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = |
200 "Permissions.Prompt.RequestsPerPrompt"; | 225 "Permissions.Prompt.RequestsPerPrompt"; |
201 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = | 226 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = |
202 "Permissions.Prompt.MergedBubbleTypes"; | 227 "Permissions.Prompt.MergedBubbleTypes"; |
203 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = | 228 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = |
204 "Permissions.Prompt.MergedBubbleAccepted"; | 229 "Permissions.Prompt.MergedBubbleAccepted"; |
205 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = | 230 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = |
206 "Permissions.Prompt.MergedBubbleDenied"; | 231 "Permissions.Prompt.MergedBubbleDenied"; |
207 | 232 |
208 // Make sure you update histograms.xml permission histogram_suffix if you | 233 // Make sure you update histograms.xml permission histogram_suffix if you |
209 // add new permission | 234 // add new permission |
210 void PermissionUmaUtil::PermissionRequested(PermissionType permission, | 235 void PermissionUmaUtil::PermissionRequested(PermissionType permission, |
211 const GURL& requesting_origin, | 236 const GURL& requesting_origin, |
212 const GURL& embedding_origin, | 237 const GURL& embedding_origin, |
213 Profile* profile) { | 238 Profile* profile) { |
214 RecordPermissionRequest(permission, requesting_origin, embedding_origin, | 239 RecordPermissionRequest(permission, requesting_origin, embedding_origin, |
215 profile); | 240 profile); |
216 } | 241 } |
217 | 242 |
218 void PermissionUmaUtil::PermissionGranted( | 243 void PermissionUmaUtil::PermissionGranted( |
219 PermissionType permission, | 244 PermissionType permission, |
220 PermissionRequestGestureType gesture_type, | 245 PermissionRequestGestureType gesture_type, |
221 const GURL& requesting_origin, | 246 const GURL& requesting_origin, |
222 Profile* profile) { | 247 Profile* profile) { |
223 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT, | 248 RecordPermissionAction(permission, GRANTED, PermissionSourceUI::PROMPT, |
224 gesture_type, requesting_origin, profile); | 249 gesture_type, requesting_origin, profile); |
250 RecordPermissionPromptPriorCount( | |
251 permission, kPermissionsPromptAcceptedPriorDismissCountPrefix, | |
252 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, | |
253 permission, profile)); | |
254 RecordPermissionPromptPriorCount( | |
255 permission, kPermissionsPromptAcceptedPriorIgnoreCountPrefix, | |
256 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, | |
257 permission, profile)); | |
225 } | 258 } |
226 | 259 |
227 void PermissionUmaUtil::PermissionDenied( | 260 void PermissionUmaUtil::PermissionDenied( |
228 PermissionType permission, | 261 PermissionType permission, |
229 PermissionRequestGestureType gesture_type, | 262 PermissionRequestGestureType gesture_type, |
230 const GURL& requesting_origin, | 263 const GURL& requesting_origin, |
231 Profile* profile) { | 264 Profile* profile) { |
232 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT, | 265 RecordPermissionAction(permission, DENIED, PermissionSourceUI::PROMPT, |
233 gesture_type, requesting_origin, profile); | 266 gesture_type, requesting_origin, profile); |
267 RecordPermissionPromptPriorCount( | |
268 permission, kPermissionsPromptDeniedPriorDismissCountPrefix, | |
269 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, | |
270 permission, profile)); | |
271 RecordPermissionPromptPriorCount( | |
272 permission, kPermissionsPromptDeniedPriorIgnoreCountPrefix, | |
273 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, | |
274 permission, profile)); | |
234 } | 275 } |
235 | 276 |
236 void PermissionUmaUtil::PermissionDismissed( | 277 void PermissionUmaUtil::PermissionDismissed( |
237 PermissionType permission, | 278 PermissionType permission, |
238 PermissionRequestGestureType gesture_type, | 279 PermissionRequestGestureType gesture_type, |
239 const GURL& requesting_origin, | 280 const GURL& requesting_origin, |
240 Profile* profile) { | 281 Profile* profile) { |
241 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT, | 282 RecordPermissionAction(permission, DISMISSED, PermissionSourceUI::PROMPT, |
242 gesture_type, requesting_origin, profile); | 283 gesture_type, requesting_origin, profile); |
284 RecordPermissionPromptPriorCount( | |
285 permission, kPermissionsPromptDismissedPriorDismissCountPrefix, | |
286 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, | |
287 permission, profile)); | |
288 RecordPermissionPromptPriorCount( | |
289 permission, kPermissionsPromptDismissedPriorIgnoreCountPrefix, | |
290 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, | |
291 permission, profile)); | |
243 } | 292 } |
244 | 293 |
245 void PermissionUmaUtil::PermissionIgnored( | 294 void PermissionUmaUtil::PermissionIgnored( |
246 PermissionType permission, | 295 PermissionType permission, |
247 PermissionRequestGestureType gesture_type, | 296 PermissionRequestGestureType gesture_type, |
248 const GURL& requesting_origin, | 297 const GURL& requesting_origin, |
249 Profile* profile) { | 298 Profile* profile) { |
250 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT, | 299 RecordPermissionAction(permission, IGNORED, PermissionSourceUI::PROMPT, |
251 gesture_type, requesting_origin, profile); | 300 gesture_type, requesting_origin, profile); |
301 RecordPermissionPromptPriorCount( | |
302 permission, kPermissionsPromptIgnoredPriorDismissCountPrefix, | |
303 PermissionDecisionAutoBlocker::GetDismissCount(requesting_origin, | |
304 permission, profile)); | |
305 RecordPermissionPromptPriorCount( | |
306 permission, kPermissionsPromptIgnoredPriorIgnoreCountPrefix, | |
307 PermissionDecisionAutoBlocker::GetIgnoreCount(requesting_origin, | |
308 permission, profile)); | |
252 } | 309 } |
253 | 310 |
254 void PermissionUmaUtil::PermissionRevoked(PermissionType permission, | 311 void PermissionUmaUtil::PermissionRevoked(PermissionType permission, |
255 PermissionSourceUI source_ui, | 312 PermissionSourceUI source_ui, |
256 const GURL& revoked_origin, | 313 const GURL& revoked_origin, |
257 Profile* profile) { | 314 Profile* profile) { |
258 // TODO(tsergeant): Expand metrics definitions for revocation to include all | 315 // TODO(tsergeant): Expand metrics definitions for revocation to include all |
259 // permissions. | 316 // permissions. |
260 if (permission == PermissionType::NOTIFICATIONS || | 317 if (permission == PermissionType::NOTIFICATIONS || |
261 permission == PermissionType::GEOLOCATION || | 318 permission == PermissionType::GEOLOCATION || |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
347 DCHECK(!requests.empty()); | 404 DCHECK(!requests.empty()); |
348 DCHECK(requests.size() == 1); | 405 DCHECK(requests.size() == 1); |
349 | 406 |
350 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, | 407 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, |
351 requests[0]->GetPermissionRequestType()); | 408 requests[0]->GetPermissionRequestType()); |
352 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( | 409 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
353 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture, | 410 kPermissionsPromptDeniedGesture, kPermissionsPromptDeniedNoGesture, |
354 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType()); | 411 requests[0]->GetGestureType(), requests[0]->GetPermissionRequestType()); |
355 } | 412 } |
356 | 413 |
357 void PermissionUmaUtil::PermissionPromptDismissed( | 414 void PermissionUmaUtil::RecordPermissionPromptPriorCount( |
358 content::PermissionType permission, | 415 content::PermissionType permission, |
416 const std::string& prefix, | |
359 int count) { | 417 int count) { |
360 switch (permission) { | 418 // The user is not prompted for these permissions, thus there is no prompt |
361 case PermissionType::GEOLOCATION: | 419 // event to record a prior count for. |
362 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Geolocation", | 420 DCHECK_NE(PermissionType::MIDI, permission); |
363 count); | 421 DCHECK_NE(PermissionType::BACKGROUND_SYNC, permission); |
364 break; | 422 DCHECK_NE(PermissionType::NUM, permission); |
365 case PermissionType::NOTIFICATIONS: | |
366 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.Notifications", | |
367 count); | |
368 break; | |
369 case PermissionType::MIDI_SYSEX: | |
370 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.MidiSysEx", | |
371 count); | |
372 break; | |
373 case PermissionType::PUSH_MESSAGING: | |
374 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.PushMessaging", | |
375 count); | |
376 break; | |
377 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: | |
378 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.ProtectedMedia", | |
379 count); | |
380 break; | |
381 case PermissionType::DURABLE_STORAGE: | |
382 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.DurableStorage", | |
383 count); | |
384 break; | |
385 case PermissionType::AUDIO_CAPTURE: | |
386 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.AudioCapture", | |
387 count); | |
388 break; | |
389 case PermissionType::VIDEO_CAPTURE: | |
390 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.DismissCount.VideoCapture", | |
391 count); | |
392 break; | |
393 // The user is not prompted for these permissions, thus there is no dismiss | |
394 // recorded for them. | |
395 case PermissionType::MIDI: | |
396 case PermissionType::BACKGROUND_SYNC: | |
397 case PermissionType::NUM: | |
398 NOTREACHED() << "PERMISSION " | |
399 << PermissionUtil::GetPermissionString(permission) | |
400 << " not accounted for"; | |
401 } | |
402 } | |
403 | 423 |
404 void PermissionUmaUtil::PermissionPromptIgnored( | 424 // Expand UMA_HISTOGRAM_COUNTS_100 so that we can use a dynamically suffixed |
405 content::PermissionType permission, | 425 // histogram name. |
406 int count) { | 426 base::Histogram::FactoryGet( |
407 switch (permission) { | 427 prefix + PermissionUtil::GetPermissionString(permission), 1, 100, 50, |
408 case PermissionType::GEOLOCATION: | 428 base::HistogramBase::kUmaTargetedHistogramFlag) |
409 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Geolocation", | 429 ->Add(count); |
410 count); | |
411 break; | |
412 case PermissionType::NOTIFICATIONS: | |
413 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.Notifications", | |
414 count); | |
415 break; | |
416 case PermissionType::MIDI_SYSEX: | |
417 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.MidiSysEx", | |
418 count); | |
419 break; | |
420 case PermissionType::PUSH_MESSAGING: | |
421 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.PushMessaging", | |
422 count); | |
423 break; | |
424 case PermissionType::PROTECTED_MEDIA_IDENTIFIER: | |
425 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.ProtectedMedia", | |
426 count); | |
427 break; | |
428 case PermissionType::DURABLE_STORAGE: | |
429 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.DurableStorage", | |
430 count); | |
431 break; | |
432 case PermissionType::AUDIO_CAPTURE: | |
433 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.AudioCapture", | |
434 count); | |
435 break; | |
436 case PermissionType::VIDEO_CAPTURE: | |
437 UMA_HISTOGRAM_COUNTS_100("Permissions.Prompt.IgnoreCount.VideoCapture", | |
438 count); | |
439 break; | |
440 // The user is not prompted for these permissions, thus there is no | |
441 // ignore recorded for them. | |
442 case PermissionType::MIDI: | |
443 case PermissionType::BACKGROUND_SYNC: | |
444 case PermissionType::NUM: | |
445 NOTREACHED() << "PERMISSION " | |
446 << PermissionUtil::GetPermissionString(permission) | |
447 << " not accounted for"; | |
448 } | |
449 } | 430 } |
450 | 431 |
451 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( | 432 void PermissionUmaUtil::PermissionPromptAcceptedWithPersistenceToggle( |
452 content::PermissionType permission, | 433 content::PermissionType permission, |
453 bool toggle_enabled) { | 434 bool toggle_enabled) { |
454 switch (permission) { | 435 switch (permission) { |
455 case PermissionType::GEOLOCATION: | 436 case PermissionType::GEOLOCATION: |
456 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation", | 437 UMA_HISTOGRAM_BOOLEAN("Permissions.Prompt.Accepted.Persisted.Geolocation", |
457 toggle_enabled); | 438 toggle_enabled); |
458 break; | 439 break; |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
666 if (!deprecated_metric.empty() && rappor_service) { | 647 if (!deprecated_metric.empty() && rappor_service) { |
667 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, | 648 rappor::SampleDomainAndRegistryFromGURL(rappor_service, deprecated_metric, |
668 requesting_origin); | 649 requesting_origin); |
669 | 650 |
670 std::string rappor_metric = deprecated_metric + "2"; | 651 std::string rappor_metric = deprecated_metric + "2"; |
671 rappor_service->RecordSample( | 652 rappor_service->RecordSample( |
672 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, | 653 rappor_metric, rappor::LOW_FREQUENCY_ETLD_PLUS_ONE_RAPPOR_TYPE, |
673 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); | 654 rappor::GetDomainAndRegistrySampleFromGURL(requesting_origin)); |
674 } | 655 } |
675 } | 656 } |
OLD | NEW |