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

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

Powered by Google App Engine
This is Rietveld 408576698