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..c6d4e90a14933376a8f4fbf05ef3a97deb380e5a 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()); |
@@ -313,8 +328,10 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, TestRequestNotBlacklisted) { |
// Check that we do not apply embargo to the plugins content type, as prompts |
// should be triggered only when necessary by Html5ByDefault. |
TEST_F(PermissionDecisionAutoBlockerUnitTest, |
- PluginsNotEmbargoedByMultipleDismisses) { |
+ PluginsNotEmbargoedByMultipleDismissesOrIgnores) { |
GURL url("https://www.google.com"); |
+ |
+ // Check dismisses first. |
autoblocker()->RecordDismissAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
autoblocker()->RecordDismissAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
PermissionResult result = |
@@ -327,7 +344,8 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, |
// The third dismiss would normally embargo, but this shouldn't happen for |
// plugins. |
- autoblocker()->RecordDismissAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
result = autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
@@ -336,13 +354,46 @@ TEST_F(PermissionDecisionAutoBlockerUnitTest, |
autoblocker()->GetDismissCount(url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
// Extra one for sanity checking. |
- autoblocker()->RecordDismissAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ EXPECT_FALSE(autoblocker()->RecordDismissAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
result = autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
EXPECT_EQ(4, |
autoblocker()->GetDismissCount(url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
+ |
+ // Check ignores. |
+ autoblocker()->RecordIgnoreAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ autoblocker()->RecordIgnoreAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ autoblocker()->RecordIgnoreAndEmbargo(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ result = autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ EXPECT_EQ(3, |
+ autoblocker()->GetIgnoreCount(url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
+ |
+ // The fourth ignore would normally embargo, but this shouldn't happen for |
+ // plugins. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
+ result = autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ EXPECT_EQ(4, |
+ autoblocker()->GetIgnoreCount(url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
+ |
+ // Extra one for sanity checking. |
+ EXPECT_FALSE(autoblocker()->RecordIgnoreAndEmbargo( |
+ url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
+ result = autoblocker()->GetEmbargoResult(url, CONTENT_SETTINGS_TYPE_PLUGINS); |
+ |
+ EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting); |
+ EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source); |
+ EXPECT_EQ(5, |
+ autoblocker()->GetIgnoreCount(url, CONTENT_SETTINGS_TYPE_PLUGINS)); |
} |
// Check that GetEmbargoResult returns the correct value when the embargo is set |
@@ -473,8 +524,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 +621,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) { |