Chromium Code Reviews| Index: chrome/browser/permissions/permission_uma_util.cc |
| diff --git a/chrome/browser/permissions/permission_uma_util.cc b/chrome/browser/permissions/permission_uma_util.cc |
| index 45305b15c1a75ddd61e955a735d4e95ff0861ab9..5744f47eb2561f57fccd405b8d406f298d51b372 100644 |
| --- a/chrome/browser/permissions/permission_uma_util.cc |
| +++ b/chrome/browser/permissions/permission_uma_util.cc |
| @@ -11,6 +11,7 @@ |
| #include "base/strings/stringprintf.h" |
| #include "base/time/time.h" |
| #include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/engagement/site_engagement_service.h" |
| #include "chrome/browser/permissions/permission_decision_auto_blocker.h" |
| #include "chrome/browser/permissions/permission_request.h" |
| #include "chrome/browser/permissions/permission_util.h" |
| @@ -25,6 +26,7 @@ |
| #include "components/rappor/public/rappor_utils.h" |
| #include "components/rappor/rappor_service_impl.h" |
| #include "content/public/browser/permission_type.h" |
| +#include "content/public/browser/web_contents.h" |
| #include "content/public/common/origin_util.h" |
| #include "url/gurl.h" |
| @@ -62,6 +64,68 @@ namespace { |
| static bool gIsFakeOfficialBuildForTest = false; |
| +std::string GetPermissionRequestString(PermissionRequestType type) { |
| + switch (type) { |
| + case PermissionRequestType::MULTIPLE: |
| + return "AudioAndVideoCapture"; |
| + case PermissionRequestType::QUOTA: |
| + return "Quota"; |
| + case PermissionRequestType::DOWNLOAD: |
| + return "MultipleDownload"; |
| + case PermissionRequestType::REGISTER_PROTOCOL_HANDLER: |
| + return "RegisterProtocolHandler"; |
| + case PermissionRequestType::PERMISSION_GEOLOCATION: |
| + return "Geolocation"; |
| + case PermissionRequestType::PERMISSION_MIDI_SYSEX: |
| + return "MidiSysEx"; |
| + case PermissionRequestType::PERMISSION_NOTIFICATIONS: |
| + return "Notifications"; |
| + case PermissionRequestType::PERMISSION_PROTECTED_MEDIA_IDENTIFIER: |
| + return "ProtectedMediaIdentifier"; |
| + case PermissionRequestType::PERMISSION_PUSH_MESSAGING: |
| + return "PushMessaging"; |
| + case PermissionRequestType::PERMISSION_FLASH: |
| + return "Flash"; |
| + case PermissionRequestType::PERMISSION_MEDIASTREAM_MIC: |
| + return "AudioCapture"; |
| + case PermissionRequestType::PERMISSION_MEDIASTREAM_CAMERA: |
| + return "VideoCapture"; |
| + default: |
| + NOTREACHED(); |
| + return ""; |
| + } |
| +} |
| + |
| +void RecordEngagementMetric(const std::vector<PermissionRequest*>& requests, |
| + const content::WebContents* web_contents, |
| + const std::string& action) { |
| + PermissionRequestType type = requests[0]->GetPermissionRequestType(); |
| + if (requests.size() > 1) |
| + type = PermissionRequestType::MULTIPLE; |
| + |
| + // This is only hit if kUsePermissionManagerForMediaRequests is off, since it |
| + // is now on by default we'll just silenty drop this. |
| + if (type == PermissionRequestType::MEDIA_STREAM) |
| + return; |
| + |
| + DCHECK(action == "Accepted" || action == "Denied" || action == "Dismissed" || |
| + 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
|
| + std::string name = "Permissions.Engagement." + action + '.' + |
| + 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
|
| + |
| + SiteEngagementService* site_engagement_service = SiteEngagementService::Get( |
| + Profile::FromBrowserContext(web_contents->GetBrowserContext())); |
| + double engagement_score = |
| + site_engagement_service->GetScore(requests[0]->GetOrigin()); |
| + |
| + // This is manually expanded from the UMA_HISTOGRAM_PERCENTAGE macro as the |
| + // macro does not work with a dynamically calculated histogram name. |
| + |
|
raymes
2017/07/06 05:03:15
nit: no newline needed
Timothy Loh
2017/07/19 06:03:43
Done.
|
| + base::LinearHistogram::FactoryGet( |
| + name, 1, 101, 102, base::HistogramBase::kUmaTargetedHistogramFlag) |
| + ->Add(engagement_score); |
| +} |
| + |
| const std::string GetRapporMetric(ContentSettingsType permission, |
| PermissionAction action) { |
| std::string action_str; |
| @@ -390,13 +454,29 @@ void PermissionUmaUtil::PermissionPromptShown( |
| } |
| void PermissionUmaUtil::PermissionPromptAccepted( |
| - const std::vector<PermissionRequest*>& requests) { |
| + const std::vector<PermissionRequest*>& requests, |
| + const content::WebContents* web_contents) { |
| RecordPromptDecided(requests, /*accepted=*/true); |
| + RecordEngagementMetric(requests, web_contents, "Accepted"); |
| } |
| void PermissionUmaUtil::PermissionPromptDenied( |
| - const std::vector<PermissionRequest*>& requests) { |
| + const std::vector<PermissionRequest*>& requests, |
| + const content::WebContents* web_contents) { |
| RecordPromptDecided(requests, /*accepted=*/false); |
| + RecordEngagementMetric(requests, web_contents, "Denied"); |
| +} |
| + |
| +void PermissionUmaUtil::PermissionPromptDismissed( |
| + const std::vector<PermissionRequest*>& requests, |
| + const content::WebContents* web_contents) { |
| + RecordEngagementMetric(requests, web_contents, "Dismissed"); |
| +} |
| + |
| +void PermissionUmaUtil::PermissionPromptIgnored( |
| + const std::vector<PermissionRequest*>& requests, |
| + const content::WebContents* web_contents) { |
| + RecordEngagementMetric(requests, web_contents, "Ignored"); |
| } |
| void PermissionUmaUtil::RecordPermissionPromptShown( |