OLD | NEW |
| (Empty) |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "android_webview/native/permission/permission_request_handler.h" | |
6 | |
7 #include <utility> | |
8 | |
9 #include "android_webview/native/permission/aw_permission_request.h" | |
10 #include "android_webview/native/permission/aw_permission_request_delegate.h" | |
11 #include "android_webview/native/permission/permission_request_handler_client.h" | |
12 #include "base/bind.h" | |
13 #include "base/callback.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 | |
16 namespace android_webview { | |
17 | |
18 class TestAwPermissionRequestDelegate : public AwPermissionRequestDelegate { | |
19 public: | |
20 TestAwPermissionRequestDelegate(const GURL& origin, | |
21 int64_t resources, | |
22 base::Callback<void(bool)> callback) | |
23 : origin_(origin), resources_(resources), callback_(callback) {} | |
24 | |
25 // Get the origin which initiated the permission request. | |
26 const GURL& GetOrigin() override { return origin_; } | |
27 | |
28 // Get the resources the origin wanted to access. | |
29 int64_t GetResources() override { return resources_; } | |
30 | |
31 // Notify the permission request is allowed or not. | |
32 void NotifyRequestResult(bool allowed) override { callback_.Run(allowed); } | |
33 | |
34 private: | |
35 GURL origin_; | |
36 int64_t resources_; | |
37 base::Callback<void(bool)> callback_; | |
38 }; | |
39 | |
40 class TestPermissionRequestHandlerClient : | |
41 public PermissionRequestHandlerClient { | |
42 public: | |
43 struct Permission { | |
44 Permission() | |
45 :resources(0) {} | |
46 Permission(const GURL& origin, int64_t resources) | |
47 : origin(origin), resources(resources) {} | |
48 GURL origin; | |
49 int64_t resources; | |
50 }; | |
51 | |
52 TestPermissionRequestHandlerClient() | |
53 : request_(NULL) {} | |
54 | |
55 void OnPermissionRequest( | |
56 base::android::ScopedJavaLocalRef<jobject> j_request, | |
57 AwPermissionRequest* request) override { | |
58 DCHECK(request); | |
59 request_ = request; | |
60 java_request_ = j_request; | |
61 requested_permission_ = | |
62 Permission(request->GetOrigin(), request->GetResources()); | |
63 } | |
64 | |
65 void OnPermissionRequestCanceled(AwPermissionRequest* request) override { | |
66 canceled_permission_ = | |
67 Permission(request->GetOrigin(), request->GetResources()); | |
68 } | |
69 | |
70 AwPermissionRequest* request() { | |
71 return request_; | |
72 } | |
73 | |
74 const Permission& requested_permission() { | |
75 return requested_permission_; | |
76 } | |
77 | |
78 const Permission& canceled_permission() { | |
79 return canceled_permission_; | |
80 } | |
81 | |
82 void Grant() { | |
83 request_->OnAccept(NULL, NULL, true); | |
84 request_->DeleteThis(); | |
85 request_ = NULL; | |
86 } | |
87 | |
88 void Deny() { | |
89 request_->OnAccept(NULL, NULL, false); | |
90 request_->DeleteThis(); | |
91 request_ = NULL; | |
92 } | |
93 | |
94 void Reset() { | |
95 request_ = NULL; | |
96 requested_permission_ = Permission(); | |
97 canceled_permission_ = Permission(); | |
98 } | |
99 | |
100 private: | |
101 base::android::ScopedJavaLocalRef<jobject> java_request_; | |
102 AwPermissionRequest* request_; | |
103 Permission requested_permission_; | |
104 Permission canceled_permission_; | |
105 }; | |
106 | |
107 class TestPermissionRequestHandler : public PermissionRequestHandler { | |
108 public: | |
109 TestPermissionRequestHandler(PermissionRequestHandlerClient* client) | |
110 : PermissionRequestHandler(client, NULL) { | |
111 } | |
112 | |
113 const std::vector<base::WeakPtr<AwPermissionRequest> > requests() { | |
114 return requests_; | |
115 } | |
116 | |
117 void PruneRequests() { | |
118 return PermissionRequestHandler::PruneRequests(); | |
119 } | |
120 }; | |
121 | |
122 class PermissionRequestHandlerTest : public testing::Test { | |
123 public: | |
124 PermissionRequestHandlerTest() | |
125 : handler_(&client_), | |
126 allowed_(false) {} | |
127 | |
128 void NotifyRequestResult(bool allowed) { | |
129 allowed_ = allowed; | |
130 } | |
131 | |
132 protected: | |
133 void SetUp() override { | |
134 testing::Test::SetUp(); | |
135 origin_ = GURL("http://www.google.com"); | |
136 resources_ = | |
137 AwPermissionRequest::VideoCapture | AwPermissionRequest::AudioCapture; | |
138 delegate_.reset( | |
139 new TestAwPermissionRequestDelegate( | |
140 origin_, resources_, base::Bind( | |
141 &PermissionRequestHandlerTest::NotifyRequestResult, | |
142 base::Unretained(this)))); | |
143 } | |
144 | |
145 const GURL& origin() { | |
146 return origin_; | |
147 } | |
148 | |
149 int64_t resources() { return resources_; } | |
150 | |
151 std::unique_ptr<AwPermissionRequestDelegate> delegate() { | |
152 return std::move(delegate_); | |
153 } | |
154 | |
155 TestPermissionRequestHandler* handler() { | |
156 return &handler_; | |
157 } | |
158 | |
159 TestPermissionRequestHandlerClient* client() { | |
160 return &client_; | |
161 } | |
162 | |
163 bool allowed() { | |
164 return allowed_; | |
165 } | |
166 | |
167 private: | |
168 GURL origin_; | |
169 int64_t resources_; | |
170 std::unique_ptr<AwPermissionRequestDelegate> delegate_; | |
171 TestPermissionRequestHandlerClient client_; | |
172 TestPermissionRequestHandler handler_; | |
173 bool allowed_; | |
174 }; | |
175 | |
176 TEST_F(PermissionRequestHandlerTest, TestPermissionGranted) { | |
177 handler()->SendRequest(delegate()); | |
178 // Verify Handler store the request correctly. | |
179 ASSERT_EQ(1u, handler()->requests().size()); | |
180 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
181 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
182 | |
183 // Verify client's onPermissionRequest was called | |
184 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
185 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
186 | |
187 // Simulate the grant request. | |
188 client()->Grant(); | |
189 // Verify the request is notified as granted | |
190 EXPECT_TRUE(allowed()); | |
191 handler()->PruneRequests(); | |
192 // Verify the weak reference in handler was removed. | |
193 EXPECT_TRUE(handler()->requests().empty()); | |
194 } | |
195 | |
196 TEST_F(PermissionRequestHandlerTest, TestPermissionDenied) { | |
197 handler()->SendRequest(delegate()); | |
198 // Verify Handler store the request correctly. | |
199 ASSERT_EQ(1u, handler()->requests().size()); | |
200 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
201 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
202 | |
203 // Verify client's onPermissionRequest was called | |
204 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
205 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
206 | |
207 // Simulate the deny request. | |
208 client()->Deny(); | |
209 // Verify the request is notified as granted | |
210 EXPECT_FALSE(allowed()); | |
211 handler()->PruneRequests(); | |
212 // Verify the weak reference in handler was removed. | |
213 EXPECT_TRUE(handler()->requests().empty()); | |
214 } | |
215 | |
216 TEST_F(PermissionRequestHandlerTest, TestMultiplePermissionRequest) { | |
217 GURL origin1 = GURL("http://a.google.com"); | |
218 int64_t resources1 = AwPermissionRequest::Geolocation; | |
219 | |
220 std::unique_ptr<AwPermissionRequestDelegate> delegate1; | |
221 delegate1.reset(new TestAwPermissionRequestDelegate( | |
222 origin1, resources1, | |
223 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
224 base::Unretained(this)))); | |
225 | |
226 // Send 1st request | |
227 handler()->SendRequest(delegate()); | |
228 // Verify Handler store the request correctly. | |
229 ASSERT_EQ(1u, handler()->requests().size()); | |
230 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
231 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
232 // Verify client's onPermissionRequest was called | |
233 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
234 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
235 | |
236 // Send 2nd request | |
237 handler()->SendRequest(std::move(delegate1)); | |
238 // Verify Handler store the request correctly. | |
239 ASSERT_EQ(2u, handler()->requests().size()); | |
240 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
241 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
242 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); | |
243 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); | |
244 // Verify client's onPermissionRequest was called | |
245 EXPECT_EQ(origin1, client()->request()->GetOrigin()); | |
246 EXPECT_EQ(resources1, client()->request()->GetResources()); | |
247 | |
248 // Send 3rd request which has same origin and resources as first one. | |
249 delegate1.reset(new TestAwPermissionRequestDelegate(origin(), resources(), | |
250 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
251 base::Unretained(this)))); | |
252 handler()->SendRequest(std::move(delegate1)); | |
253 // Verify Handler store the request correctly. | |
254 ASSERT_EQ(3u, handler()->requests().size()); | |
255 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
256 EXPECT_EQ(resources(), handler()->requests()[0]->GetResources()); | |
257 EXPECT_EQ(origin1, handler()->requests()[1]->GetOrigin()); | |
258 EXPECT_EQ(resources1, handler()->requests()[1]->GetResources()); | |
259 EXPECT_EQ(origin(), handler()->requests()[2]->GetOrigin()); | |
260 EXPECT_EQ(resources(), handler()->requests()[2]->GetResources()); | |
261 // Verify client's onPermissionRequest was called | |
262 EXPECT_EQ(origin(), client()->request()->GetOrigin()); | |
263 EXPECT_EQ(resources(), client()->request()->GetResources()); | |
264 | |
265 // Cancel the request. | |
266 handler()->CancelRequest(origin(), resources()); | |
267 // Verify client's OnPermissionRequestCancled() was called. | |
268 EXPECT_EQ(origin(), client()->canceled_permission().origin); | |
269 EXPECT_EQ(resources(), client()->canceled_permission().resources); | |
270 // Verify Handler store the request correctly, the 1st and 3rd were removed. | |
271 handler()->PruneRequests(); | |
272 ASSERT_EQ(1u, handler()->requests().size()); | |
273 EXPECT_EQ(origin1, handler()->requests()[0]->GetOrigin()); | |
274 EXPECT_EQ(resources1, handler()->requests()[0]->GetResources()); | |
275 } | |
276 | |
277 TEST_F(PermissionRequestHandlerTest, TestPreauthorizePermission) { | |
278 handler()->PreauthorizePermission(origin(), resources()); | |
279 | |
280 // Permission should granted without asking PermissionRequestHandlerClient. | |
281 handler()->SendRequest(delegate()); | |
282 EXPECT_TRUE(allowed()); | |
283 EXPECT_EQ(NULL, client()->request()); | |
284 | |
285 // Only ask one preauthorized resource, permission should granted | |
286 // without asking PermissionRequestHandlerClient. | |
287 std::unique_ptr<AwPermissionRequestDelegate> delegate; | |
288 delegate.reset(new TestAwPermissionRequestDelegate( | |
289 origin(), AwPermissionRequest::AudioCapture, | |
290 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
291 base::Unretained(this)))); | |
292 client()->Reset(); | |
293 handler()->SendRequest(std::move(delegate)); | |
294 EXPECT_TRUE(allowed()); | |
295 EXPECT_EQ(NULL, client()->request()); | |
296 } | |
297 | |
298 TEST_F(PermissionRequestHandlerTest, TestOriginNotPreauthorized) { | |
299 handler()->PreauthorizePermission(origin(), resources()); | |
300 | |
301 // Ask the origin which wasn't preauthorized. | |
302 GURL origin ("http://a.google.com/a/b"); | |
303 std::unique_ptr<AwPermissionRequestDelegate> delegate; | |
304 int64_t requested_resources = AwPermissionRequest::AudioCapture; | |
305 delegate.reset(new TestAwPermissionRequestDelegate( | |
306 origin, requested_resources, | |
307 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
308 base::Unretained(this)))); | |
309 handler()->SendRequest(std::move(delegate)); | |
310 EXPECT_EQ(origin, handler()->requests()[0]->GetOrigin()); | |
311 EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources()); | |
312 client()->Grant(); | |
313 EXPECT_TRUE(allowed()); | |
314 } | |
315 | |
316 TEST_F(PermissionRequestHandlerTest, TestResourcesNotPreauthorized) { | |
317 handler()->PreauthorizePermission(origin(), resources()); | |
318 | |
319 // Ask the resources which weren't preauthorized. | |
320 std::unique_ptr<AwPermissionRequestDelegate> delegate; | |
321 int64_t requested_resources = | |
322 AwPermissionRequest::AudioCapture | AwPermissionRequest::Geolocation; | |
323 delegate.reset(new TestAwPermissionRequestDelegate( | |
324 origin(), requested_resources, | |
325 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
326 base::Unretained(this)))); | |
327 | |
328 handler()->SendRequest(std::move(delegate)); | |
329 EXPECT_EQ(origin(), handler()->requests()[0]->GetOrigin()); | |
330 EXPECT_EQ(requested_resources, handler()->requests()[0]->GetResources()); | |
331 client()->Deny(); | |
332 EXPECT_FALSE(allowed()); | |
333 } | |
334 | |
335 TEST_F(PermissionRequestHandlerTest, TestPreauthorizeMultiplePermission) { | |
336 handler()->PreauthorizePermission(origin(), resources()); | |
337 // Preauthorize another permission. | |
338 GURL origin ("http://a.google.com/a/b"); | |
339 handler()->PreauthorizePermission(origin, AwPermissionRequest::Geolocation); | |
340 GURL origin_hostname ("http://a.google.com/"); | |
341 std::unique_ptr<AwPermissionRequestDelegate> delegate; | |
342 delegate.reset(new TestAwPermissionRequestDelegate( | |
343 origin_hostname, AwPermissionRequest::Geolocation, | |
344 base::Bind(&PermissionRequestHandlerTest::NotifyRequestResult, | |
345 base::Unretained(this)))); | |
346 handler()->SendRequest(std::move(delegate)); | |
347 EXPECT_TRUE(allowed()); | |
348 EXPECT_EQ(NULL, client()->request()); | |
349 } | |
350 | |
351 } // android_webview | |
OLD | NEW |