Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(206)

Side by Side Diff: chrome/browser/permissions/permission_uma_util.cc

Issue 2952003003: Log site engagement scores for permission actions (Closed)
Patch Set: Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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_macros.h" 10 #include "base/metrics/histogram_macros.h"
11 #include "base/strings/stringprintf.h" 11 #include "base/strings/stringprintf.h"
12 #include "base/time/time.h" 12 #include "base/time/time.h"
13 #include "chrome/browser/browser_process.h" 13 #include "chrome/browser/browser_process.h"
14 #include "chrome/browser/engagement/site_engagement_service.h"
14 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" 15 #include "chrome/browser/permissions/permission_decision_auto_blocker.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"
20 #include "chrome/browser/sync/profile_sync_service_factory.h" 21 #include "chrome/browser/sync/profile_sync_service_factory.h"
21 #include "chrome/common/chrome_switches.h" 22 #include "chrome/common/chrome_switches.h"
22 #include "chrome/common/pref_names.h" 23 #include "chrome/common/pref_names.h"
23 #include "components/browser_sync/profile_sync_service.h" 24 #include "components/browser_sync/profile_sync_service.h"
24 #include "components/prefs/pref_service.h" 25 #include "components/prefs/pref_service.h"
25 #include "components/rappor/public/rappor_utils.h" 26 #include "components/rappor/public/rappor_utils.h"
26 #include "components/rappor/rappor_service_impl.h" 27 #include "components/rappor/rappor_service_impl.h"
27 #include "content/public/browser/permission_type.h" 28 #include "content/public/browser/permission_type.h"
29 #include "content/public/browser/web_contents.h"
28 #include "content/public/common/origin_util.h" 30 #include "content/public/common/origin_util.h"
29 #include "url/gurl.h" 31 #include "url/gurl.h"
30 32
31 // UMA keys need to be statically initialized so plain function would not 33 // UMA keys need to be statically initialized so plain function would not
32 // work. Use macros instead. 34 // work. Use macros instead.
33 #define PERMISSION_ACTION_UMA(secure_origin, permission, permission_secure, \ 35 #define PERMISSION_ACTION_UMA(secure_origin, permission, permission_secure, \
34 permission_insecure, action) \ 36 permission_insecure, action) \
35 UMA_HISTOGRAM_ENUMERATION(permission, action, PermissionAction::NUM); \ 37 UMA_HISTOGRAM_ENUMERATION(permission, action, PermissionAction::NUM); \
36 if (secure_origin) { \ 38 if (secure_origin) { \
37 UMA_HISTOGRAM_ENUMERATION(permission_secure, action, \ 39 UMA_HISTOGRAM_ENUMERATION(permission_secure, action, \
(...skipping 17 matching lines...) Expand all
55 PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name, \ 57 PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name, \
56 permission_bubble_type); \ 58 permission_bubble_type); \
57 } 59 }
58 60
59 using content::PermissionType; 61 using content::PermissionType;
60 62
61 namespace { 63 namespace {
62 64
63 static bool gIsFakeOfficialBuildForTest = false; 65 static bool gIsFakeOfficialBuildForTest = false;
64 66
67 std::string GetPermissionRequestString(PermissionRequestType type) {
68 switch (type) {
69 case PermissionRequestType::MULTIPLE:
70 return "AudioAndVideoCapture";
71 case PermissionRequestType::QUOTA:
72 return "Quota";
73 case PermissionRequestType::DOWNLOAD:
74 return "MultipleDownload";
75 case PermissionRequestType::REGISTER_PROTOCOL_HANDLER:
76 return "RegisterProtocolHandler";
77 case PermissionRequestType::PERMISSION_GEOLOCATION:
78 return "Geolocation";
79 case PermissionRequestType::PERMISSION_MIDI_SYSEX:
80 return "MidiSysEx";
81 case PermissionRequestType::PERMISSION_NOTIFICATIONS:
82 return "Notifications";
83 case PermissionRequestType::PERMISSION_PROTECTED_MEDIA_IDENTIFIER:
84 return "ProtectedMediaIdentifier";
85 case PermissionRequestType::PERMISSION_PUSH_MESSAGING:
86 return "PushMessaging";
87 case PermissionRequestType::PERMISSION_FLASH:
88 return "Flash";
89 case PermissionRequestType::PERMISSION_MEDIASTREAM_MIC:
90 return "AudioCapture";
91 case PermissionRequestType::PERMISSION_MEDIASTREAM_CAMERA:
92 return "VideoCapture";
93 default:
94 NOTREACHED();
95 return "";
96 }
97 }
98
99 void RecordEngagementMetric(const std::vector<PermissionRequest*>& requests,
100 const content::WebContents* web_contents,
101 const std::string& action) {
102 PermissionRequestType type = requests[0]->GetPermissionRequestType();
103 if (requests.size() > 1)
104 type = PermissionRequestType::MULTIPLE;
105
106 // This is only hit if kUsePermissionManagerForMediaRequests is off, since it
107 // is now on by default we'll just silenty drop this.
108 if (type == PermissionRequestType::MEDIA_STREAM)
109 return;
110
111 DCHECK(action == "Accepted" || action == "Denied" || action == "Dismissed" ||
112 action == "Ignored");
raymes 2017/07/06 05:03:15 Are we interested in recording the total requests?
Timothy Loh 2017/07/19 06:03:43 I don't think we need to record the total requests
113 std::string name = "Permissions.Engagement." + action + '.' +
114 GetPermissionRequestString(type);
raymes 2017/07/06 05:03:15 Hmm, I think what we're really interested in is wh
Timothy Loh 2017/07/19 06:03:43 At least as far as we only group mic+camera right
raymes 2017/07/20 03:37:13 Ok - if you think so I'm ok. It just seemed simple
115
116 SiteEngagementService* site_engagement_service = SiteEngagementService::Get(
117 Profile::FromBrowserContext(web_contents->GetBrowserContext()));
118 double engagement_score =
119 site_engagement_service->GetScore(requests[0]->GetOrigin());
120
121 // This is manually expanded from the UMA_HISTOGRAM_PERCENTAGE macro as the
122 // macro does not work with a dynamically calculated histogram name.
123
raymes 2017/07/06 05:03:15 nit: no newline needed
Timothy Loh 2017/07/19 06:03:43 Done.
124 base::LinearHistogram::FactoryGet(
125 name, 1, 101, 102, base::HistogramBase::kUmaTargetedHistogramFlag)
126 ->Add(engagement_score);
127 }
128
65 const std::string GetRapporMetric(ContentSettingsType permission, 129 const std::string GetRapporMetric(ContentSettingsType permission,
66 PermissionAction action) { 130 PermissionAction action) {
67 std::string action_str; 131 std::string action_str;
68 switch (action) { 132 switch (action) {
69 case PermissionAction::GRANTED: 133 case PermissionAction::GRANTED:
70 action_str = "Granted"; 134 action_str = "Granted";
71 break; 135 break;
72 case PermissionAction::DENIED: 136 case PermissionAction::DENIED:
73 action_str = "Denied"; 137 action_str = "Denied";
74 break; 138 break;
(...skipping 308 matching lines...) Expand 10 before | Expand all | Expand 10 after
383 447
384 if (requests.size() > 1) { 448 if (requests.size() > 1) {
385 for (const auto* request : requests) { 449 for (const auto* request : requests) {
386 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes, 450 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes,
387 request->GetPermissionRequestType()); 451 request->GetPermissionRequestType());
388 } 452 }
389 } 453 }
390 } 454 }
391 455
392 void PermissionUmaUtil::PermissionPromptAccepted( 456 void PermissionUmaUtil::PermissionPromptAccepted(
393 const std::vector<PermissionRequest*>& requests) { 457 const std::vector<PermissionRequest*>& requests,
458 const content::WebContents* web_contents) {
394 RecordPromptDecided(requests, /*accepted=*/true); 459 RecordPromptDecided(requests, /*accepted=*/true);
460 RecordEngagementMetric(requests, web_contents, "Accepted");
395 } 461 }
396 462
397 void PermissionUmaUtil::PermissionPromptDenied( 463 void PermissionUmaUtil::PermissionPromptDenied(
398 const std::vector<PermissionRequest*>& requests) { 464 const std::vector<PermissionRequest*>& requests,
465 const content::WebContents* web_contents) {
399 RecordPromptDecided(requests, /*accepted=*/false); 466 RecordPromptDecided(requests, /*accepted=*/false);
467 RecordEngagementMetric(requests, web_contents, "Denied");
468 }
469
470 void PermissionUmaUtil::PermissionPromptDismissed(
471 const std::vector<PermissionRequest*>& requests,
472 const content::WebContents* web_contents) {
473 RecordEngagementMetric(requests, web_contents, "Dismissed");
474 }
475
476 void PermissionUmaUtil::PermissionPromptIgnored(
477 const std::vector<PermissionRequest*>& requests,
478 const content::WebContents* web_contents) {
479 RecordEngagementMetric(requests, web_contents, "Ignored");
400 } 480 }
401 481
402 void PermissionUmaUtil::RecordPermissionPromptShown( 482 void PermissionUmaUtil::RecordPermissionPromptShown(
403 PermissionRequestType request_type, 483 PermissionRequestType request_type,
404 PermissionRequestGestureType gesture_type) { 484 PermissionRequestGestureType gesture_type) {
405 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptShown, request_type); 485 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptShown, request_type);
406 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( 486 PERMISSION_BUBBLE_GESTURE_TYPE_UMA(
407 kPermissionsPromptShownGesture, kPermissionsPromptShownNoGesture, 487 kPermissionsPromptShownGesture, kPermissionsPromptShownNoGesture,
408 gesture_type, request_type); 488 gesture_type, request_type);
409 } 489 }
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
706 } 786 }
707 787
708 if (accepted) { 788 if (accepted) {
709 RecordPermissionPromptAccepted(permission_prompt_type, 789 RecordPermissionPromptAccepted(permission_prompt_type,
710 permission_gesture_type); 790 permission_gesture_type);
711 } else { 791 } else {
712 RecordPermissionPromptDenied(permission_prompt_type, 792 RecordPermissionPromptDenied(permission_prompt_type,
713 permission_gesture_type); 793 permission_gesture_type);
714 } 794 }
715 } 795 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698