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 ~MockView() override
{}
23 static scoped_ptr
<PermissionBubbleView
> Create(Browser
* browser
) {
24 return make_scoped_ptr(new MockView());
29 can_accept_updates_
= true;
31 permission_requests_
.clear();
32 permission_states_
.clear();
35 // PermissionBubbleView:
36 void SetDelegate(Delegate
* delegate
) override
{ delegate_
= delegate
; }
38 void Show(const std::vector
<PermissionBubbleRequest
*>& requests
,
39 const std::vector
<bool>& accept_state
) override
{
41 permission_requests_
= requests
;
42 permission_states_
= accept_state
;
45 void Hide() override
{ shown_
= false; }
46 bool CanAcceptRequestUpdate() override
{ return can_accept_updates_
; }
47 bool IsVisible() override
{ return shown_
; }
48 void UpdateAnchorPosition() override
{}
49 gfx::NativeWindow
GetNativeWindow() override
{ return nullptr; }
52 bool can_accept_updates_
;
54 std::vector
<PermissionBubbleRequest
*> permission_requests_
;
55 std::vector
<bool> permission_states_
;
60 class PermissionBubbleManagerTest
: public ChromeRenderViewHostTestHarness
{
62 PermissionBubbleManagerTest()
63 : ChromeRenderViewHostTestHarness(),
66 iframe_request_same_domain_("iframe",
67 GURL("http://www.google.com/some/url")),
68 iframe_request_other_domain_("iframe",
69 GURL("http://www.youtube.com")) {}
70 ~PermissionBubbleManagerTest() override
{}
72 void SetUp() override
{
73 ChromeRenderViewHostTestHarness::SetUp();
74 SetContents(CreateTestWebContents());
75 NavigateAndCommit(GURL("http://www.google.com"));
77 manager_
.reset(new PermissionBubbleManager(web_contents()));
78 manager_
->view_factory_
= base::Bind(MockView::Create
);
81 void TearDown() override
{
83 ChromeRenderViewHostTestHarness::TearDown();
86 void ToggleAccept(int index
, bool value
) {
87 manager_
->ToggleAccept(index
, value
);
98 void WaitForFrameLoad() {
99 // PermissionBubbleManager ignores all parameters. Yay?
100 manager_
->DocumentLoadedInFrame(NULL
);
101 base::MessageLoop::current()->RunUntilIdle();
104 void WaitForCoalescing() {
105 manager_
->DocumentOnLoadCompletedInMainFrame();
106 base::MessageLoop::current()->RunUntilIdle();
109 virtual void NavigationEntryCommitted(
110 const content::LoadCommittedDetails
& details
) {
111 manager_
->NavigationEntryCommitted(details
);
115 MockPermissionBubbleRequest request1_
;
116 MockPermissionBubbleRequest request2_
;
117 MockPermissionBubbleRequest iframe_request_same_domain_
;
118 MockPermissionBubbleRequest iframe_request_other_domain_
;
119 scoped_ptr
<PermissionBubbleManager
> manager_
;
121 MockView
* view_() { return static_cast<MockView
*>(manager_
->view_
.get()); }
124 // nullptr browser is OK for test.
125 manager_
->DisplayPendingRequests(nullptr);
129 TEST_F(PermissionBubbleManagerTest
, TestFlag
) {
130 EXPECT_TRUE(PermissionBubbleManager::Enabled());
131 base::CommandLine::ForCurrentProcess()->AppendSwitch(
132 switches::kDisablePermissionsBubbles
);
133 EXPECT_FALSE(PermissionBubbleManager::Enabled());
136 TEST_F(PermissionBubbleManagerTest
, SingleRequest
) {
137 manager_
->AddRequest(&request1_
);
141 EXPECT_TRUE(view_()->delegate_
== manager_
.get());
142 EXPECT_TRUE(view_()->shown_
);
143 ASSERT_EQ(static_cast<size_t>(1), view_()->permission_requests_
.size());
144 EXPECT_EQ(&request1_
, view_()->permission_requests_
[0]);
146 ToggleAccept(0, true);
148 EXPECT_TRUE(request1_
.granted());
151 TEST_F(PermissionBubbleManagerTest
, SingleRequestViewFirst
) {
153 manager_
->AddRequest(&request1_
);
156 EXPECT_TRUE(view_()->delegate_
== manager_
.get());
157 EXPECT_TRUE(view_()->shown_
);
158 ASSERT_EQ(static_cast<size_t>(1), view_()->permission_requests_
.size());
159 EXPECT_EQ(&request1_
, view_()->permission_requests_
[0]);
161 ToggleAccept(0, true);
163 EXPECT_TRUE(request1_
.granted());
166 TEST_F(PermissionBubbleManagerTest
, TwoRequests
) {
167 manager_
->AddRequest(&request1_
);
168 manager_
->AddRequest(&request2_
);
172 EXPECT_TRUE(view_()->delegate_
== manager_
.get());
173 EXPECT_TRUE(view_()->shown_
);
174 ASSERT_EQ(static_cast<size_t>(2), view_()->permission_requests_
.size());
175 EXPECT_EQ(&request1_
, view_()->permission_requests_
[0]);
176 EXPECT_EQ(&request2_
, view_()->permission_requests_
[1]);
178 ToggleAccept(0, true);
179 ToggleAccept(1, false);
181 EXPECT_TRUE(request1_
.granted());
182 EXPECT_FALSE(request2_
.granted());
185 TEST_F(PermissionBubbleManagerTest
, TwoRequestsTabSwitch
) {
186 manager_
->AddRequest(&request1_
);
187 manager_
->AddRequest(&request2_
);
191 EXPECT_TRUE(view_()->delegate_
== manager_
.get());
192 EXPECT_TRUE(view_()->shown_
);
193 ASSERT_EQ(static_cast<size_t>(2), view_()->permission_requests_
.size());
194 EXPECT_EQ(&request1_
, view_()->permission_requests_
[0]);
195 EXPECT_EQ(&request2_
, view_()->permission_requests_
[1]);
197 ToggleAccept(0, true);
198 ToggleAccept(1, false);
200 manager_
->HideBubble();
201 EXPECT_FALSE(view_());
205 EXPECT_TRUE(view_()->shown_
);
206 ASSERT_EQ(static_cast<size_t>(2), view_()->permission_requests_
.size());
207 EXPECT_EQ(&request1_
, view_()->permission_requests_
[0]);
208 EXPECT_EQ(&request2_
, view_()->permission_requests_
[1]);
209 EXPECT_TRUE(view_()->permission_states_
[0]);
210 EXPECT_FALSE(view_()->permission_states_
[1]);
213 EXPECT_TRUE(request1_
.granted());
214 EXPECT_FALSE(request2_
.granted());
217 TEST_F(PermissionBubbleManagerTest
, NoRequests
) {
220 EXPECT_FALSE(view_()->shown_
);
223 TEST_F(PermissionBubbleManagerTest
, NoView
) {
224 manager_
->AddRequest(&request1_
);
225 // Don't display the pending requests.
227 EXPECT_FALSE(view_());
230 TEST_F(PermissionBubbleManagerTest
, TwoRequestsCoalesce
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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_
->HideBubble();
361 manager_
->AddRequest(&request1_
);
364 manager_
->CancelRequest(&request1_
);
365 EXPECT_TRUE(request1_
.finished());
367 EXPECT_FALSE(view_()->shown_
);
369 manager_
->AddRequest(&request2_
);
371 EXPECT_TRUE(view_()->shown_
);
374 TEST_F(PermissionBubbleManagerTest
, TestCancelWhileDialogShown
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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
) {
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();
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();
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_
);
534 TEST_F(PermissionBubbleManagerTest
, RequestsWithoutUserGesture
) {
535 manager_
->RequireUserGesture(true);
539 manager_
->AddRequest(&request1_
);
540 manager_
->AddRequest(&iframe_request_other_domain_
);
541 manager_
->AddRequest(&request2_
);
542 base::MessageLoop::current()->RunUntilIdle();
544 EXPECT_FALSE(view_()->shown_
);
547 TEST_F(PermissionBubbleManagerTest
, RequestsWithUserGesture
) {
548 manager_
->RequireUserGesture(true);
552 request1_
.SetHasUserGesture();
553 manager_
->AddRequest(&request1_
);
554 manager_
->AddRequest(&iframe_request_other_domain_
);
555 manager_
->AddRequest(&request2_
);
556 base::MessageLoop::current()->RunUntilIdle();
558 EXPECT_TRUE(view_()->shown_
);
561 TEST_F(PermissionBubbleManagerTest
, RequestsDontNeedUserGesture
) {
565 manager_
->AddRequest(&request1_
);
566 manager_
->AddRequest(&iframe_request_other_domain_
);
567 manager_
->AddRequest(&request2_
);
568 base::MessageLoop::current()->RunUntilIdle();
570 EXPECT_TRUE(view_()->shown_
);