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

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: unit tests and some minor fixes 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 "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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698