Chromium Code Reviews| 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..c80aa4ffdb6a1950258c957e20de066c3c2b0b1b 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()); |
|
raymes
2016/08/01 05:09:11
nit: i + 1
dominickn
2016/08/03 05:38:46
Done.
|
| + 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()); |
|
raymes
2016/08/01 05:09:11
nit: i + 1
dominickn
2016/08/03 05:38:46
Done.
|
| + 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); |
| + } |
|
raymes
2016/08/01 05:09:11
Should we also test changing the parameter?
dominickn
2016/08/03 05:38:46
Done.
|
| + |
| void TestRequestPermissionInvalidUrl( |
| content::PermissionType permission_type, |
| ContentSettingsType content_settings_type) { |
| @@ -333,6 +411,16 @@ TEST_F(PermissionContextBaseTests, TestAskAndDismiss) { |
| TestAskAndDismiss_TestContent(); |
| } |
| +// Simulates clicking Dismiss (X) in the infobar/bubble with the block on too |
| +// many dismissals feature active. On Android, this logic is contained in |
| +// PermissionQueueController, so don't run this test there. |
| +// The permission should be blocked after several dismissals. |
|
raymes
2016/08/01 05:09:11
I think this should work on Android - RespondToPer
dominickn
2016/08/03 05:38:46
After much spelunking, got the tests working on An
|
| +#if !defined(OS_ANDROID) |
| +TEST_F(PermissionContextBaseTests, TestDismissUntilBlocked) { |
| + TestBlockOnSeveralDismissals_TestContent(); |
|
raymes
2016/08/01 05:09:11
Hmm it feels strange not to inline this, but I see
dominickn
2016/08/03 05:38:46
I mainly did it for consistency with the other tes
|
| +} |
| +#endif |
| + |
| // Simulates non-valid requesting URL. |
| // The permission should be denied but not saved for future use. |
| TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) { |