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

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

Issue 2690543004: Add UMA for recording embargo reasons and autoblocker interactions. (Closed)
Patch Set: Address comment Created 3 years, 10 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_context_base.h" 5 #include "chrome/browser/permissions/permission_context_base.h"
6 6
7 #include <map> 7 #include <map>
8 #include <set> 8 #include <set>
9 #include <string> 9 #include <string>
10 #include <utility> 10 #include <utility>
11 #include <vector> 11 #include <vector>
12 12
13 #include "base/bind.h" 13 #include "base/bind.h"
14 #include "base/feature_list.h" 14 #include "base/feature_list.h"
15 #include "base/macros.h" 15 #include "base/macros.h"
16 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
17 #include "base/metrics/field_trial.h" 17 #include "base/metrics/field_trial.h"
18 #include "base/run_loop.h" 18 #include "base/run_loop.h"
19 #include "base/test/histogram_tester.h" 19 #include "base/test/histogram_tester.h"
20 #include "base/test/mock_entropy_provider.h" 20 #include "base/test/mock_entropy_provider.h"
21 #include "base/test/scoped_feature_list.h" 21 #include "base/test/scoped_feature_list.h"
22 #include "build/build_config.h" 22 #include "build/build_config.h"
23 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" 23 #include "chrome/browser/content_settings/host_content_settings_map_factory.h"
24 #include "chrome/browser/infobars/infobar_service.h" 24 #include "chrome/browser/infobars/infobar_service.h"
25 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" 25 #include "chrome/browser/permissions/permission_decision_auto_blocker.h"
26 #include "chrome/browser/permissions/permission_queue_controller.h" 26 #include "chrome/browser/permissions/permission_queue_controller.h"
27 #include "chrome/browser/permissions/permission_request_id.h" 27 #include "chrome/browser/permissions/permission_request_id.h"
28 #include "chrome/browser/permissions/permission_uma_util.h"
28 #include "chrome/browser/permissions/permission_util.h" 29 #include "chrome/browser/permissions/permission_util.h"
29 #include "chrome/common/chrome_features.h" 30 #include "chrome/common/chrome_features.h"
30 #include "chrome/common/chrome_switches.h" 31 #include "chrome/common/chrome_switches.h"
31 #include "chrome/test/base/chrome_render_view_host_test_harness.h" 32 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
32 #include "chrome/test/base/testing_profile.h" 33 #include "chrome/test/base/testing_profile.h"
33 #include "components/content_settings/core/browser/host_content_settings_map.h" 34 #include "components/content_settings/core/browser/host_content_settings_map.h"
34 #include "components/content_settings/core/common/content_settings.h" 35 #include "components/content_settings/core/common/content_settings.h"
35 #include "components/content_settings/core/common/content_settings_types.h" 36 #include "components/content_settings/core/common/content_settings_types.h"
36 #include "components/safe_browsing_db/database_manager.h" 37 #include "components/safe_browsing_db/database_manager.h"
37 #include "components/safe_browsing_db/test_database_manager.h" 38 #include "components/safe_browsing_db/test_database_manager.h"
(...skipping 274 matching lines...) Expand 10 before | Expand all | Expand 10 after
312 0, 1); 313 0, 1);
313 } 314 }
314 315
315 if (persist) { 316 if (persist) {
316 EXPECT_EQ(decision, 317 EXPECT_EQ(decision,
317 permission_context.GetContentSettingFromMap(url, url)); 318 permission_context.GetContentSettingFromMap(url, url));
318 } else { 319 } else {
319 EXPECT_EQ(CONTENT_SETTING_ASK, 320 EXPECT_EQ(CONTENT_SETTING_ASK,
320 permission_context.GetContentSettingFromMap(url, url)); 321 permission_context.GetContentSettingFromMap(url, url));
321 } 322 }
323
324 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
325 PermissionEmbargoStatus::NOT_EMBARGOED, 1);
322 } 326 }
323 327
324 void DismissMultipleTimesAndExpectBlock( 328 void DismissMultipleTimesAndExpectBlock(
325 const GURL& url, 329 const GURL& url,
326 content::PermissionType permission_type, 330 content::PermissionType permission_type,
327 ContentSettingsType content_settings_type, 331 ContentSettingsType content_settings_type,
328 uint32_t iterations) { 332 uint32_t iterations) {
329 base::HistogramTester histograms; 333 base::HistogramTester histograms;
330 334
331 // Dismiss |iterations| times. The final dismiss should change the decision 335 // Dismiss |iterations| times. The final dismiss should change the decision
(...skipping 17 matching lines...) Expand all
349 base::Bind(&TestPermissionContext::TrackPermissionDecision, 353 base::Bind(&TestPermissionContext::TrackPermissionDecision,
350 base::Unretained(&permission_context))); 354 base::Unretained(&permission_context)));
351 histograms.ExpectTotalCount( 355 histograms.ExpectTotalCount(
352 "Permissions.Prompt.Dismissed.PriorDismissCount." + 356 "Permissions.Prompt.Dismissed.PriorDismissCount." +
353 PermissionUtil::GetPermissionString(permission_type), 357 PermissionUtil::GetPermissionString(permission_type),
354 i + 1); 358 i + 1);
355 histograms.ExpectBucketCount( 359 histograms.ExpectBucketCount(
356 "Permissions.Prompt.Dismissed.PriorDismissCount." + 360 "Permissions.Prompt.Dismissed.PriorDismissCount." +
357 PermissionUtil::GetPermissionString(permission_type), 361 PermissionUtil::GetPermissionString(permission_type),
358 i, 1); 362 i, 1);
363 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
364 i + 1);
365 if (i < 2) {
366 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
367 PermissionEmbargoStatus::NOT_EMBARGOED,
368 i + 1);
369 } else {
370 histograms.ExpectBucketCount(
371 "Permissions.AutoBlocker.EmbargoStatus",
372 PermissionEmbargoStatus::REPEATED_DISMISSALS, 1);
373 }
374
359 ASSERT_EQ(1u, permission_context.decisions().size()); 375 ASSERT_EQ(1u, permission_context.decisions().size());
360 EXPECT_EQ(expected, permission_context.decisions()[0]); 376 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
361 EXPECT_TRUE(permission_context.tab_context_updated()); 377 EXPECT_TRUE(permission_context.tab_context_updated());
362 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url)); 378 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url));
363 } 379 }
364 380
365 TestPermissionContext permission_context(profile(), permission_type, 381 TestPermissionContext permission_context(profile(), permission_type,
366 content_settings_type); 382 content_settings_type);
367 const PermissionRequestID id( 383 const PermissionRequestID id(
368 web_contents()->GetRenderProcessHost()->GetID(), 384 web_contents()->GetRenderProcessHost()->GetID(),
369 web_contents()->GetMainFrame()->GetRoutingID(), -1); 385 web_contents()->GetMainFrame()->GetRoutingID(), -1);
370 386
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
403 false, CONTENT_SETTING_ASK)); 419 false, CONTENT_SETTING_ASK));
404 permission_context.RequestPermission( 420 permission_context.RequestPermission(
405 web_contents(), id, url, true /* user_gesture */, 421 web_contents(), id, url, true /* user_gesture */,
406 base::Bind(&TestPermissionContext::TrackPermissionDecision, 422 base::Bind(&TestPermissionContext::TrackPermissionDecision,
407 base::Unretained(&permission_context))); 423 base::Unretained(&permission_context)));
408 histograms.ExpectTotalCount( 424 histograms.ExpectTotalCount(
409 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", 425 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation",
410 i + 1); 426 i + 1);
411 histograms.ExpectBucketCount( 427 histograms.ExpectBucketCount(
412 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1); 428 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1);
429 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
430 PermissionEmbargoStatus::NOT_EMBARGOED,
431 i + 1);
432
413 ASSERT_EQ(1u, permission_context.decisions().size()); 433 ASSERT_EQ(1u, permission_context.decisions().size());
414 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]); 434 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
415 EXPECT_TRUE(permission_context.tab_context_updated()); 435 EXPECT_TRUE(permission_context.tab_context_updated());
416 EXPECT_EQ(CONTENT_SETTING_ASK, 436 EXPECT_EQ(CONTENT_SETTING_ASK,
417 permission_context.GetContentSettingFromMap(url, url)); 437 permission_context.GetContentSettingFromMap(url, url));
418 } 438 }
419 439
420 // Flush the dismissal counts. Enable the block on too many dismissals 440 // Flush the dismissal counts. Enable the block on too many dismissals
421 // feature, which is disabled by default. 441 // feature, which is disabled by default.
422 auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); 442 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 permission_context.SetRespondPermissionCallback( 505 permission_context.SetRespondPermissionCallback(
486 base::Bind(&PermissionContextBaseTests::RespondToPermission, 506 base::Bind(&PermissionContextBaseTests::RespondToPermission,
487 base::Unretained(this), &permission_context, id, url, 507 base::Unretained(this), &permission_context, id, url,
488 false, CONTENT_SETTING_ASK)); 508 false, CONTENT_SETTING_ASK));
489 permission_context.RequestPermission( 509 permission_context.RequestPermission(
490 web_contents(), id, url, true /* user_gesture */, 510 web_contents(), id, url, true /* user_gesture */,
491 base::Bind(&TestPermissionContext::TrackPermissionDecision, 511 base::Bind(&TestPermissionContext::TrackPermissionDecision,
492 base::Unretained(&permission_context))); 512 base::Unretained(&permission_context)));
493 513
494 EXPECT_EQ(1u, permission_context.decisions().size()); 514 EXPECT_EQ(1u, permission_context.decisions().size());
495 ASSERT_EQ(expected, permission_context.decisions()[0]); 515 ASSERT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
496 EXPECT_TRUE(permission_context.tab_context_updated()); 516 EXPECT_TRUE(permission_context.tab_context_updated());
497 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url)); 517 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url));
498 518
499 histograms.ExpectTotalCount( 519 histograms.ExpectTotalCount(
500 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1); 520 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1);
501 histograms.ExpectBucketCount( 521 histograms.ExpectBucketCount(
502 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1); 522 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1);
523
524 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
525 i + 1);
526 if (i < 4) {
527 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
528 PermissionEmbargoStatus::NOT_EMBARGOED,
529 i + 1);
530 } else {
531 histograms.ExpectBucketCount(
532 "Permissions.AutoBlocker.EmbargoStatus",
533 PermissionEmbargoStatus::REPEATED_DISMISSALS, 1);
534 }
503 } 535 }
504 536
505 // Ensure that we finish in the block state. 537 // Ensure that we finish in the block state.
506 TestPermissionContext permission_context( 538 TestPermissionContext permission_context(
507 profile(), content::PermissionType::MIDI_SYSEX, 539 profile(), content::PermissionType::MIDI_SYSEX,
508 CONTENT_SETTINGS_TYPE_MIDI_SYSEX); 540 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
509 EXPECT_EQ(CONTENT_SETTING_BLOCK, 541 EXPECT_EQ(CONTENT_SETTING_BLOCK,
510 permission_context.GetPermissionStatus(url, url)); 542 permission_context.GetPermissionStatus(url, url));
511 variations::testing::ClearAllVariationParams(); 543 variations::testing::ClearAllVariationParams();
512 } 544 }
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 671
640 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url)); 672 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url));
641 } 673 }
642 674
643 void TestPermissionsBlacklisting( 675 void TestPermissionsBlacklisting(
644 content::PermissionType permission_type, 676 content::PermissionType permission_type,
645 ContentSettingsType content_settings_type, 677 ContentSettingsType content_settings_type,
646 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager, 678 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
647 const GURL& url, 679 const GURL& url,
648 int timeout, 680 int timeout,
649 ContentSetting expected_permission_status) { 681 ContentSetting expected_permission_status,
682 PermissionEmbargoStatus expected_embargo_reason) {
650 NavigateAndCommit(url); 683 NavigateAndCommit(url);
684 base::HistogramTester histograms;
651 base::test::ScopedFeatureList scoped_feature_list; 685 base::test::ScopedFeatureList scoped_feature_list;
652 scoped_feature_list.InitAndEnableFeature(features::kPermissionsBlacklist); 686 scoped_feature_list.InitAndEnableFeature(features::kPermissionsBlacklist);
653 TestPermissionContext permission_context(profile(), permission_type, 687 TestPermissionContext permission_context(profile(), permission_type,
654 content_settings_type); 688 content_settings_type);
655 PermissionDecisionAutoBlocker::GetForProfile(profile()) 689 PermissionDecisionAutoBlocker::GetForProfile(profile())
656 ->SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager, 690 ->SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
657 timeout); 691 timeout);
658 const PermissionRequestID id( 692 const PermissionRequestID id(
659 web_contents()->GetRenderProcessHost()->GetID(), 693 web_contents()->GetRenderProcessHost()->GetID(),
660 web_contents()->GetMainFrame()->GetRoutingID(), -1); 694 web_contents()->GetMainFrame()->GetRoutingID(), -1);
(...skipping 12 matching lines...) Expand all
673 web_contents(), id, url, true /* user_gesture */, 707 web_contents(), id, url, true /* user_gesture */,
674 base::Bind(&TestPermissionContext::TrackPermissionDecision, 708 base::Bind(&TestPermissionContext::TrackPermissionDecision,
675 base::Unretained(&permission_context))); 709 base::Unretained(&permission_context)));
676 EXPECT_EQ(expected_permission_status, 710 EXPECT_EQ(expected_permission_status,
677 permission_context.GetPermissionStatus(url, url)); 711 permission_context.GetPermissionStatus(url, url));
678 712
679 if (expected_permission_status == CONTENT_SETTING_ALLOW) { 713 if (expected_permission_status == CONTENT_SETTING_ALLOW) {
680 ASSERT_EQ(1u, permission_context.decisions().size()); 714 ASSERT_EQ(1u, permission_context.decisions().size());
681 EXPECT_EQ(expected_permission_status, permission_context.decisions()[0]); 715 EXPECT_EQ(expected_permission_status, permission_context.decisions()[0]);
682 } 716 }
717 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
718 expected_embargo_reason, 1);
683 } 719 }
684 720
685 private: 721 private:
686 // ChromeRenderViewHostTestHarness: 722 // ChromeRenderViewHostTestHarness:
687 void SetUp() override { 723 void SetUp() override {
688 ChromeRenderViewHostTestHarness::SetUp(); 724 ChromeRenderViewHostTestHarness::SetUp();
689 #if defined(OS_ANDROID) 725 #if defined(OS_ANDROID)
690 InfoBarService::CreateForWebContents(web_contents()); 726 InfoBarService::CreateForWebContents(web_contents());
691 #else 727 #else
692 PermissionRequestManager::CreateForWebContents(web_contents()); 728 PermissionRequestManager::CreateForWebContents(web_contents());
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 } 874 }
839 875
840 // Tests a blacklisted (URL, permission) pair has had its permission request 876 // Tests a blacklisted (URL, permission) pair has had its permission request
841 // blocked. 877 // blocked.
842 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) { 878 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) {
843 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager = 879 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
844 new MockSafeBrowsingDatabaseManager(true /* perform_callback */); 880 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
845 const GURL url("https://www.example.com"); 881 const GURL url("https://www.example.com");
846 std::set<std::string> blacklisted_permissions{"GEOLOCATION"}; 882 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
847 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions); 883 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
848 TestPermissionsBlacklisting(content::PermissionType::GEOLOCATION, 884 TestPermissionsBlacklisting(
849 CONTENT_SETTINGS_TYPE_GEOLOCATION, db_manager, 885 content::PermissionType::GEOLOCATION, CONTENT_SETTINGS_TYPE_GEOLOCATION,
850 url, 2000 /* timeout */, CONTENT_SETTING_BLOCK); 886 db_manager, url, 2000 /* timeout */, CONTENT_SETTING_BLOCK,
887 PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING);
851 } 888 }
852 889
853 // Tests that a URL that is blacklisted for one permission can still request 890 // Tests that a URL that is blacklisted for one permission can still request
854 // another and grant another. 891 // another and grant another.
855 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) { 892 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) {
856 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager = 893 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
857 new MockSafeBrowsingDatabaseManager(true /* perform_callback */); 894 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
858 const GURL url("https://www.example.com"); 895 const GURL url("https://www.example.com");
859 std::set<std::string> blacklisted_permissions{"GEOLOCATION"}; 896 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
860 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions); 897 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
861 TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS, 898 TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS,
862 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager, 899 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
863 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW); 900 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW,
901 PermissionEmbargoStatus::NOT_EMBARGOED);
864 } 902 }
OLDNEW
« no previous file with comments | « chrome/browser/permissions/permission_context_base.cc ('k') | chrome/browser/permissions/permission_decision_auto_blocker.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698