OLD | NEW |
---|---|
(Empty) | |
1 // Copyright 2016 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/browser/aw_permission_manager.h" | |
6 | |
7 #include <list> | |
8 #include <memory> | |
9 | |
10 #include "android_webview/browser/aw_browser_permission_request_delegate.h" | |
11 #include "base/bind.h" | |
12 #include "base/bind_helpers.h" | |
13 #include "content/public/browser/permission_manager.h" | |
14 #include "content/public/browser/permission_type.h" | |
15 #include "testing/gtest/include/gtest/gtest.h" | |
16 #include "url/gurl.h" | |
17 | |
18 using blink::mojom::PermissionStatus; | |
19 using content::PermissionType; | |
20 | |
21 namespace android_webview { | |
22 | |
23 namespace { | |
24 | |
25 int kNoPendingOperation = -1; | |
26 | |
27 int kRenderProcessIDForTesting = 8; | |
28 int kRenderFrameIDForTesting = 19; | |
29 const char kEmbeddingOrigin[] = "https://www.google.com"; | |
30 const char kRequestingOrigin1[] = "https://www.google.com"; | |
31 const char kRequestingOrigin2[] = "https://www.chromium.org"; | |
32 | |
33 class AwBrowserPermissionRequestDelegateForTesting | |
34 : public AwBrowserPermissionRequestDelegate { | |
35 public: | |
36 void EnqueueResponse(const std::string& origin, | |
37 PermissionType type, | |
38 bool grant) { | |
39 for (auto it = request_.begin(); it != request_.end(); ++it) { | |
40 if ((*it)->type != type || (*it)->origin != GURL(origin)) | |
41 continue; | |
42 const base::Callback<void(bool)> callback = (*it)->callback; | |
43 request_.erase(it); | |
44 callback.Run(grant); | |
45 return; | |
46 } | |
47 response_.push_back(new Response(origin, type, grant)); | |
48 } | |
49 | |
50 // AwBrowserPermissionRequestDelegate: | |
51 void RequestProtectedMediaIdentifierPermission( | |
52 const GURL& origin, | |
53 const base::Callback<void(bool)>& callback) override {} | |
54 | |
55 void CancelProtectedMediaIdentifierPermissionRequests( | |
56 const GURL& origin) override {} | |
57 | |
58 void RequestGeolocationPermission( | |
59 const GURL& origin, | |
60 const base::Callback<void(bool)>& callback) override { | |
61 RequestPermission(origin, PermissionType::GEOLOCATION, callback); | |
62 } | |
63 | |
64 void CancelGeolocationPermissionRequests(const GURL& origin) override { | |
65 CancelPermission(origin, PermissionType::GEOLOCATION); | |
66 } | |
67 | |
68 void RequestMIDISysexPermission( | |
69 const GURL& origin, | |
70 const base::Callback<void(bool)>& callback) override { | |
71 RequestPermission(origin, PermissionType::MIDI_SYSEX, callback); | |
72 } | |
73 | |
74 void CancelMIDISysexPermissionRequests(const GURL& origin) override { | |
75 CancelPermission(origin, PermissionType::MIDI_SYSEX); | |
76 } | |
77 | |
78 private: | |
79 void RequestPermission(const GURL& origin, | |
80 PermissionType type, | |
81 const base::Callback<void(bool)>& callback) { | |
82 for (auto request : request_) { | |
83 // AwPermissionManager does not request for the same type permission until | |
84 // the previous request is resolved. | |
85 CHECK_NE(type, request->type); | |
86 } | |
87 for (auto it = response_.begin(); it != response_.end(); ++it) { | |
88 if ((*it)->type != type || (*it)->origin != origin) | |
89 continue; | |
90 bool grant = (*it)->grant; | |
91 response_.erase(it); | |
92 callback.Run(grant); | |
93 return; | |
94 } | |
95 request_.push_back(new Request(origin, type, callback)); | |
96 } | |
97 | |
98 void CancelPermission(const GURL& origin, PermissionType type) { | |
99 for (auto it = request_.begin(); it != request_.end(); ++it) { | |
100 if ((*it)->type != type || (*it)->origin != origin) | |
101 continue; | |
102 request_.erase(it); | |
103 return; | |
104 } | |
105 NOTREACHED(); | |
106 } | |
107 | |
108 private: | |
109 struct Request { | |
110 GURL origin; | |
111 PermissionType type; | |
112 base::Callback<void(bool)> callback; | |
113 | |
114 Request(const GURL& origin, | |
115 PermissionType type, | |
116 const base::Callback<void(bool)>& callback) | |
117 : origin(origin), type(type), callback(callback) {} | |
118 }; | |
119 | |
120 struct Response { | |
121 GURL origin; | |
122 PermissionType type; | |
123 bool grant; | |
124 | |
125 Response(const std::string& origin, PermissionType type, bool grant) | |
126 : origin(GURL(origin)), type(type), grant(grant) {} | |
127 | |
128 }; | |
129 | |
130 std::list<Response*> response_; | |
Tobias Sargeant
2016/07/15 13:44:35
Can you make these lists of unique_ptr so that you
Takashi Toyoshima
2016/07/18 04:30:38
Done.
| |
131 std::list<Request*> request_; | |
132 }; | |
133 | |
134 class AwPermissionManagerForTesting : public AwPermissionManager { | |
135 public: | |
136 ~AwPermissionManagerForTesting() override { | |
137 // Call CancelPermissionRequests() from here so that it calls virtual | |
138 // methods correctly. | |
139 CancelPermissionRequests(); | |
140 } | |
141 | |
142 void EnqueuePermissionResponse(const std::string& origin, | |
143 PermissionType type, | |
144 bool grant) { | |
145 delegate()->EnqueueResponse(origin, type, grant); | |
146 } | |
147 | |
148 private: | |
149 AwBrowserPermissionRequestDelegateForTesting* delegate() { | |
150 if (!delegate_) | |
151 delegate_.reset(new AwBrowserPermissionRequestDelegateForTesting); | |
152 return delegate_.get(); | |
153 } | |
154 | |
155 // AwPermissionManager: | |
156 int GetRenderProcessID(content::RenderFrameHost* render_frame_host) override { | |
157 return kRenderProcessIDForTesting; | |
158 } | |
159 | |
160 int GetRenderFrameID(content::RenderFrameHost* render_frame_host) override { | |
161 return kRenderFrameIDForTesting; | |
162 } | |
163 | |
164 GURL LastCommittedOrigin( | |
165 content::RenderFrameHost* render_frame_host) override { | |
166 return GURL(kEmbeddingOrigin); | |
167 } | |
168 | |
169 AwBrowserPermissionRequestDelegate* GetDelegate( | |
170 int render_process_id, | |
171 int render_frame_id) override { | |
172 CHECK_EQ(kRenderProcessIDForTesting, render_process_id); | |
173 CHECK_EQ(kRenderFrameIDForTesting, render_frame_id); | |
174 return delegate(); | |
175 } | |
176 | |
177 std::unique_ptr<AwBrowserPermissionRequestDelegateForTesting> delegate_; | |
178 }; | |
179 | |
180 class AwPermissionManagerTest : public testing::Test { | |
181 public: | |
182 AwPermissionManagerTest() | |
183 : render_frame_host(nullptr) {} | |
184 | |
185 void PermissionRequestResponse(int id, const PermissionStatus status) { | |
186 resolved_permission_status.push_back(status); | |
187 resolved_permission_request_id.push_back(id); | |
188 } | |
189 | |
190 void PermissionsRequestResponse(int id, | |
191 const std::vector<PermissionStatus>& status) { | |
192 resolved_permission_status.insert(resolved_permission_status.end(), | |
193 status.begin(), status.end()); | |
194 for (size_t i = 0; i < status.size(); ++i) | |
195 resolved_permission_request_id.push_back(id); | |
196 } | |
197 | |
198 protected: | |
199 void SetUp() override { manager.reset(new AwPermissionManagerForTesting); } | |
200 void TearDown() override { manager.reset(); } | |
201 | |
202 void EnqueuePermissionResponse(const std::string& origin, | |
203 PermissionType type, | |
204 bool grant) { | |
205 CHECK(manager); | |
206 manager->EnqueuePermissionResponse(origin, type, grant); | |
207 } | |
208 | |
209 std::unique_ptr<AwPermissionManagerForTesting> manager; | |
210 | |
211 // Use nullptr for testing. AwPermissionManagerForTesting override all methods | |
212 // that touch RenderFrameHost to work with nullptr. | |
213 content::RenderFrameHost* render_frame_host; | |
214 | |
215 std::vector<PermissionStatus> resolved_permission_status; | |
216 std::vector<int> resolved_permission_request_id; | |
217 }; | |
218 | |
219 // The most simple test, PermissionType::MIDI is hard-coded to be granted. | |
220 TEST_F(AwPermissionManagerTest, MIDIPermissionIsGrantedSynchronously) { | |
221 int request_id = manager->RequestPermission( | |
222 PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin1), true, | |
223 base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
224 base::Unretained(this), 0)); | |
225 EXPECT_EQ(kNoPendingOperation, request_id); | |
226 ASSERT_EQ(1u, resolved_permission_status.size()); | |
227 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
228 } | |
229 | |
230 // Test the case a delegate is called, and it resolves the permission | |
231 // synchronously. | |
232 TEST_F(AwPermissionManagerTest, SinglePermissionRequestIsGrantedSynchronously) { | |
233 // Permission should be granted in this scenario. | |
234 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
235 PermissionType::GEOLOCATION, true); | |
236 int request_id = manager->RequestPermission( | |
237 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
238 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
239 base::Unretained(this), 0)); | |
240 EXPECT_EQ(kNoPendingOperation, request_id); | |
241 ASSERT_EQ(1u, resolved_permission_status.size()); | |
242 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
243 | |
244 // Permission should not be granted in this scenario. | |
245 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
246 PermissionType::GEOLOCATION, false); | |
247 request_id = manager->RequestPermission( | |
248 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
249 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
250 base::Unretained(this), 0)); | |
251 EXPECT_EQ(kNoPendingOperation, request_id); | |
252 ASSERT_EQ(2u, resolved_permission_status.size()); | |
253 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | |
254 } | |
255 | |
256 // Test the case a delegate is called, and it resolves the permission | |
257 // asynchronously. | |
258 TEST_F(AwPermissionManagerTest, | |
259 SinglePermissionRequestIsGrantedAsynchronously) { | |
260 int request_id = manager->RequestPermission( | |
261 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
262 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
263 base::Unretained(this), 0)); | |
264 EXPECT_NE(kNoPendingOperation, request_id); | |
265 EXPECT_EQ(0u, resolved_permission_status.size()); | |
266 | |
267 // This will resolve the permission. | |
268 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
269 PermissionType::GEOLOCATION, true); | |
270 | |
271 ASSERT_EQ(1u, resolved_permission_status.size()); | |
272 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
273 } | |
274 | |
275 // Test the case a delegate is called, and the manager is deleted before the | |
276 // delegate callback is invoked. | |
277 TEST_F(AwPermissionManagerTest, ManagerIsDeletedWhileDelegateProcesses) { | |
278 int request_id = manager->RequestPermission( | |
279 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
280 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
281 base::Unretained(this), 0)); | |
282 | |
283 EXPECT_NE(kNoPendingOperation, request_id); | |
284 EXPECT_EQ(0u, resolved_permission_status.size()); | |
285 | |
286 // Delete the manager. | |
287 manager.reset(); | |
288 | |
289 // All requests are cancelled internally. | |
290 EXPECT_EQ(0u, resolved_permission_status.size()); | |
291 } | |
292 | |
293 // Test the case multiple permissions are requested for the same origin, and the | |
294 // second permission is also resolved when the first permission is resolved. | |
295 TEST_F(AwPermissionManagerTest, | |
296 MultiplePermissionRequestsAreGrantedTogether) { | |
297 int request_1 = manager->RequestPermission( | |
298 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
299 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
300 base::Unretained(this), 1)); | |
301 EXPECT_NE(kNoPendingOperation, request_1); | |
302 | |
303 int request_2 = manager->RequestPermission( | |
304 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
305 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
306 base::Unretained(this), 2)); | |
307 EXPECT_NE(kNoPendingOperation, request_2); | |
308 | |
309 EXPECT_NE(request_1, request_2); | |
310 EXPECT_EQ(0u, resolved_permission_status.size()); | |
311 | |
312 // This will resolve the permission. | |
313 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
314 PermissionType::GEOLOCATION, true); | |
315 | |
316 ASSERT_EQ(2u, resolved_permission_status.size()); | |
317 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
318 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | |
319 } | |
320 | |
321 // Test the case multiple permissions are requested for different origins, and | |
322 // each permission is resolved respectively in the requested order. | |
323 TEST_F(AwPermissionManagerTest, | |
324 MultiplePermissionRequestsAreGrantedRespectively) { | |
325 int request_1 = manager->RequestPermission( | |
326 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
327 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
328 base::Unretained(this), 1)); | |
329 EXPECT_NE(kNoPendingOperation, request_1); | |
330 | |
331 int request_2 = manager->RequestPermission( | |
332 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | |
333 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
334 base::Unretained(this), 2)); | |
335 EXPECT_NE(kNoPendingOperation, request_2); | |
336 | |
337 EXPECT_NE(request_1, request_2); | |
338 EXPECT_EQ(0u, resolved_permission_status.size()); | |
339 | |
340 // This will resolve the first request. | |
341 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
342 PermissionType::GEOLOCATION, true); | |
343 | |
344 ASSERT_EQ(1u, resolved_permission_status.size()); | |
345 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
346 EXPECT_EQ(1, resolved_permission_request_id[0]); | |
347 | |
348 // This will resolve the second request. | |
349 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
350 PermissionType::GEOLOCATION, false); | |
351 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | |
352 EXPECT_EQ(2, resolved_permission_request_id[1]); | |
353 } | |
354 | |
355 // Test the case multiple permissions are requested through single | |
356 // RequestPermissions call, then resolved synchronously. | |
357 TEST_F(AwPermissionManagerTest, | |
358 SinglePermissionsRequestIsGrantedSynchronously) { | |
359 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
360 PermissionType::MIDI_SYSEX, false); | |
361 | |
362 std::vector<PermissionType> permissions = {PermissionType::MIDI, | |
363 PermissionType::MIDI_SYSEX}; | |
364 | |
365 int request_id = manager->RequestPermissions( | |
366 permissions, | |
367 render_frame_host, GURL(kRequestingOrigin1), | |
368 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
369 base::Unretained(this), 0)); | |
370 EXPECT_EQ(kNoPendingOperation, request_id); | |
371 | |
372 ASSERT_EQ(2u, resolved_permission_status.size()); | |
373 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
374 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | |
375 } | |
376 | |
377 // Test the case multiple permissions are requested through single | |
378 // RequestPermissions call, then one is resolved synchronously, the other is | |
379 // resolved asynchronously. | |
380 TEST_F(AwPermissionManagerTest, | |
381 SinglePermissionsRequestIsGrantedAsynchronously) { | |
382 std::vector<PermissionType> permissions = {PermissionType::MIDI, | |
383 PermissionType::MIDI_SYSEX}; | |
384 | |
385 int request_id = manager->RequestPermissions( | |
386 permissions, | |
387 render_frame_host, GURL(kRequestingOrigin1), | |
388 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
389 base::Unretained(this), 0)); | |
390 EXPECT_NE(kNoPendingOperation, request_id); | |
391 | |
392 // PermissionType::MIDI is resolved synchronously, but all permissions result | |
393 // are notified together when all permissions are resolved. | |
394 EXPECT_EQ(0u, resolved_permission_status.size()); | |
395 | |
396 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
397 PermissionType::MIDI_SYSEX, false); | |
398 | |
399 ASSERT_EQ(2u, resolved_permission_status.size()); | |
400 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
401 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | |
402 } | |
403 | |
404 // Test the case multiple permissions are requested multiple times as follow. | |
405 // 1. Permission A and B are requested. | |
406 // 2. Permission A is resolved. | |
407 // 3. Permission A is requested for the same origin before the B is resolved. | |
408 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario1) { | |
409 // In the first case, the permission A is a type that does not call an | |
410 // internal delegate method. | |
411 std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | |
412 PermissionType::MIDI_SYSEX}; | |
413 | |
414 int request_1 = manager->RequestPermissions( | |
415 permissions_1, | |
416 render_frame_host, GURL(kRequestingOrigin1), | |
417 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
418 base::Unretained(this), 1)); | |
419 EXPECT_NE(kNoPendingOperation, request_1); | |
420 EXPECT_EQ(0u, resolved_permission_status.size()); | |
421 | |
422 int request_2 = manager->RequestPermission( | |
423 PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin1), true, | |
424 base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
425 base::Unretained(this), 2)); | |
426 EXPECT_EQ(kNoPendingOperation, request_2); | |
427 ASSERT_EQ(1u, resolved_permission_status.size()); | |
428 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
429 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
430 | |
431 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
432 PermissionType::MIDI_SYSEX, true); | |
433 | |
434 ASSERT_EQ(3u, resolved_permission_status.size()); | |
435 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | |
436 EXPECT_EQ(1, resolved_permission_request_id[1]); | |
437 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[2]); | |
438 EXPECT_EQ(1, resolved_permission_request_id[2]); | |
439 | |
440 // In the second case, the permission A is a type that calls an internal | |
441 // delegate method. | |
442 std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | |
443 PermissionType::MIDI_SYSEX}; | |
444 | |
445 int request_3 = manager->RequestPermissions( | |
446 permissions_2, | |
447 render_frame_host, GURL(kRequestingOrigin1), | |
448 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
449 base::Unretained(this), 3)); | |
450 EXPECT_NE(kNoPendingOperation, request_3); | |
451 ASSERT_EQ(3u, resolved_permission_status.size()); | |
452 | |
453 // The permission A is resolved, but the first request isn't finished. | |
454 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
455 PermissionType::GEOLOCATION, false); | |
456 ASSERT_EQ(3u, resolved_permission_status.size()); | |
457 | |
458 int request_4 = manager->RequestPermission( | |
459 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
460 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
461 base::Unretained(this), 4)); | |
462 // The second request is finished first by using the resolved result for the | |
463 // first request. | |
464 EXPECT_EQ(kNoPendingOperation, request_4); | |
465 ASSERT_EQ(4u, resolved_permission_status.size()); | |
466 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[3]); | |
467 EXPECT_EQ(4, resolved_permission_request_id[3]); | |
468 | |
469 // Then the first request is finished. | |
470 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
471 PermissionType::MIDI_SYSEX, true); | |
472 | |
473 ASSERT_EQ(6u, resolved_permission_status.size()); | |
474 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | |
475 EXPECT_EQ(3, resolved_permission_request_id[4]); | |
476 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | |
477 EXPECT_EQ(3, resolved_permission_request_id[5]); | |
478 } | |
479 | |
480 // Test the case multiple permissions are requested multiple times as follow. | |
481 // 1. Permission A and B are requested. | |
482 // 2. Permission A is resolved. | |
483 // 3. Permission A is requested for a different origin before the B is | |
484 // resolved. | |
485 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario2) { | |
486 // In the first case, the permission A is a type that does not call an | |
487 // internal delegate method. | |
488 std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | |
489 PermissionType::MIDI_SYSEX}; | |
490 | |
491 int request_1 = manager->RequestPermissions( | |
492 permissions_1, | |
493 render_frame_host, GURL(kRequestingOrigin1), | |
494 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
495 base::Unretained(this), 1)); | |
496 EXPECT_NE(kNoPendingOperation, request_1); | |
497 EXPECT_EQ(0u, resolved_permission_status.size()); | |
498 | |
499 int request_2 = manager->RequestPermission( | |
500 PermissionType::MIDI, render_frame_host, GURL(kRequestingOrigin2), true, | |
501 base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
502 base::Unretained(this), 2)); | |
503 EXPECT_EQ(kNoPendingOperation, request_2); | |
504 ASSERT_EQ(1u, resolved_permission_status.size()); | |
505 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
506 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
507 | |
508 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
509 PermissionType::MIDI_SYSEX, true); | |
510 | |
511 ASSERT_EQ(3u, resolved_permission_status.size()); | |
512 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | |
513 EXPECT_EQ(1, resolved_permission_request_id[1]); | |
514 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[2]); | |
515 EXPECT_EQ(1, resolved_permission_request_id[2]); | |
516 | |
517 // In the second case, the permission A is a type that calls an internal | |
518 // delegate method. | |
519 std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | |
520 PermissionType::MIDI_SYSEX}; | |
521 | |
522 int request_3 = manager->RequestPermissions( | |
523 permissions_2, | |
524 render_frame_host, GURL(kRequestingOrigin1), | |
525 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
526 base::Unretained(this), 3)); | |
527 EXPECT_NE(kNoPendingOperation, request_3); | |
528 ASSERT_EQ(3u, resolved_permission_status.size()); | |
529 | |
530 // The permission A is resolved, but the first request isn't finished. | |
531 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
532 PermissionType::GEOLOCATION, false); | |
533 ASSERT_EQ(3u, resolved_permission_status.size()); | |
534 | |
535 // The second request could be resolved synchronously if there is no blocking | |
536 // request. In this scenario, the first request does not block this. | |
537 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
538 PermissionType::GEOLOCATION, true); | |
539 int request_4 = manager->RequestPermission( | |
540 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | |
541 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
542 base::Unretained(this), 4)); | |
543 EXPECT_EQ(kNoPendingOperation, request_4); | |
544 ASSERT_EQ(4u, resolved_permission_status.size()); | |
545 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[3]); | |
546 EXPECT_EQ(4, resolved_permission_request_id[3]); | |
547 | |
548 // The first request is finished. | |
549 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
550 PermissionType::MIDI_SYSEX, true); | |
551 | |
552 ASSERT_EQ(6u, resolved_permission_status.size()); | |
553 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | |
554 EXPECT_EQ(3, resolved_permission_request_id[4]); | |
555 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | |
556 EXPECT_EQ(3, resolved_permission_request_id[5]); | |
557 } | |
558 | |
559 // Test the case multiple permissions are requested multiple times as follow. | |
560 // 1. Permission A and B are requested. | |
561 // 2. Permission B is resolved. | |
562 // 3. Permission A is requested for the same origin before the A is resolved. | |
563 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario3) { | |
564 // In the first case, the permission A is a type that does not call an | |
565 // internal delegate method. | |
566 std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | |
567 PermissionType::MIDI_SYSEX}; | |
568 | |
569 int request_1 = manager->RequestPermissions( | |
570 permissions_1, | |
571 render_frame_host, GURL(kRequestingOrigin1), | |
572 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
573 base::Unretained(this), 1)); | |
574 EXPECT_NE(kNoPendingOperation, request_1); | |
575 EXPECT_EQ(0u, resolved_permission_status.size()); | |
576 | |
577 int request_2 = manager->RequestPermission( | |
578 PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin1), | |
579 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
580 base::Unretained(this), 2)); | |
581 EXPECT_NE(kNoPendingOperation, request_2); | |
582 EXPECT_EQ(0u, resolved_permission_status.size()); | |
583 | |
584 // Resolving the first request results in both requests finished. | |
585 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
586 PermissionType::MIDI_SYSEX, false); | |
587 ASSERT_EQ(3u, resolved_permission_status.size()); | |
588 // Note: The result order in the same requiest is ensured, but each results | |
589 // for a request can be swapped because the manager use IDMap to resolve | |
590 // matched requests. | |
591 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | |
592 EXPECT_EQ(1, resolved_permission_request_id[1]); | |
593 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[2]); | |
594 EXPECT_EQ(1, resolved_permission_request_id[2]); | |
595 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[0]); | |
596 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
597 | |
598 // In the second case, the permission A is a type that calls an internal | |
599 // delegate method. | |
600 std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | |
601 PermissionType::MIDI_SYSEX}; | |
602 | |
603 int request_3 = manager->RequestPermissions( | |
604 permissions_2, | |
605 render_frame_host, GURL(kRequestingOrigin1), | |
606 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
607 base::Unretained(this), 3)); | |
608 EXPECT_NE(kNoPendingOperation, request_3); | |
609 ASSERT_EQ(3u, resolved_permission_status.size()); | |
610 | |
611 // The permission B is resolved, but the first request isn't finished. | |
612 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
613 PermissionType::GEOLOCATION, false); | |
614 ASSERT_EQ(3u, resolved_permission_status.size()); | |
615 | |
616 int request_4 = manager->RequestPermission( | |
617 PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin1), | |
618 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
619 base::Unretained(this), 4)); | |
620 EXPECT_NE(kNoPendingOperation, request_4); | |
621 ASSERT_EQ(3u, resolved_permission_status.size()); | |
622 | |
623 // Resolving the first request results in both requests finished. | |
624 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
625 PermissionType::MIDI_SYSEX, true); | |
626 ASSERT_EQ(6u, resolved_permission_status.size()); | |
627 // Order can be swapped. See Note in ComplicatedRequestScenario1. | |
628 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | |
629 EXPECT_EQ(3, resolved_permission_request_id[4]); | |
630 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[5]); | |
631 EXPECT_EQ(3, resolved_permission_request_id[5]); | |
632 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[3]); | |
633 EXPECT_EQ(4, resolved_permission_request_id[3]); | |
634 } | |
635 | |
636 // Test the case multiple permissions are requested multiple times as follow. | |
637 // 1. Permission A and B are requested. | |
638 // 2. Permission B is resolved. | |
639 // 3. Permission A is requested for a different origin before the A is | |
640 // resolved. | |
641 TEST_F(AwPermissionManagerTest, ComplicatedRequestScenario4) { | |
642 // In the first case, the permission A is a type that does not call an | |
643 // internal delegate method. | |
644 std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | |
645 PermissionType::MIDI_SYSEX}; | |
646 | |
647 int request_1 = manager->RequestPermissions( | |
648 permissions_1, | |
649 render_frame_host, GURL(kRequestingOrigin1), | |
650 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
651 base::Unretained(this), 1)); | |
652 EXPECT_NE(kNoPendingOperation, request_1); | |
653 EXPECT_EQ(0u, resolved_permission_status.size()); | |
654 | |
655 int request_2 = manager->RequestPermission( | |
656 PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin2), | |
657 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
658 base::Unretained(this), 2)); | |
659 EXPECT_NE(kNoPendingOperation, request_2); | |
660 EXPECT_EQ(0u, resolved_permission_status.size()); | |
661 | |
662 // The second request could be resolved if there is no blocking request, but | |
663 // in this case, the first request blocks this. | |
664 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
665 PermissionType::MIDI_SYSEX, true); | |
666 EXPECT_EQ(0u, resolved_permission_status.size()); | |
667 | |
668 // Resolving the first request results in resuming the second request. | |
669 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
670 PermissionType::MIDI_SYSEX, false); | |
671 ASSERT_EQ(3u, resolved_permission_status.size()); | |
672 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
673 EXPECT_EQ(1, resolved_permission_request_id[0]); | |
674 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[1]); | |
675 EXPECT_EQ(1, resolved_permission_request_id[1]); | |
676 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[2]); | |
677 EXPECT_EQ(2, resolved_permission_request_id[2]); | |
678 | |
679 // In the second case, the permission A is a type that calls an internal | |
680 // delegate method. | |
681 std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | |
682 PermissionType::MIDI_SYSEX}; | |
683 | |
684 int request_3 = manager->RequestPermissions( | |
685 permissions_2, | |
686 render_frame_host, GURL(kRequestingOrigin1), | |
687 true, base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
688 base::Unretained(this), 3)); | |
689 EXPECT_NE(kNoPendingOperation, request_3); | |
690 ASSERT_EQ(3u, resolved_permission_status.size()); | |
691 | |
692 // The permission B is resolved, but the first request isn't finished. | |
693 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
694 PermissionType::GEOLOCATION, false); | |
695 ASSERT_EQ(3u, resolved_permission_status.size()); | |
696 | |
697 int request_4 = manager->RequestPermission( | |
698 PermissionType::MIDI_SYSEX, render_frame_host, GURL(kRequestingOrigin2), | |
699 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
700 base::Unretained(this), 4)); | |
701 EXPECT_NE(kNoPendingOperation, request_4); | |
702 ASSERT_EQ(3u, resolved_permission_status.size()); | |
703 | |
704 // The second request could be resolved if there is no blocking request, but | |
705 // in this case, the first request blocks this. | |
706 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
707 PermissionType::MIDI_SYSEX, false); | |
708 ASSERT_EQ(3u, resolved_permission_status.size()); | |
709 | |
710 // Resolving the first request results in resuming the second request. | |
711 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
712 PermissionType::MIDI_SYSEX, false); | |
713 ASSERT_EQ(6u, resolved_permission_status.size()); | |
714 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[3]); | |
715 EXPECT_EQ(3, resolved_permission_request_id[3]); | |
716 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[4]); | |
717 EXPECT_EQ(3, resolved_permission_request_id[4]); | |
718 EXPECT_EQ(PermissionStatus::DENIED, resolved_permission_status[5]); | |
719 EXPECT_EQ(4, resolved_permission_request_id[5]); | |
720 } | |
721 | |
722 // Test the case CancelPermissionRequest is called for an invalid request. | |
723 TEST_F(AwPermissionManagerTest, InvalidRequestIsCancelled) { | |
724 manager->CancelPermissionRequest(0); | |
725 } | |
726 | |
727 // Test the case a delegate is called, and cancelled. | |
728 TEST_F(AwPermissionManagerTest, SinglePermissionRequestIsCancelled) { | |
729 int request_id = manager->RequestPermission( | |
730 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
731 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
732 base::Unretained(this), 0)); | |
733 EXPECT_NE(kNoPendingOperation, request_id); | |
734 EXPECT_EQ(0u, resolved_permission_status.size()); | |
735 | |
736 manager->CancelPermissionRequest(request_id); | |
737 EXPECT_EQ(0u, resolved_permission_status.size()); | |
738 | |
739 // This should not resolve the permission. | |
740 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
741 PermissionType::GEOLOCATION, true); | |
742 EXPECT_EQ(0u, resolved_permission_status.size()); | |
743 } | |
744 | |
745 // Test the case multiple permissions are requested through single call, and | |
746 // cancelled. | |
747 TEST_F(AwPermissionManagerTest, SinglePermissionsRequestIsCancelled) { | |
748 std::vector<PermissionType> permissions_1 = {PermissionType::MIDI, | |
749 PermissionType::MIDI_SYSEX}; | |
750 | |
751 int request_id = manager->RequestPermissions( | |
752 permissions_1, render_frame_host, GURL(kRequestingOrigin1), true, | |
753 base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
754 base::Unretained(this), 0)); | |
755 EXPECT_NE(kNoPendingOperation, request_id); | |
756 EXPECT_EQ(0u, resolved_permission_status.size()); | |
757 | |
758 manager->CancelPermissionRequest(request_id); | |
759 EXPECT_EQ(0u, resolved_permission_status.size()); | |
760 | |
761 std::vector<PermissionType> permissions_2 = {PermissionType::GEOLOCATION, | |
762 PermissionType::MIDI_SYSEX}; | |
763 | |
764 request_id = manager->RequestPermissions( | |
765 permissions_2, render_frame_host, GURL(kRequestingOrigin1), true, | |
766 base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
767 base::Unretained(this), 0)); | |
768 EXPECT_NE(kNoPendingOperation, request_id); | |
769 EXPECT_EQ(0u, resolved_permission_status.size()); | |
770 | |
771 manager->CancelPermissionRequest(request_id); | |
772 EXPECT_EQ(0u, resolved_permission_status.size()); | |
773 | |
774 // This should not resolve the permission. | |
775 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
776 PermissionType::GEOLOCATION, true); | |
777 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
778 PermissionType::MIDI_SYSEX, true); | |
779 EXPECT_EQ(0u, resolved_permission_status.size()); | |
780 } | |
781 | |
782 // Test the case multiple permissions are requested, and cancelled as follow. | |
783 // 1. Permission A is requested. | |
784 // 2. Permission A is requested for the same origin again. | |
785 // 3. The first request is cancelled. | |
786 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario1) { | |
787 int request_1 = manager->RequestPermission( | |
788 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
789 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
790 base::Unretained(this), 1)); | |
791 EXPECT_NE(kNoPendingOperation, request_1); | |
792 EXPECT_EQ(0u, resolved_permission_status.size()); | |
793 | |
794 int request_2 = manager->RequestPermission( | |
795 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
796 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
797 base::Unretained(this), 2)); | |
798 EXPECT_NE(kNoPendingOperation, request_2); | |
799 EXPECT_EQ(0u, resolved_permission_status.size()); | |
800 | |
801 EXPECT_NE(request_1, request_2); | |
802 | |
803 manager->CancelPermissionRequest(request_1); | |
804 EXPECT_EQ(0u, resolved_permission_status.size()); | |
805 | |
806 // This should resolve the second request. | |
807 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
808 PermissionType::GEOLOCATION, true); | |
809 EXPECT_EQ(1u, resolved_permission_status.size()); | |
810 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
811 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
812 } | |
813 | |
814 // Test the case multiple permissions are requested, and cancelled as follow. | |
815 // 1. Permission A is requested. | |
816 // 2. Permission A is requested for a different origin. | |
817 // 3. The first request is cancelled. | |
818 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario2) { | |
819 int request_1 = manager->RequestPermission( | |
820 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin1), | |
821 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
822 base::Unretained(this), 1)); | |
823 EXPECT_NE(kNoPendingOperation, request_1); | |
824 EXPECT_EQ(0u, resolved_permission_status.size()); | |
825 | |
826 int request_2 = manager->RequestPermission( | |
827 PermissionType::GEOLOCATION, render_frame_host, GURL(kRequestingOrigin2), | |
828 true, base::Bind(&AwPermissionManagerTest::PermissionRequestResponse, | |
829 base::Unretained(this), 2)); | |
830 EXPECT_NE(kNoPendingOperation, request_2); | |
831 EXPECT_EQ(0u, resolved_permission_status.size()); | |
832 | |
833 EXPECT_NE(request_1, request_2); | |
834 | |
835 manager->CancelPermissionRequest(request_1); | |
836 EXPECT_EQ(0u, resolved_permission_status.size()); | |
837 | |
838 // This should not resolve the first request. | |
839 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
840 PermissionType::GEOLOCATION, true); | |
841 EXPECT_EQ(0u, resolved_permission_status.size()); | |
842 | |
843 // This should resolve the second request. | |
844 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
845 PermissionType::GEOLOCATION, true); | |
846 EXPECT_EQ(1u, resolved_permission_status.size()); | |
847 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
848 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
849 } | |
850 | |
851 // Test the case multiple permissions are requested, and cancelled as follow. | |
852 // 1. Permission A and B are requested. | |
853 // 2. Permission A and B are requested for a different origin. | |
854 // 3. Permission A for the second request is resolved. | |
855 // 4. The second request is cancelled. | |
856 TEST_F(AwPermissionManagerTest, ComplicatedCancelScenario3) { | |
857 std::vector<PermissionType> permissions = {PermissionType::GEOLOCATION, | |
858 PermissionType::MIDI_SYSEX}; | |
859 | |
860 int request_1 = manager->RequestPermissions( | |
861 permissions, render_frame_host, GURL(kRequestingOrigin1), true, | |
862 base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
863 base::Unretained(this), 1)); | |
864 EXPECT_NE(kNoPendingOperation, request_1); | |
865 EXPECT_EQ(0u, resolved_permission_status.size()); | |
866 | |
867 int request_2 = manager->RequestPermissions( | |
868 permissions, render_frame_host, GURL(kRequestingOrigin2), true, | |
869 base::Bind(&AwPermissionManagerTest::PermissionsRequestResponse, | |
870 base::Unretained(this), 2)); | |
871 EXPECT_NE(kNoPendingOperation, request_2); | |
872 EXPECT_EQ(0u, resolved_permission_status.size()); | |
873 | |
874 EXPECT_NE(request_1, request_2); | |
875 | |
876 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
877 PermissionType::GEOLOCATION, true); | |
878 | |
879 manager->CancelPermissionRequest(request_1); | |
880 EXPECT_EQ(0u, resolved_permission_status.size()); | |
881 | |
882 // This should not resolve the first request. | |
883 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
884 PermissionType::GEOLOCATION, true); | |
885 manager->EnqueuePermissionResponse(kRequestingOrigin1, | |
886 PermissionType::MIDI_SYSEX, true); | |
887 EXPECT_EQ(0u, resolved_permission_status.size()); | |
888 | |
889 // This should resolve the second request. | |
890 manager->EnqueuePermissionResponse(kRequestingOrigin2, | |
891 PermissionType::MIDI_SYSEX, true); | |
892 EXPECT_EQ(2u, resolved_permission_status.size()); | |
893 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[0]); | |
894 EXPECT_EQ(2, resolved_permission_request_id[0]); | |
895 EXPECT_EQ(PermissionStatus::GRANTED, resolved_permission_status[1]); | |
896 EXPECT_EQ(2, resolved_permission_request_id[1]); | |
897 } | |
898 | |
899 } // namespace | |
900 | |
901 } // namespace android_webview | |
OLD | NEW |