| 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) {
|
|
|