Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(58)

Side by Side Diff: content/browser/permissions/permission_service_impl_unittest.cc

Issue 2874053003: Add checks for Feature Policy to the mojo Permission Service (Closed)
Patch Set: Add checks for Feature Policy to the mojo Permission Service Created 3 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 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
5 #include "content/browser/permissions/permission_service_impl.h"
6
7 #include "base/run_loop.h"
8 #include "base/test/scoped_feature_list.h"
9 #include "content/browser/permissions/permission_service_context.h"
10 #include "content/common/feature_policy/feature_policy.h"
11 #include "content/public/browser/web_contents.h"
12 #include "content/public/common/content_features.h"
13 #include "content/public/test/test_browser_context.h"
14 #include "content/public/test/test_renderer_host.h"
15 #include "content/test/mock_permission_manager.h"
16 #include "content/test/test_render_frame_host.h"
17 #include "mojo/public/cpp/bindings/interface_request.h"
18 #include "third_party/WebKit/public/platform/WebFeaturePolicy.h"
19 #include "third_party/WebKit/public/platform/modules/permissions/permission.mojo m.h"
20 #include "url/origin.h"
21
22 using blink::mojom::PermissionStatus;
23 using blink::mojom::PermissionName;
24
25 namespace content {
26
27 namespace {
28
29 blink::mojom::PermissionDescriptorPtr CreatePermissionDescriptor(
30 PermissionName name) {
31 auto descriptor = blink::mojom::PermissionDescriptor::New();
32 descriptor->name = name;
33 return descriptor;
34 }
35
36 class TestPermissionManager : public MockPermissionManager {
37 public:
38 ~TestPermissionManager() override {}
mlamouri (slow - plz ping) 2017/05/30 09:38:22 nit: `= default`
raymes 2017/05/31 05:32:01 Done.
39
40 PermissionStatus GetPermissionStatus(PermissionType permission,
41 const GURL& requesting_origin,
42 const GURL& embedding_origin) override {
43 // Always return granted.
44 return PermissionStatus::GRANTED;
45 }
46
47 int RequestPermissions(
48 const std::vector<PermissionType>& permissions,
49 RenderFrameHost* render_frame_host,
50 const GURL& requesting_origin,
51 bool user_gesture,
52 const base::Callback<void(const std::vector<PermissionStatus>&)>&
53 callback) override {
54 callback.Run(std::vector<PermissionStatus>(permissions.size(),
55 PermissionStatus::GRANTED));
56 return 0;
57 }
58 };
59
60 } // namespace
61
62 class PermissionServiceImplTest : public RenderViewHostTestHarness {
63 public:
64 PermissionServiceImplTest() : origin_(GURL("https://www.google.com")) {}
65
66 void SetUp() override {
67 RenderViewHostTestHarness::SetUp();
68 static_cast<TestBrowserContext*>(browser_context())
69 ->SetPermissionManager(base::MakeUnique<TestPermissionManager>());
70 NavigateAndCommit(origin_.GetURL());
71 service_context_.reset(new PermissionServiceContext(main_rfh()));
72 service_impl_.reset(new PermissionServiceImpl(service_context_.get()));
73 }
74
75 void TearDown() override {
76 service_impl_.reset();
77 service_context_.reset();
78 RenderViewHostTestHarness::TearDown();
79 }
80
81 protected:
82 // The header policy should only be set once on page load, so we refresh the
83 // page to simulate that.
84 void RefreshPageAndSetHeaderPolicy(blink::WebFeaturePolicyFeature feature,
85 bool enabled) {
86 NavigateAndCommit(origin_.GetURL());
87 ParsedFeaturePolicyHeader header;
88 std::vector<url::Origin> whitelist;
89 if (enabled)
90 whitelist.push_back(origin_);
91 header.push_back({feature, /*match_all_origins=*/false, whitelist});
92 static_cast<TestRenderFrameHost*>(main_rfh())
93 ->OnDidSetFeaturePolicyHeader(header);
94 }
95
96 PermissionStatus HasPermission(PermissionName permission) {
97 base::Callback<void(PermissionStatus)> callback =
98 base::Bind(&PermissionServiceImplTest::PermissionStatusCallback,
99 base::Unretained(this));
100 service_impl_->HasPermission(CreatePermissionDescriptor(permission),
101 origin_, callback);
102 EXPECT_EQ(1u, last_permission_statuses_.size());
103 return last_permission_statuses_[0];
104 }
105
106 std::vector<PermissionStatus> RequestPermissions(
107 const std::vector<PermissionName>& permissions) {
108 std::vector<blink::mojom::PermissionDescriptorPtr> descriptors;
109 for (PermissionName name : permissions)
110 descriptors.push_back(CreatePermissionDescriptor(name));
111 base::Callback<void(const std::vector<PermissionStatus>&)> callback =
112 base::Bind(&PermissionServiceImplTest::RequestPermissionsCallback,
113 base::Unretained(this));
114 service_impl_->RequestPermissions(std::move(descriptors), origin_,
115 /*user_gesture=*/false, callback);
116 EXPECT_EQ(permissions.size(), last_permission_statuses_.size());
117 return last_permission_statuses_;
118 }
119
120 private:
121 void PermissionStatusCallback(blink::mojom::PermissionStatus status) {
122 last_permission_statuses_ = std::vector<PermissionStatus>{status};
123 }
124
125 void RequestPermissionsCallback(
126 const std::vector<PermissionStatus>& statuses) {
127 last_permission_statuses_ = statuses;
128 }
129
130 url::Origin origin_;
131
132 base::Closure quit_closure_;
133
134 std::vector<PermissionStatus> last_permission_statuses_;
135
136 std::unique_ptr<PermissionServiceImpl> service_impl_;
137 std::unique_ptr<PermissionServiceContext> service_context_;
138 };
139
140 // Basic tests for feature policy checks through the PermissionService. These
141 // tests are not meant to cover every edge case as the FeaturePolicy class
142 // itself is tested thoroughly in feature_policy_unittest.cc and in
143 // render_frame_host_feature_policy_unittest.cc.
144 TEST_F(PermissionServiceImplTest, HasPermissionWithFeaturePolicy) {
145 base::test::ScopedFeatureList feature_list;
146 feature_list.InitAndEnableFeature(features::kUseFeaturePolicyForPermissions);
147 // Geolocation should be enabled by default for a frame (if permission is
148 // granted).
149 EXPECT_EQ(PermissionStatus::GRANTED,
150 HasPermission(PermissionName::GEOLOCATION));
151
152 RefreshPageAndSetHeaderPolicy(blink::WebFeaturePolicyFeature::kGeolocation,
153 /*enabled=*/false);
154 EXPECT_EQ(PermissionStatus::DENIED,
155 HasPermission(PermissionName::GEOLOCATION));
156
157 // Midi should be allowed even though geolocation was disabled.
158 EXPECT_EQ(PermissionStatus::GRANTED, HasPermission(PermissionName::MIDI));
159
160 // Now block midi.
161 RefreshPageAndSetHeaderPolicy(blink::WebFeaturePolicyFeature::kMidiFeature,
162 /*enabled=*/false);
163 EXPECT_EQ(PermissionStatus::DENIED, HasPermission(PermissionName::MIDI));
164
165 // Ensure that the policy is ignored if kUseFeaturePolicyForPermissions is
166 // disabled.
167 base::test::ScopedFeatureList empty_feature_list;
168 empty_feature_list.Init();
169 EXPECT_EQ(PermissionStatus::GRANTED, HasPermission(PermissionName::MIDI));
170 }
171
172 TEST_F(PermissionServiceImplTest, RequestPermissionsWithFeaturePolicy) {
173 base::test::ScopedFeatureList feature_list;
174 feature_list.InitAndEnableFeature(features::kUseFeaturePolicyForPermissions);
175
176 // Disable midi.
177 RefreshPageAndSetHeaderPolicy(blink::WebFeaturePolicyFeature::kMidiFeature,
178 /*enabled=*/false);
179
180 std::vector<PermissionStatus> result =
181 RequestPermissions(std::vector<PermissionName>{PermissionName::MIDI});
182 EXPECT_EQ(1u, result.size());
183 EXPECT_EQ(PermissionStatus::DENIED, result[0]);
184
185 // Request midi along with geolocation. Geolocation should be granted.
186 result = RequestPermissions(std::vector<PermissionName>{
187 PermissionName::MIDI, PermissionName::GEOLOCATION});
188 EXPECT_EQ(2u, result.size());
189 EXPECT_EQ(PermissionStatus::DENIED, result[0]);
190 EXPECT_EQ(PermissionStatus::GRANTED, result[1]);
191 }
192
193 } // namespace
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698