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

Side by Side Diff: android_webview/browser/aw_permission_manager_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698