blob: e19ff8aa3123ffeca4caa7edd3d92ed3d3526d87 [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"
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"
Tim Volodinee45938472017-09-21 10:08:2238#include "components/safe_browsing/db/database_manager.h"
39#include "components/safe_browsing/db/test_database_manager.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"
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:2047const char* const kPermissionsKillSwitchFieldStudy =
kcarattini2ee48ad52015-10-26 23:45:3148 PermissionContextBase::kPermissionsKillSwitchFieldStudy;
thestig9bdf7f22016-09-28 00:56:2049const char* const kPermissionsKillSwitchBlockedValue =
kcarattini2ee48ad52015-10-26 23:45:3150 PermissionContextBase::kPermissionsKillSwitchBlockedValue;
51const char kPermissionsKillSwitchTestGroup[] = "TestGroup";
thestig9bdf7f22016-09-28 00:56:2052const char* const kPromptGroupName = kPermissionsKillSwitchTestGroup;
dominickn6947d752016-08-10 02:00:0653const char kPromptTrialName[] = "PermissionPromptsUX";
kcarattini2ee48ad52015-10-26 23:45:3154
meredithl48ad16812017-02-08 03:15:3755namespace {
56
meredithl62b8c3d2017-01-10 05:47:5357class MockSafeBrowsingDatabaseManager
58 : public safe_browsing::TestSafeBrowsingDatabaseManager {
59 public:
60 explicit MockSafeBrowsingDatabaseManager(bool perform_callback)
61 : perform_callback_(perform_callback) {}
62
63 bool CheckApiBlacklistUrl(
64 const GURL& url,
65 safe_browsing::SafeBrowsingDatabaseManager::Client* client) override {
66 if (perform_callback_) {
67 safe_browsing::ThreatMetadata metadata;
68 const auto& blacklisted_permissions = permissions_blacklist_.find(url);
69 if (blacklisted_permissions != permissions_blacklist_.end())
70 metadata.api_permissions = blacklisted_permissions->second;
71 client->OnCheckApiBlacklistUrlResult(url, metadata);
72 }
73 // Returns false if scheme is HTTP/HTTPS and able to be checked.
74 return false;
75 }
76
77 bool CancelApiCheck(Client* client) override {
78 DCHECK(!perform_callback_);
79 // Returns true when client check could be stopped.
80 return true;
81 }
82
83 void BlacklistUrlPermissions(const GURL& url,
84 const std::set<std::string> permissions) {
85 permissions_blacklist_[url] = permissions;
86 }
87
88 protected:
89 ~MockSafeBrowsingDatabaseManager() override {}
90
91 private:
92 bool perform_callback_;
93 std::map<GURL, std::set<std::string>> permissions_blacklist_;
94
95 DISALLOW_COPY_AND_ASSIGN(MockSafeBrowsingDatabaseManager);
96};
97
meredithl48ad16812017-02-08 03:15:3798} // namespace
99
[email protected]89a8dd5d2014-07-11 12:02:07100class TestPermissionContext : public PermissionContextBase {
101 public:
102 TestPermissionContext(Profile* profile,
lshang88ec36a2015-12-09 04:50:17103 const ContentSettingsType content_settings_type)
raymes21b9affc2017-05-31 06:15:26104 : PermissionContextBase(profile,
105 content_settings_type,
Luna Lubd7ae2f2017-11-07 15:18:03106 blink::FeaturePolicyFeature::kNotFound),
dominickn6947d752016-08-10 02:00:06107 tab_context_updated_(false) {}
[email protected]89a8dd5d2014-07-11 12:02:07108
Daniel Chenga542fca2014-10-21 09:51:29109 ~TestPermissionContext() override {}
[email protected]89a8dd5d2014-07-11 12:02:07110
thestig9bdf7f22016-09-28 00:56:20111 const std::vector<ContentSetting>& decisions() const { return decisions_; }
[email protected]89a8dd5d2014-07-11 12:02:07112
thestig9bdf7f22016-09-28 00:56:20113 bool tab_context_updated() const { return tab_context_updated_; }
[email protected]89a8dd5d2014-07-11 12:02:07114
meredithl62b8c3d2017-01-10 05:47:53115 // Once a decision for the requested permission has been made, run the
116 // callback.
mlamouridf357a312015-03-03 17:34:05117 void TrackPermissionDecision(ContentSetting content_setting) {
johnme7fa91f72016-01-29 22:13:44118 decisions_.push_back(content_setting);
meredithl62b8c3d2017-01-10 05:47:53119 // Null check required here as the quit_closure_ can also be run and reset
120 // first from within DecidePermission.
121 if (quit_closure_) {
122 quit_closure_.Run();
123 quit_closure_.Reset();
124 }
[email protected]89a8dd5d2014-07-11 12:02:07125 }
126
johnmec41dfee2016-01-13 14:35:16127 ContentSetting GetContentSettingFromMap(const GURL& url_a,
128 const GURL& url_b) {
thestig9bdf7f22016-09-28 00:56:20129 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
130 return map->GetContentSetting(url_a.GetOrigin(), url_b.GetOrigin(),
cm.sanchi761e67a2017-11-16 08:23:28131 content_settings_type(), std::string());
johnmec41dfee2016-01-13 14:35:16132 }
133
meredithl62b8c3d2017-01-10 05:47:53134 void RequestPermission(content::WebContents* web_contents,
135 const PermissionRequestID& id,
136 const GURL& requesting_frame,
137 bool user_gesture,
138 const BrowserPermissionCallback& callback) override {
139 base::RunLoop run_loop;
140 quit_closure_ = run_loop.QuitClosure();
141 PermissionContextBase::RequestPermission(web_contents, id, requesting_frame,
142 true /* user_gesture */, callback);
143 run_loop.Run();
144 }
145
146 void DecidePermission(content::WebContents* web_contents,
147 const PermissionRequestID& id,
148 const GURL& requesting_origin,
149 const GURL& embedding_origin,
150 bool user_gesture,
151 const BrowserPermissionCallback& callback) override {
152 PermissionContextBase::DecidePermission(web_contents, id, requesting_origin,
153 embedding_origin, user_gesture,
154 callback);
155 if (respond_permission_) {
156 respond_permission_.Run();
157 respond_permission_.Reset();
158 } else {
159 // Stop the run loop from spinning indefinitely if no response callback
160 // has been set, as is the case with TestParallelRequests.
161 quit_closure_.Run();
162 quit_closure_.Reset();
163 }
164 }
165
meredithl03b12852017-01-25 05:08:01166 // Set the callback to run if the permission is being responded to in the
167 // test. This is left empty where no response is needed, such as in parallel
168 // requests, permissions blacklisting, invalid origin, and killswitch.
meredithl62b8c3d2017-01-10 05:47:53169 void SetRespondPermissionCallback(base::Closure callback) {
170 respond_permission_ = callback;
171 }
172
[email protected]89a8dd5d2014-07-11 12:02:07173 protected:
Daniel Chenga542fca2014-10-21 09:51:29174 void UpdateTabContext(const PermissionRequestID& id,
175 const GURL& requesting_origin,
176 bool allowed) override {
[email protected]89a8dd5d2014-07-11 12:02:07177 tab_context_updated_ = true;
178 }
179
dominickn2e27dea2017-02-23 23:00:25180 bool IsRestrictedToSecureOrigins() const override { return false; }
mlamouria31c6ff12015-06-01 15:40:52181
[email protected]89a8dd5d2014-07-11 12:02:07182 private:
johnme7fa91f72016-01-29 22:13:44183 std::vector<ContentSetting> decisions_;
184 bool tab_context_updated_;
meredithl62b8c3d2017-01-10 05:47:53185 base::Closure quit_closure_;
186 // Callback for responding to a permission once the request has been completed
187 // (valid URL, kill switch disabled, not blacklisted)
188 base::Closure respond_permission_;
thestig9bdf7f22016-09-28 00:56:20189 DISALLOW_COPY_AND_ASSIGN(TestPermissionContext);
dominickn6947d752016-08-10 02:00:06190};
191
192class TestKillSwitchPermissionContext : public TestPermissionContext {
193 public:
194 TestKillSwitchPermissionContext(
195 Profile* profile,
dominickn6947d752016-08-10 02:00:06196 const ContentSettingsType content_settings_type)
timloh9a180ad2017-02-20 07:15:23197 : TestPermissionContext(profile, content_settings_type),
thestig9bdf7f22016-09-28 00:56:20198 field_trial_list_(base::MakeUnique<base::FieldTrialList>(
199 base::MakeUnique<base::MockEntropyProvider>())) {}
dominickn6947d752016-08-10 02:00:06200
201 void ResetFieldTrialList() {
202 // Destroy the existing FieldTrialList before creating a new one to avoid
203 // a DCHECK.
204 field_trial_list_.reset();
thestig9bdf7f22016-09-28 00:56:20205 field_trial_list_ = base::MakeUnique<base::FieldTrialList>(
206 base::MakeUnique<base::MockEntropyProvider>());
dominickn6947d752016-08-10 02:00:06207 variations::testing::ClearAllVariationParams();
208 }
209
210 private:
dcheng4af48582016-04-19 00:29:35211 std::unique_ptr<base::FieldTrialList> field_trial_list_;
thestig9bdf7f22016-09-28 00:56:20212
213 DISALLOW_COPY_AND_ASSIGN(TestKillSwitchPermissionContext);
[email protected]89a8dd5d2014-07-11 12:02:07214};
215
Timothy Loh246355d2017-08-18 05:10:30216class PermissionContextBaseTests : public ChromeRenderViewHostTestHarness {
felt88bf98cb2014-12-16 03:50:23217 protected:
218 PermissionContextBaseTests() {}
thestig9bdf7f22016-09-28 00:56:20219 ~PermissionContextBaseTests() override {}
felt88bf98cb2014-12-16 03:50:23220
Timothy Loh246355d2017-08-18 05:10:30221 // Accept or dismiss the permission prompt.
felt88bf98cb2014-12-16 03:50:23222 void RespondToPermission(TestPermissionContext* context,
223 const PermissionRequestID& id,
224 const GURL& url,
dominicknd4e446a2016-09-13 07:44:13225 bool persist,
johnme7fa91f72016-01-29 22:13:44226 ContentSetting response) {
227 DCHECK(response == CONTENT_SETTING_ALLOW ||
228 response == CONTENT_SETTING_BLOCK ||
229 response == CONTENT_SETTING_ASK);
Timothy Loh246355d2017-08-18 05:10:30230 PermissionRequestManager* manager =
231 PermissionRequestManager::FromWebContents(web_contents());
232 manager->TogglePersist(persist);
233 using AutoResponseType = PermissionRequestManager::AutoResponseType;
234 AutoResponseType decision = AutoResponseType::DISMISS;
235 if (response == CONTENT_SETTING_ALLOW)
236 decision = AutoResponseType::ACCEPT_ALL;
237 else if (response == CONTENT_SETTING_BLOCK)
238 decision = AutoResponseType::DENY_ALL;
239 prompt_factory_->set_response_type(decision);
felt88bf98cb2014-12-16 03:50:23240 }
241
timloh9a180ad2017-02-20 07:15:23242 void TestAskAndDecide_TestContent(ContentSettingsType content_settings_type,
dominicknd4e446a2016-09-13 07:44:13243 ContentSetting decision,
244 bool persist) {
timloh9a180ad2017-02-20 07:15:23245 TestPermissionContext permission_context(profile(), content_settings_type);
dominicknd4e446a2016-09-13 07:44:13246 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09247 SetUpUrl(url);
dominickn6da2b382016-08-23 20:21:30248 base::HistogramTester histograms;
felt88bf98cb2014-12-16 03:50:23249
250 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09251 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25252 web_contents()->GetMainFrame()->GetRoutingID(), -1);
meredithl62b8c3d2017-01-10 05:47:53253 permission_context.SetRespondPermissionCallback(
254 base::Bind(&PermissionContextBaseTests::RespondToPermission,
255 base::Unretained(this), &permission_context, id, url,
256 persist, decision));
felt88bf98cb2014-12-16 03:50:23257 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25258 web_contents(), id, url, true /* user_gesture */,
felt88bf98cb2014-12-16 03:50:23259 base::Bind(&TestPermissionContext::TrackPermissionDecision,
260 base::Unretained(&permission_context)));
thestig9bdf7f22016-09-28 00:56:20261 ASSERT_EQ(1u, permission_context.decisions().size());
dominicknd4e446a2016-09-13 07:44:13262 EXPECT_EQ(decision, permission_context.decisions()[0]);
felt88bf98cb2014-12-16 03:50:23263 EXPECT_TRUE(permission_context.tab_context_updated());
dominickn6da2b382016-08-23 20:21:30264
thestig9bdf7f22016-09-28 00:56:20265 std::string decision_string;
dominicknd4e446a2016-09-13 07:44:13266 if (decision == CONTENT_SETTING_ALLOW)
267 decision_string = "Accepted";
268 else if (decision == CONTENT_SETTING_BLOCK)
269 decision_string = "Denied";
270 else if (decision == CONTENT_SETTING_ASK)
271 decision_string = "Dismissed";
felt88bf98cb2014-12-16 03:50:23272
dominicknd4e446a2016-09-13 07:44:13273 if (decision_string.size()) {
274 histograms.ExpectUniqueSample(
275 "Permissions.Prompt." + decision_string + ".PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23276 PermissionUtil::GetPermissionString(content_settings_type),
dominicknd4e446a2016-09-13 07:44:13277 0, 1);
278 histograms.ExpectUniqueSample(
279 "Permissions.Prompt." + decision_string + ".PriorIgnoreCount." +
timloh9a180ad2017-02-20 07:15:23280 PermissionUtil::GetPermissionString(content_settings_type),
dominicknd4e446a2016-09-13 07:44:13281 0, 1);
282 }
felt88bf98cb2014-12-16 03:50:23283
dominicknd4e446a2016-09-13 07:44:13284 if (persist) {
285 EXPECT_EQ(decision,
286 permission_context.GetContentSettingFromMap(url, url));
287 } else {
288 EXPECT_EQ(CONTENT_SETTING_ASK,
289 permission_context.GetContentSettingFromMap(url, url));
290 }
dominickn79b96cc2017-02-14 04:14:21291
dominickn23913152017-02-23 12:04:02292 histograms.ExpectUniqueSample(
293 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25294 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), 1);
295 histograms.ExpectUniqueSample(
296 "Permissions.AutoBlocker.EmbargoStatus",
297 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), 1);
felt88bf98cb2014-12-16 03:50:23298 }
299
dominickn6947d752016-08-10 02:00:06300 void DismissMultipleTimesAndExpectBlock(
301 const GURL& url,
dominickn6947d752016-08-10 02:00:06302 ContentSettingsType content_settings_type,
303 uint32_t iterations) {
304 base::HistogramTester histograms;
305
306 // Dismiss |iterations| times. The final dismiss should change the decision
307 // from dismiss to block, and hence change the persisted content setting.
308 for (uint32_t i = 0; i < iterations; ++i) {
timloh9a180ad2017-02-20 07:15:23309 TestPermissionContext permission_context(profile(),
310 content_settings_type);
dominickn6947d752016-08-10 02:00:06311 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09312 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn6947d752016-08-10 02:00:06313 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53314
315 permission_context.SetRespondPermissionCallback(
316 base::Bind(&PermissionContextBaseTests::RespondToPermission,
317 base::Unretained(this), &permission_context, id, url,
318 false, CONTENT_SETTING_ASK));
319
dominickn6947d752016-08-10 02:00:06320 permission_context.RequestPermission(
321 web_contents(), id, url, true /* user_gesture */,
322 base::Bind(&TestPermissionContext::TrackPermissionDecision,
dominickn2e27dea2017-02-23 23:00:25323 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06324 histograms.ExpectTotalCount(
dominickn6da2b382016-08-23 20:21:30325 "Permissions.Prompt.Dismissed.PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23326 PermissionUtil::GetPermissionString(content_settings_type),
dominickn6947d752016-08-10 02:00:06327 i + 1);
dominickn6da2b382016-08-23 20:21:30328 histograms.ExpectBucketCount(
329 "Permissions.Prompt.Dismissed.PriorDismissCount." +
timloh9a180ad2017-02-20 07:15:23330 PermissionUtil::GetPermissionString(content_settings_type),
dominickn6da2b382016-08-23 20:21:30331 i, 1);
dominickn23913152017-02-23 12:04:02332
Timothy Loh246355d2017-08-18 05:10:30333 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
334 i + 1);
dominickn23913152017-02-23 12:04:02335
raymesf6104d492017-03-09 01:20:18336 PermissionResult result = permission_context.GetPermissionStatus(
337 nullptr /* render_frame_host */, url, url);
dominickn23913152017-02-23 12:04:02338
339 histograms.ExpectUniqueSample(
340 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25341 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21342 if (i < 2) {
dominickn23913152017-02-23 12:04:02343 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
344 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
Timothy Loh246355d2017-08-18 05:10:30345 histograms.ExpectUniqueSample(
346 "Permissions.AutoBlocker.EmbargoStatus",
347 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21348 } else {
dominickn23913152017-02-23 12:04:02349 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
350 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
Timothy Loh246355d2017-08-18 05:10:30351 histograms.ExpectBucketCount(
352 "Permissions.AutoBlocker.EmbargoStatus",
353 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn79b96cc2017-02-14 04:14:21354 }
355
thestig9bdf7f22016-09-28 00:56:20356 ASSERT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21357 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06358 EXPECT_TRUE(permission_context.tab_context_updated());
dominickn6947d752016-08-10 02:00:06359 }
360
timloh9a180ad2017-02-20 07:15:23361 TestPermissionContext permission_context(profile(), content_settings_type);
meredithl03b12852017-01-25 05:08:01362 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09363 web_contents()->GetMainFrame()->GetProcess()->GetID(),
meredithl03b12852017-01-25 05:08:01364 web_contents()->GetMainFrame()->GetRoutingID(), -1);
365
366 permission_context.SetRespondPermissionCallback(
367 base::Bind(&PermissionContextBaseTests::RespondToPermission,
368 base::Unretained(this), &permission_context, id, url, false,
369 CONTENT_SETTING_ASK));
370
371 permission_context.RequestPermission(
372 web_contents(), id, url, true /* user_gesture */,
373 base::Bind(&TestPermissionContext::TrackPermissionDecision,
374 base::Unretained(&permission_context)));
meredithlcda94daf2017-01-19 03:03:35375
raymesf6104d492017-03-09 01:20:18376 PermissionResult result = permission_context.GetPermissionStatus(
377 nullptr /* render_frame_host */, url, url);
raymesab359712017-02-15 06:23:25378 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
dominickn23913152017-02-23 12:04:02379 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
380 histograms.ExpectBucketCount(
381 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25382 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn6947d752016-08-10 02:00:06383 }
384
385 void TestBlockOnSeveralDismissals_TestContent() {
386 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09387 SetUpUrl(url);
dominickn6947d752016-08-10 02:00:06388 base::HistogramTester histograms;
389
dominickn5b41f222017-05-11 03:44:26390 {
391 // Ensure that > 3 dismissals behaves correctly when the
392 // BlockPromptsIfDismissedOften feature is off.
393 base::test::ScopedFeatureList feature_list;
Timothy Loh246355d2017-08-18 05:10:30394 feature_list.InitAndDisableFeature(
395 features::kBlockPromptsIfDismissedOften);
dominickn6947d752016-08-10 02:00:06396
dominickn5b41f222017-05-11 03:44:26397 for (uint32_t i = 0; i < 4; ++i) {
398 TestPermissionContext permission_context(
399 profile(), CONTENT_SETTINGS_TYPE_GEOLOCATION);
meredithl62b8c3d2017-01-10 05:47:53400
dominickn5b41f222017-05-11 03:44:26401 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09402 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn5b41f222017-05-11 03:44:26403 web_contents()->GetMainFrame()->GetRoutingID(), i);
404
405 permission_context.SetRespondPermissionCallback(
406 base::Bind(&PermissionContextBaseTests::RespondToPermission,
407 base::Unretained(this), &permission_context, id, url,
408 false, CONTENT_SETTING_ASK));
409 permission_context.RequestPermission(
410 web_contents(), id, url, true /* user_gesture */,
411 base::Bind(&TestPermissionContext::TrackPermissionDecision,
412 base::Unretained(&permission_context)));
413 histograms.ExpectTotalCount(
414 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation",
415 i + 1);
416 histograms.ExpectBucketCount(
417 "Permissions.Prompt.Dismissed.PriorDismissCount.Geolocation", i, 1);
418 histograms.ExpectUniqueSample(
419 "Permissions.AutoBlocker.EmbargoPromptSuppression",
420 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
Timothy Loh246355d2017-08-18 05:10:30421 histograms.ExpectUniqueSample(
422 "Permissions.AutoBlocker.EmbargoStatus",
423 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21424
dominickn5b41f222017-05-11 03:44:26425 ASSERT_EQ(1u, permission_context.decisions().size());
426 EXPECT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
427 EXPECT_TRUE(permission_context.tab_context_updated());
428 EXPECT_EQ(CONTENT_SETTING_ASK,
429 permission_context.GetContentSettingFromMap(url, url));
430 }
431
432 // Flush the dismissal counts.
433 auto* map = HostContentSettingsMapFactory::GetForProfile(profile());
434 map->ClearSettingsForOneType(
435 CONTENT_SETTINGS_TYPE_PERMISSION_AUTOBLOCKER_DATA);
dominickn6947d752016-08-10 02:00:06436 }
437
dominickn6947d752016-08-10 02:00:06438 EXPECT_TRUE(
439 base::FeatureList::IsEnabled(features::kBlockPromptsIfDismissedOften));
440
441 // Sanity check independence per permission type by checking two of them.
dominickn2e27dea2017-02-23 23:00:25442 DismissMultipleTimesAndExpectBlock(url, CONTENT_SETTINGS_TYPE_GEOLOCATION,
443 3);
444 DismissMultipleTimesAndExpectBlock(url, CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
445 3);
dominickn6947d752016-08-10 02:00:06446 }
447
448 void TestVariationBlockOnSeveralDismissals_TestContent() {
449 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09450 SetUpUrl(url);
dominickn6da2b382016-08-23 20:21:30451 base::HistogramTester histograms;
dominickn6947d752016-08-10 02:00:06452
453 // Set up the custom parameter and custom value.
thestig9bdf7f22016-09-28 00:56:20454 base::FieldTrialList field_trials(nullptr);
dominickn6947d752016-08-10 02:00:06455 base::FieldTrial* trial = base::FieldTrialList::CreateFieldTrial(
456 kPromptTrialName, kPromptGroupName);
457 std::map<std::string, std::string> params;
458 params[PermissionDecisionAutoBlocker::kPromptDismissCountKey] = "5";
dominickn2e27dea2017-02-23 23:00:25459 ASSERT_TRUE(variations::AssociateVariationParams(kPromptTrialName,
460 kPromptGroupName, params));
dominickn6947d752016-08-10 02:00:06461
thestig9bdf7f22016-09-28 00:56:20462 std::unique_ptr<base::FeatureList> feature_list =
463 base::MakeUnique<base::FeatureList>();
dominickn6947d752016-08-10 02:00:06464 feature_list->RegisterFieldTrialOverride(
465 features::kBlockPromptsIfDismissedOften.name,
466 base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial);
thestig9bdf7f22016-09-28 00:56:20467
468 base::test::ScopedFeatureList scoped_feature_list;
469 scoped_feature_list.InitWithFeatureList(std::move(feature_list));
470
dominickn6947d752016-08-10 02:00:06471 EXPECT_EQ(base::FeatureList::GetFieldTrial(
472 features::kBlockPromptsIfDismissedOften),
473 trial);
474
thestig9bdf7f22016-09-28 00:56:20475 {
476 std::map<std::string, std::string> actual_params;
477 EXPECT_TRUE(variations::GetVariationParamsByFeature(
478 features::kBlockPromptsIfDismissedOften, &actual_params));
479 EXPECT_EQ(params, actual_params);
480 }
dominickn6947d752016-08-10 02:00:06481
482 for (uint32_t i = 0; i < 5; ++i) {
483 TestPermissionContext permission_context(
timloh9a180ad2017-02-20 07:15:23484 profile(), CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
dominickn6947d752016-08-10 02:00:06485
dominickn6947d752016-08-10 02:00:06486 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09487 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn6947d752016-08-10 02:00:06488 web_contents()->GetMainFrame()->GetRoutingID(), i);
meredithl62b8c3d2017-01-10 05:47:53489 permission_context.SetRespondPermissionCallback(
490 base::Bind(&PermissionContextBaseTests::RespondToPermission,
491 base::Unretained(this), &permission_context, id, url,
492 false, CONTENT_SETTING_ASK));
dominickn6947d752016-08-10 02:00:06493 permission_context.RequestPermission(
494 web_contents(), id, url, true /* user_gesture */,
495 base::Bind(&TestPermissionContext::TrackPermissionDecision,
meredithl62b8c3d2017-01-10 05:47:53496 base::Unretained(&permission_context)));
dominickn6947d752016-08-10 02:00:06497
dominickn6947d752016-08-10 02:00:06498 EXPECT_EQ(1u, permission_context.decisions().size());
dominickn79b96cc2017-02-14 04:14:21499 ASSERT_EQ(CONTENT_SETTING_ASK, permission_context.decisions()[0]);
dominickn6947d752016-08-10 02:00:06500 EXPECT_TRUE(permission_context.tab_context_updated());
raymesf6104d492017-03-09 01:20:18501 PermissionResult result = permission_context.GetPermissionStatus(
502 nullptr /* render_frame_host */, url, url);
dominickn6da2b382016-08-23 20:21:30503
504 histograms.ExpectTotalCount(
505 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i + 1);
506 histograms.ExpectBucketCount(
507 "Permissions.Prompt.Dismissed.PriorDismissCount.MidiSysEx", i, 1);
dominickn23913152017-02-23 12:04:02508 histograms.ExpectUniqueSample(
509 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25510 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
Timothy Loh246355d2017-08-18 05:10:30511 histograms.ExpectTotalCount("Permissions.AutoBlocker.EmbargoStatus",
512 i + 1);
dominickn79b96cc2017-02-14 04:14:21513 if (i < 4) {
dominickn23913152017-02-23 12:04:02514 EXPECT_EQ(CONTENT_SETTING_ASK, result.content_setting);
515 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
Timothy Loh246355d2017-08-18 05:10:30516 histograms.ExpectUniqueSample(
517 "Permissions.AutoBlocker.EmbargoStatus",
518 static_cast<int>(PermissionEmbargoStatus::NOT_EMBARGOED), i + 1);
dominickn79b96cc2017-02-14 04:14:21519 } else {
dominickn23913152017-02-23 12:04:02520 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
521 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
Timothy Loh246355d2017-08-18 05:10:30522 histograms.ExpectBucketCount(
523 "Permissions.AutoBlocker.EmbargoStatus",
524 static_cast<int>(PermissionEmbargoStatus::REPEATED_DISMISSALS), 1);
dominickn79b96cc2017-02-14 04:14:21525 }
dominickn6947d752016-08-10 02:00:06526 }
527
528 // Ensure that we finish in the block state.
timloh9a180ad2017-02-20 07:15:23529 TestPermissionContext permission_context(profile(),
530 CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
raymesf6104d492017-03-09 01:20:18531 PermissionResult result = permission_context.GetPermissionStatus(
532 nullptr /* render_frame_host */, url, url);
raymesab359712017-02-15 06:23:25533 EXPECT_EQ(CONTENT_SETTING_BLOCK, result.content_setting);
dominickn23913152017-02-23 12:04:02534 EXPECT_EQ(PermissionStatusSource::MULTIPLE_DISMISSALS, result.source);
dominickn6947d752016-08-10 02:00:06535 variations::testing::ClearAllVariationParams();
536 }
537
lshang88ec36a2015-12-09 04:50:17538 void TestRequestPermissionInvalidUrl(
lshang88ec36a2015-12-09 04:50:17539 ContentSettingsType content_settings_type) {
dominickn23913152017-02-23 12:04:02540 base::HistogramTester histograms;
timloh9a180ad2017-02-20 07:15:23541 TestPermissionContext permission_context(profile(), content_settings_type);
timvolodinea2830552015-01-20 17:21:23542 GURL url;
543 ASSERT_FALSE(url.is_valid());
clamy05ebb4e2017-08-17 18:59:05544 controller().LoadURL(url, content::Referrer(), ui::PAGE_TRANSITION_TYPED,
545 std::string());
timvolodinea2830552015-01-20 17:21:23546
547 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09548 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25549 web_contents()->GetMainFrame()->GetRoutingID(), -1);
timvolodinea2830552015-01-20 17:21:23550 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25551 web_contents(), id, url, true /* user_gesture */,
timvolodinea2830552015-01-20 17:21:23552 base::Bind(&TestPermissionContext::TrackPermissionDecision,
553 base::Unretained(&permission_context)));
554
thestig9bdf7f22016-09-28 00:56:20555 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44556 EXPECT_EQ(CONTENT_SETTING_BLOCK, permission_context.decisions()[0]);
timvolodinea2830552015-01-20 17:21:23557 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16558 EXPECT_EQ(CONTENT_SETTING_ASK,
559 permission_context.GetContentSettingFromMap(url, url));
dominickn23913152017-02-23 12:04:02560 histograms.ExpectTotalCount(
561 "Permissions.AutoBlocker.EmbargoPromptSuppression", 0);
timvolodinea2830552015-01-20 17:21:23562 }
563
timloh9a180ad2017-02-20 07:15:23564 void TestGrantAndRevoke_TestContent(ContentSettingsType content_settings_type,
timvolodine16be5202015-02-02 17:44:54565 ContentSetting expected_default) {
timloh9a180ad2017-02-20 07:15:23566 TestPermissionContext permission_context(profile(), content_settings_type);
toyoshim9eb573f42015-03-30 10:39:39567 GURL url("https://www.google.com");
timloh86d8eaf2017-05-09 03:43:09568 SetUpUrl(url);
timvolodine16be5202015-02-02 17:44:54569
570 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09571 web_contents()->GetMainFrame()->GetProcess()->GetID(),
dominickn2e27dea2017-02-23 23:00:25572 web_contents()->GetMainFrame()->GetRoutingID(), -1);
meredithl62b8c3d2017-01-10 05:47:53573 permission_context.SetRespondPermissionCallback(
574 base::Bind(&PermissionContextBaseTests::RespondToPermission,
575 base::Unretained(this), &permission_context, id, url, true,
576 CONTENT_SETTING_ALLOW));
577
timvolodine16be5202015-02-02 17:44:54578 permission_context.RequestPermission(
dominickn2e27dea2017-02-23 23:00:25579 web_contents(), id, url, true /* user_gesture */,
timvolodine16be5202015-02-02 17:44:54580 base::Bind(&TestPermissionContext::TrackPermissionDecision,
581 base::Unretained(&permission_context)));
582
thestig9bdf7f22016-09-28 00:56:20583 ASSERT_EQ(1u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44584 EXPECT_EQ(CONTENT_SETTING_ALLOW, permission_context.decisions()[0]);
timvolodine16be5202015-02-02 17:44:54585 EXPECT_TRUE(permission_context.tab_context_updated());
johnmec41dfee2016-01-13 14:35:16586 EXPECT_EQ(CONTENT_SETTING_ALLOW,
587 permission_context.GetContentSettingFromMap(url, url));
timvolodine16be5202015-02-02 17:44:54588
589 // Try to reset permission.
590 permission_context.ResetPermission(url.GetOrigin(), url.GetOrigin());
591 ContentSetting setting_after_reset =
johnmec41dfee2016-01-13 14:35:16592 permission_context.GetContentSettingFromMap(url, url);
timvolodine16be5202015-02-02 17:44:54593 ContentSetting default_setting =
peconn5100d432015-09-16 12:03:08594 HostContentSettingsMapFactory::GetForProfile(profile())
lshang88ec36a2015-12-09 04:50:17595 ->GetDefaultContentSetting(content_settings_type, nullptr);
timvolodine16be5202015-02-02 17:44:54596 EXPECT_EQ(default_setting, setting_after_reset);
597 }
598
lshang88ec36a2015-12-09 04:50:17599 void TestGlobalPermissionsKillSwitch(
lshang88ec36a2015-12-09 04:50:17600 ContentSettingsType content_settings_type) {
timloh9a180ad2017-02-20 07:15:23601 TestKillSwitchPermissionContext permission_context(profile(),
602 content_settings_type);
kcarattini2ee48ad52015-10-26 23:45:31603 permission_context.ResetFieldTrialList();
604
605 EXPECT_FALSE(permission_context.IsPermissionKillSwitchOn());
606 std::map<std::string, std::string> params;
timloh9a180ad2017-02-20 07:15:23607 params[PermissionUtil::GetPermissionString(content_settings_type)] =
kcarattini2ee48ad52015-10-26 23:45:31608 kPermissionsKillSwitchBlockedValue;
dominickn2e27dea2017-02-23 23:00:25609 variations::AssociateVariationParams(kPermissionsKillSwitchFieldStudy,
610 kPermissionsKillSwitchTestGroup,
611 params);
kcarattini2ee48ad52015-10-26 23:45:31612 base::FieldTrialList::CreateFieldTrial(kPermissionsKillSwitchFieldStudy,
613 kPermissionsKillSwitchTestGroup);
614 EXPECT_TRUE(permission_context.IsPermissionKillSwitchOn());
615 }
616
johnme7fa91f72016-01-29 22:13:44617 // Don't call this more than once in the same test, as it persists data to
618 // HostContentSettingsMap.
619 void TestParallelRequests(ContentSetting response) {
620 TestPermissionContext permission_context(
timloh9a180ad2017-02-20 07:15:23621 profile(), CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
johnme7fa91f72016-01-29 22:13:44622 GURL url("http://www.google.com");
timloh86d8eaf2017-05-09 03:43:09623 SetUpUrl(url);
johnme7fa91f72016-01-29 22:13:44624
625 const PermissionRequestID id0(
Lukasz Anforowicz1452b892017-09-28 20:10:09626 web_contents()->GetMainFrame()->GetProcess()->GetID(),
johnme7fa91f72016-01-29 22:13:44627 web_contents()->GetMainFrame()->GetRoutingID(), 0);
628 const PermissionRequestID id1(
Lukasz Anforowicz1452b892017-09-28 20:10:09629 web_contents()->GetMainFrame()->GetProcess()->GetID(),
johnme7fa91f72016-01-29 22:13:44630 web_contents()->GetMainFrame()->GetRoutingID(), 1);
631
meredithl62b8c3d2017-01-10 05:47:53632 bool persist = (response == CONTENT_SETTING_ALLOW ||
633 response == CONTENT_SETTING_BLOCK);
634
635 // Request a permission without setting the callback to DecidePermission.
johnme7fa91f72016-01-29 22:13:44636 permission_context.RequestPermission(
benwellsfd2b1552016-07-05 04:26:53637 web_contents(), id0, url, true /* user_gesture */,
johnme7fa91f72016-01-29 22:13:44638 base::Bind(&TestPermissionContext::TrackPermissionDecision,
639 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44640
641 EXPECT_EQ(0u, permission_context.decisions().size());
642
meredithl62b8c3d2017-01-10 05:47:53643 // Set the callback, and make a second permission request.
644 permission_context.SetRespondPermissionCallback(
645 base::Bind(&PermissionContextBaseTests::RespondToPermission,
646 base::Unretained(this), &permission_context, id0, url,
647 persist, response));
648 permission_context.RequestPermission(
649 web_contents(), id1, url, true /* user_gesture */,
650 base::Bind(&TestPermissionContext::TrackPermissionDecision,
651 base::Unretained(&permission_context)));
johnme7fa91f72016-01-29 22:13:44652
thestig9bdf7f22016-09-28 00:56:20653 ASSERT_EQ(2u, permission_context.decisions().size());
johnme7fa91f72016-01-29 22:13:44654 EXPECT_EQ(response, permission_context.decisions()[0]);
655 EXPECT_EQ(response, permission_context.decisions()[1]);
656 EXPECT_TRUE(permission_context.tab_context_updated());
657
658 EXPECT_EQ(response, permission_context.GetContentSettingFromMap(url, url));
659 }
660
meredithl62b8c3d2017-01-10 05:47:53661 void TestPermissionsBlacklisting(
meredithl62b8c3d2017-01-10 05:47:53662 ContentSettingsType content_settings_type,
663 scoped_refptr<safe_browsing::SafeBrowsingDatabaseManager> db_manager,
664 const GURL& url,
665 int timeout,
dominickn79b96cc2017-02-14 04:14:21666 ContentSetting expected_permission_status,
667 PermissionEmbargoStatus expected_embargo_reason) {
timloh86d8eaf2017-05-09 03:43:09668 SetUpUrl(url);
dominickn79b96cc2017-02-14 04:14:21669 base::HistogramTester histograms;
meredithl62b8c3d2017-01-10 05:47:53670 base::test::ScopedFeatureList scoped_feature_list;
Timothy Loh246355d2017-08-18 05:10:30671 scoped_feature_list.InitAndEnableFeature(features::kPermissionsBlacklist);
timloh9a180ad2017-02-20 07:15:23672 TestPermissionContext permission_context(profile(), content_settings_type);
meredithl03b12852017-01-25 05:08:01673 PermissionDecisionAutoBlocker::GetForProfile(profile())
674 ->SetSafeBrowsingDatabaseManagerAndTimeoutForTesting(db_manager,
675 timeout);
meredithl62b8c3d2017-01-10 05:47:53676 const PermissionRequestID id(
Lukasz Anforowicz1452b892017-09-28 20:10:09677 web_contents()->GetMainFrame()->GetProcess()->GetID(),
meredithl62b8c3d2017-01-10 05:47:53678 web_contents()->GetMainFrame()->GetRoutingID(), -1);
meredithl03b12852017-01-25 05:08:01679
680 // A response only needs to be made to the permission request if we do not
dominickn23913152017-02-23 12:04:02681 // expect the permission to be blacklisted.
meredithl03b12852017-01-25 05:08:01682 if (expected_permission_status == CONTENT_SETTING_ALLOW) {
683 permission_context.SetRespondPermissionCallback(
684 base::Bind(&PermissionContextBaseTests::RespondToPermission,
685 base::Unretained(this), &permission_context, id, url,
686 true /* persist */, expected_permission_status));
687 }
688
meredithl62b8c3d2017-01-10 05:47:53689 permission_context.RequestPermission(
690 web_contents(), id, url, true /* user_gesture */,
691 base::Bind(&TestPermissionContext::TrackPermissionDecision,
692 base::Unretained(&permission_context)));
raymesf6104d492017-03-09 01:20:18693 PermissionResult result = permission_context.GetPermissionStatus(
694 nullptr /* render_frame_host */, url, url);
raymesab359712017-02-15 06:23:25695 EXPECT_EQ(expected_permission_status, result.content_setting);
meredithl62b8c3d2017-01-10 05:47:53696
meredithl03b12852017-01-25 05:08:01697 if (expected_permission_status == CONTENT_SETTING_ALLOW) {
698 ASSERT_EQ(1u, permission_context.decisions().size());
699 EXPECT_EQ(expected_permission_status, permission_context.decisions()[0]);
dominickn23913152017-02-23 12:04:02700 EXPECT_EQ(PermissionStatusSource::UNSPECIFIED, result.source);
701 } else {
702 EXPECT_EQ(PermissionStatusSource::SAFE_BROWSING_BLACKLIST, result.source);
meredithl03b12852017-01-25 05:08:01703 }
dominickn23913152017-02-23 12:04:02704 histograms.ExpectUniqueSample(
705 "Permissions.AutoBlocker.EmbargoPromptSuppression",
dominickn2e27dea2017-02-23 23:00:25706 static_cast<int>(expected_embargo_reason), 1);
dominickn79b96cc2017-02-14 04:14:21707 histograms.ExpectUniqueSample("Permissions.AutoBlocker.EmbargoStatus",
dominickn2e27dea2017-02-23 23:00:25708 static_cast<int>(expected_embargo_reason), 1);
meredithl62b8c3d2017-01-10 05:47:53709 }
710
timloh86d8eaf2017-05-09 03:43:09711 void SetUpUrl(const GURL& url) {
712 NavigateAndCommit(url);
Timothy Loh246355d2017-08-18 05:10:30713 prompt_factory_->DocumentOnLoadCompletedInMainFrame();
timloh86d8eaf2017-05-09 03:43:09714 }
715
felt88bf98cb2014-12-16 03:50:23716 private:
717 // ChromeRenderViewHostTestHarness:
dcheng171318362014-12-29 18:31:25718 void SetUp() override {
felt88bf98cb2014-12-16 03:50:23719 ChromeRenderViewHostTestHarness::SetUp();
Timothy Loh246355d2017-08-18 05:10:30720 PermissionRequestManager::CreateForWebContents(web_contents());
721 PermissionRequestManager* manager =
722 PermissionRequestManager::FromWebContents(web_contents());
723 prompt_factory_.reset(new MockPermissionPromptFactory(manager));
felt88bf98cb2014-12-16 03:50:23724 }
725
timloh86d8eaf2017-05-09 03:43:09726 void TearDown() override {
727 prompt_factory_.reset();
728 ChromeRenderViewHostTestHarness::TearDown();
729 }
730
731 std::unique_ptr<MockPermissionPromptFactory> prompt_factory_;
732
felt88bf98cb2014-12-16 03:50:23733 DISALLOW_COPY_AND_ASSIGN(PermissionContextBaseTests);
734};
735
[email protected]89a8dd5d2014-07-11 12:02:07736// Simulates clicking Accept. The permission should be granted and
737// saved for future use.
Timothy Loh246355d2017-08-18 05:10:30738TEST_F(PermissionContextBaseTests, TestAskAndGrantPersist) {
timloh9a180ad2017-02-20 07:15:23739 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
dominicknd4e446a2016-09-13 07:44:13740 CONTENT_SETTING_ALLOW, true);
741}
742
743// Simulates clicking Accept. The permission should be granted, but not
744// persisted.
Timothy Loh246355d2017-08-18 05:10:30745TEST_F(PermissionContextBaseTests, TestAskAndGrantNoPersist) {
timloh9a180ad2017-02-20 07:15:23746 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
dominicknd4e446a2016-09-13 07:44:13747 CONTENT_SETTING_ALLOW, false);
748}
749
750// Simulates clicking Block. The permission should be denied and
751// saved for future use.
Timothy Loh246355d2017-08-18 05:10:30752TEST_F(PermissionContextBaseTests, TestAskAndBlockPersist) {
timloh9a180ad2017-02-20 07:15:23753 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
dominicknd4e446a2016-09-13 07:44:13754 CONTENT_SETTING_BLOCK, true);
755}
756
757// Simulates clicking Block. The permission should be denied, but not persisted.
Timothy Loh246355d2017-08-18 05:10:30758TEST_F(PermissionContextBaseTests, TestAskAndBlockNoPersist) {
timloh9a180ad2017-02-20 07:15:23759 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
dominicknd4e446a2016-09-13 07:44:13760 CONTENT_SETTING_BLOCK, false);
timvolodinea2830552015-01-20 17:21:23761}
[email protected]89a8dd5d2014-07-11 12:02:07762
Timothy Loh246355d2017-08-18 05:10:30763// Simulates clicking Dismiss (X) in the prompt.
[email protected]89a8dd5d2014-07-11 12:02:07764// The permission should be denied but not saved for future use.
Timothy Loh246355d2017-08-18 05:10:30765TEST_F(PermissionContextBaseTests, TestAskAndDismiss) {
timloh9a180ad2017-02-20 07:15:23766 TestAskAndDecide_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
dominicknd4e446a2016-09-13 07:44:13767 CONTENT_SETTING_ASK, false);
timvolodinea2830552015-01-20 17:21:23768}
769
Timothy Loh246355d2017-08-18 05:10:30770// Simulates clicking Dismiss (X) in the prompt with the block on too
dominickn6947d752016-08-10 02:00:06771// many dismissals feature active. The permission should be blocked after
772// several dismissals.
Timothy Loh246355d2017-08-18 05:10:30773TEST_F(PermissionContextBaseTests, TestDismissUntilBlocked) {
dominickn6947d752016-08-10 02:00:06774 TestBlockOnSeveralDismissals_TestContent();
775}
776
777// Test setting a custom number of dismissals before block via variations.
Timothy Loh246355d2017-08-18 05:10:30778TEST_F(PermissionContextBaseTests, TestDismissVariations) {
dominickn6947d752016-08-10 02:00:06779 TestVariationBlockOnSeveralDismissals_TestContent();
780}
781
timvolodinea2830552015-01-20 17:21:23782// Simulates non-valid requesting URL.
783// The permission should be denied but not saved for future use.
Timothy Loh246355d2017-08-18 05:10:30784TEST_F(PermissionContextBaseTests, TestNonValidRequestingUrl) {
timloh9a180ad2017-02-20 07:15:23785 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_GEOLOCATION);
786 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
787 TestRequestPermissionInvalidUrl(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
timvolodinea2830552015-01-20 17:21:23788#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
789 TestRequestPermissionInvalidUrl(
790 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
791#endif
792}
timvolodine16be5202015-02-02 17:44:54793
timloh90e8cec2017-05-22 04:26:19794// Simulates granting and revoking of permissions.
Timothy Loh246355d2017-08-18 05:10:30795TEST_F(PermissionContextBaseTests, TestGrantAndRevoke) {
timloh9a180ad2017-02-20 07:15:23796 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_GEOLOCATION,
timvolodine16be5202015-02-02 17:44:54797 CONTENT_SETTING_ASK);
timloh9a180ad2017-02-20 07:15:23798 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_MIDI_SYSEX,
timvolodine16be5202015-02-02 17:44:54799 CONTENT_SETTING_ASK);
timloh90e8cec2017-05-22 04:26:19800#if defined(OS_ANDROID)
timvolodine16be5202015-02-02 17:44:54801 TestGrantAndRevoke_TestContent(
802 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER, CONTENT_SETTING_ASK);
timvolodine16be5202015-02-02 17:44:54803 // TODO(timvolodine): currently no test for
804 // CONTENT_SETTINGS_TYPE_NOTIFICATIONS because notification permissions work
805 // differently with infobars as compared to bubbles (crbug.com/453784).
timloh90e8cec2017-05-22 04:26:19806#else
timloh9a180ad2017-02-20 07:15:23807 TestGrantAndRevoke_TestContent(CONTENT_SETTINGS_TYPE_NOTIFICATIONS,
timvolodine16be5202015-02-02 17:44:54808 CONTENT_SETTING_ASK);
feltcb9e7362015-06-25 00:36:43809#endif
timloh90e8cec2017-05-22 04:26:19810}
kcarattini2ee48ad52015-10-26 23:45:31811
812// Tests the global kill switch by enabling/disabling the Field Trials.
Timothy Loh246355d2017-08-18 05:10:30813TEST_F(PermissionContextBaseTests, TestGlobalKillSwitch) {
timloh9a180ad2017-02-20 07:15:23814 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_GEOLOCATION);
815 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
816 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MIDI_SYSEX);
timloh9a180ad2017-02-20 07:15:23817 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_DURABLE_STORAGE);
kcarattini2ee48ad52015-10-26 23:45:31818#if defined(OS_ANDROID) || defined(OS_CHROMEOS)
819 TestGlobalPermissionsKillSwitch(
820 CONTENT_SETTINGS_TYPE_PROTECTED_MEDIA_IDENTIFIER);
821#endif
timloh9a180ad2017-02-20 07:15:23822 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_MIC);
823 TestGlobalPermissionsKillSwitch(CONTENT_SETTINGS_TYPE_MEDIASTREAM_CAMERA);
kcarattini2ee48ad52015-10-26 23:45:31824}
johnme7fa91f72016-01-29 22:13:44825
Timothy Loh246355d2017-08-18 05:10:30826TEST_F(PermissionContextBaseTests, TestParallelRequestsAllowed) {
johnme7fa91f72016-01-29 22:13:44827 TestParallelRequests(CONTENT_SETTING_ALLOW);
828}
829
Timothy Loh246355d2017-08-18 05:10:30830TEST_F(PermissionContextBaseTests, TestParallelRequestsBlocked) {
johnme7fa91f72016-01-29 22:13:44831 TestParallelRequests(CONTENT_SETTING_BLOCK);
832}
833
Timothy Loh246355d2017-08-18 05:10:30834TEST_F(PermissionContextBaseTests, TestParallelRequestsDismissed) {
johnme7fa91f72016-01-29 22:13:44835 TestParallelRequests(CONTENT_SETTING_ASK);
836}
meredithl62b8c3d2017-01-10 05:47:53837
838// Tests a blacklisted (URL, permission) pair has had its permission request
839// blocked.
Timothy Loh246355d2017-08-18 05:10:30840TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingBlocked) {
meredithl62b8c3d2017-01-10 05:47:53841 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
842 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
843 const GURL url("https://www.example.com");
meredithl03b12852017-01-25 05:08:01844 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
meredithl62b8c3d2017-01-10 05:47:53845 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
dominickn79b96cc2017-02-14 04:14:21846 TestPermissionsBlacklisting(
dominickn2e27dea2017-02-23 23:00:25847 CONTENT_SETTINGS_TYPE_GEOLOCATION, db_manager, url, 2000 /* timeout */,
848 CONTENT_SETTING_BLOCK, PermissionEmbargoStatus::PERMISSIONS_BLACKLISTING);
meredithl62b8c3d2017-01-10 05:47:53849}
850
meredithl03b12852017-01-25 05:08:01851// Tests that a URL that is blacklisted for one permission can still request
852// another and grant another.
Timothy Loh246355d2017-08-18 05:10:30853TEST_F(PermissionContextBaseTests, TestPermissionsBlacklistingAllowed) {
meredithl62b8c3d2017-01-10 05:47:53854 scoped_refptr<MockSafeBrowsingDatabaseManager> db_manager =
855 new MockSafeBrowsingDatabaseManager(true /* perform_callback */);
856 const GURL url("https://www.example.com");
meredithl03b12852017-01-25 05:08:01857 std::set<std::string> blacklisted_permissions{"GEOLOCATION"};
meredithl62b8c3d2017-01-10 05:47:53858 db_manager->BlacklistUrlPermissions(url, blacklisted_permissions);
timloh9a180ad2017-02-20 07:15:23859 TestPermissionsBlacklisting(CONTENT_SETTINGS_TYPE_NOTIFICATIONS, db_manager,
dominickn79b96cc2017-02-14 04:14:21860 url, 2000 /* timeout */, CONTENT_SETTING_ALLOW,
861 PermissionEmbargoStatus::NOT_EMBARGOED);
meredithl62b8c3d2017-01-10 05:47:53862}