| 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/metrics/histogram_macros.h" | 9 #include "base/metrics/histogram_macros.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| (...skipping 14 matching lines...) Expand all Loading... |
| 25 permission_insecure, action) \ | 25 permission_insecure, action) \ |
| 26 UMA_HISTOGRAM_ENUMERATION(permission, action, PERMISSION_ACTION_NUM); \ | 26 UMA_HISTOGRAM_ENUMERATION(permission, action, PERMISSION_ACTION_NUM); \ |
| 27 if (secure_origin) { \ | 27 if (secure_origin) { \ |
| 28 UMA_HISTOGRAM_ENUMERATION(permission_secure, action, \ | 28 UMA_HISTOGRAM_ENUMERATION(permission_secure, action, \ |
| 29 PERMISSION_ACTION_NUM); \ | 29 PERMISSION_ACTION_NUM); \ |
| 30 } else { \ | 30 } else { \ |
| 31 UMA_HISTOGRAM_ENUMERATION(permission_insecure, action, \ | 31 UMA_HISTOGRAM_ENUMERATION(permission_insecure, action, \ |
| 32 PERMISSION_ACTION_NUM); \ | 32 PERMISSION_ACTION_NUM); \ |
| 33 } | 33 } |
| 34 | 34 |
| 35 #define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type) \ | 35 #define PERMISSION_BUBBLE_TYPE_UMA(metric_name, permission_bubble_type) \ |
| 36 UMA_HISTOGRAM_ENUMERATION( \ | 36 UMA_HISTOGRAM_ENUMERATION( \ |
| 37 metric_name, \ | 37 metric_name, \ |
| 38 static_cast<base::HistogramBase::Sample>(permission_bubble_type), \ | 38 static_cast<base::HistogramBase::Sample>(permission_bubble_type), \ |
| 39 static_cast<base::HistogramBase::Sample>(PermissionBubbleType::NUM)) | 39 static_cast<base::HistogramBase::Sample>(PermissionBubbleType::NUM)) |
| 40 |
| 41 #define PERMISSION_BUBBLE_GESTURE_TYPE_UMA(gesture_metric_name, \ |
| 42 no_gesture_metric_name, \ |
| 43 gesture_type, \ |
| 44 permission_bubble_type) \ |
| 45 if (gesture_type == PermissionBubbleGestureType::GESTURE) { \ |
| 46 PERMISSION_BUBBLE_TYPE_UMA(gesture_metric_name, permission_bubble_type); \ |
| 47 } else if (gesture_type == PermissionBubbleGestureType::NO_GESTURE) { \ |
| 48 PERMISSION_BUBBLE_TYPE_UMA(no_gesture_metric_name, \ |
| 49 permission_bubble_type); \ |
| 50 } |
| 40 | 51 |
| 41 using content::PermissionType; | 52 using content::PermissionType; |
| 42 | 53 |
| 43 namespace { | 54 namespace { |
| 44 | 55 |
| 45 const std::string GetRapporMetric(PermissionType permission, | 56 const std::string GetRapporMetric(PermissionType permission, |
| 46 PermissionAction action) { | 57 PermissionAction action) { |
| 47 std::string action_str; | 58 std::string action_str; |
| 48 switch (action) { | 59 switch (action) { |
| 49 case GRANTED: | 60 case GRANTED: |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 } | 264 } |
| 254 | 265 |
| 255 } // anonymous namespace | 266 } // anonymous namespace |
| 256 | 267 |
| 257 const char PermissionUmaUtil::kPermissionsPromptShown[] = | 268 const char PermissionUmaUtil::kPermissionsPromptShown[] = |
| 258 "Permissions.Prompt.Shown"; | 269 "Permissions.Prompt.Shown"; |
| 259 const char PermissionUmaUtil::kPermissionsPromptAccepted[] = | 270 const char PermissionUmaUtil::kPermissionsPromptAccepted[] = |
| 260 "Permissions.Prompt.Accepted"; | 271 "Permissions.Prompt.Accepted"; |
| 261 const char PermissionUmaUtil::kPermissionsPromptDenied[] = | 272 const char PermissionUmaUtil::kPermissionsPromptDenied[] = |
| 262 "Permissions.Prompt.Denied"; | 273 "Permissions.Prompt.Denied"; |
| 274 const char PermissionUmaUtil::kPermissionsPromptGestureShown[] = |
| 275 "Permissions.Prompt.Gesture.Shown"; |
| 276 const char PermissionUmaUtil::kPermissionsPromptGestureAccepted[] = |
| 277 "Permissions.Prompt.Gesture.Accepted"; |
| 278 const char PermissionUmaUtil::kPermissionsPromptGestureDenied[] = |
| 279 "Permissions.Prompt.Gesture.Denied"; |
| 280 const char PermissionUmaUtil::kPermissionsPromptNoGestureShown[] = |
| 281 "Permissions.Prompt.NoGesture.Shown"; |
| 282 const char PermissionUmaUtil::kPermissionsPromptNoGestureAccepted[] = |
| 283 "Permissions.Prompt.NoGesture.Accepted"; |
| 284 const char PermissionUmaUtil::kPermissionsPromptNoGestureDenied[] = |
| 285 "Permissions.Prompt.NoGesture.Denied"; |
| 263 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = | 286 const char PermissionUmaUtil::kPermissionsPromptRequestsPerPrompt[] = |
| 264 "Permissions.Prompt.RequestsPerPrompt"; | 287 "Permissions.Prompt.RequestsPerPrompt"; |
| 265 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = | 288 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleTypes[] = |
| 266 "Permissions.Prompt.MergedBubbleTypes"; | 289 "Permissions.Prompt.MergedBubbleTypes"; |
| 267 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = | 290 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleAccepted[] = |
| 268 "Permissions.Prompt.MergedBubbleAccepted"; | 291 "Permissions.Prompt.MergedBubbleAccepted"; |
| 269 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = | 292 const char PermissionUmaUtil::kPermissionsPromptMergedBubbleDenied[] = |
| 270 "Permissions.Prompt.MergedBubbleDenied"; | 293 "Permissions.Prompt.MergedBubbleDenied"; |
| 271 | 294 |
| 272 // Make sure you update histograms.xml permission histogram_suffix if you | 295 // Make sure you update histograms.xml permission histogram_suffix if you |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 permission == PermissionType::VIDEO_CAPTURE) { | 332 permission == PermissionType::VIDEO_CAPTURE) { |
| 310 RecordPermissionAction(permission, REVOKED, revoked_origin); | 333 RecordPermissionAction(permission, REVOKED, revoked_origin); |
| 311 } | 334 } |
| 312 } | 335 } |
| 313 | 336 |
| 314 void PermissionUmaUtil::PermissionPromptShown( | 337 void PermissionUmaUtil::PermissionPromptShown( |
| 315 const std::vector<PermissionBubbleRequest*>& requests) { | 338 const std::vector<PermissionBubbleRequest*>& requests) { |
| 316 DCHECK(!requests.empty()); | 339 DCHECK(!requests.empty()); |
| 317 | 340 |
| 318 PermissionBubbleType permission_prompt_type = PermissionBubbleType::MULTIPLE; | 341 PermissionBubbleType permission_prompt_type = PermissionBubbleType::MULTIPLE; |
| 319 if (requests.size() == 1) | 342 PermissionBubbleGestureType permission_gesture_type = |
| 343 PermissionBubbleGestureType::UNKNOWN; |
| 344 if (requests.size() == 1) { |
| 320 permission_prompt_type = requests[0]->GetPermissionBubbleType(); | 345 permission_prompt_type = requests[0]->GetPermissionBubbleType(); |
| 346 permission_gesture_type = requests[0]->GetGestureType(); |
| 347 } |
| 348 |
| 321 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptShown, permission_prompt_type); | 349 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptShown, permission_prompt_type); |
| 350 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
| 351 kPermissionsPromptGestureShown, kPermissionsPromptNoGestureShown, |
| 352 permission_gesture_type, permission_prompt_type); |
| 322 | 353 |
| 323 UMA_HISTOGRAM_ENUMERATION( | 354 UMA_HISTOGRAM_ENUMERATION( |
| 324 kPermissionsPromptRequestsPerPrompt, | 355 kPermissionsPromptRequestsPerPrompt, |
| 325 static_cast<base::HistogramBase::Sample>(requests.size()), | 356 static_cast<base::HistogramBase::Sample>(requests.size()), |
| 326 static_cast<base::HistogramBase::Sample>(10)); | 357 static_cast<base::HistogramBase::Sample>(10)); |
| 327 | 358 |
| 328 if (requests.size() > 1) { | 359 if (requests.size() > 1) { |
| 329 for (const auto* request : requests) { | 360 for (const auto* request : requests) { |
| 330 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes, | 361 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleTypes, |
| 331 request->GetPermissionBubbleType()); | 362 request->GetPermissionBubbleType()); |
| 332 } | 363 } |
| 333 } | 364 } |
| 334 } | 365 } |
| 335 | 366 |
| 336 void PermissionUmaUtil::PermissionPromptAccepted( | 367 void PermissionUmaUtil::PermissionPromptAccepted( |
| 337 const std::vector<PermissionBubbleRequest*>& requests, | 368 const std::vector<PermissionBubbleRequest*>& requests, |
| 338 const std::vector<bool>& accept_states) { | 369 const std::vector<bool>& accept_states) { |
| 339 DCHECK(!requests.empty()); | 370 DCHECK(!requests.empty()); |
| 340 DCHECK(requests.size() == accept_states.size()); | 371 DCHECK(requests.size() == accept_states.size()); |
| 341 | 372 |
| 342 bool all_accepted = accept_states[0]; | 373 bool all_accepted = accept_states[0]; |
| 343 PermissionBubbleType permission_prompt_type = | 374 PermissionBubbleType permission_prompt_type = |
| 344 requests[0]->GetPermissionBubbleType(); | 375 requests[0]->GetPermissionBubbleType(); |
| 376 PermissionBubbleGestureType permission_gesture_type = |
| 377 requests[0]->GetGestureType(); |
| 345 if (requests.size() > 1) { | 378 if (requests.size() > 1) { |
| 346 permission_prompt_type = PermissionBubbleType::MULTIPLE; | 379 permission_prompt_type = PermissionBubbleType::MULTIPLE; |
| 380 permission_gesture_type = PermissionBubbleGestureType::UNKNOWN; |
| 347 for (size_t i = 0; i < requests.size(); ++i) { | 381 for (size_t i = 0; i < requests.size(); ++i) { |
| 348 const auto* request = requests[i]; | 382 const auto* request = requests[i]; |
| 349 if (accept_states[i]) { | 383 if (accept_states[i]) { |
| 350 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleAccepted, | 384 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleAccepted, |
| 351 request->GetPermissionBubbleType()); | 385 request->GetPermissionBubbleType()); |
| 352 } else { | 386 } else { |
| 353 all_accepted = false; | 387 all_accepted = false; |
| 354 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleDenied, | 388 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptMergedBubbleDenied, |
| 355 request->GetPermissionBubbleType()); | 389 request->GetPermissionBubbleType()); |
| 356 } | 390 } |
| 357 } | 391 } |
| 358 } | 392 } |
| 359 | 393 |
| 360 if (all_accepted) { | 394 if (all_accepted) { |
| 361 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptAccepted, | 395 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptAccepted, |
| 362 permission_prompt_type); | 396 permission_prompt_type); |
| 397 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
| 398 kPermissionsPromptGestureAccepted, kPermissionsPromptNoGestureAccepted, |
| 399 permission_gesture_type, permission_prompt_type); |
| 363 } else { | 400 } else { |
| 364 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, | 401 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, |
| 365 permission_prompt_type); | 402 permission_prompt_type); |
| 403 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
| 404 kPermissionsPromptGestureDenied, kPermissionsPromptNoGestureDenied, |
| 405 permission_gesture_type, permission_prompt_type); |
| 366 } | 406 } |
| 367 } | 407 } |
| 368 | 408 |
| 369 void PermissionUmaUtil::PermissionPromptDenied( | 409 void PermissionUmaUtil::PermissionPromptDenied( |
| 370 const std::vector<PermissionBubbleRequest*>& requests) { | 410 const std::vector<PermissionBubbleRequest*>& requests) { |
| 371 DCHECK(!requests.empty()); | 411 DCHECK(!requests.empty()); |
| 372 DCHECK(requests.size() == 1); | 412 DCHECK(requests.size() == 1); |
| 373 | 413 |
| 374 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, | 414 PERMISSION_BUBBLE_TYPE_UMA(kPermissionsPromptDenied, |
| 375 requests[0]->GetPermissionBubbleType()); | 415 requests[0]->GetPermissionBubbleType()); |
| 416 PERMISSION_BUBBLE_GESTURE_TYPE_UMA( |
| 417 kPermissionsPromptGestureDenied, kPermissionsPromptNoGestureDenied, |
| 418 requests[0]->GetGestureType(), requests[0]->GetPermissionBubbleType()); |
| 376 } | 419 } |
| OLD | NEW |