1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/command_line.h"
6 #include "base/message_loop/message_loop.h"
7 #include "base/strings/utf_string_conversions.h"
8 #include "chrome/browser/ui/website_settings/mock_permission_bubble_request.h"
9 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
10 #include "chrome/browser/ui/website_settings/permission_bubble_request.h"
11 #include "chrome/browser/ui/website_settings/permission_bubble_view.h"
12 #include "chrome/common/chrome_switches.h"
13 #include "chrome/test/base/chrome_render_view_host_test_harness.h"
14 #include "testing/gtest/include/gtest/gtest.h"
18 class MockView
: public PermissionBubbleView
{
20 MockView() : shown_(false), can_accept_updates_(true), delegate_(NULL
) {}
21 virtual ~MockView() {}
25 can_accept_updates_
= true;
27 permission_requests_
.clear();
28 permission_states_
.clear();
31 // PermissionBubbleView:
32 virtual void SetDelegate(Delegate
* delegate
) override
{
37 const std::vector
<PermissionBubbleRequest
*>& requests
,
38 const std::vector
<bool>& accept_state
,
39 bool customization_state_
) override
{
41 permission_requests_
= requests
;
42 permission_states_
= accept_state
;
45 virtual void Hide() override
{
49 virtual bool CanAcceptRequestUpdate() override
{
50 return can_accept_updates_
;
53 virtual bool IsVisible() override
{
58 bool can_accept_updates_
;
60 std::vector
<PermissionBubbleRequest
*> permission_requests_
;
61 std::vector
<bool> permission_states_
;
66 class PermissionBubbleManagerTest
: public ChromeRenderViewHostTestHarness
{
68 PermissionBubbleManagerTest()
69 : ChromeRenderViewHostTestHarness(),
72 iframe_request_same_domain_("iframe",
73 GURL("http://www.google.com/some/url")),
74 iframe_request_other_domain_("iframe",
75 GURL("http://www.youtube.com")) {}
76 virtual ~PermissionBubbleManagerTest() {}
78 virtual void SetUp() override
{
79 ChromeRenderViewHostTestHarness::SetUp();
80 SetContents(CreateTestWebContents());
81 NavigateAndCommit(GURL("http://www.google.com"));
83 manager_
.reset(new PermissionBubbleManager(web_contents()));
86 virtual void TearDown() override
{
88 ChromeRenderViewHostTestHarness::TearDown();
91 void ToggleAccept(int index
, bool value
) {
92 manager_
->ToggleAccept(index
, value
);
103 void WaitForFrameLoad() {
104 // PermissionBubbleManager ignores all parameters. Yay?
105 manager_
->DocumentLoadedInFrame(NULL
);
106 base::MessageLoop::current()->RunUntilIdle();
109 void WaitForCoalescing() {
110 manager_
->DocumentOnLoadCompletedInMainFrame();
111 base::MessageLoop::current()->RunUntilIdle();
114 virtual void NavigationEntryCommitted(
115 const content::LoadCommittedDetails
& details
) {
116 manager_
->NavigationEntryCommitted(details
);
120 MockPermissionBubbleRequest request1_
;
121 MockPermissionBubbleRequest request2_
;
122 MockPermissionBubbleRequest iframe_request_same_domain_
;
123 MockPermissionBubbleRequest iframe_request_other_domain_
;
125 scoped_ptr
<PermissionBubbleManager
> manager_
;
128 TEST_F(PermissionBubbleManagerTest
, TestFlag
) {
129 EXPECT_FALSE(PermissionBubbleManager::Enabled());
130 CommandLine::ForCurrentProcess()->AppendSwitch(
131 switches::kEnablePermissionsBubbles
);
132 EXPECT_TRUE(PermissionBubbleManager::Enabled());
135 TEST_F(PermissionBubbleManagerTest
, SingleRequest
) {
136 manager_
->AddRequest(&request1_
);
137 manager_
->SetView(&view_
);
140 EXPECT_TRUE(view_
.delegate_
== manager_
.get());
141 EXPECT_TRUE(view_
.shown_
);
142 ASSERT_EQ(static_cast<size_t>(1), view_
.permission_requests_
.size());
143 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
145 ToggleAccept(0, true);
147 EXPECT_TRUE(request1_
.granted());
150 TEST_F(PermissionBubbleManagerTest
, SingleRequestViewFirst
) {
151 manager_
->SetView(&view_
);
152 manager_
->AddRequest(&request1_
);
155 EXPECT_TRUE(view_
.delegate_
== manager_
.get());
156 EXPECT_TRUE(view_
.shown_
);
157 ASSERT_EQ(static_cast<size_t>(1), view_
.permission_requests_
.size());
158 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
160 ToggleAccept(0, true);
162 EXPECT_TRUE(request1_
.granted());
165 TEST_F(PermissionBubbleManagerTest
, TwoRequests
) {
166 manager_
->AddRequest(&request1_
);
167 manager_
->AddRequest(&request2_
);
168 manager_
->SetView(&view_
);
171 EXPECT_TRUE(view_
.delegate_
== manager_
.get());
172 EXPECT_TRUE(view_
.shown_
);
173 ASSERT_EQ(static_cast<size_t>(2), view_
.permission_requests_
.size());
174 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
175 EXPECT_EQ(&request2_
, view_
.permission_requests_
[1]);
177 ToggleAccept(0, true);
178 ToggleAccept(1, false);
180 EXPECT_TRUE(request1_
.granted());
181 EXPECT_FALSE(request2_
.granted());
184 TEST_F(PermissionBubbleManagerTest
, TwoRequestsTabSwitch
) {
185 manager_
->AddRequest(&request1_
);
186 manager_
->AddRequest(&request2_
);
187 manager_
->SetView(&view_
);
190 EXPECT_TRUE(view_
.delegate_
== manager_
.get());
191 EXPECT_TRUE(view_
.shown_
);
192 ASSERT_EQ(static_cast<size_t>(2), view_
.permission_requests_
.size());
193 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
194 EXPECT_EQ(&request2_
, view_
.permission_requests_
[1]);
196 ToggleAccept(0, true);
197 ToggleAccept(1, false);
199 manager_
->SetView(NULL
);
200 EXPECT_FALSE(view_
.shown_
);
201 EXPECT_TRUE(view_
.delegate_
== NULL
);
204 manager_
->SetView(&view_
);
206 EXPECT_TRUE(view_
.shown_
);
207 ASSERT_EQ(static_cast<size_t>(2), view_
.permission_requests_
.size());
208 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
209 EXPECT_EQ(&request2_
, view_
.permission_requests_
[1]);
210 EXPECT_TRUE(view_
.permission_states_
[0]);
211 EXPECT_FALSE(view_
.permission_states_
[1]);
214 EXPECT_TRUE(request1_
.granted());
215 EXPECT_FALSE(request2_
.granted());
218 TEST_F(PermissionBubbleManagerTest
, NoRequests
) {
219 manager_
->SetView(&view_
);
221 EXPECT_FALSE(view_
.shown_
);
224 TEST_F(PermissionBubbleManagerTest
, NoView
) {
225 manager_
->AddRequest(&request1_
);
227 EXPECT_FALSE(view_
.shown_
);
230 TEST_F(PermissionBubbleManagerTest
, TwoRequestsCoalesce
) {
231 manager_
->SetView(&view_
);
232 manager_
->AddRequest(&request1_
);
233 manager_
->AddRequest(&request2_
);
234 EXPECT_FALSE(view_
.shown_
);
237 EXPECT_TRUE(view_
.shown_
);
238 EXPECT_EQ(2u, view_
.permission_requests_
.size());
241 TEST_F(PermissionBubbleManagerTest
, TwoRequestsDoNotCoalesce
) {
242 manager_
->SetView(&view_
);
243 manager_
->AddRequest(&request1_
);
245 manager_
->AddRequest(&request2_
);
247 EXPECT_TRUE(view_
.shown_
);
248 EXPECT_EQ(1u, view_
.permission_requests_
.size());
251 TEST_F(PermissionBubbleManagerTest
, TwoRequestsShownInTwoBubbles
) {
252 manager_
->SetView(&view_
);
253 manager_
->AddRequest(&request1_
);
255 manager_
->AddRequest(&request2_
);
257 EXPECT_TRUE(view_
.shown_
);
258 ASSERT_EQ(1u, view_
.permission_requests_
.size());
259 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
265 EXPECT_TRUE(view_
.shown_
);
266 ASSERT_EQ(1u, view_
.permission_requests_
.size());
267 EXPECT_EQ(&request2_
, view_
.permission_requests_
[0]);
270 TEST_F(PermissionBubbleManagerTest
, TestAddDuplicateRequest
) {
271 manager_
->SetView(&view_
);
272 manager_
->AddRequest(&request1_
);
273 manager_
->AddRequest(&request2_
);
274 manager_
->AddRequest(&request1_
);
277 EXPECT_TRUE(view_
.shown_
);
278 ASSERT_EQ(2u, view_
.permission_requests_
.size());
279 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
280 EXPECT_EQ(&request2_
, view_
.permission_requests_
[1]);
283 TEST_F(PermissionBubbleManagerTest
, SequentialRequests
) {
284 manager_
->SetView(&view_
);
285 manager_
->AddRequest(&request1_
);
287 EXPECT_TRUE(view_
.shown_
);
290 EXPECT_TRUE(request1_
.granted());
292 EXPECT_FALSE(view_
.shown_
);
294 manager_
->AddRequest(&request2_
);
296 EXPECT_TRUE(view_
.shown_
);
298 EXPECT_FALSE(view_
.shown_
);
299 EXPECT_TRUE(request2_
.granted());
302 TEST_F(PermissionBubbleManagerTest
, SameRequestRejected
) {
303 manager_
->SetView(&view_
);
304 manager_
->AddRequest(&request1_
);
305 manager_
->AddRequest(&request1_
);
306 EXPECT_FALSE(request1_
.finished());
309 EXPECT_TRUE(view_
.shown_
);
310 ASSERT_EQ(1u, view_
.permission_requests_
.size());
311 EXPECT_EQ(&request1_
, view_
.permission_requests_
[0]);
314 TEST_F(PermissionBubbleManagerTest
, DuplicateRequestRejected
) {
315 manager_
->SetView(&view_
);
316 manager_
->AddRequest(&request1_
);
317 MockPermissionBubbleRequest
dupe_request("test1");
318 manager_
->AddRequest(&dupe_request
);
319 EXPECT_TRUE(dupe_request
.finished());
320 EXPECT_FALSE(request1_
.finished());
323 TEST_F(PermissionBubbleManagerTest
, DuplicateQueuedRequest
) {
324 manager_
->SetView(&view_
);
325 manager_
->AddRequest(&request1_
);
327 manager_
->AddRequest(&request2_
);
329 MockPermissionBubbleRequest
dupe_request("test1");
330 manager_
->AddRequest(&dupe_request
);
331 EXPECT_TRUE(dupe_request
.finished());
332 EXPECT_FALSE(request1_
.finished());
334 MockPermissionBubbleRequest
dupe_request2("test1");
335 manager_
->AddRequest(&dupe_request2
);
336 EXPECT_TRUE(dupe_request2
.finished());
337 EXPECT_FALSE(request2_
.finished());
340 TEST_F(PermissionBubbleManagerTest
, ForgetRequestsOnPageNavigation
) {
341 manager_
->SetView(&view_
);
342 manager_
->AddRequest(&request1_
);
344 manager_
->AddRequest(&request2_
);
345 manager_
->AddRequest(&iframe_request_other_domain_
);
347 EXPECT_TRUE(view_
.shown_
);
348 ASSERT_EQ(1u, view_
.permission_requests_
.size());
350 NavigateAndCommit(GURL("http://www2.google.com/"));
353 EXPECT_FALSE(view_
.shown_
);
354 EXPECT_TRUE(request1_
.finished());
355 EXPECT_TRUE(request2_
.finished());
356 EXPECT_TRUE(iframe_request_other_domain_
.finished());
359 TEST_F(PermissionBubbleManagerTest
, TestCancel
) {
360 manager_
->SetView(NULL
);
361 manager_
->AddRequest(&request1_
);
364 manager_
->CancelRequest(&request1_
);
365 EXPECT_TRUE(request1_
.finished());
366 manager_
->SetView(&view_
);
367 EXPECT_FALSE(view_
.shown_
);
369 manager_
->AddRequest(&request2_
);
371 EXPECT_TRUE(view_
.shown_
);
374 TEST_F(PermissionBubbleManagerTest
, TestCancelWhileDialogShown
) {
375 manager_
->SetView(&view_
);
376 manager_
->AddRequest(&request1_
);
379 EXPECT_TRUE(view_
.shown_
);
380 EXPECT_FALSE(request1_
.finished());
381 manager_
->CancelRequest(&request1_
);
382 EXPECT_TRUE(request1_
.finished());
385 TEST_F(PermissionBubbleManagerTest
, TestCancelWhileDialogShownNoUpdate
) {
386 manager_
->SetView(&view_
);
387 view_
.can_accept_updates_
= false;
388 manager_
->AddRequest(&request1_
);
391 EXPECT_TRUE(view_
.shown_
);
392 EXPECT_FALSE(request1_
.finished());
393 manager_
->CancelRequest(&request1_
);
394 EXPECT_TRUE(request1_
.finished());
398 TEST_F(PermissionBubbleManagerTest
, TestCancelPendingRequest
) {
399 manager_
->SetView(&view_
);
400 manager_
->AddRequest(&request1_
);
402 manager_
->AddRequest(&request2_
);
404 EXPECT_TRUE(view_
.shown_
);
405 EXPECT_EQ(1u, view_
.permission_requests_
.size());
406 manager_
->CancelRequest(&request2_
);
408 EXPECT_TRUE(view_
.shown_
);
409 EXPECT_FALSE(request1_
.finished());
410 EXPECT_TRUE(request2_
.finished());
413 TEST_F(PermissionBubbleManagerTest
, MainFrameNoRequestIFrameRequest
) {
414 manager_
->SetView(&view_
);
415 manager_
->AddRequest(&iframe_request_same_domain_
);
419 EXPECT_TRUE(view_
.shown_
);
421 EXPECT_TRUE(iframe_request_same_domain_
.finished());
424 TEST_F(PermissionBubbleManagerTest
, MainFrameAndIFrameRequestSameDomain
) {
425 manager_
->SetView(&view_
);
426 manager_
->AddRequest(&request1_
);
427 manager_
->AddRequest(&iframe_request_same_domain_
);
431 EXPECT_TRUE(view_
.shown_
);
432 EXPECT_EQ(2u, view_
.permission_requests_
.size());
434 EXPECT_TRUE(request1_
.finished());
435 EXPECT_TRUE(iframe_request_same_domain_
.finished());
436 EXPECT_FALSE(view_
.shown_
);
439 TEST_F(PermissionBubbleManagerTest
, MainFrameAndIFrameRequestOtherDomain
) {
440 manager_
->SetView(&view_
);
441 manager_
->AddRequest(&request1_
);
442 manager_
->AddRequest(&iframe_request_other_domain_
);
446 EXPECT_TRUE(view_
.shown_
);
448 EXPECT_TRUE(request1_
.finished());
449 EXPECT_FALSE(iframe_request_other_domain_
.finished());
450 EXPECT_TRUE(view_
.shown_
);
452 EXPECT_TRUE(iframe_request_other_domain_
.finished());
455 TEST_F(PermissionBubbleManagerTest
, IFrameRequestWhenMainRequestVisible
) {
456 manager_
->SetView(&view_
);
457 manager_
->AddRequest(&request1_
);
459 EXPECT_TRUE(view_
.shown_
);
461 manager_
->AddRequest(&iframe_request_same_domain_
);
463 EXPECT_EQ(1u, view_
.permission_requests_
.size());
465 EXPECT_TRUE(request1_
.finished());
466 EXPECT_FALSE(iframe_request_same_domain_
.finished());
467 EXPECT_TRUE(view_
.shown_
);
468 EXPECT_EQ(1u, view_
.permission_requests_
.size());
470 EXPECT_TRUE(iframe_request_same_domain_
.finished());
473 TEST_F(PermissionBubbleManagerTest
,
474 IFrameRequestOtherDomainWhenMainRequestVisible
) {
475 manager_
->SetView(&view_
);
476 manager_
->AddRequest(&request1_
);
478 EXPECT_TRUE(view_
.shown_
);
480 manager_
->AddRequest(&iframe_request_other_domain_
);
483 EXPECT_TRUE(request1_
.finished());
484 EXPECT_FALSE(iframe_request_other_domain_
.finished());
485 EXPECT_TRUE(view_
.shown_
);
487 EXPECT_TRUE(iframe_request_other_domain_
.finished());
490 TEST_F(PermissionBubbleManagerTest
, IFrameUserGestureRequest
) {
491 iframe_request_other_domain_
.SetHasUserGesture();
492 manager_
->SetView(&view_
);
493 manager_
->AddRequest(&request1_
);
494 manager_
->AddRequest(&iframe_request_other_domain_
);
497 manager_
->AddRequest(&request2_
);
499 EXPECT_TRUE(view_
.shown_
);
501 EXPECT_TRUE(request1_
.finished());
502 EXPECT_FALSE(iframe_request_other_domain_
.finished());
503 EXPECT_FALSE(request2_
.finished());
504 EXPECT_TRUE(view_
.shown_
);
506 EXPECT_TRUE(iframe_request_other_domain_
.finished());
507 EXPECT_FALSE(request2_
.finished());
510 TEST_F(PermissionBubbleManagerTest
, AllUserGestureRequests
) {
511 iframe_request_other_domain_
.SetHasUserGesture();
512 request2_
.SetHasUserGesture();
513 manager_
->SetView(&view_
);
514 manager_
->AddRequest(&request1_
);
515 manager_
->AddRequest(&iframe_request_other_domain_
);
518 manager_
->AddRequest(&request2_
);
520 EXPECT_TRUE(view_
.shown_
);
522 EXPECT_TRUE(request1_
.finished());
523 EXPECT_FALSE(request2_
.finished());
524 EXPECT_FALSE(iframe_request_other_domain_
.finished());
525 EXPECT_TRUE(view_
.shown_
);
527 EXPECT_TRUE(request2_
.finished());
528 EXPECT_FALSE(iframe_request_other_domain_
.finished());
530 EXPECT_TRUE(iframe_request_other_domain_
.finished());
531 EXPECT_FALSE(view_
.shown_
);