blob: 5c6d8140447a51bc3ffe348a6713ced2d647ec56 [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"
robliao79393ffb2016-09-21 18:45:2916#include "base/memory/ptr_util.h"
kcarattini2ee48ad52015-10-26 23:45:3117#include "base/metrics/field_trial.h"
meredithl62b8c3d2017-01-10 05:47:5318#include "base/run_loop.h"
dominickn6947d752016-08-10 02:00:0619#include "base/test/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"
[email protected]89a8dd5d2014-07-11 12:02:0724#include "chrome/browser/infobars/infobar_service.h"
dominickn6947d752016-08-10 02:00:0625#include "chrome/browser/permissions/permission_decision_auto_blocker.h"
kcarattini2ee48ad52015-10-26 23:45:3126#include "chrome/browser/permissions/permission_queue_controller.h"
mlamouridfbf5692015-06-06 18:53:4127#include "chrome/browser/permissions/permission_request_id.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"
dominickn6947d752016-08-10 02:00:0630#include "chrome/common/chrome_features.h"
felt88bf98cb2014-12-16 03:50:2331#include "chrome/common/chrome_switches.h"
[email protected]89a8dd5d2014-07-11 12:02:0732#include "chrome/test/base/chrome_render_view_host_test_harness.h"
33#include "chrome/test/base/testing_profile.h"
mukai8eaec822014-10-25 17:53:1634#include "components/content_settings/core/browser/host_content_settings_map.h"
mukai077089f2014-09-11 18:41:5235#include "components/content_settings/core/common/content_settings.h"
[email protected]08f71012014-07-25 10:27:5436#include "components/content_settings/core/common/content_settings_types.h"
meredithl62b8c3d2017-01-10 05:47:5337#include "components/safe_browsing_db/database_manager.h"
38#include "components/safe_browsing_db/test_database_manager.h"
kcarattini2ee48ad52015-10-26 23:45:3139#include "components/variations/variations_associated_data.h"
meredithl62b8c3d2017-01-10 05:47:5340#include "content/public/browser/browser_thread.h"
lshang88ec36a2015-12-09 04:50:1741#include "content/public/browser/permission_type.h"
mlamouri5fc460f2015-06-03 17:30:2842#include "content/public/browser/render_frame_host.h"
[email protected]89a8dd5d2014-07-11 12:02:0743#include "content/public/browser/web_contents.h"
44#include "content/public/test/mock_render_process_host.h"
[email protected]89a8dd5d2014-07-11 12:02:0745#include "testing/gtest/include/gtest/gtest.h"
46
thestig9bdf7f22016-09-28 00:56:2047#if !defined(OS_ANDROID)
tsergeanta771c23e2016-07-13 04:54:5248#include "chrome/browser/permissions/permission_request_manager.h"
estade6d95d1d2015-10-02 18:55:2349#endif
50
thestig9bdf7f22016-09-28 00:56:2051const char* const kPermissionsKillSwitchFieldStudy =
kcarattini2ee48ad52015-10-26 23:45:3152 PermissionContextBase::kPermissionsKillSwitchFieldStudy;
thestig9bdf7f22016-09-28 00:56:2053const char* const kPermissionsKillSwitchBlockedValue =
kcarattini2ee48ad52015-10-26 23:45:3154 PermissionContextBase::kPermissionsKillSwitchBlockedValue;
55const char kPermissionsKillSwitchTestGroup[] = "TestGroup";
thestig9bdf7f22016-09-28 00:56:2056const char* const kPromptGroupName = kPermissionsKillSwitchTestGroup;
dominickn6947d752016-08-10 02:00:0657const char kPromptTrialName[] = "PermissionPromptsUX";
kcarattini2ee48ad52015-10-26 23:45:3158
meredithl48ad16812017-02-08 03:15:3759namespace {
60
meredithl62b8c3d2017-01-10 05:47:5361class MockSafeBrowsingDatabaseManager
62 : public safe_browsing::TestSafeBrowsingDatabaseManager {
63 public:
64 explicit MockSafeBrowsingDatabaseManager(bool perform_callback)
65 : perform_callback_(perform_callback) {}
66
67 bool CheckApiBlacklistUrl(
68 const GURL& url,
69 safe_browsing::SafeBrowsingDatabaseManager::Client* client) override {
70 if (perform_callback_) {
71 safe_browsing::ThreatMetadata metadata;
72 const auto& blacklisted_permissions = permissions_blacklist_.find(url);
73 if (blacklisted_permissions != permissions_blacklist_.end())
74 metadata.api_permissions = blacklisted_permissions->second;
75 client->OnCheckApiBlacklistUrlResult(url, metadata);
76 }
77 // Returns false if scheme is HTTP/HTTPS and able to be checked.
78 return false;
79 }
80
81 bool CancelApiCheck(Client* client) override {
82 DCHECK(!perform_callback_);
83 // Returns true when client check could be stopped.
84 return true;
85 }
86
87 void BlacklistUrlPermissions(const GURL& url,
88 const std::set<std::string> permissions) {
89 permissions_blacklist_[url] = permissions;
90 }
91
92 protected:
93 ~MockSafeBrowsingDatabaseManager() override {}
94
95 private:
96 bool perform_callback_;
97 std::map<GURL, std::set<std::string>> permissions_blacklist_;
98
99 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
100};
101
meredithl48ad16812017-02-08 03:15:37102} // namespace
103
[email protected]89a8dd5d2014-07-11 12:02:07104class TestPermissionContext : public PermissionContextBase {
105 public:
106 TestPermissionContext(Profile* profile,
lshang88ec36a2015-12-09 04:50:17107 const content::PermissionType permission_type,
108 const ContentSettingsType content_settings_type)
109 : PermissionContextBase(profile, permission_type, content_settings_type),
dominickn6947d752016-08-10 02:00:06110 tab_context_updated_(false) {}
[email protected]89a8dd5d2014-07-11 12:02:07111
Daniel Chenga542fca2014-10-21 09:51:29112 ~TestPermissionContext() override {}
[email protected]89a8dd5d2014-07-11 12:02:07113
estade6d95d1d2015-10-02 18:55:23114#if defined(OS_ANDROID)
[email protected]89a8dd5d2014-07-11 12:02:07115 PermissionQueueController* GetInfoBarController() {
116 return GetQueueController();
117 }
estade6d95d1d2015-10-02 18:55:23118#endif
[email protected]89a8dd5d2014-07-11 12:02:07119
thestig9bdf7f22016-09-28 00:56:20120 const std::vector<ContentSetting>& decisions() const { return decisions_; }
[email protected]89a8dd5d2014-07-11 12:02:07121
thestig9bdf7f22016-09-28 00:56:20122 bool tab_context_updated() const { return tab_context_updated_; }
[email protected]89a8dd5d2014-07-11 12:02:07123
meredithl62b8c3d2017-01-10 05:47:53124 // Once a decision for the requested permission has been made, run the
125 // callback.
mlamouridf357a312015-03-03 17:34:05126 void TrackPermissionDecision(ContentSetting content_setting) {
johnme7fa91f72016-01-29 22:13:44127 decisions_.push_back(content_setting);
meredithl62b8c3d2017-01-10 05:47:53128 // Null check required here as the quit_closure_ can also be run and reset
129 // first from within DecidePermission.
130 if (quit_closure_) {
131 quit_closure_.Run();
132 quit_closure_.Reset();
133 }
[email protected]89a8dd5d2014-07-11 12:02:07134 }
135
johnmec41dfee2016-01-13 14:35:16136 ContentSetting GetContentSettingFromMap(const GURL& url_a,
137 const GURL& url_b) {
thestig9bdf7f22016-09-28 00:56:20138 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
139 return map->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(),
140 content_settings_type(), std::string());
johnmec41dfee2016-01-13 14:35:16141 }
142
meredithl62b8c3d2017-01-10 05:47:53143 void RequestPermission(content::WebContents* web_contents,
144 const PermissionRequestID& id,
145 const GURL& requesting_frame,
146 bool user_gesture,
147 const BrowserPermissionCallback& callback) override {
148 base::RunLoop run_loop;
149 quit_closure_ = run_loop.QuitClosure();
150 PermissionContextBase::RequestPermission(web_contents, id, requesting_frame,
151 true /* user_gesture */, callback);
152 run_loop.Run();
153 }
154
155 void DecidePermission(content::WebContents* web_contents,
156 const PermissionRequestID& id,
157 const GURL& requesting_origin,
158 const GURL& embedding_origin,
159 bool user_gesture,
160 const BrowserPermissionCallback& callback) override {
161 PermissionContextBase::DecidePermission(web_contents, id, requesting_origin,
162 embedding_origin, user_gesture,
163 callback);
164 if (respond_permission_) {
165 respond_permission_.Run();
166 respond_permission_.Reset();
167 } else {
168 // Stop the run loop from spinning indefinitely if no response callback
169 // has been set, as is the case with TestParallelRequests.
170 quit_closure_.Run();
171 quit_closure_.Reset();
172 }
173 }
174
meredithl03b12852017-01-25 05:08:01175 // Set the callback to run if the permission is being responded to in the
176 // test. This is left empty where no response is needed, such as in parallel
177 // requests, permissions blacklisting, invalid origin, and killswitch.
meredithl62b8c3d2017-01-10 05:47:53178 void SetRespondPermissionCallback(base::Closure callback) {
179 respond_permission_ = callback;
180 }
181
[email protected]89a8dd5d2014-07-11 12:02:07182 protected:
Daniel Chenga542fca2014-10-21 09:51:29183 void UpdateTabContext(const PermissionRequestID& id,
184 const GURL& requesting_origin,
185 bool allowed) override {
[email protected]89a8dd5d2014-07-11 12:02:07186 tab_context_updated_ = true;
187 }
188
mlamouria31c6ff12015-06-01 15:40:52189 bool IsRestrictedToSecureOrigins() const override {
190 return false;
191 }
192
[email protected]89a8dd5d2014-07-11 12:02:07193 private:
johnme7fa91f72016-01-29 22:13:44194 std::vector<ContentSetting> decisions_;
195 bool tab_context_updated_;
meredithl62b8c3d2017-01-10 05:47:53196 base::Closure quit_closure_;
197 // Callback for responding to a permission once the request has been completed
198 // (valid URL, kill switch disabled, not blacklisted)
199 base::Closure respond_permission_;
thestig9bdf7f22016-09-28 00:56:20200 DISALLOW_COPY_AND_ASSIGN(TestPermissionContext);
dominickn6947d752016-08-10 02:00:06201};
202
203class TestKillSwitchPermissionContext : public TestPermissionContext {
204 public:
205 TestKillSwitchPermissionContext(
206 Profile* profile,
207 const content::PermissionType permission_type,
208 const ContentSettingsType content_settings_type)
209 : TestPermissionContext(profile, permission_type, content_settings_type),
thestig9bdf7f22016-09-28 00:56:20210 field_trial_list_(base::MakeUnique<base::FieldTrialList>(
211 base::MakeUnique<base::MockEntropyProvider>())) {}
dominickn6947d752016-08-10 02:00:06212
213 void ResetFieldTrialList() {
214 // Destroy the existing FieldTrialList before creating a new one to avoid
215 // a DCHECK.
216 field_trial_list_.reset();
thestig9bdf7f22016-09-28 00:56:20217 field_trial_list_ = base::MakeUnique<base::FieldTrialList>(
218 base::MakeUnique<base::MockEntropyProvider>());
dominickn6947d752016-08-10 02:00:06219 variations::testing::ClearAllVariationParams();
220 }
221
222 private:
dcheng4af48582016-04-19 00:29:35223 std::unique_ptr<base::FieldTrialList> field_trial_list_;
thestig9bdf7f22016-09-28 00:56:20224
225 DISALLOW_COPY_AND_ASSIGN(TestKillSwitchPermissionContext);
[email protected]89a8dd5d2014-07-11 12:02:07226};
227
felt88bf98cb2014-12-16 03:50:23228class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
229 protected:
230 PermissionContextBaseTests() {}
thestig9bdf7f22016-09-28 00:56:20231 ~PermissionContextBaseTests() override {}
felt88bf98cb2014-12-16 03:50:23232
233 // Accept or dismiss the permission bubble or infobar.
234 void RespondToPermission(TestPermissionContext* context,
235 const PermissionRequestID& id,
236 const GURL& url,
dominicknd4e446a2016-09-13 07:44:13237 bool persist,
johnme7fa91f72016-01-29 22:13:44238 ContentSetting response) {
239 DCHECK(response == CONTENT_SETTING_ALLOW ||
240 response == CONTENT_SETTING_BLOCK ||
241 response == CONTENT_SETTING_ASK);
estade6d95d1d2015-10-02 18:55:23242#if defined(OS_ANDROID)
dominickn6957a9c2016-08-16 06:06:36243 PermissionAction decision = DISMISSED;
244 if (response == CONTENT_SETTING_ALLOW)
245 decision = GRANTED;
246 else if (response == CONTENT_SETTING_BLOCK)
247 decision = DENIED;
johnme7fa91f72016-01-29 22:13:44248 context->GetInfoBarController()->OnPermissionSet(
dominicknd4e446a2016-09-13 07:44:13249 id, url, url, false /* user_gesture */, persist, decision);
estade6d95d1d2015-10-02 18:55:23250#else
tsergeanta771c23e2016-07-13 04:54:52251 PermissionRequestManager* manager =
252 PermissionRequestManager::FromWebContents(web_contents());
dominicknd4e446a2016-09-13 07:44:13253 manager->TogglePersist(persist);
johnme7fa91f72016-01-29 22:13:44254 switch (response) {
255 case CONTENT_SETTING_ALLOW:
256 manager->Accept();
257 break;
258 case CONTENT_SETTING_BLOCK:
259 manager->Deny();
260 break;
261 case CONTENT_SETTING_ASK:
262 manager->Closing();
263 break;
264 default:
265 NOTREACHED();
266 }
estade6d95d1d2015-10-02 18:55:23267#endif
felt88bf98cb2014-12-16 03:50:23268 }
269
dominicknd4e446a2016-09-13 07:44:13270 void TestAskAndDecide_TestContent(content::PermissionType permission,
271 ContentSettingsType content_settings_type,
272 ContentSetting decision,
273 bool persist) {
274 TestPermissionContext permission_context(profile(), permission,
275 content_settings_type);
276 GURL url("https://www.google.com");
johnme7fa91f72016-01-29 22:13:44277 NavigateAndCommit(url);
dominickn6da2b382016-08-23 20:21:30278 base::HistogramTester histograms;
felt88bf98cb2014-12-16 03:50:23279
280 const PermissionRequestID id(
281 web_contents()->GetRenderProcessHost()->GetID(),
mlamouri5fc460f2015-06-03 17:30:28282 web_contents()->GetMainFrame()->GetRoutingID(),
lalitmc886a2562015-09-10 10:20:02283 -1);
meredithl62b8c3d2017-01-10 05:47:53284 permission_context.SetRespondPermissionCallback(
285 base::Bind(&PermissionContextBaseTests::RespondToPermission,
286 base::Unretained(this), &permission_context, id, url,
287 persist, decision));
felt88bf98cb2014-12-16 03:50:23288 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53289 web_contents(),
290 id, url, true /* user_gesture */,
felt88bf98cb2014-12-16 03:50:23291 base::Bind(&TestPermissionContext::TrackPermissionDecision,
292 base::Unretained(&permission_context)));
thestig9bdf7f22016-09-28 00:56:20293 ASSERT_EQ(1u, permission_context.decisions().size());
dominicknd4e446a2016-09-13 07:44:13294 EXPECT_EQ(decision, permission_context.decisions()[0]);
felt88bf98cb2014-12-16 03:50:23295 EXPECT_TRUE(permission_context.tab_context_updated());
dominickn6da2b382016-08-23 20:21:30296
thestig9bdf7f22016-09-28 00:56:20297 std::string decision_string;
dominicknd4e446a2016-09-13 07:44:13298 if (decision == CONTENT_SETTING_ALLOW)
299 decision_string = "Accepted";
300 else if (decision == CONTENT_SETTING_BLOCK)
301 decision_string = "Denied";
302 else if (decision == CONTENT_SETTING_ASK)
303 decision_string = "Dismissed";
felt88bf98cb2014-12-16 03:50:23304
dominicknd4e446a2016-09-13 07:44:13305 if (decision_string.size()) {
306 histograms.ExpectUniqueSample(
307 "Permissions.Prompt." + decision_string + ".PriorDismissCount." +
308 PermissionUtil::GetPermissionString(permission),
309 0, 1);
310 histograms.ExpectUniqueSample(
311 "Permissions.Prompt." + decision_string + ".PriorIgnoreCount." +
312 PermissionUtil::GetPermissionString(permission),
313 0, 1);
314 }
felt88bf98cb2014-12-16 03:50:23315
dominicknd4e446a2016-09-13 07:44:13316 if (persist) {
317 EXPECT_EQ(decision,
318 permission_context.GetContentSettingFromMap(url, url));
319 } else {
320 EXPECT_EQ(CONTENT_SETTING_ASK,
321 permission_context.GetContentSettingFromMap(url, url));
322 }
dominickn79b96cc2017-02-14 04:14:21323
324 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
325 PermissionEmbargoStatus::NOT_EMBARGOED, 1);
felt88bf98cb2014-12-16 03:50:23326 }
327
dominickn6947d752016-08-10 02:00:06328 void DismissMultipleTimesAndExpectBlock(
329 const GURL& url,
330 content::PermissionType permission_type,
331 ContentSettingsType content_settings_type,
332 uint32_t iterations) {
333 base::HistogramTester histograms;
334
335 // Dismiss |iterations| times. The final dismiss should change the decision
336 // from dismiss to block, and hence change the persisted content setting.
337 for (uint32_t i = 0; i < iterations; ++i) {
meredithlcda94daf2017-01-19 03:03:35338 ContentSetting expected =
339 (i < 2) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK;
dominickn6947d752016-08-10 02:00:06340 TestPermissionContext permission_context(
341 profile(), permission_type, content_settings_type);
dominickn6947d752016-08-10 02:00:06342 const PermissionRequestID id(
343 web_contents()->GetRenderProcessHost()->GetID(),
344 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53345
346 permission_context.SetRespondPermissionCallback(
347 base::Bind(&PermissionContextBaseTests::RespondToPermission,
348 base::Unretained(this), &permission_context, id, url,
349 false, CONTENT_SETTING_ASK));
350
dominickn6947d752016-08-10 02:00:06351 permission_context.RequestPermission(
352 web_contents(), id, url, true /* user_gesture */,
353 base::Bind(&TestPermissionContext::TrackPermissionDecision,
354 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06355 histograms.ExpectTotalCount(
dominickn6da2b382016-08-23 20:21:30356 "Permissions.Prompt.Dismissed.PriorDismissCount." +
dominickn6947d752016-08-10 02:00:06357 PermissionUtil::GetPermissionString(permission_type),
358 i + 1);
dominickn6da2b382016-08-23 20:21:30359 histograms.ExpectBucketCount(
360 "Permissions.Prompt.Dismissed.PriorDismissCount." +
361 PermissionUtil::GetPermissionString(permission_type),
362 i, 1);
dominickn79b96cc2017-02-14 04:14:21363 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
364 i + 1);
365 if (i < 2) {
366 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
367 PermissionEmbargoStatus::NOT_EMBARGOED,
368 i + 1);
369 } else {
370 histograms.ExpectBucketCount(
371 "Permissions.AutoBlocker.EmbargoStatus",
372 PermissionEmbargoStatus::REPEATED_DISMISSALS, 1);
373 }
374
thestig9bdf7f22016-09-28 00:56:20375 ASSERT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21376 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06377 EXPECT_TRUE(permission_context.tab_context_updated());
raymesab359712017-02-15 06:23:25378 PermissionResult result =
379 permission_context.GetPermissionStatus(url, url);
380 EXPECT_EQ(expected, result.content_setting);
381 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
dominickn6947d752016-08-10 02:00:06382 }
383
meredithlcda94daf2017-01-19 03:03:35384 TestPermissionContext permission_context(profile(), permission_type,
385 content_settings_type);
meredithl03b12852017-01-25 05:08:01386 const PermissionRequestID id(
387 web_contents()->GetRenderProcessHost()->GetID(),
388 web_contents()->GetMainFrame()->GetRoutingID(), -1);
389
390 permission_context.SetRespondPermissionCallback(
391 base::Bind(&PermissionContextBaseTests::RespondToPermission,
392 base::Unretained(this), &permission_context, id, url, false,
393 CONTENT_SETTING_ASK));
394
395 permission_context.RequestPermission(
396 web_contents(), id, url, true /* user_gesture */,
397 base::Bind(&TestPermissionContext::TrackPermissionDecision,
398 base::Unretained(&permission_context)));
meredithlcda94daf2017-01-19 03:03:35399
raymesab359712017-02-15 06:23:25400 PermissionResult result = permission_context.GetPermissionStatus(url, url);
401 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
402 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
dominickn6947d752016-08-10 02:00:06403 }
404
405 void TestBlockOnSeveralDismissals_TestContent() {
406 GURL url("https://www.google.com");
407 NavigateAndCommit(url);
408 base::HistogramTester histograms;
409
410 // First, ensure that > 3 dismissals behaves correctly.
411 for (uint32_t i = 0; i < 4; ++i) {
412 TestPermissionContext permission_context(
413 profile(), content::PermissionType::GEOLOCATION,
414 CONTENT_SETTINGS_TYPE_GEOLOCATION);
415
416 const PermissionRequestID id(
417 web_contents()->GetRenderProcessHost()->GetID(),
418 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53419
420 permission_context.SetRespondPermissionCallback(
421 base::Bind(&PermissionContextBaseTests::RespondToPermission,
422 base::Unretained(this), &permission_context, id, url,
423 false, CONTENT_SETTING_ASK));
dominickn6947d752016-08-10 02:00:06424 permission_context.RequestPermission(
425 web_contents(), id, url, true /* user_gesture */,
426 base::Bind(&TestPermissionContext::TrackPermissionDecision,
427 base::Unretained(&permission_context)));
dominickn6da2b382016-08-23 20:21:30428 histograms.ExpectTotalCount(
429 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation",
430 i + 1);
431 histograms.ExpectBucketCount(
432 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1);
dominickn79b96cc2017-02-14 04:14:21433 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
434 PermissionEmbargoStatus::NOT_EMBARGOED,
435 i + 1);
436
thestig9bdf7f22016-09-28 00:56:20437 ASSERT_EQ(1u, permission_context.decisions().size());
dominickn6947d752016-08-10 02:00:06438 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
439 EXPECT_TRUE(permission_context.tab_context_updated());
440 EXPECT_EQ(CONTENT_SETTING_ASK,
441 permission_context.GetContentSettingFromMap(url, url));
442 }
443
444 // Flush the dismissal counts. Enable the block on too many dismissals
445 // feature, which is disabled by default.
thestig9bdf7f22016-09-28 00:56:20446 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
447 map->ClearSettingsForOneType(
raymesd9c50e12017-02-01 20:03:35448 CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA);
dominickn6947d752016-08-10 02:00:06449
dominicknc2726ec2016-09-15 12:15:39450 base::test::ScopedFeatureList feature_list;
451 feature_list.InitAndEnableFeature(features::kBlockPromptsIfDismissedOften);
dominickn6947d752016-08-10 02:00:06452
453 EXPECT_TRUE(
454 base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften));
455
456 // Sanity check independence per permission type by checking two of them.
457 DismissMultipleTimesAndExpectBlock(url,
458 content::PermissionType::GEOLOCATION,
459 CONTENT_SETTINGS_TYPE_GEOLOCATION, 3);
460 DismissMultipleTimesAndExpectBlock(url,
461 content::PermissionType::NOTIFICATIONS,
462 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, 3);
dominickn6947d752016-08-10 02:00:06463 }
464
465 void TestVariationBlockOnSeveralDismissals_TestContent() {
466 GURL url("https://www.google.com");
467 NavigateAndCommit(url);
dominickn6da2b382016-08-23 20:21:30468 base::HistogramTester histograms;
dominickn6947d752016-08-10 02:00:06469
470 // Set up the custom parameter and custom value.
thestig9bdf7f22016-09-28 00:56:20471 base::FieldTrialList field_trials(nullptr);
dominickn6947d752016-08-10 02:00:06472 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
473 kPromptTrialName, kPromptGroupName);
474 std::map<std::string, std::string> params;
475 params[PermissionDecisionAutoBlocker::kPromptDismissCountKey] = "5";
476 ASSERT_TRUE(variations::AssociateVariationParams(
477 kPromptTrialName, kPromptGroupName, params));
478
thestig9bdf7f22016-09-28 00:56:20479 std::unique_ptr<base::FeatureList> feature_list =
480 base::MakeUnique<base::FeatureList>();
dominickn6947d752016-08-10 02:00:06481 feature_list->RegisterFieldTrialOverride(
482 features::kBlockPromptsIfDismissedOften.name,
483 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial);
thestig9bdf7f22016-09-28 00:56:20484
485 base::test::ScopedFeatureList scoped_feature_list;
486 scoped_feature_list.InitWithFeatureList(std::move(feature_list));
487
dominickn6947d752016-08-10 02:00:06488 EXPECT_EQ(base::FeatureList::GetFieldTrial(
489 features::kBlockPromptsIfDismissedOften),
490 trial);
491
thestig9bdf7f22016-09-28 00:56:20492 {
493 std::map<std::string, std::string> actual_params;
494 EXPECT_TRUE(variations::GetVariationParamsByFeature(
495 features::kBlockPromptsIfDismissedOften, &actual_params));
496 EXPECT_EQ(params, actual_params);
497 }
dominickn6947d752016-08-10 02:00:06498
499 for (uint32_t i = 0; i < 5; ++i) {
500 TestPermissionContext permission_context(
501 profile(), content::PermissionType::MIDI_SYSEX,
502 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
503
504 ContentSetting expected =
505 (i < 4) ? CONTENT_SETTING_ASK : CONTENT_SETTING_BLOCK;
506 const PermissionRequestID id(
507 web_contents()->GetRenderProcessHost()->GetID(),
508 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53509 permission_context.SetRespondPermissionCallback(
510 base::Bind(&PermissionContextBaseTests::RespondToPermission,
511 base::Unretained(this), &permission_context, id, url,
512 false, CONTENT_SETTING_ASK));
dominickn6947d752016-08-10 02:00:06513 permission_context.RequestPermission(
514 web_contents(), id, url, true /* user_gesture */,
515 base::Bind(&TestPermissionContext::TrackPermissionDecision,
meredithl62b8c3d2017-01-10 05:47:53516 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06517
dominickn6947d752016-08-10 02:00:06518 EXPECT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21519 ASSERT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06520 EXPECT_TRUE(permission_context.tab_context_updated());
raymesab359712017-02-15 06:23:25521 PermissionResult result =
522 permission_context.GetPermissionStatus(url, url);
523 EXPECT_EQ(expected, result.content_setting);
524 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
dominickn6da2b382016-08-23 20:21:30525
526 histograms.ExpectTotalCount(
527 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1);
528 histograms.ExpectBucketCount(
529 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1);
dominickn79b96cc2017-02-14 04:14:21530
531 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
532 i + 1);
533 if (i < 4) {
534 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
535 PermissionEmbargoStatus::NOT_EMBARGOED,
536 i + 1);
537 } else {
538 histograms.ExpectBucketCount(
539 "Permissions.AutoBlocker.EmbargoStatus",
540 PermissionEmbargoStatus::REPEATED_DISMISSALS, 1);
541 }
dominickn6947d752016-08-10 02:00:06542 }
543
544 // Ensure that we finish in the block state.
545 TestPermissionContext permission_context(
546 profile(), content::PermissionType::MIDI_SYSEX,
547 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
raymesab359712017-02-15 06:23:25548 PermissionResult result = permission_context.GetPermissionStatus(url, url);
549 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
550 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
551
dominickn6947d752016-08-10 02:00:06552 variations::testing::ClearAllVariationParams();
553 }
554
lshang88ec36a2015-12-09 04:50:17555 void TestRequestPermissionInvalidUrl(
556 content::PermissionType permission_type,
557 ContentSettingsType content_settings_type) {
558 TestPermissionContext permission_context(profile(), permission_type,
559 content_settings_type);
timvolodinea2830552015-01-20 17:21:23560 GURL url;
561 ASSERT_FALSE(url.is_valid());
johnme7fa91f72016-01-29 22:13:44562 NavigateAndCommit(url);
timvolodinea2830552015-01-20 17:21:23563
564 const PermissionRequestID id(
565 web_contents()->GetRenderProcessHost()->GetID(),
mlamouri5fc460f2015-06-03 17:30:28566 web_contents()->GetMainFrame()->GetRoutingID(),
lalitmc886a2562015-09-10 10:20:02567 -1);
timvolodinea2830552015-01-20 17:21:23568 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53569 web_contents(),
570 id, url, true /* user_gesture */,
timvolodinea2830552015-01-20 17:21:23571 base::Bind(&TestPermissionContext::TrackPermissionDecision,
572 base::Unretained(&permission_context)));
573
thestig9bdf7f22016-09-28 00:56:20574 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44575 EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.decisions()[0]);
timvolodinea2830552015-01-20 17:21:23576 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16577 EXPECT_EQ(CONTENT_SETTING_ASK,
578 permission_context.GetContentSettingFromMap(url, url));
timvolodinea2830552015-01-20 17:21:23579 }
580
lshang88ec36a2015-12-09 04:50:17581 void TestGrantAndRevoke_TestContent(content::PermissionType permission_type,
582 ContentSettingsType content_settings_type,
timvolodine16be5202015-02-02 17:44:54583 ContentSetting expected_default) {
lshang88ec36a2015-12-09 04:50:17584 TestPermissionContext permission_context(profile(), permission_type,
585 content_settings_type);
toyoshim9eb573f42015-03-30 10:39:39586 GURL url("https://www.google.com");
johnme7fa91f72016-01-29 22:13:44587 NavigateAndCommit(url);
timvolodine16be5202015-02-02 17:44:54588
589 const PermissionRequestID id(
590 web_contents()->GetRenderProcessHost()->GetID(),
mlamouri5fc460f2015-06-03 17:30:28591 web_contents()->GetMainFrame()->GetRoutingID(),
lalitmc886a2562015-09-10 10:20:02592 -1);
meredithl62b8c3d2017-01-10 05:47:53593 permission_context.SetRespondPermissionCallback(
594 base::Bind(&PermissionContextBaseTests::RespondToPermission,
595 base::Unretained(this), &permission_context, id, url, true,
596 CONTENT_SETTING_ALLOW));
597
timvolodine16be5202015-02-02 17:44:54598 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53599 web_contents(),
600 id, url, true /* user_gesture */,
timvolodine16be5202015-02-02 17:44:54601 base::Bind(&TestPermissionContext::TrackPermissionDecision,
602 base::Unretained(&permission_context)));
603
thestig9bdf7f22016-09-28 00:56:20604 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44605 EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]);
timvolodine16be5202015-02-02 17:44:54606 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16607 EXPECT_EQ(CONTENT_SETTING_ALLOW,
608 permission_context.GetContentSettingFromMap(url, url));
timvolodine16be5202015-02-02 17:44:54609
610 // Try to reset permission.
611 permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin());
612 ContentSetting setting_after_reset =
johnmec41dfee2016-01-13 14:35:16613 permission_context.GetContentSettingFromMap(url, url);
timvolodine16be5202015-02-02 17:44:54614 ContentSetting default_setting =
peconn5100d432015-09-16 12:03:08615 HostContentSettingsMapFactory::GetForProfile(profile())
lshang88ec36a2015-12-09 04:50:17616 ->GetDefaultContentSetting(content_settings_type, nullptr);
timvolodine16be5202015-02-02 17:44:54617 EXPECT_EQ(default_setting, setting_after_reset);
618 }
619
lshang88ec36a2015-12-09 04:50:17620 void TestGlobalPermissionsKillSwitch(
621 content::PermissionType permission_type,
622 ContentSettingsType content_settings_type) {
dominickn6947d752016-08-10 02:00:06623 TestKillSwitchPermissionContext permission_context(
624 profile(), permission_type, content_settings_type);
kcarattini2ee48ad52015-10-26 23:45:31625 permission_context.ResetFieldTrialList();
626
627 EXPECT_FALSE(permission_context.IsPermissionKillSwitchOn());
628 std::map<std::string, std::string> params;
lshang2a0b8cb2015-12-09 04:59:49629 params[PermissionUtil::GetPermissionString(permission_type)] =
kcarattini2ee48ad52015-10-26 23:45:31630 kPermissionsKillSwitchBlockedValue;
631 variations::AssociateVariationParams(
632 kPermissionsKillSwitchFieldStudy, kPermissionsKillSwitchTestGroup,
633 params);
634 base::FieldTrialList::CreateFieldTrial(kPermissionsKillSwitchFieldStudy,
635 kPermissionsKillSwitchTestGroup);
636 EXPECT_TRUE(permission_context.IsPermissionKillSwitchOn());
637 }
638
johnme7fa91f72016-01-29 22:13:44639 // Don't call this more than once in the same test, as it persists data to
640 // HostContentSettingsMap.
641 void TestParallelRequests(ContentSetting response) {
642 TestPermissionContext permission_context(
643 profile(), content::PermissionType::NOTIFICATIONS,
644 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
645 GURL url("http://www.google.com");
646 NavigateAndCommit(url);
647
648 const PermissionRequestID id0(
649 web_contents()->GetRenderProcessHost()->GetID(),
650 web_contents()->GetMainFrame()->GetRoutingID(), 0);
651 const PermissionRequestID id1(
652 web_contents()->GetRenderProcessHost()->GetID(),
653 web_contents()->GetMainFrame()->GetRoutingID(), 1);
654
meredithl62b8c3d2017-01-10 05:47:53655 bool persist = (response == CONTENT_SETTING_ALLOW ||
656 response == CONTENT_SETTING_BLOCK);
657
658 // Request a permission without setting the callback to DecidePermission.
johnme7fa91f72016-01-29 22:13:44659 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53660 web_contents(), id0, url, true /* user_gesture */,
johnme7fa91f72016-01-29 22:13:44661 base::Bind(&TestPermissionContext::TrackPermissionDecision,
662 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44663
664 EXPECT_EQ(0u, permission_context.decisions().size());
665
meredithl62b8c3d2017-01-10 05:47:53666 // Set the callback, and make a second permission request.
667 permission_context.SetRespondPermissionCallback(
668 base::Bind(&PermissionContextBaseTests::RespondToPermission,
669 base::Unretained(this), &permission_context, id0, url,
670 persist, response));
671 permission_context.RequestPermission(
672 web_contents(), id1, url, true /* user_gesture */,
673 base::Bind(&TestPermissionContext::TrackPermissionDecision,
674 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44675
thestig9bdf7f22016-09-28 00:56:20676 ASSERT_EQ(2u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44677 EXPECT_EQ(response, permission_context.decisions()[0]);
678 EXPECT_EQ(response, permission_context.decisions()[1]);
679 EXPECT_TRUE(permission_context.tab_context_updated());
680
681 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url));
682 }
683
meredithl62b8c3d2017-01-10 05:47:53684 void TestPermissionsBlacklisting(
685 content::PermissionType permission_type,
686 ContentSettingsType content_settings_type,
687 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
688 const GURL& url,
689 int timeout,
dominickn79b96cc2017-02-14 04:14:21690 ContentSetting expected_permission_status,
691 PermissionEmbargoStatus expected_embargo_reason) {
meredithl62b8c3d2017-01-10 05:47:53692 NavigateAndCommit(url);
dominickn79b96cc2017-02-14 04:14:21693 base::HistogramTester histograms;
meredithl62b8c3d2017-01-10 05:47:53694 base::test::ScopedFeatureList scoped_feature_list;
695 scoped_feature_list.InitAndEnableFeature(features::kPermissionsBlacklist);
696 TestPermissionContext permission_context(profile(), permission_type,
697 content_settings_type);
meredithl03b12852017-01-25 05:08:01698 PermissionDecisionAutoBlocker::GetForProfile(profile())
699 ->SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
700 timeout);
meredithl62b8c3d2017-01-10 05:47:53701 const PermissionRequestID id(
702 web_contents()->GetRenderProcessHost()->GetID(),
703 web_contents()->GetMainFrame()->GetRoutingID(), -1);
meredithl03b12852017-01-25 05:08:01704
705 // A response only needs to be made to the permission request if we do not
706 // expect he permission to be blacklisted, therefore set the response
707 // callback.
708 if (expected_permission_status == CONTENT_SETTING_ALLOW) {
709 permission_context.SetRespondPermissionCallback(
710 base::Bind(&PermissionContextBaseTests::RespondToPermission,
711 base::Unretained(this), &permission_context, id, url,
712 true /* persist */, expected_permission_status));
713 }
714
meredithl62b8c3d2017-01-10 05:47:53715 permission_context.RequestPermission(
716 web_contents(), id, url, true /* user_gesture */,
717 base::Bind(&TestPermissionContext::TrackPermissionDecision,
718 base::Unretained(&permission_context)));
raymesab359712017-02-15 06:23:25719 PermissionResult result = permission_context.GetPermissionStatus(url, url);
720 EXPECT_EQ(expected_permission_status, result.content_setting);
721 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
meredithl62b8c3d2017-01-10 05:47:53722
meredithl03b12852017-01-25 05:08:01723 if (expected_permission_status == CONTENT_SETTING_ALLOW) {
724 ASSERT_EQ(1u, permission_context.decisions().size());
725 EXPECT_EQ(expected_permission_status, permission_context.decisions()[0]);
726 }
dominickn79b96cc2017-02-14 04:14:21727 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
728 expected_embargo_reason, 1);
meredithl62b8c3d2017-01-10 05:47:53729 }
730
felt88bf98cb2014-12-16 03:50:23731 private:
732 // ChromeRenderViewHostTestHarness:
dcheng171318362014-12-29 18:31:25733 void SetUp() override {
felt88bf98cb2014-12-16 03:50:23734 ChromeRenderViewHostTestHarness::SetUp();
estade6d95d1d2015-10-02 18:55:23735#if defined(OS_ANDROID)
felt88bf98cb2014-12-16 03:50:23736 InfoBarService::CreateForWebContents(web_contents());
estade6d95d1d2015-10-02 18:55:23737#else
tsergeanta771c23e2016-07-13 04:54:52738 PermissionRequestManager::CreateForWebContents(web_contents());
estade6d95d1d2015-10-02 18:55:23739#endif
felt88bf98cb2014-12-16 03:50:23740 }
741
742 DISALLOW_COPY_AND_ASSIGN(PermissionContextBaseTests);
743};
744
[email protected]89a8dd5d2014-07-11 12:02:07745// Simulates clicking Accept. The permission should be granted and
746// saved for future use.
dominicknd4e446a2016-09-13 07:44:13747TEST_F(PermissionContextBaseTests, TestAskAndGrantPersist) {
748 TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS,
749 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
750 CONTENT_SETTING_ALLOW, true);
751}
752
753// Simulates clicking Accept. The permission should be granted, but not
754// persisted.
755TEST_F(PermissionContextBaseTests, TestAskAndGrantNoPersist) {
756 TestAskAndDecide_TestContent(content::PermissionType::NOTIFICATIONS,
757 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
758 CONTENT_SETTING_ALLOW, false);
759}
760
761// Simulates clicking Block. The permission should be denied and
762// saved for future use.
763TEST_F(PermissionContextBaseTests, TestAskAndBlockPersist) {
764 TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION,
765 CONTENT_SETTINGS_TYPE_GEOLOCATION,
766 CONTENT_SETTING_BLOCK, true);
767}
768
769// Simulates clicking Block. The permission should be denied, but not persisted.
770TEST_F(PermissionContextBaseTests, TestAskAndBlockNoPersist) {
771 TestAskAndDecide_TestContent(content::PermissionType::GEOLOCATION,
772 CONTENT_SETTINGS_TYPE_GEOLOCATION,
773 CONTENT_SETTING_BLOCK, false);
timvolodinea2830552015-01-20 17:21:23774}
[email protected]89a8dd5d2014-07-11 12:02:07775
felt88bf98cb2014-12-16 03:50:23776// Simulates clicking Dismiss (X) in the infobar/bubble.
[email protected]89a8dd5d2014-07-11 12:02:07777// The permission should be denied but not saved for future use.
778TEST_F(PermissionContextBaseTests, TestAskAndDismiss) {
dominicknd4e446a2016-09-13 07:44:13779 TestAskAndDecide_TestContent(content::PermissionType::MIDI_SYSEX,
780 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
781 CONTENT_SETTING_ASK, false);
timvolodinea2830552015-01-20 17:21:23782}
783
dominickn6947d752016-08-10 02:00:06784// Simulates clicking Dismiss (X) in the infobar/bubble with the block on too
785// many dismissals feature active. The permission should be blocked after
786// several dismissals.
787TEST_F(PermissionContextBaseTests, TestDismissUntilBlocked) {
788 TestBlockOnSeveralDismissals_TestContent();
789}
790
791// Test setting a custom number of dismissals before block via variations.
792TEST_F(PermissionContextBaseTests, TestDismissVariations) {
793 TestVariationBlockOnSeveralDismissals_TestContent();
794}
795
timvolodinea2830552015-01-20 17:21:23796// Simulates non-valid requesting URL.
797// The permission should be denied but not saved for future use.
798TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) {
lshang88ec36a2015-12-09 04:50:17799 TestRequestPermissionInvalidUrl(content::PermissionType::GEOLOCATION,
800 CONTENT_SETTINGS_TYPE_GEOLOCATION);
801 TestRequestPermissionInvalidUrl(content::PermissionType::NOTIFICATIONS,
802 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
803 TestRequestPermissionInvalidUrl(content::PermissionType::MIDI_SYSEX,
804 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
805 TestRequestPermissionInvalidUrl(content::PermissionType::PUSH_MESSAGING,
raymes516a7db62016-08-02 06:43:27806 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
timvolodinea2830552015-01-20 17:21:23807#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
808 TestRequestPermissionInvalidUrl(
lshang88ec36a2015-12-09 04:50:17809 content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
timvolodinea2830552015-01-20 17:21:23810 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
811#endif
812}
timvolodine16be5202015-02-02 17:44:54813
feltcb9e7362015-06-25 00:36:43814#if defined(OS_ANDROID)
815// This test is specific to Android because other platforms use bubbles.
816TEST_F(PermissionContextBaseTests, TestGrantAndRevokeWithInfobars) {
lshang88ec36a2015-12-09 04:50:17817 TestGrantAndRevoke_TestContent(content::PermissionType::GEOLOCATION,
818 CONTENT_SETTINGS_TYPE_GEOLOCATION,
timvolodine16be5202015-02-02 17:44:54819 CONTENT_SETTING_ASK);
lshang88ec36a2015-12-09 04:50:17820 TestGrantAndRevoke_TestContent(content::PermissionType::MIDI_SYSEX,
821 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
timvolodine16be5202015-02-02 17:44:54822 CONTENT_SETTING_ASK);
timvolodine16be5202015-02-02 17:44:54823 TestGrantAndRevoke_TestContent(
lshang88ec36a2015-12-09 04:50:17824 content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
timvolodine16be5202015-02-02 17:44:54825 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, CONTENT_SETTING_ASK);
timvolodine16be5202015-02-02 17:44:54826 // TODO(timvolodine): currently no test for
827 // CONTENT_SETTINGS_TYPE_NOTIFICATIONS because notification permissions work
828 // differently with infobars as compared to bubbles (crbug.com/453784).
timvolodine16be5202015-02-02 17:44:54829}
feltcb9e7362015-06-25 00:36:43830#endif
timvolodine16be5202015-02-02 17:44:54831
jam1c5a91492016-02-24 20:47:53832#if !defined(OS_ANDROID)
timvolodine16be5202015-02-02 17:44:54833// Simulates granting and revoking of permissions using permission bubbles.
feltcb9e7362015-06-25 00:36:43834// This test shouldn't run on mobile because mobile platforms use infobars.
timvolodine16be5202015-02-02 17:44:54835TEST_F(PermissionContextBaseTests, TestGrantAndRevokeWithBubbles) {
lshang88ec36a2015-12-09 04:50:17836 TestGrantAndRevoke_TestContent(content::PermissionType::GEOLOCATION,
837 CONTENT_SETTINGS_TYPE_GEOLOCATION,
timvolodine16be5202015-02-02 17:44:54838 CONTENT_SETTING_ASK);
lshang88ec36a2015-12-09 04:50:17839 TestGrantAndRevoke_TestContent(content::PermissionType::NOTIFICATIONS,
840 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
timvolodine16be5202015-02-02 17:44:54841 CONTENT_SETTING_ASK);
lshang88ec36a2015-12-09 04:50:17842 TestGrantAndRevoke_TestContent(content::PermissionType::MIDI_SYSEX,
843 CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
timvolodine16be5202015-02-02 17:44:54844 CONTENT_SETTING_ASK);
lshang88ec36a2015-12-09 04:50:17845 TestGrantAndRevoke_TestContent(content::PermissionType::PUSH_MESSAGING,
raymes516a7db62016-08-02 06:43:27846 CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
timvolodine16be5202015-02-02 17:44:54847 CONTENT_SETTING_ASK);
timvolodine16be5202015-02-02 17:44:54848}
feltcb9e7362015-06-25 00:36:43849#endif
kcarattini2ee48ad52015-10-26 23:45:31850
851// Tests the global kill switch by enabling/disabling the Field Trials.
852TEST_F(PermissionContextBaseTests, TestGlobalKillSwitch) {
lshang88ec36a2015-12-09 04:50:17853 TestGlobalPermissionsKillSwitch(content::PermissionType::GEOLOCATION,
854 CONTENT_SETTINGS_TYPE_GEOLOCATION);
855 TestGlobalPermissionsKillSwitch(content::PermissionType::NOTIFICATIONS,
856 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
857 TestGlobalPermissionsKillSwitch(content::PermissionType::MIDI_SYSEX,
858 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
859 TestGlobalPermissionsKillSwitch(content::PermissionType::PUSH_MESSAGING,
raymes516a7db62016-08-02 06:43:27860 CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
lshang88ec36a2015-12-09 04:50:17861 TestGlobalPermissionsKillSwitch(content::PermissionType::DURABLE_STORAGE,
862 CONTENT_SETTINGS_TYPE_DURABLE_STORAGE);
kcarattini2ee48ad52015-10-26 23:45:31863#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
864 TestGlobalPermissionsKillSwitch(
lshang88ec36a2015-12-09 04:50:17865 content::PermissionType::PROTECTED_MEDIA_IDENTIFIER,
kcarattini2ee48ad52015-10-26 23:45:31866 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
867#endif
lshang88ec36a2015-12-09 04:50:17868 TestGlobalPermissionsKillSwitch(content::PermissionType::AUDIO_CAPTURE,
869 CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
870 TestGlobalPermissionsKillSwitch(content::PermissionType::VIDEO_CAPTURE,
871 CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
kcarattini2ee48ad52015-10-26 23:45:31872}
johnme7fa91f72016-01-29 22:13:44873
874TEST_F(PermissionContextBaseTests, TestParallelRequestsAllowed) {
875 TestParallelRequests(CONTENT_SETTING_ALLOW);
876}
877
878TEST_F(PermissionContextBaseTests, TestParallelRequestsBlocked) {
879 TestParallelRequests(CONTENT_SETTING_BLOCK);
880}
881
882TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) {
883 TestParallelRequests(CONTENT_SETTING_ASK);
884}
meredithl62b8c3d2017-01-10 05:47:53885
886// Tests a blacklisted (URL, permission) pair has had its permission request
887// blocked.
888TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) {
889 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
890 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
891 const GURL url("https://www.example.com");
meredithl03b12852017-01-25 05:08:01892 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
meredithl62b8c3d2017-01-10 05:47:53893 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
dominickn79b96cc2017-02-14 04:14:21894 TestPermissionsBlacklisting(
895 content::PermissionType::GEOLOCATION, CONTENT_SETTINGS_TYPE_GEOLOCATION,
896 db_manager, url, 2000 /* timeout */, CONTENT_SETTING_BLOCK,
897 PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING);
meredithl62b8c3d2017-01-10 05:47:53898}
899
meredithl03b12852017-01-25 05:08:01900// Tests that a URL that is blacklisted for one permission can still request
901// another and grant another.
meredithl62b8c3d2017-01-10 05:47:53902TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) {
903 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
904 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
905 const GURL url("https://www.example.com");
meredithl03b12852017-01-25 05:08:01906 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
meredithl62b8c3d2017-01-10 05:47:53907 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
meredithl62b8c3d2017-01-10 05:47:53908 TestPermissionsBlacklisting(content::PermissionType::NOTIFICATIONS,
909 CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
dominickn79b96cc2017-02-14 04:14:21910 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW,
911 PermissionEmbargoStatus::NOT_EMBARGOED);
meredithl62b8c3d2017-01-10 05:47:53912}