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

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: 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 13a1f34ae959c13cc1fbf97f6ee3332ea158082f..423ad2abd1d30d965e37ff12f34cad04adefc67f 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"
@@ -189,6 +190,76 @@ class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
permission_context.GetContentSettingFromMap(url, url));
}
+ void TestBlockOnSeveralDismissals_TestContent() {
+ {
+ TestPermissionContext permission_context(
+ profile(), content::PermissionType::GEOLOCATION,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION);
+ GURL url("https://www.google.com");
+ NavigateAndCommit(url);
+
+ // 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.
+ HostContentSettingsMapFactory::GetForProfile(profile())
+ ->ClearSettingsForOneType(
+ CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT);
+
+ {
+ TestPermissionContext permission_context(
+ profile(), content::PermissionType::GEOLOCATION,
+ CONTENT_SETTINGS_TYPE_GEOLOCATION);
+ GURL url("https://www.google.com");
+ NavigateAndCommit(url);
+
+ // Enable the block on too many dismissals feature, which is disabled by
+ // default.
+ 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));
+
+ // 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 TestRequestPermissionInvalidUrl(
content::PermissionType permission_type,
ContentSettingsType content_settings_type) {
@@ -332,6 +403,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