Index: chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc |
diff --git a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc |
index 849d0b2086349d9d9681f0922895506a4e258408..77dedbe44605c2328c6aecab45c3314a573d2e06 100644 |
--- a/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc |
+++ b/chrome/browser/permissions/permission_decision_auto_blocker_unittest.cc |
@@ -89,6 +89,7 @@ class PermissionDecisionAutoBlockerUnitTest |
ChromeRenderViewHostTestHarness::SetUp(); |
autoblocker_ = PermissionDecisionAutoBlocker::GetForProfile(profile()); |
feature_list_.InitWithFeatures({features::kBlockPromptsIfDismissedOften, |
+ features::kBlockPromptsIfIgnoredOften, |
features::kPermissionsBlacklist}, |
{}); |
last_embargoed_status_ = false; |
@@ -190,14 +191,20 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, RemoveCountsByUrl) { |
url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); |
// Record some ignores. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url1, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
EXPECT_EQ( |
- 1, autoblocker()->RecordIgnore(url1, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
- EXPECT_EQ(1, autoblocker()->RecordIgnore( |
+ 1, autoblocker()->GetIgnoreCount(url1, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE)); |
+ EXPECT_EQ(1, autoblocker()->GetIgnoreCount( |
url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE)); |
- EXPECT_EQ( |
- 1, autoblocker()->RecordIgnore(url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
- EXPECT_EQ( |
- 2, autoblocker()->RecordIgnore(url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_EQ(2, autoblocker()->GetIgnoreCount( |
+ url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
autoblocker()->RemoveCountsByUrl(base::Bind(&FilterGoogle)); |
@@ -232,14 +239,22 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, RemoveCountsByUrl) { |
EXPECT_EQ(2, autoblocker()->GetDismissCount( |
url2, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
- EXPECT_EQ( |
- 1, autoblocker()->RecordIgnore(url1, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
- EXPECT_EQ(1, autoblocker()->RecordIgnore( |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url1, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_EQ(1, autoblocker()->GetIgnoreCount( |
+ url1, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); |
+ EXPECT_EQ(1, autoblocker()->GetIgnoreCount( |
url1, CONTENT_SETTINGS_TYPE_NOTIFICATIONS)); |
- EXPECT_EQ(1, autoblocker()->RecordIgnore( |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE)); |
+ EXPECT_EQ(1, autoblocker()->GetIgnoreCount( |
url1, CONTENT_SETTINGS_TYPE_DURABLE_STORAGE)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url2, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
EXPECT_EQ( |
- 1, autoblocker()->RecordIgnore(url2, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ 1, autoblocker()->GetIgnoreCount(url2, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
// Remove everything and expect that it's all gone. |
autoblocker()->RemoveCountsByUrl(base::Bind(&FilterAll)); |
@@ -287,7 +302,7 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, TestUpdateEmbargoBlacklist) { |
} |
// Test that an origin that is blacklisted for a permission will not be placed |
-// under embargoed for another. |
+// under embargo for another permission. |
TEST_F(PermissionDecisionAutoBlockerUnitTest, TestRequestNotBlacklisted) { |
GURL url("https://www.google.com"); |
clock()->SetNow(base::Time::Now()); |
@@ -473,8 +488,77 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, TestDismissEmbargoBackoff) { |
"Permissions.AutoBlocker.SafeBrowsingResponseTime", 0); |
} |
+// Tests the alternating pattern of the block on multiple ignores behaviour. |
+TEST_F(PermissionDecisionAutoBlockerUnitTest, TestIgnoreEmbargoBackoff) { |
+ GURL url("https://www.google.com"); |
+ clock()->SetNow(base::Time::Now()); |
+ base::HistogramTester histograms; |
+ |
+ // Record some ignores. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ |
+ // A request with < 4 prior ignores should not be automatically blocked. |
+ PermissionResult result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ |
+ // After the 4th ignore subsequent permission requests should be autoblocked. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ EXPECT_TRUE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::MULTIPLE_IGNORES, result.source); |
+ |
+ histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse", |
+ 0); |
+ histograms.ExpectTotalCount( |
+ "Permissions.AutoBlocker.SafeBrowsingResponseTime", 0); |
+ // Accelerate time forward, check that the embargo status is lifted and the |
+ // request won't be automatically blocked. |
+ clock()->Advance(base::TimeDelta::FromDays(8)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ |
+ // Record another dismiss, subsequent requests should be autoblocked again. |
+ EXPECT_TRUE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::MULTIPLE_IGNORES, result.source); |
+ |
+ // Accelerate time again, check embargo is lifted and another permission |
+ // request is let through. |
+ clock()->Advance(base::TimeDelta::FromDays(8)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ |
+ // Record another dismiss, subsequent requests should be autoblocked again. |
+ EXPECT_TRUE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
+ EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::MULTIPLE_IGNORES, result.source); |
+ histograms.ExpectTotalCount("Permissions.AutoBlocker.SafeBrowsingResponse", |
+ 0); |
+ histograms.ExpectTotalCount( |
+ "Permissions.AutoBlocker.SafeBrowsingResponseTime", 0); |
+} |
+ |
// Test the logic for a combination of blacklisting and dismissal embargo. |
-TEST_F(PermissionDecisionAutoBlockerUnitTest, TestExpiredBlacklistEmbargo) { |
+TEST_F(PermissionDecisionAutoBlockerUnitTest, TestExpiringOverlappingEmbargo) { |
GURL url("https://www.google.com"); |
clock()->SetNow(base::Time::Now()); |
@@ -501,6 +585,23 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, TestExpiredBlacklistEmbargo) { |
autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_GEOLOCATION); |
EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting); |
EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source); |
+ |
+ // Record an ignore embargo. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ EXPECT_TRUE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_GEOLOCATION)); |
+ |
+ // Ensure the ignore embargo is still set. |
+ clock()->Advance(base::TimeDelta::FromDays(5)); |
+ result = |
+ autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_GEOLOCATION); |
+ EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::MULTIPLE_IGNORES, result.source); |
} |
TEST_F(PermissionDecisionAutoBlockerUnitTest, TestSafeBrowsingTimeout) { |