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

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

Issue 2651163002: Add UMA for autoblocking and embargoing. (Closed)
Patch Set: Review 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 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 base::Unretained(this), &permission_context, id, url, 282 base::Unretained(this), &permission_context, id, url,
282 persist, decision)); 283 persist, decision));
283 permission_context.RequestPermission( 284 permission_context.RequestPermission(
284 web_contents(), 285 web_contents(),
285 id, url, true /* user_gesture */, 286 id, url, true /* user_gesture */,
286 base::Bind(&TestPermissionContext::TrackPermissionDecision, 287 base::Bind(&TestPermissionContext::TrackPermissionDecision,
287 base::Unretained(&permission_context))); 288 base::Unretained(&permission_context)));
288 ASSERT_EQ(1u, permission_context.decisions().size()); 289 ASSERT_EQ(1u, permission_context.decisions().size());
289 EXPECT_EQ(decision, permission_context.decisions()[0]); 290 EXPECT_EQ(decision, permission_context.decisions()[0]);
290 EXPECT_TRUE(permission_context.tab_context_updated()); 291 EXPECT_TRUE(permission_context.tab_context_updated());
291 292 histograms.ExpectBucketCount("Permissions.AutoBlocker.EmbargoReason",
293 PermissionEmbargoReason::NOT_EMBARGOED, 1);
292 std::string decision_string; 294 std::string decision_string;
293 if (decision == CONTENT_SETTING_ALLOW) 295 if (decision == CONTENT_SETTING_ALLOW)
294 decision_string = "Accepted"; 296 decision_string = "Accepted";
295 else if (decision == CONTENT_SETTING_BLOCK) 297 else if (decision == CONTENT_SETTING_BLOCK)
296 decision_string = "Denied"; 298 decision_string = "Denied";
297 else if (decision == CONTENT_SETTING_ASK) 299 else if (decision == CONTENT_SETTING_ASK)
298 decision_string = "Dismissed"; 300 decision_string = "Dismissed";
299 301
300 if (decision_string.size()) { 302 if (decision_string.size()) {
301 histograms.ExpectUniqueSample( 303 histograms.ExpectUniqueSample(
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
345 base::Bind(&TestPermissionContext::TrackPermissionDecision, 347 base::Bind(&TestPermissionContext::TrackPermissionDecision,
346 base::Unretained(&permission_context))); 348 base::Unretained(&permission_context)));
347 histograms.ExpectTotalCount( 349 histograms.ExpectTotalCount(
348 "Permissions.Prompt.Dismissed.PriorDismissCount." + 350 "Permissions.Prompt.Dismissed.PriorDismissCount." +
349 PermissionUtil::GetPermissionString(permission_type), 351 PermissionUtil::GetPermissionString(permission_type),
350 i + 1); 352 i + 1);
351 histograms.ExpectBucketCount( 353 histograms.ExpectBucketCount(
352 "Permissions.Prompt.Dismissed.PriorDismissCount." + 354 "Permissions.Prompt.Dismissed.PriorDismissCount." +
353 PermissionUtil::GetPermissionString(permission_type), 355 PermissionUtil::GetPermissionString(permission_type),
354 i, 1); 356 i, 1);
357 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoReason",
358 i + 1);
355 ASSERT_EQ(1u, permission_context.decisions().size()); 359 ASSERT_EQ(1u, permission_context.decisions().size());
356 EXPECT_EQ(expected, permission_context.decisions()[0]); 360 EXPECT_EQ(expected, permission_context.decisions()[0]);
357 EXPECT_TRUE(permission_context.tab_context_updated()); 361 EXPECT_TRUE(permission_context.tab_context_updated());
358 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url)); 362 EXPECT_EQ(expected, permission_context.GetPermissionStatus(url, url));
359 } 363 }
360 364
361 TestPermissionContext permission_context(profile(), permission_type, 365 TestPermissionContext permission_context(profile(), permission_type,
362 content_settings_type); 366 content_settings_type);
363 const PermissionRequestID id( 367 const PermissionRequestID id(
364 web_contents()->GetRenderProcessHost()->GetID(), 368 web_contents()->GetRenderProcessHost()->GetID(),
365 web_contents()->GetMainFrame()->GetRoutingID(), -1); 369 web_contents()->GetMainFrame()->GetRoutingID(), -1);
366 370
367 permission_context.SetRespondPermissionCallback( 371 permission_context.SetRespondPermissionCallback(
368 base::Bind(&PermissionContextBaseTests::RespondToPermission, 372 base::Bind(&PermissionContextBaseTests::RespondToPermission,
369 base::Unretained(this), &permission_context, id, url, false, 373 base::Unretained(this), &permission_context, id, url, false,
370 CONTENT_SETTING_ASK)); 374 CONTENT_SETTING_ASK));
371 375
372 permission_context.RequestPermission( 376 permission_context.RequestPermission(
373 web_contents(), id, url, true /* user_gesture */, 377 web_contents(), id, url, true /* user_gesture */,
374 base::Bind(&TestPermissionContext::TrackPermissionDecision, 378 base::Bind(&TestPermissionContext::TrackPermissionDecision,
375 base::Unretained(&permission_context))); 379 base::Unretained(&permission_context)));
376 380
377 EXPECT_EQ(CONTENT_SETTING_BLOCK, 381 EXPECT_EQ(CONTENT_SETTING_BLOCK,
378 permission_context.GetPermissionStatus(url, url)); 382 permission_context.GetPermissionStatus(url, url));
383
384 // The first N-1 dismissals should not result in an embargo being recorded.
385 // The embargo should have only been recorded once, on the Nth dismissal.
386 histograms.ExpectBucketCount("Permissions.AutoBlocker.EmbargoReason",
387 PermissionEmbargoReason::NOT_EMBARGOED,
388 iterations - 1);
389 histograms.ExpectBucketCount("Permissions.AutoBlocker.EmbargoReason",
390 PermissionEmbargoReason::REPEATED_DISMISSALS,
391 1);
379 } 392 }
380 393
381 void TestBlockOnSeveralDismissals_TestContent() { 394 void TestBlockOnSeveralDismissals_TestContent() {
382 GURL url("https://www.google.com"); 395 GURL url("https://www.google.com");
383 NavigateAndCommit(url); 396 NavigateAndCommit(url);
384 base::HistogramTester histograms; 397 base::HistogramTester histograms;
385 398
386 // First, ensure that > 3 dismissals behaves correctly. 399 // First, ensure that > 3 dismissals behaves correctly.
387 for (uint32_t i = 0; i < 4; ++i) { 400 for (uint32_t i = 0; i < 4; ++i) {
388 TestPermissionContext permission_context( 401 TestPermissionContext permission_context(
(...skipping 10 matching lines...) Expand all
399 false, CONTENT_SETTING_ASK)); 412 false, CONTENT_SETTING_ASK));
400 permission_context.RequestPermission( 413 permission_context.RequestPermission(
401 web_contents(), id, url, true /* user_gesture */, 414 web_contents(), id, url, true /* user_gesture */,
402 base::Bind(&TestPermissionContext::TrackPermissionDecision, 415 base::Bind(&TestPermissionContext::TrackPermissionDecision,
403 base::Unretained(&permission_context))); 416 base::Unretained(&permission_context)));
404 histograms.ExpectTotalCount( 417 histograms.ExpectTotalCount(
405 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", 418 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation",
406 i + 1); 419 i + 1);
407 histograms.ExpectBucketCount( 420 histograms.ExpectBucketCount(
408 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1); 421 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1);
422 histograms.ExpectBucketCount("Permissions.AutoBlocker.EmbargoReason",
423 PermissionEmbargoReason::NOT_EMBARGOED,
424 i + 1);
409 ASSERT_EQ(1u, permission_context.decisions().size()); 425 ASSERT_EQ(1u, permission_context.decisions().size());
410 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]); 426 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
411 EXPECT_TRUE(permission_context.tab_context_updated()); 427 EXPECT_TRUE(permission_context.tab_context_updated());
412 EXPECT_EQ(CONTENT_SETTING_ASK, 428 EXPECT_EQ(CONTENT_SETTING_ASK,
413 permission_context.GetContentSettingFromMap(url, url)); 429 permission_context.GetContentSettingFromMap(url, url));
414 } 430 }
415 431
416 // Flush the dismissal counts. Enable the block on too many dismissals 432 // Flush the dismissal counts. Enable the block on too many dismissals
417 // feature, which is disabled by default. 433 // feature, which is disabled by default.
418 auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); 434 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
(...skipping 415 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 } 850 }
835 851
836 // Tests a blacklisted (URL, permission) pair has had its permission request 852 // Tests a blacklisted (URL, permission) pair has had its permission request
837 // blocked. 853 // blocked.
838 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) { 854 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) {
839 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager = 855 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
840 new MockSafeBrowsingDatabaseManager(true /* perform_callback */); 856 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
841 const GURL url("https://www.example.com"); 857 const GURL url("https://www.example.com");
842 std::set<std::string> blacklisted_permissions{"GEOLOCATION"}; 858 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
843 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions); 859 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
860 base::HistogramTester histograms;
844 TestPermissionsBlacklisting(content::PermissionType::GEOLOCATION, 861 TestPermissionsBlacklisting(content::PermissionType::GEOLOCATION,
845 CONTENT_SETTINGS_TYPE_GEOLOCATION, db_manager, 862 CONTENT_SETTINGS_TYPE_GEOLOCATION, db_manager,
846 url, 2000 /* timeout */, CONTENT_SETTING_BLOCK); 863 url, 2000 /* timeout */, CONTENT_SETTING_BLOCK);
864 histograms.ExpectUniqueSample(
865 "Permissions.AutoBlocker.EmbargoReason",
866 PermissionEmbargoReason::PERMISSIONS_BLACKLISTING, 1);
847 } 867 }
848 868
849 // Tests that a URL that is blacklisted for one permission can still request 869 // Tests that a URL that is blacklisted for one permission can still request
850 // another and grant another. 870 // another and grant another.
851 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) { 871 TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) {
852 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager = 872 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
853 new MockSafeBrowsingDatabaseManager(true /* perform_callback */); 873 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
854 const GURL url("https://www.example.com"); 874 const GURL url("https://www.example.com");
855 std::set<std::string> blacklisted_permissions{"GEOLOCATION"}; 875 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
856 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions); 876 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
877 base::HistogramTester histograms;
857 TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS, 878 TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS,
858 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager, 879 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
859 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW); 880 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW);
881 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoReason",
882 PermissionEmbargoReason::NOT_EMBARGOED, 1);
860 } 883 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698