blob: 66fd0c2934fe6765daf6f490ab5352b07cb34a6f [file] [log] [blame]
[email protected]89a8dd5d2014-07-11 12:02:071// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
lalitmca47d9c42015-07-08 13:48:145#include "chrome/browser/permissions/permission_context_base.h"
[email protected]89a8dd5d2014-07-11 12:02:076
thestig9bdf7f22016-09-28 00:56:207#include <map>
meredithl62b8c3d2017-01-10 05:47:538#include <set>
thestig9bdf7f22016-09-28 00:56:209#include <string>
10#include <utility>
johnme7fa91f72016-01-29 22:13:4411#include <vector>
12
[email protected]89a8dd5d2014-07-11 12:02:0713#include "base/bind.h"
dominickn6947d752016-08-10 02:00:0614#include "base/feature_list.h"
avib896c712015-12-26 02:10:4315#include "base/macros.h"
kcarattini2ee48ad52015-10-26 23:45:3116#include "base/metrics/field_trial.h"
Robbie McElrathf7632532019-01-10 19:22:0617#include "base/metrics/field_trial_params.h"
meredithl62b8c3d2017-01-10 05:47:5318#include "base/run_loop.h"
Devlin Cronin626d80c2018-06-01 01:08:3619#include "base/test/metrics/histogram_tester.h"
kcarattini2ee48ad52015-10-26 23:45:3120#include "base/test/mock_entropy_provider.h"
dominicknc2726ec2016-09-15 12:15:3921#include "base/test/scoped_feature_list.h"
avib896c712015-12-26 02:10:4322#include "build/build_config.h"
peconn5100d432015-09-16 12:03:0823#include "chrome/browser/content_settings/host_content_settings_map_factory.h"
dominickn6947d752016-08-10 02:00:0624#include "chrome/browser/permissions/permission_decision_auto_blocker.h"
Patricia Loracc56f72017-07-04 01:21:5625#include "chrome/browser/permissions/permission_manager.h"
mlamouridfbf5692015-06-06 18:53:4126#include "chrome/browser/permissions/permission_request_id.h"
timloh90e8cec2017-05-22 04:26:1927#include "chrome/browser/permissions/permission_request_manager.h"
dominickn79b96cc2017-02-14 04:14:2128#include "chrome/browser/permissions/permission_uma_util.h"
kcarattini2ee48ad52015-10-26 23:45:3129#include "chrome/browser/permissions/permission_util.h"
timloh86d8eaf2017-05-09 03:43:0930#include "chrome/browser/ui/permission_bubble/mock_permission_prompt_factory.h"
dominickn6947d752016-08-10 02:00:0631#include "chrome/common/chrome_features.h"
felt88bf98cb2014-12-16 03:50:2332#include "chrome/common/chrome_switches.h"
[email protected]89a8dd5d2014-07-11 12:02:0733#include "chrome/test/base/chrome_render_view_host_test_harness.h"
34#include "chrome/test/base/testing_profile.h"
mukai8eaec822014-10-25 17:53:1635#include "components/content_settings/core/browser/host_content_settings_map.h"
mukai077089f2014-09-11 18:41:5236#include "components/content_settings/core/common/content_settings.h"
[email protected]08f71012014-07-25 10:27:5437#include "components/content_settings/core/common/content_settings_types.h"
Yao Xiaoadefb8e2019-05-24 18:49:1138#include "components/ukm/content/source_url_recorder.h"
39#include "components/ukm/test_ukm_recorder.h"
kcarattini2ee48ad52015-10-26 23:45:3140#include "components/variations/variations_associated_data.h"
meredithl62b8c3d2017-01-10 05:47:5341#include "content/public/browser/browser_thread.h"
Robert Ogden24375242018-10-05 21:16:2642#include "content/public/browser/navigation_entry.h"
mlamouri5fc460f2015-06-03 17:30:2843#include "content/public/browser/render_frame_host.h"
[email protected]89a8dd5d2014-07-11 12:02:0744#include "content/public/browser/web_contents.h"
45#include "content/public/test/mock_render_process_host.h"
[email protected]89a8dd5d2014-07-11 12:02:0746#include "testing/gtest/include/gtest/gtest.h"
47
thestig9bdf7f22016-09-28 00:56:2048const char* const kPermissionsKillSwitchFieldStudy =
kcarattini2ee48ad52015-10-26 23:45:3149 PermissionContextBase::kPermissionsKillSwitchFieldStudy;
thestig9bdf7f22016-09-28 00:56:2050const char* const kPermissionsKillSwitchBlockedValue =
kcarattini2ee48ad52015-10-26 23:45:3151 PermissionContextBase::kPermissionsKillSwitchBlockedValue;
52const char kPermissionsKillSwitchTestGroup[] = "TestGroup";
kcarattini2ee48ad52015-10-26 23:45:3153
[email protected]89a8dd5d2014-07-11 12:02:0754class TestPermissionContext : public PermissionContextBase {
55 public:
56 TestPermissionContext(Profile* profile,
lshang88ec36a2015-12-09 04:50:1757 const ContentSettingsType content_settings_type)
raymes21b9affc2017-05-31 06:15:2658 : PermissionContextBase(profile,
59 content_settings_type,
Luna Lu730f283f2018-02-08 16:38:0360 blink::mojom::FeaturePolicyFeature::kNotFound),
dominickn6947d752016-08-10 02:00:0661 tab_context_updated_(false) {}
[email protected]89a8dd5d2014-07-11 12:02:0762
Daniel Chenga542fca2014-10-21 09:51:2963 ~TestPermissionContext() override {}
[email protected]89a8dd5d2014-07-11 12:02:0764
thestig9bdf7f22016-09-28 00:56:2065 const std::vector<ContentSetting>& decisions() const { return decisions_; }
[email protected]89a8dd5d2014-07-11 12:02:0766
thestig9bdf7f22016-09-28 00:56:2067 bool tab_context_updated() const { return tab_context_updated_; }
[email protected]89a8dd5d2014-07-11 12:02:0768
meredithl62b8c3d2017-01-10 05:47:5369 // Once a decision for the requested permission has been made, run the
70 // callback.
mlamouridf357a312015-03-03 17:34:0571 void TrackPermissionDecision(ContentSetting content_setting) {
johnme7fa91f72016-01-29 22:13:4472 decisions_.push_back(content_setting);
meredithl62b8c3d2017-01-10 05:47:5373 // Null check required here as the quit_closure_ can also be run and reset
74 // first from within DecidePermission.
75 if (quit_closure_) {
76 quit_closure_.Run();
77 quit_closure_.Reset();
78 }
[email protected]89a8dd5d2014-07-11 12:02:0779 }
80
johnmec41dfee2016-01-13 14:35:1681 ContentSetting GetContentSettingFromMap(const GURL& url_a,
82 const GURL& url_b) {
thestig9bdf7f22016-09-28 00:56:2083 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
84 return map->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(),
cm.sanchi761e67a2017-11-16 08:23:2885 content_settings_type(), std::string());
johnmec41dfee2016-01-13 14:35:1686 }
87
meredithl62b8c3d2017-01-10 05:47:5388 void RequestPermission(content::WebContents* web_contents,
89 const PermissionRequestID& id,
90 const GURL& requesting_frame,
91 bool user_gesture,
danakj47c8fb52019-05-02 16:34:3692 BrowserPermissionCallback callback) override {
meredithl62b8c3d2017-01-10 05:47:5393 base::RunLoop run_loop;
94 quit_closure_ = run_loop.QuitClosure();
95 PermissionContextBase::RequestPermission(web_contents, id, requesting_frame,
danakj47c8fb52019-05-02 16:34:3696 true /* user_gesture */,
97 std::move(callback));
meredithl62b8c3d2017-01-10 05:47:5398 run_loop.Run();
99 }
100
101 void DecidePermission(content::WebContents* web_contents,
102 const PermissionRequestID& id,
103 const GURL& requesting_origin,
104 const GURL& embedding_origin,
105 bool user_gesture,
danakj47c8fb52019-05-02 16:34:36106 BrowserPermissionCallback callback) override {
meredithl62b8c3d2017-01-10 05:47:53107 PermissionContextBase::DecidePermission(web_contents, id, requesting_origin,
108 embedding_origin, user_gesture,
danakj47c8fb52019-05-02 16:34:36109 std::move(callback));
meredithl62b8c3d2017-01-10 05:47:53110 if (respond_permission_) {
111 respond_permission_.Run();
112 respond_permission_.Reset();
113 } else {
114 // Stop the run loop from spinning indefinitely if no response callback
115 // has been set, as is the case with TestParallelRequests.
116 quit_closure_.Run();
117 quit_closure_.Reset();
118 }
119 }
120
meredithl03b12852017-01-25 05:08:01121 // Set the callback to run if the permission is being responded to in the
122 // test. This is left empty where no response is needed, such as in parallel
Timothy Loh8fbdac52018-03-15 03:34:30123 // requests, invalid origin, and killswitch.
meredithl62b8c3d2017-01-10 05:47:53124 void SetRespondPermissionCallback(base::Closure callback) {
125 respond_permission_ = callback;
126 }
127
[email protected]89a8dd5d2014-07-11 12:02:07128 protected:
Daniel Chenga542fca2014-10-21 09:51:29129 void UpdateTabContext(const PermissionRequestID& id,
130 const GURL& requesting_origin,
131 bool allowed) override {
[email protected]89a8dd5d2014-07-11 12:02:07132 tab_context_updated_ = true;
133 }
134
dominickn2e27dea2017-02-23 23:00:25135 bool IsRestrictedToSecureOrigins() const override { return false; }
mlamouria31c6ff12015-06-01 15:40:52136
[email protected]89a8dd5d2014-07-11 12:02:07137 private:
johnme7fa91f72016-01-29 22:13:44138 std::vector<ContentSetting> decisions_;
139 bool tab_context_updated_;
meredithl62b8c3d2017-01-10 05:47:53140 base::Closure quit_closure_;
141 // Callback for responding to a permission once the request has been completed
Timothy Loh8fbdac52018-03-15 03:34:30142 // (valid URL, kill switch disabled)
meredithl62b8c3d2017-01-10 05:47:53143 base::Closure respond_permission_;
thestig9bdf7f22016-09-28 00:56:20144 DISALLOW_COPY_AND_ASSIGN(TestPermissionContext);
dominickn6947d752016-08-10 02:00:06145};
146
147class TestKillSwitchPermissionContext : public TestPermissionContext {
148 public:
149 TestKillSwitchPermissionContext(
150 Profile* profile,
dominickn6947d752016-08-10 02:00:06151 const ContentSettingsType content_settings_type)
timloh9a180ad2017-02-20 07:15:23152 : TestPermissionContext(profile, content_settings_type),
Jinho Bang5f1795e2018-01-22 11:49:19153 field_trial_list_(std::make_unique<base::FieldTrialList>(
154 std::make_unique<base::MockEntropyProvider>())) {}
dominickn6947d752016-08-10 02:00:06155
156 void ResetFieldTrialList() {
157 // Destroy the existing FieldTrialList before creating a new one to avoid
158 // a DCHECK.
159 field_trial_list_.reset();
Jinho Bang5f1795e2018-01-22 11:49:19160 field_trial_list_ = std::make_unique<base::FieldTrialList>(
161 std::make_unique<base::MockEntropyProvider>());
dominickn6947d752016-08-10 02:00:06162 variations::testing::ClearAllVariationParams();
163 }
164
165 private:
dcheng4af48582016-04-19 00:29:35166 std::unique_ptr<base::FieldTrialList> field_trial_list_;
thestig9bdf7f22016-09-28 00:56:20167
168 DISALLOW_COPY_AND_ASSIGN(TestKillSwitchPermissionContext);
[email protected]89a8dd5d2014-07-11 12:02:07169};
170
Timothy Loh246355d2017-08-18 05:10:30171class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
felt88bf98cb2014-12-16 03:50:23172 protected:
173 PermissionContextBaseTests() {}
thestig9bdf7f22016-09-28 00:56:20174 ~PermissionContextBaseTests() override {}
felt88bf98cb2014-12-16 03:50:23175
Timothy Loh246355d2017-08-18 05:10:30176 // Accept or dismiss the permission prompt.
felt88bf98cb2014-12-16 03:50:23177 void RespondToPermission(TestPermissionContext* context,
178 const PermissionRequestID& id,
179 const GURL& url,
johnme7fa91f72016-01-29 22:13:44180 ContentSetting response) {
181 DCHECK(response == CONTENT_SETTING_ALLOW ||
182 response == CONTENT_SETTING_BLOCK ||
183 response == CONTENT_SETTING_ASK);
Timothy Loh246355d2017-08-18 05:10:30184 using AutoResponseType = PermissionRequestManager::AutoResponseType;
185 AutoResponseType decision = AutoResponseType::DISMISS;
186 if (response == CONTENT_SETTING_ALLOW)
187 decision = AutoResponseType::ACCEPT_ALL;
188 else if (response == CONTENT_SETTING_BLOCK)
189 decision = AutoResponseType::DENY_ALL;
190 prompt_factory_->set_response_type(decision);
felt88bf98cb2014-12-16 03:50:23191 }
192
timloh9a180ad2017-02-20 07:15:23193 void TestAskAndDecide_TestContent(ContentSettingsType content_settings_type,
Timothy Lohf4caae012017-11-27 05:36:00194 ContentSetting decision) {
Yao Xiaoadefb8e2019-05-24 18:49:11195 ukm::InitializeSourceUrlRecorderForWebContents(web_contents());
196 ukm::TestAutoSetUkmRecorder ukm_recorder;
timloh9a180ad2017-02-20 07:15:23197 TestPermissionContext permission_context(profile(), content_settings_type);
dominicknd4e446a2016-09-13 07:44:13198 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09199 SetUpUrl(url);
dominickn6da2b382016-08-23 20:21:30200 base::HistogramTester histograms;
felt88bf98cb2014-12-16 03:50:23201
202 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09203 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25204 web_contents()->GetMainFrame()->GetRoutingID(), -1);
Timothy Lohf4caae012017-11-27 05:36:00205 permission_context.SetRespondPermissionCallback(base::Bind(
206 &PermissionContextBaseTests::RespondToPermission,
207 base::Unretained(this), &permission_context, id, url, decision));
felt88bf98cb2014-12-16 03:50:23208 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25209 web_contents(), id, url, true /* user_gesture */,
felt88bf98cb2014-12-16 03:50:23210 base::Bind(&TestPermissionContext::TrackPermissionDecision,
211 base::Unretained(&permission_context)));
thestig9bdf7f22016-09-28 00:56:20212 ASSERT_EQ(1u, permission_context.decisions().size());
dominicknd4e446a2016-09-13 07:44:13213 EXPECT_EQ(decision, permission_context.decisions()[0]);
felt88bf98cb2014-12-16 03:50:23214 EXPECT_TRUE(permission_context.tab_context_updated());
dominickn6da2b382016-08-23 20:21:30215
thestig9bdf7f22016-09-28 00:56:20216 std::string decision_string;
Yao Xiaoadefb8e2019-05-24 18:49:11217 base::Optional<PermissionAction> action;
218 if (decision == CONTENT_SETTING_ALLOW) {
dominicknd4e446a2016-09-13 07:44:13219 decision_string = "Accepted";
Yao Xiaoadefb8e2019-05-24 18:49:11220 action = PermissionAction::GRANTED;
221 } else if (decision == CONTENT_SETTING_BLOCK) {
dominicknd4e446a2016-09-13 07:44:13222 decision_string = "Denied";
Yao Xiaoadefb8e2019-05-24 18:49:11223 action = PermissionAction::DENIED;
224 } else if (decision == CONTENT_SETTING_ASK) {
dominicknd4e446a2016-09-13 07:44:13225 decision_string = "Dismissed";
Yao Xiaoadefb8e2019-05-24 18:49:11226 action = PermissionAction::DISMISSED;
227 }
felt88bf98cb2014-12-16 03:50:23228
Zinovy Nisdcc844d2019-02-28 07:11:29229 if (!decision_string.empty()) {
dominicknd4e446a2016-09-13 07:44:13230 histograms.ExpectUniqueSample(
231 "Permissions.Prompt." + decision_string + ".PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23232 PermissionUtil::GetPermissionString(content_settings_type),
dominicknd4e446a2016-09-13 07:44:13233 0, 1);
234 histograms.ExpectUniqueSample(
235 "Permissions.Prompt." + decision_string + ".PriorIgnoreCount." +
timloh9a180ad2017-02-20 07:15:23236 PermissionUtil::GetPermissionString(content_settings_type),
dominicknd4e446a2016-09-13 07:44:13237 0, 1);
238 }
felt88bf98cb2014-12-16 03:50:23239
Timothy Lohf4caae012017-11-27 05:36:00240 EXPECT_EQ(decision, permission_context.GetContentSettingFromMap(url, url));
dominickn79b96cc2017-02-14 04:14:21241
dominickn23913152017-02-23 12:04:02242 histograms.ExpectUniqueSample(
243 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25244 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), 1);
245 histograms.ExpectUniqueSample(
246 "Permissions.AutoBlocker.EmbargoStatus",
247 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), 1);
Yao Xiaoadefb8e2019-05-24 18:49:11248
249 if (action.has_value()) {
250 auto entries = ukm_recorder.GetEntriesByName("Permission");
251 EXPECT_EQ(1u, entries.size());
252 auto* entry = entries.front();
253 ukm_recorder.ExpectEntrySourceHasUrl(entry, url);
254
255 EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Source"),
256 static_cast<int64_t>(PermissionSourceUI::PROMPT));
257 EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "PermissionType"),
258 static_cast<int64_t>(content_settings_type));
259 EXPECT_EQ(*ukm_recorder.GetEntryMetric(entry, "Action"),
260 static_cast<int64_t>(action.value()));
261 }
felt88bf98cb2014-12-16 03:50:23262 }
263
dominickn6947d752016-08-10 02:00:06264 void DismissMultipleTimesAndExpectBlock(
265 const GURL& url,
dominickn6947d752016-08-10 02:00:06266 ContentSettingsType content_settings_type,
267 uint32_t iterations) {
268 base::HistogramTester histograms;
269
270 // Dismiss |iterations| times. The final dismiss should change the decision
271 // from dismiss to block, and hence change the persisted content setting.
272 for (uint32_t i = 0; i < iterations; ++i) {
timloh9a180ad2017-02-20 07:15:23273 TestPermissionContext permission_context(profile(),
274 content_settings_type);
dominickn6947d752016-08-10 02:00:06275 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09276 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn6947d752016-08-10 02:00:06277 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53278
279 permission_context.SetRespondPermissionCallback(
280 base::Bind(&PermissionContextBaseTests::RespondToPermission,
281 base::Unretained(this), &permission_context, id, url,
Timothy Lohf4caae012017-11-27 05:36:00282 CONTENT_SETTING_ASK));
meredithl62b8c3d2017-01-10 05:47:53283
dominickn6947d752016-08-10 02:00:06284 permission_context.RequestPermission(
285 web_contents(), id, url, true /* user_gesture */,
286 base::Bind(&TestPermissionContext::TrackPermissionDecision,
dominickn2e27dea2017-02-23 23:00:25287 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06288 histograms.ExpectTotalCount(
dominickn6da2b382016-08-23 20:21:30289 "Permissions.Prompt.Dismissed.PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23290 PermissionUtil::GetPermissionString(content_settings_type),
dominickn6947d752016-08-10 02:00:06291 i + 1);
dominickn6da2b382016-08-23 20:21:30292 histograms.ExpectBucketCount(
293 "Permissions.Prompt.Dismissed.PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23294 PermissionUtil::GetPermissionString(content_settings_type),
dominickn6da2b382016-08-23 20:21:30295 i, 1);
dominickn23913152017-02-23 12:04:02296
Timothy Loh246355d2017-08-18 05:10:30297 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
298 i + 1);
dominickn23913152017-02-23 12:04:02299
raymesf6104d492017-03-09 01:20:18300 PermissionResult result = permission_context.GetPermissionStatus(
301 nullptr /* render_frame_host */, url, url);
dominickn23913152017-02-23 12:04:02302
303 histograms.ExpectUniqueSample(
304 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25305 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21306 if (i < 2) {
dominickn23913152017-02-23 12:04:02307 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
308 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
Timothy Loh246355d2017-08-18 05:10:30309 histograms.ExpectUniqueSample(
310 "Permissions.AutoBlocker.EmbargoStatus",
311 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21312 } else {
dominickn23913152017-02-23 12:04:02313 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
314 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
Timothy Loh246355d2017-08-18 05:10:30315 histograms.ExpectBucketCount(
316 "Permissions.AutoBlocker.EmbargoStatus",
317 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn79b96cc2017-02-14 04:14:21318 }
319
thestig9bdf7f22016-09-28 00:56:20320 ASSERT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21321 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06322 EXPECT_TRUE(permission_context.tab_context_updated());
dominickn6947d752016-08-10 02:00:06323 }
324
timloh9a180ad2017-02-20 07:15:23325 TestPermissionContext permission_context(profile(), content_settings_type);
meredithl03b12852017-01-25 05:08:01326 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09327 web_contents()->GetMainFrame()->GetProcess()->GetID(),
meredithl03b12852017-01-25 05:08:01328 web_contents()->GetMainFrame()->GetRoutingID(), -1);
329
330 permission_context.SetRespondPermissionCallback(
331 base::Bind(&PermissionContextBaseTests::RespondToPermission,
Timothy Lohf4caae012017-11-27 05:36:00332 base::Unretained(this), &permission_context, id, url,
meredithl03b12852017-01-25 05:08:01333 CONTENT_SETTING_ASK));
334
335 permission_context.RequestPermission(
336 web_contents(), id, url, true /* user_gesture */,
337 base::Bind(&TestPermissionContext::TrackPermissionDecision,
338 base::Unretained(&permission_context)));
meredithlcda94daf2017-01-19 03:03:35339
raymesf6104d492017-03-09 01:20:18340 PermissionResult result = permission_context.GetPermissionStatus(
341 nullptr /* render_frame_host */, url, url);
raymesab359712017-02-15 06:23:25342 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
dominickn23913152017-02-23 12:04:02343 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
344 histograms.ExpectBucketCount(
345 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25346 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn6947d752016-08-10 02:00:06347 }
348
349 void TestBlockOnSeveralDismissals_TestContent() {
350 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09351 SetUpUrl(url);
dominickn6947d752016-08-10 02:00:06352 base::HistogramTester histograms;
353
dominickn5b41f222017-05-11 03:44:26354 {
355 // Ensure that > 3 dismissals behaves correctly when the
356 // BlockPromptsIfDismissedOften feature is off.
357 base::test::ScopedFeatureList feature_list;
Timothy Loh246355d2017-08-18 05:10:30358 feature_list.InitAndDisableFeature(
359 features::kBlockPromptsIfDismissedOften);
dominickn6947d752016-08-10 02:00:06360
dominickn5b41f222017-05-11 03:44:26361 for (uint32_t i = 0; i < 4; ++i) {
362 TestPermissionContext permission_context(
363 profile(), CONTENT_SETTINGS_TYPE_GEOLOCATION);
meredithl62b8c3d2017-01-10 05:47:53364
dominickn5b41f222017-05-11 03:44:26365 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09366 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn5b41f222017-05-11 03:44:26367 web_contents()->GetMainFrame()->GetRoutingID(), i);
368
369 permission_context.SetRespondPermissionCallback(
370 base::Bind(&PermissionContextBaseTests::RespondToPermission,
371 base::Unretained(this), &permission_context, id, url,
Timothy Lohf4caae012017-11-27 05:36:00372 CONTENT_SETTING_ASK));
dominickn5b41f222017-05-11 03:44:26373 permission_context.RequestPermission(
374 web_contents(), id, url, true /* user_gesture */,
375 base::Bind(&TestPermissionContext::TrackPermissionDecision,
376 base::Unretained(&permission_context)));
377 histograms.ExpectTotalCount(
378 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation",
379 i + 1);
380 histograms.ExpectBucketCount(
381 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1);
382 histograms.ExpectUniqueSample(
383 "Permissions.AutoBlocker.EmbargoPromptSuppression",
384 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
Timothy Loh246355d2017-08-18 05:10:30385 histograms.ExpectUniqueSample(
386 "Permissions.AutoBlocker.EmbargoStatus",
387 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21388
dominickn5b41f222017-05-11 03:44:26389 ASSERT_EQ(1u, permission_context.decisions().size());
390 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
391 EXPECT_TRUE(permission_context.tab_context_updated());
392 EXPECT_EQ(CONTENT_SETTING_ASK,
393 permission_context.GetContentSettingFromMap(url, url));
394 }
395
396 // Flush the dismissal counts.
397 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
398 map->ClearSettingsForOneType(
399 CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA);
dominickn6947d752016-08-10 02:00:06400 }
401
dominickn6947d752016-08-10 02:00:06402 EXPECT_TRUE(
403 base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften));
404
405 // Sanity check independence per permission type by checking two of them.
dominickn2e27dea2017-02-23 23:00:25406 DismissMultipleTimesAndExpectBlock(url, CONTENT_SETTINGS_TYPE_GEOLOCATION,
407 3);
408 DismissMultipleTimesAndExpectBlock(url, CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
409 3);
dominickn6947d752016-08-10 02:00:06410 }
411
412 void TestVariationBlockOnSeveralDismissals_TestContent() {
413 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09414 SetUpUrl(url);
dominickn6da2b382016-08-23 20:21:30415 base::HistogramTester histograms;
dominickn6947d752016-08-10 02:00:06416
dominickn6947d752016-08-10 02:00:06417 std::map<std::string, std::string> params;
418 params[PermissionDecisionAutoBlocker::kPromptDismissCountKey] = "5";
thestig9bdf7f22016-09-28 00:56:20419 base::test::ScopedFeatureList scoped_feature_list;
Robbie McElrathf7632532019-01-10 19:22:06420 scoped_feature_list.InitAndEnableFeatureWithParameters(
421 features::kBlockPromptsIfDismissedOften, params);
thestig9bdf7f22016-09-28 00:56:20422
Robbie McElrathf7632532019-01-10 19:22:06423 std::map<std::string, std::string> actual_params;
424 EXPECT_TRUE(base::GetFieldTrialParamsByFeature(
425 features::kBlockPromptsIfDismissedOften, &actual_params));
426 EXPECT_EQ(params, actual_params);
dominickn6947d752016-08-10 02:00:06427
thestig9bdf7f22016-09-28 00:56:20428 {
429 std::map<std::string, std::string> actual_params;
430 EXPECT_TRUE(variations::GetVariationParamsByFeature(
431 features::kBlockPromptsIfDismissedOften, &actual_params));
432 EXPECT_EQ(params, actual_params);
433 }
dominickn6947d752016-08-10 02:00:06434
435 for (uint32_t i = 0; i < 5; ++i) {
436 TestPermissionContext permission_context(
timloh9a180ad2017-02-20 07:15:23437 profile(), CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
dominickn6947d752016-08-10 02:00:06438
dominickn6947d752016-08-10 02:00:06439 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09440 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn6947d752016-08-10 02:00:06441 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53442 permission_context.SetRespondPermissionCallback(
443 base::Bind(&PermissionContextBaseTests::RespondToPermission,
444 base::Unretained(this), &permission_context, id, url,
Timothy Lohf4caae012017-11-27 05:36:00445 CONTENT_SETTING_ASK));
dominickn6947d752016-08-10 02:00:06446 permission_context.RequestPermission(
447 web_contents(), id, url, true /* user_gesture */,
448 base::Bind(&TestPermissionContext::TrackPermissionDecision,
meredithl62b8c3d2017-01-10 05:47:53449 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06450
dominickn6947d752016-08-10 02:00:06451 EXPECT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21452 ASSERT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06453 EXPECT_TRUE(permission_context.tab_context_updated());
raymesf6104d492017-03-09 01:20:18454 PermissionResult result = permission_context.GetPermissionStatus(
455 nullptr /* render_frame_host */, url, url);
dominickn6da2b382016-08-23 20:21:30456
457 histograms.ExpectTotalCount(
458 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1);
459 histograms.ExpectBucketCount(
460 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1);
dominickn23913152017-02-23 12:04:02461 histograms.ExpectUniqueSample(
462 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25463 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
Timothy Loh246355d2017-08-18 05:10:30464 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
465 i + 1);
dominickn79b96cc2017-02-14 04:14:21466 if (i < 4) {
dominickn23913152017-02-23 12:04:02467 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
468 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
Timothy Loh246355d2017-08-18 05:10:30469 histograms.ExpectUniqueSample(
470 "Permissions.AutoBlocker.EmbargoStatus",
471 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21472 } else {
dominickn23913152017-02-23 12:04:02473 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
474 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
Timothy Loh246355d2017-08-18 05:10:30475 histograms.ExpectBucketCount(
476 "Permissions.AutoBlocker.EmbargoStatus",
477 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn79b96cc2017-02-14 04:14:21478 }
dominickn6947d752016-08-10 02:00:06479 }
480
481 // Ensure that we finish in the block state.
timloh9a180ad2017-02-20 07:15:23482 TestPermissionContext permission_context(profile(),
483 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
raymesf6104d492017-03-09 01:20:18484 PermissionResult result = permission_context.GetPermissionStatus(
485 nullptr /* render_frame_host */, url, url);
raymesab359712017-02-15 06:23:25486 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
dominickn23913152017-02-23 12:04:02487 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
dominickn6947d752016-08-10 02:00:06488 variations::testing::ClearAllVariationParams();
489 }
490
lshang88ec36a2015-12-09 04:50:17491 void TestRequestPermissionInvalidUrl(
lshang88ec36a2015-12-09 04:50:17492 ContentSettingsType content_settings_type) {
dominickn23913152017-02-23 12:04:02493 base::HistogramTester histograms;
timloh9a180ad2017-02-20 07:15:23494 TestPermissionContext permission_context(profile(), content_settings_type);
timvolodinea2830552015-01-20 17:21:23495 GURL url;
496 ASSERT_FALSE(url.is_valid());
clamy05ebb4e2017-08-17 18:59:05497 controller().LoadURL(url, content::Referrer(), ui::PAGE_TRANSITION_TYPED,
498 std::string());
timvolodinea2830552015-01-20 17:21:23499
500 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09501 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25502 web_contents()->GetMainFrame()->GetRoutingID(), -1);
timvolodinea2830552015-01-20 17:21:23503 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25504 web_contents(), id, url, true /* user_gesture */,
timvolodinea2830552015-01-20 17:21:23505 base::Bind(&TestPermissionContext::TrackPermissionDecision,
506 base::Unretained(&permission_context)));
507
thestig9bdf7f22016-09-28 00:56:20508 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44509 EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.decisions()[0]);
timvolodinea2830552015-01-20 17:21:23510 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16511 EXPECT_EQ(CONTENT_SETTING_ASK,
512 permission_context.GetContentSettingFromMap(url, url));
dominickn23913152017-02-23 12:04:02513 histograms.ExpectTotalCount(
514 "Permissions.AutoBlocker.EmbargoPromptSuppression", 0);
timvolodinea2830552015-01-20 17:21:23515 }
516
timloh9a180ad2017-02-20 07:15:23517 void TestGrantAndRevoke_TestContent(ContentSettingsType content_settings_type,
timvolodine16be5202015-02-02 17:44:54518 ContentSetting expected_default) {
timloh9a180ad2017-02-20 07:15:23519 TestPermissionContext permission_context(profile(), content_settings_type);
toyoshim9eb573f42015-03-30 10:39:39520 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09521 SetUpUrl(url);
timvolodine16be5202015-02-02 17:44:54522
523 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09524 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25525 web_contents()->GetMainFrame()->GetRoutingID(), -1);
meredithl62b8c3d2017-01-10 05:47:53526 permission_context.SetRespondPermissionCallback(
527 base::Bind(&PermissionContextBaseTests::RespondToPermission,
Timothy Lohf4caae012017-11-27 05:36:00528 base::Unretained(this), &permission_context, id, url,
meredithl62b8c3d2017-01-10 05:47:53529 CONTENT_SETTING_ALLOW));
530
timvolodine16be5202015-02-02 17:44:54531 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25532 web_contents(), id, url, true /* user_gesture */,
timvolodine16be5202015-02-02 17:44:54533 base::Bind(&TestPermissionContext::TrackPermissionDecision,
534 base::Unretained(&permission_context)));
535
thestig9bdf7f22016-09-28 00:56:20536 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44537 EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]);
timvolodine16be5202015-02-02 17:44:54538 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16539 EXPECT_EQ(CONTENT_SETTING_ALLOW,
540 permission_context.GetContentSettingFromMap(url, url));
timvolodine16be5202015-02-02 17:44:54541
542 // Try to reset permission.
543 permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin());
544 ContentSetting setting_after_reset =
johnmec41dfee2016-01-13 14:35:16545 permission_context.GetContentSettingFromMap(url, url);
timvolodine16be5202015-02-02 17:44:54546 ContentSetting default_setting =
peconn5100d432015-09-16 12:03:08547 HostContentSettingsMapFactory::GetForProfile(profile())
lshang88ec36a2015-12-09 04:50:17548 ->GetDefaultContentSetting(content_settings_type, nullptr);
timvolodine16be5202015-02-02 17:44:54549 EXPECT_EQ(default_setting, setting_after_reset);
550 }
551
lshang88ec36a2015-12-09 04:50:17552 void TestGlobalPermissionsKillSwitch(
lshang88ec36a2015-12-09 04:50:17553 ContentSettingsType content_settings_type) {
timloh9a180ad2017-02-20 07:15:23554 TestKillSwitchPermissionContext permission_context(profile(),
555 content_settings_type);
kcarattini2ee48ad52015-10-26 23:45:31556 permission_context.ResetFieldTrialList();
557
558 EXPECT_FALSE(permission_context.IsPermissionKillSwitchOn());
559 std::map<std::string, std::string> params;
timloh9a180ad2017-02-20 07:15:23560 params[PermissionUtil::GetPermissionString(content_settings_type)] =
kcarattini2ee48ad52015-10-26 23:45:31561 kPermissionsKillSwitchBlockedValue;
dominickn2e27dea2017-02-23 23:00:25562 variations::AssociateVariationParams(kPermissionsKillSwitchFieldStudy,
563 kPermissionsKillSwitchTestGroup,
564 params);
kcarattini2ee48ad52015-10-26 23:45:31565 base::FieldTrialList::CreateFieldTrial(kPermissionsKillSwitchFieldStudy,
566 kPermissionsKillSwitchTestGroup);
567 EXPECT_TRUE(permission_context.IsPermissionKillSwitchOn());
568 }
569
johnme7fa91f72016-01-29 22:13:44570 // Don't call this more than once in the same test, as it persists data to
571 // HostContentSettingsMap.
572 void TestParallelRequests(ContentSetting response) {
Ian Vollick7df93832019-07-10 22:51:04573 TestPermissionContext permission_context(profile(),
574 CONTENT_SETTINGS_TYPE_GEOLOCATION);
johnme7fa91f72016-01-29 22:13:44575 GURL url("http://www.google.com");
timloh86d8eaf2017-05-09 03:43:09576 SetUpUrl(url);
johnme7fa91f72016-01-29 22:13:44577
578 const PermissionRequestID id0(
Lukasz Anforowicz1452b892017-09-28 20:10:09579 web_contents()->GetMainFrame()->GetProcess()->GetID(),
johnme7fa91f72016-01-29 22:13:44580 web_contents()->GetMainFrame()->GetRoutingID(), 0);
581 const PermissionRequestID id1(
Lukasz Anforowicz1452b892017-09-28 20:10:09582 web_contents()->GetMainFrame()->GetProcess()->GetID(),
johnme7fa91f72016-01-29 22:13:44583 web_contents()->GetMainFrame()->GetRoutingID(), 1);
584
meredithl62b8c3d2017-01-10 05:47:53585 // Request a permission without setting the callback to DecidePermission.
johnme7fa91f72016-01-29 22:13:44586 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53587 web_contents(), id0, url, true /* user_gesture */,
johnme7fa91f72016-01-29 22:13:44588 base::Bind(&TestPermissionContext::TrackPermissionDecision,
589 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44590
591 EXPECT_EQ(0u, permission_context.decisions().size());
592
meredithl62b8c3d2017-01-10 05:47:53593 // Set the callback, and make a second permission request.
Timothy Lohf4caae012017-11-27 05:36:00594 permission_context.SetRespondPermissionCallback(base::Bind(
595 &PermissionContextBaseTests::RespondToPermission,
596 base::Unretained(this), &permission_context, id0, url, response));
meredithl62b8c3d2017-01-10 05:47:53597 permission_context.RequestPermission(
598 web_contents(), id1, url, true /* user_gesture */,
599 base::Bind(&TestPermissionContext::TrackPermissionDecision,
600 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44601
thestig9bdf7f22016-09-28 00:56:20602 ASSERT_EQ(2u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44603 EXPECT_EQ(response, permission_context.decisions()[0]);
604 EXPECT_EQ(response, permission_context.decisions()[1]);
605 EXPECT_TRUE(permission_context.tab_context_updated());
606
607 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url));
608 }
609
Robert Ogden24375242018-10-05 21:16:26610 void TestVirtualURL(const GURL& loaded_url,
611 const GURL& virtual_url,
612 const ContentSetting want_response,
613 const PermissionStatusSource& want_source) {
Ian Vollick7df93832019-07-10 22:51:04614 TestPermissionContext permission_context(profile(),
615 CONTENT_SETTINGS_TYPE_GEOLOCATION);
Robert Ogden24375242018-10-05 21:16:26616
617 NavigateAndCommit(loaded_url);
618 web_contents()->GetController().GetVisibleEntry()->SetVirtualURL(
619 virtual_url);
620
621 PermissionResult result = permission_context.GetPermissionStatus(
622 web_contents()->GetMainFrame(), virtual_url, virtual_url);
623 EXPECT_EQ(result.content_setting, want_response);
624 EXPECT_EQ(result.source, want_source);
625 }
626
timloh86d8eaf2017-05-09 03:43:09627 void SetUpUrl(const GURL& url) {
628 NavigateAndCommit(url);
Timothy Loh246355d2017-08-18 05:10:30629 prompt_factory_->DocumentOnLoadCompletedInMainFrame();
timloh86d8eaf2017-05-09 03:43:09630 }
631
felt88bf98cb2014-12-16 03:50:23632 private:
633 // ChromeRenderViewHostTestHarness:
dcheng171318362014-12-29 18:31:25634 void SetUp() override {
felt88bf98cb2014-12-16 03:50:23635 ChromeRenderViewHostTestHarness::SetUp();
Timothy Loh246355d2017-08-18 05:10:30636 PermissionRequestManager::CreateForWebContents(web_contents());
637 PermissionRequestManager* manager =
638 PermissionRequestManager::FromWebContents(web_contents());
639 prompt_factory_.reset(new MockPermissionPromptFactory(manager));
felt88bf98cb2014-12-16 03:50:23640 }
641
timloh86d8eaf2017-05-09 03:43:09642 void TearDown() override {
643 prompt_factory_.reset();
644 ChromeRenderViewHostTestHarness::TearDown();
645 }
646
647 std::unique_ptr<MockPermissionPromptFactory> prompt_factory_;
648
felt88bf98cb2014-12-16 03:50:23649 DISALLOW_COPY_AND_ASSIGN(PermissionContextBaseTests);
650};
651
[email protected]89a8dd5d2014-07-11 12:02:07652// Simulates clicking Accept. The permission should be granted and
653// saved for future use.
Timothy Lohf4caae012017-11-27 05:36:00654TEST_F(PermissionContextBaseTests, TestAskAndGrant) {
timloh9a180ad2017-02-20 07:15:23655 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
Timothy Lohf4caae012017-11-27 05:36:00656 CONTENT_SETTING_ALLOW);
dominicknd4e446a2016-09-13 07:44:13657}
658
659// Simulates clicking Block. The permission should be denied and
660// saved for future use.
Timothy Lohf4caae012017-11-27 05:36:00661TEST_F(PermissionContextBaseTests, TestAskAndBlock) {
timloh9a180ad2017-02-20 07:15:23662 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
Timothy Lohf4caae012017-11-27 05:36:00663 CONTENT_SETTING_BLOCK);
timvolodinea2830552015-01-20 17:21:23664}
[email protected]89a8dd5d2014-07-11 12:02:07665
Timothy Loh246355d2017-08-18 05:10:30666// Simulates clicking Dismiss (X) in the prompt.
[email protected]89a8dd5d2014-07-11 12:02:07667// The permission should be denied but not saved for future use.
Timothy Loh246355d2017-08-18 05:10:30668TEST_F(PermissionContextBaseTests, TestAskAndDismiss) {
timloh9a180ad2017-02-20 07:15:23669 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
Timothy Lohf4caae012017-11-27 05:36:00670 CONTENT_SETTING_ASK);
timvolodinea2830552015-01-20 17:21:23671}
672
Timothy Loh246355d2017-08-18 05:10:30673// Simulates clicking Dismiss (X) in the prompt with the block on too
dominickn6947d752016-08-10 02:00:06674// many dismissals feature active. The permission should be blocked after
675// several dismissals.
Timothy Loh246355d2017-08-18 05:10:30676TEST_F(PermissionContextBaseTests, TestDismissUntilBlocked) {
dominickn6947d752016-08-10 02:00:06677 TestBlockOnSeveralDismissals_TestContent();
678}
679
680// Test setting a custom number of dismissals before block via variations.
Timothy Loh246355d2017-08-18 05:10:30681TEST_F(PermissionContextBaseTests, TestDismissVariations) {
dominickn6947d752016-08-10 02:00:06682 TestVariationBlockOnSeveralDismissals_TestContent();
683}
684
timvolodinea2830552015-01-20 17:21:23685// Simulates non-valid requesting URL.
686// The permission should be denied but not saved for future use.
Timothy Loh246355d2017-08-18 05:10:30687TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) {
timloh9a180ad2017-02-20 07:15:23688 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_GEOLOCATION);
689 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
690 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
Xiaohan Wang7b4c0582018-08-24 19:30:50691#if defined(OS_CHROMEOS)
timvolodinea2830552015-01-20 17:21:23692 TestRequestPermissionInvalidUrl(
693 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
694#endif
695}
timvolodine16be5202015-02-02 17:44:54696
timloh90e8cec2017-05-22 04:26:19697// Simulates granting and revoking of permissions.
Timothy Loh246355d2017-08-18 05:10:30698TEST_F(PermissionContextBaseTests, TestGrantAndRevoke) {
timloh9a180ad2017-02-20 07:15:23699 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
timvolodine16be5202015-02-02 17:44:54700 CONTENT_SETTING_ASK);
timloh9a180ad2017-02-20 07:15:23701 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
timvolodine16be5202015-02-02 17:44:54702 CONTENT_SETTING_ASK);
timloh90e8cec2017-05-22 04:26:19703#if defined(OS_ANDROID)
timvolodine16be5202015-02-02 17:44:54704 TestGrantAndRevoke_TestContent(
705 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, CONTENT_SETTING_ASK);
timvolodine16be5202015-02-02 17:44:54706 // TODO(timvolodine): currently no test for
707 // CONTENT_SETTINGS_TYPE_NOTIFICATIONS because notification permissions work
708 // differently with infobars as compared to bubbles (crbug.com/453784).
timloh90e8cec2017-05-22 04:26:19709#else
timloh9a180ad2017-02-20 07:15:23710 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
timvolodine16be5202015-02-02 17:44:54711 CONTENT_SETTING_ASK);
feltcb9e7362015-06-25 00:36:43712#endif
timloh90e8cec2017-05-22 04:26:19713}
kcarattini2ee48ad52015-10-26 23:45:31714
715// Tests the global kill switch by enabling/disabling the Field Trials.
Timothy Loh246355d2017-08-18 05:10:30716TEST_F(PermissionContextBaseTests, TestGlobalKillSwitch) {
timloh9a180ad2017-02-20 07:15:23717 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_GEOLOCATION);
718 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
719 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
timloh9a180ad2017-02-20 07:15:23720 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE);
kcarattini2ee48ad52015-10-26 23:45:31721#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
722 TestGlobalPermissionsKillSwitch(
723 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
724#endif
timloh9a180ad2017-02-20 07:15:23725 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
726 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
kcarattini2ee48ad52015-10-26 23:45:31727}
johnme7fa91f72016-01-29 22:13:44728
Timothy Loh246355d2017-08-18 05:10:30729TEST_F(PermissionContextBaseTests, TestParallelRequestsAllowed) {
johnme7fa91f72016-01-29 22:13:44730 TestParallelRequests(CONTENT_SETTING_ALLOW);
731}
732
Timothy Loh246355d2017-08-18 05:10:30733TEST_F(PermissionContextBaseTests, TestParallelRequestsBlocked) {
johnme7fa91f72016-01-29 22:13:44734 TestParallelRequests(CONTENT_SETTING_BLOCK);
735}
736
Timothy Loh246355d2017-08-18 05:10:30737TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) {
johnme7fa91f72016-01-29 22:13:44738 TestParallelRequests(CONTENT_SETTING_ASK);
739}
Robert Ogden24375242018-10-05 21:16:26740
741TEST_F(PermissionContextBaseTests, TestVirtualURLDifferentOrigin) {
742 TestVirtualURL(GURL("http://www.google.com"), GURL("http://foo.com"),
743 CONTENT_SETTING_BLOCK,
744 PermissionStatusSource::VIRTUAL_URL_DIFFERENT_ORIGIN);
745}
746
747TEST_F(PermissionContextBaseTests, TestVirtualURLNotHTTP) {
748 TestVirtualURL(GURL("chrome://foo"), GURL("chrome://newtab"),
749 CONTENT_SETTING_ASK, PermissionStatusSource::UNSPECIFIED);
750}
751
752TEST_F(PermissionContextBaseTests, TestVirtualURLSameOrigin) {
753 TestVirtualURL(GURL("http://www.google.com"),
754 GURL("http://www.google.com/foo"), CONTENT_SETTING_ASK,
755 PermissionStatusSource::UNSPECIFIED);
756}