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

Unified Diff: chrome/browser/permissions/permission_context_base_unittest.cc

Issue 2184823007: Add a feature which, when enabled, blocks permissions after X prompt dismissals. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improve test Created 4 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/permissions/permission_context_base_unittest.cc
diff --git a/chrome/browser/permissions/permission_context_base_unittest.cc b/chrome/browser/permissions/permission_context_base_unittest.cc
index e351822da4006e7b839894a0a44ecc18916560a8..f651c8461de4fcb341f2e3929d04b6bcef5778e8 100644
--- a/chrome/browser/permissions/permission_context_base_unittest.cc
+++ b/chrome/browser/permissions/permission_context_base_unittest.cc
@@ -8,6 +8,7 @@
#include "base/bind.h"
#include "base/command_line.h"
+#include "base/feature_list.h"
#include "base/macros.h"
#include "base/metrics/field_trial.h"
#include "base/test/mock_entropy_provider.h"
@@ -190,6 +191,83 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
permission_context.GetContentSettingFromMap(url, url));
}
+ void DismissMultipleTimesAndExpectBlock(
+ const GURL& url,
+ content::PermissionType permission_type,
+ ContentSettingsType content_settings_type) {
+ TestPermissionContext permission_context(
+ profile(), permission_type, content_settings_type);
+
+ // Dismiss three times. The third dismiss should change the decision from
+ // dismiss to block, and hence change the persisted content setting.
+ for (unsigned int i = 0; i < 3; ++i) {
+ ContentSetting expected =
+ (i < 2) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK;
+ const PermissionRequestID id(
+ web_contents()->GetRenderProcessHost()->GetID(),
+ web_contents()->GetMainFrame()->GetRoutingID(), i);
+ permission_context.RequestPermission(
+ web_contents(), id, url, true /* user_gesture */,
+ base::Bind(&TestPermissionContext::TrackPermissionDecision,
+ base::Unretained(&permission_context)));
+
+ RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK);
+ EXPECT_EQ(i+1, permission_context.decisions().size());
+ EXPECT_EQ(expected, permission_context.decisions()[i]);
+ EXPECT_TRUE(permission_context.tab_context_updated());
+ EXPECT_EQ(expected,
+ permission_context.GetContentSettingFromMap(url, url));
+ }
+ }
+
+ void TestBlockOnSeveralDismissals_TestContent() {
+ GURL url("https://www.google.com");
+ NavigateAndCommit(url);
+
+ {
+ TestPermissionContext permission_context(
+ profile(), content::PermissionType::GEOLOCATION,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION);
+
+ // First, ensure that > 3 dismissals behaves correctly.
+ for (unsigned int i = 0; i < 4; ++i) {
+ const PermissionRequestID id(
+ web_contents()->GetRenderProcessHost()->GetID(),
+ web_contents()->GetMainFrame()->GetRoutingID(), i);
+ permission_context.RequestPermission(
+ web_contents(), id, url, true /* user_gesture */,
+ base::Bind(&TestPermissionContext::TrackPermissionDecision,
+ base::Unretained(&permission_context)));
+
+ RespondToPermission(&permission_context, id, url, CONTENT_SETTING_ASK);
+ EXPECT_EQ(i+1, permission_context.decisions().size());
+ EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[i]);
+ EXPECT_TRUE(permission_context.tab_context_updated());
+ EXPECT_EQ(CONTENT_SETTING_ASK,
+ permission_context.GetContentSettingFromMap(url, url));
+ }
+ }
+
+ // Flush the dismissal counts. Enable the block on too many dismissals
+ // feature, which is disabled by default.
+ HostContentSettingsMapFactory::GetForProfile(profile())
+ ->ClearSettingsForOneType(
+ CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT);
+ base::FeatureList::ClearInstanceForTesting();
+ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList);
+ feature_list->InitializeFromCommandLine(
+ "BlockPromptsIfDismissedOften<PermissionPromptsUX", "");
+ base::FeatureList::SetInstance(std::move(feature_list));
+
+ // Sanity check independence per permission type by checking two of them.
+ DismissMultipleTimesAndExpectBlock(url,
+ content::PermissionType::GEOLOCATION,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION);
+ DismissMultipleTimesAndExpectBlock(url,
+ content::PermissionType::NOTIFICATIONS,
+ CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
+ }
+
void TestRequestPermissionInvalidUrl(
content::PermissionType permission_type,
ContentSettingsType content_settings_type) {
@@ -333,6 +411,13 @@ TEST_F(PermissionContextBaseTests, TestAskAndDismiss) {
TestAskAndDismiss_TestContent();
}
+// Simulates clicking Dismiss (X) in the infobar/bubble with the block on too
+// many dismissals feature active.
+// The permission should be blocked after several dismissals.
+TEST_F(PermissionContextBaseTests, TestDismissUntilBlocked) {
+ TestBlockOnSeveralDismissals_TestContent();
+}
+
// Simulates non-valid requesting URL.
// The permission should be denied but not saved for future use.
TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) {

Powered by Google App Engine
This is Rietveld 408576698