| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/permissions/permission_context_base.h" | 5 #include "chrome/browser/permissions/permission_context_base.h" |
| 6 | 6 |
| 7 #include <map> |
| 8 #include <string> |
| 9 #include <utility> |
| 7 #include <vector> | 10 #include <vector> |
| 8 | 11 |
| 9 #include "base/bind.h" | 12 #include "base/bind.h" |
| 10 #include "base/command_line.h" | |
| 11 #include "base/feature_list.h" | 13 #include "base/feature_list.h" |
| 12 #include "base/macros.h" | 14 #include "base/macros.h" |
| 13 #include "base/memory/ptr_util.h" | 15 #include "base/memory/ptr_util.h" |
| 14 #include "base/metrics/field_trial.h" | 16 #include "base/metrics/field_trial.h" |
| 15 #include "base/test/histogram_tester.h" | 17 #include "base/test/histogram_tester.h" |
| 16 #include "base/test/mock_entropy_provider.h" | 18 #include "base/test/mock_entropy_provider.h" |
| 17 #include "base/test/scoped_feature_list.h" | 19 #include "base/test/scoped_feature_list.h" |
| 18 #include "build/build_config.h" | 20 #include "build/build_config.h" |
| 19 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" | 21 #include "chrome/browser/content_settings/host_content_settings_map_factory.h" |
| 20 #include "chrome/browser/infobars/infobar_service.h" | 22 #include "chrome/browser/infobars/infobar_service.h" |
| 21 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" | 23 #include "chrome/browser/permissions/permission_decision_auto_blocker.h" |
| 22 #include "chrome/browser/permissions/permission_queue_controller.h" | 24 #include "chrome/browser/permissions/permission_queue_controller.h" |
| 23 #include "chrome/browser/permissions/permission_request_id.h" | 25 #include "chrome/browser/permissions/permission_request_id.h" |
| 24 #include "chrome/browser/permissions/permission_util.h" | 26 #include "chrome/browser/permissions/permission_util.h" |
| 25 #include "chrome/common/chrome_features.h" | 27 #include "chrome/common/chrome_features.h" |
| 26 #include "chrome/common/chrome_switches.h" | 28 #include "chrome/common/chrome_switches.h" |
| 27 #include "chrome/test/base/chrome_render_view_host_test_harness.h" | 29 #include "chrome/test/base/chrome_render_view_host_test_harness.h" |
| 28 #include "chrome/test/base/testing_profile.h" | 30 #include "chrome/test/base/testing_profile.h" |
| 29 #include "components/content_settings/core/browser/host_content_settings_map.h" | 31 #include "components/content_settings/core/browser/host_content_settings_map.h" |
| 30 #include "components/content_settings/core/common/content_settings.h" | 32 #include "components/content_settings/core/common/content_settings.h" |
| 31 #include "components/content_settings/core/common/content_settings_types.h" | 33 #include "components/content_settings/core/common/content_settings_types.h" |
| 32 #include "components/variations/variations_associated_data.h" | 34 #include "components/variations/variations_associated_data.h" |
| 33 #include "content/public/browser/permission_type.h" | 35 #include "content/public/browser/permission_type.h" |
| 34 #include "content/public/browser/render_frame_host.h" | 36 #include "content/public/browser/render_frame_host.h" |
| 35 #include "content/public/browser/web_contents.h" | 37 #include "content/public/browser/web_contents.h" |
| 36 #include "content/public/test/mock_render_process_host.h" | 38 #include "content/public/test/mock_render_process_host.h" |
| 37 #include "testing/gtest/include/gtest/gtest.h" | 39 #include "testing/gtest/include/gtest/gtest.h" |
| 38 | 40 |
| 39 #if defined(OS_ANDROID) | 41 #if !defined(OS_ANDROID) |
| 40 #include "chrome/browser/permissions/permission_queue_controller.h" | |
| 41 #else | |
| 42 #include "chrome/browser/permissions/permission_request_manager.h" | 42 #include "chrome/browser/permissions/permission_request_manager.h" |
| 43 #endif | 43 #endif |
| 44 | 44 |
| 45 const char* kPermissionsKillSwitchFieldStudy = | 45 const char* const kPermissionsKillSwitchFieldStudy = |
| 46 PermissionContextBase::kPermissionsKillSwitchFieldStudy; | 46 PermissionContextBase::kPermissionsKillSwitchFieldStudy; |
| 47 const char* kPermissionsKillSwitchBlockedValue = | 47 const char* const kPermissionsKillSwitchBlockedValue = |
| 48 PermissionContextBase::kPermissionsKillSwitchBlockedValue; | 48 PermissionContextBase::kPermissionsKillSwitchBlockedValue; |
| 49 const char kPermissionsKillSwitchTestGroup[] = "TestGroup"; | 49 const char kPermissionsKillSwitchTestGroup[] = "TestGroup"; |
| 50 const char* kPromptGroupName = kPermissionsKillSwitchTestGroup; | 50 const char* const kPromptGroupName = kPermissionsKillSwitchTestGroup; |
| 51 const char kPromptTrialName[] = "PermissionPromptsUX"; | 51 const char kPromptTrialName[] = "PermissionPromptsUX"; |
| 52 | 52 |
| 53 class TestPermissionContext : public PermissionContextBase { | 53 class TestPermissionContext : public PermissionContextBase { |
| 54 public: | 54 public: |
| 55 TestPermissionContext(Profile* profile, | 55 TestPermissionContext(Profile* profile, |
| 56 const content::PermissionType permission_type, | 56 const content::PermissionType permission_type, |
| 57 const ContentSettingsType content_settings_type) | 57 const ContentSettingsType content_settings_type) |
| 58 : PermissionContextBase(profile, permission_type, content_settings_type), | 58 : PermissionContextBase(profile, permission_type, content_settings_type), |
| 59 tab_context_updated_(false) {} | 59 tab_context_updated_(false) {} |
| 60 | 60 |
| 61 ~TestPermissionContext() override {} | 61 ~TestPermissionContext() override {} |
| 62 | 62 |
| 63 #if defined(OS_ANDROID) | 63 #if defined(OS_ANDROID) |
| 64 PermissionQueueController* GetInfoBarController() { | 64 PermissionQueueController* GetInfoBarController() { |
| 65 return GetQueueController(); | 65 return GetQueueController(); |
| 66 } | 66 } |
| 67 #endif | 67 #endif |
| 68 | 68 |
| 69 const std::vector<ContentSetting>& decisions() { return decisions_; } | 69 const std::vector<ContentSetting>& decisions() const { return decisions_; } |
| 70 | 70 |
| 71 bool tab_context_updated() { | 71 bool tab_context_updated() const { return tab_context_updated_; } |
| 72 return tab_context_updated_; | |
| 73 } | |
| 74 | 72 |
| 75 void TrackPermissionDecision(ContentSetting content_setting) { | 73 void TrackPermissionDecision(ContentSetting content_setting) { |
| 76 decisions_.push_back(content_setting); | 74 decisions_.push_back(content_setting); |
| 77 } | 75 } |
| 78 | 76 |
| 79 ContentSetting GetContentSettingFromMap(const GURL& url_a, | 77 ContentSetting GetContentSettingFromMap(const GURL& url_a, |
| 80 const GURL& url_b) { | 78 const GURL& url_b) { |
| 81 return HostContentSettingsMapFactory::GetForProfile(profile()) | 79 auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); |
| 82 ->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(), | 80 return map->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(), |
| 83 content_settings_type(), std::string()); | 81 content_settings_type(), std::string()); |
| 84 } | 82 } |
| 85 | 83 |
| 86 protected: | 84 protected: |
| 87 void UpdateTabContext(const PermissionRequestID& id, | 85 void UpdateTabContext(const PermissionRequestID& id, |
| 88 const GURL& requesting_origin, | 86 const GURL& requesting_origin, |
| 89 bool allowed) override { | 87 bool allowed) override { |
| 90 tab_context_updated_ = true; | 88 tab_context_updated_ = true; |
| 91 } | 89 } |
| 92 | 90 |
| 93 bool IsRestrictedToSecureOrigins() const override { | 91 bool IsRestrictedToSecureOrigins() const override { |
| 94 return false; | 92 return false; |
| 95 } | 93 } |
| 96 | 94 |
| 97 private: | 95 private: |
| 98 std::vector<ContentSetting> decisions_; | 96 std::vector<ContentSetting> decisions_; |
| 99 bool tab_context_updated_; | 97 bool tab_context_updated_; |
| 98 |
| 99 DISALLOW_COPY_AND_ASSIGN(TestPermissionContext); |
| 100 }; | 100 }; |
| 101 | 101 |
| 102 class TestKillSwitchPermissionContext : public TestPermissionContext { | 102 class TestKillSwitchPermissionContext : public TestPermissionContext { |
| 103 public: | 103 public: |
| 104 TestKillSwitchPermissionContext( | 104 TestKillSwitchPermissionContext( |
| 105 Profile* profile, | 105 Profile* profile, |
| 106 const content::PermissionType permission_type, | 106 const content::PermissionType permission_type, |
| 107 const ContentSettingsType content_settings_type) | 107 const ContentSettingsType content_settings_type) |
| 108 : TestPermissionContext(profile, permission_type, content_settings_type), | 108 : TestPermissionContext(profile, permission_type, content_settings_type), |
| 109 field_trial_list_( | 109 field_trial_list_(base::MakeUnique<base::FieldTrialList>( |
| 110 new base::FieldTrialList( | 110 base::MakeUnique<base::MockEntropyProvider>())) {} |
| 111 base::MakeUnique<base::MockEntropyProvider>())) {} | |
| 112 | 111 |
| 113 void ResetFieldTrialList() { | 112 void ResetFieldTrialList() { |
| 114 // Destroy the existing FieldTrialList before creating a new one to avoid | 113 // Destroy the existing FieldTrialList before creating a new one to avoid |
| 115 // a DCHECK. | 114 // a DCHECK. |
| 116 field_trial_list_.reset(); | 115 field_trial_list_.reset(); |
| 117 field_trial_list_.reset(new base::FieldTrialList( | 116 field_trial_list_ = base::MakeUnique<base::FieldTrialList>( |
| 118 base::MakeUnique<base::MockEntropyProvider>())); | 117 base::MakeUnique<base::MockEntropyProvider>()); |
| 119 variations::testing::ClearAllVariationParams(); | 118 variations::testing::ClearAllVariationParams(); |
| 120 } | 119 } |
| 121 | 120 |
| 122 private: | 121 private: |
| 123 std::unique_ptr<base::FieldTrialList> field_trial_list_; | 122 std::unique_ptr<base::FieldTrialList> field_trial_list_; |
| 123 |
| 124 DISALLOW_COPY_AND_ASSIGN(TestKillSwitchPermissionContext); |
| 124 }; | 125 }; |
| 125 | 126 |
| 126 class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { | 127 class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness { |
| 127 protected: | 128 protected: |
| 128 PermissionContextBaseTests() {} | 129 PermissionContextBaseTests() {} |
| 130 ~PermissionContextBaseTests() override {} |
| 129 | 131 |
| 130 // Accept or dismiss the permission bubble or infobar. | 132 // Accept or dismiss the permission bubble or infobar. |
| 131 void RespondToPermission(TestPermissionContext* context, | 133 void RespondToPermission(TestPermissionContext* context, |
| 132 const PermissionRequestID& id, | 134 const PermissionRequestID& id, |
| 133 const GURL& url, | 135 const GURL& url, |
| 134 bool persist, | 136 bool persist, |
| 135 ContentSetting response) { | 137 ContentSetting response) { |
| 136 DCHECK(response == CONTENT_SETTING_ALLOW || | 138 DCHECK(response == CONTENT_SETTING_ALLOW || |
| 137 response == CONTENT_SETTING_BLOCK || | 139 response == CONTENT_SETTING_BLOCK || |
| 138 response == CONTENT_SETTING_ASK); | 140 response == CONTENT_SETTING_ASK); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 178 web_contents()->GetRenderProcessHost()->GetID(), | 180 web_contents()->GetRenderProcessHost()->GetID(), |
| 179 web_contents()->GetMainFrame()->GetRoutingID(), | 181 web_contents()->GetMainFrame()->GetRoutingID(), |
| 180 -1); | 182 -1); |
| 181 permission_context.RequestPermission( | 183 permission_context.RequestPermission( |
| 182 web_contents(), | 184 web_contents(), |
| 183 id, url, true /* user_gesture */, | 185 id, url, true /* user_gesture */, |
| 184 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 186 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 185 base::Unretained(&permission_context))); | 187 base::Unretained(&permission_context))); |
| 186 | 188 |
| 187 RespondToPermission(&permission_context, id, url, persist, decision); | 189 RespondToPermission(&permission_context, id, url, persist, decision); |
| 188 EXPECT_EQ(1u, permission_context.decisions().size()); | 190 ASSERT_EQ(1u, permission_context.decisions().size()); |
| 189 EXPECT_EQ(decision, permission_context.decisions()[0]); | 191 EXPECT_EQ(decision, permission_context.decisions()[0]); |
| 190 EXPECT_TRUE(permission_context.tab_context_updated()); | 192 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 191 | 193 |
| 192 std::string decision_string = ""; | 194 std::string decision_string; |
| 193 if (decision == CONTENT_SETTING_ALLOW) | 195 if (decision == CONTENT_SETTING_ALLOW) |
| 194 decision_string = "Accepted"; | 196 decision_string = "Accepted"; |
| 195 else if (decision == CONTENT_SETTING_BLOCK) | 197 else if (decision == CONTENT_SETTING_BLOCK) |
| 196 decision_string = "Denied"; | 198 decision_string = "Denied"; |
| 197 else if (decision == CONTENT_SETTING_ASK) | 199 else if (decision == CONTENT_SETTING_ASK) |
| 198 decision_string = "Dismissed"; | 200 decision_string = "Dismissed"; |
| 199 | 201 |
| 200 if (decision_string.size()) { | 202 if (decision_string.size()) { |
| 201 histograms.ExpectUniqueSample( | 203 histograms.ExpectUniqueSample( |
| 202 "Permissions.Prompt." + decision_string + ".PriorDismissCount." + | 204 "Permissions.Prompt." + decision_string + ".PriorDismissCount." + |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 244 CONTENT_SETTING_ASK); | 246 CONTENT_SETTING_ASK); |
| 245 histograms.ExpectTotalCount( | 247 histograms.ExpectTotalCount( |
| 246 "Permissions.Prompt.Dismissed.PriorDismissCount." + | 248 "Permissions.Prompt.Dismissed.PriorDismissCount." + |
| 247 PermissionUtil::GetPermissionString(permission_type), | 249 PermissionUtil::GetPermissionString(permission_type), |
| 248 i + 1); | 250 i + 1); |
| 249 histograms.ExpectBucketCount( | 251 histograms.ExpectBucketCount( |
| 250 "Permissions.Prompt.Dismissed.PriorDismissCount." + | 252 "Permissions.Prompt.Dismissed.PriorDismissCount." + |
| 251 PermissionUtil::GetPermissionString(permission_type), | 253 PermissionUtil::GetPermissionString(permission_type), |
| 252 i, 1); | 254 i, 1); |
| 253 | 255 |
| 254 EXPECT_EQ(1u, permission_context.decisions().size()); | 256 ASSERT_EQ(1u, permission_context.decisions().size()); |
| 255 EXPECT_EQ(expected, permission_context.decisions()[0]); | 257 EXPECT_EQ(expected, permission_context.decisions()[0]); |
| 256 EXPECT_TRUE(permission_context.tab_context_updated()); | 258 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 257 EXPECT_EQ(expected, | 259 EXPECT_EQ(expected, |
| 258 permission_context.GetContentSettingFromMap(url, url)); | 260 permission_context.GetContentSettingFromMap(url, url)); |
| 259 } | 261 } |
| 260 | 262 |
| 261 // Ensure that we finish in the block state. | 263 // Ensure that we finish in the block state. |
| 262 TestPermissionContext permission_context( | 264 TestPermissionContext permission_context( |
| 263 profile(), permission_type, content_settings_type); | 265 profile(), permission_type, content_settings_type); |
| 264 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 266 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 284 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 286 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 285 base::Unretained(&permission_context))); | 287 base::Unretained(&permission_context))); |
| 286 | 288 |
| 287 RespondToPermission(&permission_context, id, url, false, /* persist */ | 289 RespondToPermission(&permission_context, id, url, false, /* persist */ |
| 288 CONTENT_SETTING_ASK); | 290 CONTENT_SETTING_ASK); |
| 289 histograms.ExpectTotalCount( | 291 histograms.ExpectTotalCount( |
| 290 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", | 292 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", |
| 291 i + 1); | 293 i + 1); |
| 292 histograms.ExpectBucketCount( | 294 histograms.ExpectBucketCount( |
| 293 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1); | 295 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1); |
| 294 EXPECT_EQ(1u, permission_context.decisions().size()); | 296 ASSERT_EQ(1u, permission_context.decisions().size()); |
| 295 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]); | 297 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]); |
| 296 EXPECT_TRUE(permission_context.tab_context_updated()); | 298 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 297 EXPECT_EQ(CONTENT_SETTING_ASK, | 299 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 298 permission_context.GetContentSettingFromMap(url, url)); | 300 permission_context.GetContentSettingFromMap(url, url)); |
| 299 } | 301 } |
| 300 | 302 |
| 301 // Flush the dismissal counts. Enable the block on too many dismissals | 303 // Flush the dismissal counts. Enable the block on too many dismissals |
| 302 // feature, which is disabled by default. | 304 // feature, which is disabled by default. |
| 303 HostContentSettingsMapFactory::GetForProfile(profile()) | 305 auto* map = HostContentSettingsMapFactory::GetForProfile(profile()); |
| 304 ->ClearSettingsForOneType( | 306 map->ClearSettingsForOneType( |
| 305 CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT); | 307 CONTENT_SETTINGS_TYPE_PROMPT_NO_DECISION_COUNT); |
| 306 | 308 |
| 307 base::test::ScopedFeatureList feature_list; | 309 base::test::ScopedFeatureList feature_list; |
| 308 feature_list.InitAndEnableFeature(features::kBlockPromptsIfDismissedOften); | 310 feature_list.InitAndEnableFeature(features::kBlockPromptsIfDismissedOften); |
| 309 | 311 |
| 310 EXPECT_TRUE( | 312 EXPECT_TRUE( |
| 311 base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften)); | 313 base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften)); |
| 312 | 314 |
| 313 // Sanity check independence per permission type by checking two of them. | 315 // Sanity check independence per permission type by checking two of them. |
| 314 DismissMultipleTimesAndExpectBlock(url, | 316 DismissMultipleTimesAndExpectBlock(url, |
| 315 content::PermissionType::GEOLOCATION, | 317 content::PermissionType::GEOLOCATION, |
| 316 CONTENT_SETTINGS_TYPE_GEOLOCATION, 3); | 318 CONTENT_SETTINGS_TYPE_GEOLOCATION, 3); |
| 317 DismissMultipleTimesAndExpectBlock(url, | 319 DismissMultipleTimesAndExpectBlock(url, |
| 318 content::PermissionType::NOTIFICATIONS, | 320 content::PermissionType::NOTIFICATIONS, |
| 319 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3); | 321 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3); |
| 320 } | 322 } |
| 321 | 323 |
| 322 void TestVariationBlockOnSeveralDismissals_TestContent() { | 324 void TestVariationBlockOnSeveralDismissals_TestContent() { |
| 323 GURL url("https://www.google.com"); | 325 GURL url("https://www.google.com"); |
| 324 NavigateAndCommit(url); | 326 NavigateAndCommit(url); |
| 325 base::HistogramTester histograms; | 327 base::HistogramTester histograms; |
| 326 | 328 |
| 327 // Set up the custom parameter and custom value. | 329 // Set up the custom parameter and custom value. |
| 328 base::FieldTrialList field_trials_(nullptr); | 330 base::FieldTrialList field_trials(nullptr); |
| 329 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial( | 331 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial( |
| 330 kPromptTrialName, kPromptGroupName); | 332 kPromptTrialName, kPromptGroupName); |
| 331 std::map<std::string, std::string> params; | 333 std::map<std::string, std::string> params; |
| 332 params[PermissionDecisionAutoBlocker::kPromptDismissCountKey] = "5"; | 334 params[PermissionDecisionAutoBlocker::kPromptDismissCountKey] = "5"; |
| 333 ASSERT_TRUE(variations::AssociateVariationParams( | 335 ASSERT_TRUE(variations::AssociateVariationParams( |
| 334 kPromptTrialName, kPromptGroupName, params)); | 336 kPromptTrialName, kPromptGroupName, params)); |
| 335 | 337 |
| 336 base::FeatureList::ClearInstanceForTesting(); | 338 std::unique_ptr<base::FeatureList> feature_list = |
| 337 std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); | 339 base::MakeUnique<base::FeatureList>(); |
| 338 feature_list->RegisterFieldTrialOverride( | 340 feature_list->RegisterFieldTrialOverride( |
| 339 features::kBlockPromptsIfDismissedOften.name, | 341 features::kBlockPromptsIfDismissedOften.name, |
| 340 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial); | 342 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial); |
| 341 base::FeatureList::SetInstance(std::move(feature_list)); | 343 |
| 344 base::test::ScopedFeatureList scoped_feature_list; |
| 345 scoped_feature_list.InitWithFeatureList(std::move(feature_list)); |
| 346 |
| 342 EXPECT_EQ(base::FeatureList::GetFieldTrial( | 347 EXPECT_EQ(base::FeatureList::GetFieldTrial( |
| 343 features::kBlockPromptsIfDismissedOften), | 348 features::kBlockPromptsIfDismissedOften), |
| 344 trial); | 349 trial); |
| 345 | 350 |
| 346 std::map<std::string, std::string> actualParams; | 351 { |
| 347 EXPECT_TRUE(variations::GetVariationParamsByFeature( | 352 std::map<std::string, std::string> actual_params; |
| 348 features::kBlockPromptsIfDismissedOften, &actualParams)); | 353 EXPECT_TRUE(variations::GetVariationParamsByFeature( |
| 349 EXPECT_EQ(params, actualParams); | 354 features::kBlockPromptsIfDismissedOften, &actual_params)); |
| 355 EXPECT_EQ(params, actual_params); |
| 356 } |
| 350 | 357 |
| 351 for (uint32_t i = 0; i < 5; ++i) { | 358 for (uint32_t i = 0; i < 5; ++i) { |
| 352 TestPermissionContext permission_context( | 359 TestPermissionContext permission_context( |
| 353 profile(), content::PermissionType::MIDI_SYSEX, | 360 profile(), content::PermissionType::MIDI_SYSEX, |
| 354 CONTENT_SETTINGS_TYPE_MIDI_SYSEX); | 361 CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
| 355 | 362 |
| 356 ContentSetting expected = | 363 ContentSetting expected = |
| 357 (i < 4) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK; | 364 (i < 4) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK; |
| 358 const PermissionRequestID id( | 365 const PermissionRequestID id( |
| 359 web_contents()->GetRenderProcessHost()->GetID(), | 366 web_contents()->GetRenderProcessHost()->GetID(), |
| 360 web_contents()->GetMainFrame()->GetRoutingID(), i); | 367 web_contents()->GetMainFrame()->GetRoutingID(), i); |
| 361 permission_context.RequestPermission( | 368 permission_context.RequestPermission( |
| 362 web_contents(), id, url, true /* user_gesture */, | 369 web_contents(), id, url, true /* user_gesture */, |
| 363 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 370 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 364 base::Unretained(&permission_context))); | 371 base::Unretained(&permission_context))); |
| 365 | 372 |
| 366 RespondToPermission(&permission_context, id, url, false, /* persist */ | 373 RespondToPermission(&permission_context, id, url, false, /* persist */ |
| 367 CONTENT_SETTING_ASK); | 374 CONTENT_SETTING_ASK); |
| 368 EXPECT_EQ(1u, permission_context.decisions().size()); | 375 EXPECT_EQ(1u, permission_context.decisions().size()); |
| 369 EXPECT_EQ(expected, permission_context.decisions()[0]); | 376 ASSERT_EQ(expected, permission_context.decisions()[0]); |
| 370 EXPECT_TRUE(permission_context.tab_context_updated()); | 377 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 371 EXPECT_EQ(expected, | 378 EXPECT_EQ(expected, |
| 372 permission_context.GetContentSettingFromMap(url, url)); | 379 permission_context.GetContentSettingFromMap(url, url)); |
| 373 | 380 |
| 374 histograms.ExpectTotalCount( | 381 histograms.ExpectTotalCount( |
| 375 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1); | 382 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1); |
| 376 histograms.ExpectBucketCount( | 383 histograms.ExpectBucketCount( |
| 377 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1); | 384 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1); |
| 378 } | 385 } |
| 379 | 386 |
| 380 // Ensure that we finish in the block state. | 387 // Ensure that we finish in the block state. |
| 381 TestPermissionContext permission_context( | 388 TestPermissionContext permission_context( |
| 382 profile(), content::PermissionType::MIDI_SYSEX, | 389 profile(), content::PermissionType::MIDI_SYSEX, |
| 383 CONTENT_SETTINGS_TYPE_MIDI_SYSEX); | 390 CONTENT_SETTINGS_TYPE_MIDI_SYSEX); |
| 384 EXPECT_EQ(CONTENT_SETTING_BLOCK, | 391 EXPECT_EQ(CONTENT_SETTING_BLOCK, |
| 385 permission_context.GetContentSettingFromMap(url, url)); | 392 permission_context.GetContentSettingFromMap(url, url)); |
| 386 base::FeatureList::ClearInstanceForTesting(); | |
| 387 variations::testing::ClearAllVariationParams(); | 393 variations::testing::ClearAllVariationParams(); |
| 388 } | 394 } |
| 389 | 395 |
| 390 void TestRequestPermissionInvalidUrl( | 396 void TestRequestPermissionInvalidUrl( |
| 391 content::PermissionType permission_type, | 397 content::PermissionType permission_type, |
| 392 ContentSettingsType content_settings_type) { | 398 ContentSettingsType content_settings_type) { |
| 393 TestPermissionContext permission_context(profile(), permission_type, | 399 TestPermissionContext permission_context(profile(), permission_type, |
| 394 content_settings_type); | 400 content_settings_type); |
| 395 GURL url; | 401 GURL url; |
| 396 ASSERT_FALSE(url.is_valid()); | 402 ASSERT_FALSE(url.is_valid()); |
| 397 NavigateAndCommit(url); | 403 NavigateAndCommit(url); |
| 398 | 404 |
| 399 const PermissionRequestID id( | 405 const PermissionRequestID id( |
| 400 web_contents()->GetRenderProcessHost()->GetID(), | 406 web_contents()->GetRenderProcessHost()->GetID(), |
| 401 web_contents()->GetMainFrame()->GetRoutingID(), | 407 web_contents()->GetMainFrame()->GetRoutingID(), |
| 402 -1); | 408 -1); |
| 403 permission_context.RequestPermission( | 409 permission_context.RequestPermission( |
| 404 web_contents(), | 410 web_contents(), |
| 405 id, url, true /* user_gesture */, | 411 id, url, true /* user_gesture */, |
| 406 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 412 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 407 base::Unretained(&permission_context))); | 413 base::Unretained(&permission_context))); |
| 408 | 414 |
| 409 EXPECT_EQ(1u, permission_context.decisions().size()); | 415 ASSERT_EQ(1u, permission_context.decisions().size()); |
| 410 EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.decisions()[0]); | 416 EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.decisions()[0]); |
| 411 EXPECT_TRUE(permission_context.tab_context_updated()); | 417 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 412 EXPECT_EQ(CONTENT_SETTING_ASK, | 418 EXPECT_EQ(CONTENT_SETTING_ASK, |
| 413 permission_context.GetContentSettingFromMap(url, url)); | 419 permission_context.GetContentSettingFromMap(url, url)); |
| 414 } | 420 } |
| 415 | 421 |
| 416 void TestGrantAndRevoke_TestContent(content::PermissionType permission_type, | 422 void TestGrantAndRevoke_TestContent(content::PermissionType permission_type, |
| 417 ContentSettingsType content_settings_type, | 423 ContentSettingsType content_settings_type, |
| 418 ContentSetting expected_default) { | 424 ContentSetting expected_default) { |
| 419 TestPermissionContext permission_context(profile(), permission_type, | 425 TestPermissionContext permission_context(profile(), permission_type, |
| 420 content_settings_type); | 426 content_settings_type); |
| 421 GURL url("https://www.google.com"); | 427 GURL url("https://www.google.com"); |
| 422 NavigateAndCommit(url); | 428 NavigateAndCommit(url); |
| 423 | 429 |
| 424 const PermissionRequestID id( | 430 const PermissionRequestID id( |
| 425 web_contents()->GetRenderProcessHost()->GetID(), | 431 web_contents()->GetRenderProcessHost()->GetID(), |
| 426 web_contents()->GetMainFrame()->GetRoutingID(), | 432 web_contents()->GetMainFrame()->GetRoutingID(), |
| 427 -1); | 433 -1); |
| 428 permission_context.RequestPermission( | 434 permission_context.RequestPermission( |
| 429 web_contents(), | 435 web_contents(), |
| 430 id, url, true /* user_gesture */, | 436 id, url, true /* user_gesture */, |
| 431 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 437 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 432 base::Unretained(&permission_context))); | 438 base::Unretained(&permission_context))); |
| 433 | 439 |
| 434 RespondToPermission(&permission_context, id, url, true, /* persist */ | 440 RespondToPermission(&permission_context, id, url, true, /* persist */ |
| 435 CONTENT_SETTING_ALLOW); | 441 CONTENT_SETTING_ALLOW); |
| 436 EXPECT_EQ(1u, permission_context.decisions().size()); | 442 ASSERT_EQ(1u, permission_context.decisions().size()); |
| 437 EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]); | 443 EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]); |
| 438 EXPECT_TRUE(permission_context.tab_context_updated()); | 444 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 439 EXPECT_EQ(CONTENT_SETTING_ALLOW, | 445 EXPECT_EQ(CONTENT_SETTING_ALLOW, |
| 440 permission_context.GetContentSettingFromMap(url, url)); | 446 permission_context.GetContentSettingFromMap(url, url)); |
| 441 | 447 |
| 442 // Try to reset permission. | 448 // Try to reset permission. |
| 443 permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin()); | 449 permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin()); |
| 444 ContentSetting setting_after_reset = | 450 ContentSetting setting_after_reset = |
| 445 permission_context.GetContentSettingFromMap(url, url); | 451 permission_context.GetContentSettingFromMap(url, url); |
| 446 ContentSetting default_setting = | 452 ContentSetting default_setting = |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 492 web_contents(), id1, url, true /* user_gesture */, | 498 web_contents(), id1, url, true /* user_gesture */, |
| 493 base::Bind(&TestPermissionContext::TrackPermissionDecision, | 499 base::Bind(&TestPermissionContext::TrackPermissionDecision, |
| 494 base::Unretained(&permission_context))); | 500 base::Unretained(&permission_context))); |
| 495 | 501 |
| 496 EXPECT_EQ(0u, permission_context.decisions().size()); | 502 EXPECT_EQ(0u, permission_context.decisions().size()); |
| 497 | 503 |
| 498 bool persist = (response == CONTENT_SETTING_ALLOW || | 504 bool persist = (response == CONTENT_SETTING_ALLOW || |
| 499 response == CONTENT_SETTING_BLOCK); | 505 response == CONTENT_SETTING_BLOCK); |
| 500 RespondToPermission(&permission_context, id0, url, persist, response); | 506 RespondToPermission(&permission_context, id0, url, persist, response); |
| 501 | 507 |
| 502 EXPECT_EQ(2u, permission_context.decisions().size()); | 508 ASSERT_EQ(2u, permission_context.decisions().size()); |
| 503 EXPECT_EQ(response, permission_context.decisions()[0]); | 509 EXPECT_EQ(response, permission_context.decisions()[0]); |
| 504 EXPECT_EQ(response, permission_context.decisions()[1]); | 510 EXPECT_EQ(response, permission_context.decisions()[1]); |
| 505 EXPECT_TRUE(permission_context.tab_context_updated()); | 511 EXPECT_TRUE(permission_context.tab_context_updated()); |
| 506 | 512 |
| 507 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url)); | 513 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url)); |
| 508 } | 514 } |
| 509 | 515 |
| 510 private: | 516 private: |
| 511 // ChromeRenderViewHostTestHarness: | 517 // ChromeRenderViewHostTestHarness: |
| 512 void SetUp() override { | 518 void SetUp() override { |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 656 TestParallelRequests(CONTENT_SETTING_ALLOW); | 662 TestParallelRequests(CONTENT_SETTING_ALLOW); |
| 657 } | 663 } |
| 658 | 664 |
| 659 TEST_F(PermissionContextBaseTests, TestParallelRequestsBlocked) { | 665 TEST_F(PermissionContextBaseTests, TestParallelRequestsBlocked) { |
| 660 TestParallelRequests(CONTENT_SETTING_BLOCK); | 666 TestParallelRequests(CONTENT_SETTING_BLOCK); |
| 661 } | 667 } |
| 662 | 668 |
| 663 TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) { | 669 TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) { |
| 664 TestParallelRequests(CONTENT_SETTING_ASK); | 670 TestParallelRequests(CONTENT_SETTING_ASK); |
| 665 } | 671 } |
| OLD | NEW |