1 // Copyright (c) 2012 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.
9 #include "base/callback.h"
10 #include "base/command_line.h"
11 #include "base/compiler_specific.h"
12 #include "base/memory/ref_counted.h"
13 #include "base/run_loop.h"
14 #include "base/strings/stringprintf.h"
15 #include "base/strings/utf_string_conversions.h"
16 #include "base/test/simple_test_clock.h"
17 #include "base/time/clock.h"
18 #include "chrome/browser/browser_process.h"
19 #include "chrome/browser/chrome_notification_types.h"
20 #include "chrome/browser/infobars/infobar_service.h"
21 #include "chrome/browser/notifications/desktop_notification_profile_util.h"
22 #include "chrome/browser/notifications/notification.h"
23 #include "chrome/browser/profiles/profile.h"
24 #include "chrome/browser/ui/browser.h"
25 #include "chrome/browser/ui/browser_tabstrip.h"
26 #include "chrome/browser/ui/browser_window.h"
27 #include "chrome/browser/ui/tabs/tab_strip_model.h"
28 #include "chrome/browser/ui/website_settings/permission_bubble_manager.h"
29 #include "chrome/test/base/in_process_browser_test.h"
30 #include "chrome/test/base/ui_test_utils.h"
31 #include "components/content_settings/core/browser/host_content_settings_map.h"
32 #include "components/content_settings/core/common/content_settings.h"
33 #include "components/content_settings/core/common/content_settings_pattern.h"
34 #include "content/public/browser/notification_service.h"
35 #include "content/public/browser/notification_source.h"
36 #include "content/public/browser/notification_types.h"
37 #include "content/public/browser/render_view_host.h"
38 #include "content/public/browser/web_contents.h"
39 #include "content/public/test/browser_test_utils.h"
40 #include "content/public/test/test_utils.h"
41 #include "net/base/net_util.h"
42 #include "net/test/embedded_test_server/embedded_test_server.h"
43 #include "testing/gtest/include/gtest/gtest.h"
44 #include "ui/base/window_open_disposition.h"
45 #include "ui/message_center/message_center.h"
46 #include "ui/message_center/message_center_observer.h"
51 const char kExpectedIconUrl
[] = "/notifications/no_such_file.png";
53 class NotificationChangeObserver
{
55 virtual ~NotificationChangeObserver() {}
56 virtual bool Wait() = 0;
59 class MessageCenterChangeObserver
60 : public message_center::MessageCenterObserver
,
61 public NotificationChangeObserver
{
63 MessageCenterChangeObserver()
64 : notification_received_(false) {
65 message_center::MessageCenter::Get()->AddObserver(this);
68 ~MessageCenterChangeObserver() override
{
69 message_center::MessageCenter::Get()->RemoveObserver(this);
72 // NotificationChangeObserver:
73 bool Wait() override
{
74 if (notification_received_
)
77 message_loop_runner_
= new content::MessageLoopRunner
;
78 message_loop_runner_
->Run();
79 return notification_received_
;
82 // message_center::MessageCenterObserver:
83 void OnNotificationAdded(const std::string
& notification_id
) override
{
84 OnMessageCenterChanged();
87 void OnNotificationRemoved(const std::string
& notification_id
,
88 bool by_user
) override
{
89 OnMessageCenterChanged();
92 void OnNotificationUpdated(const std::string
& notification_id
) override
{
93 OnMessageCenterChanged();
96 void OnMessageCenterChanged() {
97 notification_received_
= true;
98 if (message_loop_runner_
.get())
99 message_loop_runner_
->Quit();
102 bool notification_received_
;
103 scoped_refptr
<content::MessageLoopRunner
> message_loop_runner_
;
105 DISALLOW_COPY_AND_ASSIGN(MessageCenterChangeObserver
);
108 // Used to observe the creation of permission prompt without responding.
109 class PermissionRequestObserver
: public PermissionBubbleManager::Observer
{
111 explicit PermissionRequestObserver(content::WebContents
* web_contents
)
112 : bubble_manager_(PermissionBubbleManager::FromWebContents(web_contents
)),
113 request_shown_(false),
114 message_loop_runner_(new content::MessageLoopRunner
) {
115 bubble_manager_
->AddObserver(this);
117 ~PermissionRequestObserver() override
{
118 // Safe to remove twice if it happens.
119 bubble_manager_
->RemoveObserver(this);
122 void Wait() { message_loop_runner_
->Run(); }
124 bool request_shown() { return request_shown_
; }
127 // PermissionBubbleManager::Observer
128 void OnBubbleAdded() override
{
129 request_shown_
= true;
130 bubble_manager_
->RemoveObserver(this);
131 message_loop_runner_
->Quit();
134 PermissionBubbleManager
* bubble_manager_
;
136 scoped_refptr
<content::MessageLoopRunner
> message_loop_runner_
;
138 DISALLOW_COPY_AND_ASSIGN(PermissionRequestObserver
);
143 class NotificationsTest
: public InProcessBrowserTest
{
145 NotificationsTest() {}
148 int GetNotificationCount();
149 int GetNotificationPopupCount();
151 void CloseBrowserWindow(Browser
* browser
);
152 void CrashTab(Browser
* browser
, int index
);
154 void DenyOrigin(const GURL
& origin
);
155 void AllowOrigin(const GURL
& origin
);
156 void AllowAllOrigins();
157 void SetDefaultContentSetting(ContentSetting setting
);
159 std::string
CreateNotification(Browser
* browser
,
160 bool wait_for_new_balloon
,
164 const char* replace_id
);
165 std::string
CreateSimpleNotification(Browser
* browser
,
166 bool wait_for_new_balloon
);
167 bool RequestAndAcceptPermission(Browser
* browser
);
168 bool RequestAndDenyPermission(Browser
* browser
);
169 bool RequestAndDismissPermission(Browser
* browser
);
170 bool RequestPermissionAndWait(Browser
* browser
);
171 bool CancelNotification(const char* notification_id
, Browser
* browser
);
172 void GetPrefsByContentSetting(ContentSetting setting
,
173 ContentSettingsForOneType
* settings
);
174 bool CheckOriginInSetting(const ContentSettingsForOneType
& settings
,
177 GURL
GetTestPageURLForFile(const std::string
& file
) const {
178 return embedded_test_server()->GetURL(
179 std::string("/notifications/") + file
);
182 GURL
GetTestPageURL() const {
183 return GetTestPageURLForFile("notification_tester.html");
186 content::WebContents
* GetActiveWebContents(Browser
* browser
) {
187 return browser
->tab_strip_model()->GetActiveWebContents();
191 void DropOriginPreference(const GURL
& origin
);
192 std::string
RequestAndRespondToPermission(
194 PermissionBubbleManager::AutoResponseType bubble_response
);
197 int NotificationsTest::GetNotificationCount() {
198 return message_center::MessageCenter::Get()->NotificationCount();
201 int NotificationsTest::GetNotificationPopupCount() {
202 return message_center::MessageCenter::Get()->GetPopupNotifications().size();
205 void NotificationsTest::CloseBrowserWindow(Browser
* browser
) {
206 content::WindowedNotificationObserver
observer(
207 chrome::NOTIFICATION_BROWSER_CLOSED
,
208 content::Source
<Browser
>(browser
));
209 browser
->window()->Close();
213 void NotificationsTest::CrashTab(Browser
* browser
, int index
) {
214 content::CrashTab(browser
->tab_strip_model()->GetWebContentsAt(index
));
217 void NotificationsTest::DenyOrigin(const GURL
& origin
) {
218 DropOriginPreference(origin
);
219 DesktopNotificationProfileUtil::DenyPermission(browser()->profile(), origin
);
222 void NotificationsTest::AllowOrigin(const GURL
& origin
) {
223 DropOriginPreference(origin
);
224 DesktopNotificationProfileUtil::GrantPermission(browser()->profile(), origin
);
227 void NotificationsTest::AllowAllOrigins() {
229 browser()->profile()->GetHostContentSettingsMap()->ClearSettingsForOneType(
230 CONTENT_SETTINGS_TYPE_NOTIFICATIONS
);
231 SetDefaultContentSetting(CONTENT_SETTING_ALLOW
);
234 void NotificationsTest::SetDefaultContentSetting(ContentSetting setting
) {
235 browser()->profile()->GetHostContentSettingsMap()->SetDefaultContentSetting(
236 CONTENT_SETTINGS_TYPE_NOTIFICATIONS
, setting
);
239 std::string
NotificationsTest::CreateNotification(
241 bool wait_for_new_balloon
,
245 const char* replace_id
) {
246 std::string script
= base::StringPrintf(
247 "createNotification('%s', '%s', '%s', '%s');",
248 icon
, title
, body
, replace_id
);
250 MessageCenterChangeObserver observer
;
252 bool success
= content::ExecuteScriptAndExtractString(
253 GetActiveWebContents(browser
), script
, &result
);
254 if (success
&& result
!= "-1" && wait_for_new_balloon
)
255 success
= observer
.Wait();
256 EXPECT_TRUE(success
);
261 std::string
NotificationsTest::CreateSimpleNotification(
263 bool wait_for_new_balloon
) {
264 return CreateNotification(
265 browser
, wait_for_new_balloon
,
266 "no_such_file.png", "My Title", "My Body", "");
269 std::string
NotificationsTest::RequestAndRespondToPermission(
271 PermissionBubbleManager::AutoResponseType bubble_response
) {
273 content::WebContents
* web_contents
= GetActiveWebContents(browser
);
274 PermissionBubbleManager::FromWebContents(web_contents
)
275 ->set_auto_response_for_test(bubble_response
);
276 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
277 web_contents
, "requestPermission();", &result
));
281 bool NotificationsTest::RequestAndAcceptPermission(Browser
* browser
) {
282 std::string result
= RequestAndRespondToPermission(
283 browser
, PermissionBubbleManager::ACCEPT_ALL
);
284 return "request-callback-granted" == result
;
287 bool NotificationsTest::RequestAndDenyPermission(Browser
* browser
) {
289 RequestAndRespondToPermission(browser
, PermissionBubbleManager::DENY_ALL
);
290 return "request-callback-denied" == result
;
293 bool NotificationsTest::RequestAndDismissPermission(Browser
* browser
) {
295 RequestAndRespondToPermission(browser
, PermissionBubbleManager::DISMISS
);
296 return "request-callback-default" == result
;
299 bool NotificationsTest::RequestPermissionAndWait(Browser
* browser
) {
300 content::WebContents
* web_contents
= GetActiveWebContents(browser
);
301 ui_test_utils::NavigateToURL(browser
, GetTestPageURL());
302 PermissionRequestObserver
observer(web_contents
);
304 EXPECT_TRUE(content::ExecuteScriptAndExtractString(
305 web_contents
, "requestPermissionAndRespond();", &result
));
306 EXPECT_EQ("requested", result
);
308 return observer
.request_shown();
311 bool NotificationsTest::CancelNotification(
312 const char* notification_id
,
314 std::string script
= base::StringPrintf(
315 "cancelNotification('%s');",
318 MessageCenterChangeObserver observer
;
320 bool success
= content::ExecuteScriptAndExtractString(
321 GetActiveWebContents(browser
), script
, &result
);
322 if (!success
|| result
!= "1")
324 return observer
.Wait();
327 void NotificationsTest::GetPrefsByContentSetting(
328 ContentSetting setting
,
329 ContentSettingsForOneType
* settings
) {
330 DesktopNotificationProfileUtil::GetNotificationsSettings(
331 browser()->profile(), settings
);
332 for (ContentSettingsForOneType::iterator it
= settings
->begin();
333 it
!= settings
->end(); ) {
334 if (it
->setting
!= setting
|| it
->source
.compare("preference") != 0)
335 it
= settings
->erase(it
);
341 bool NotificationsTest::CheckOriginInSetting(
342 const ContentSettingsForOneType
& settings
,
343 const GURL
& origin
) {
344 ContentSettingsPattern pattern
=
345 ContentSettingsPattern::FromURLNoWildcard(origin
);
346 for (ContentSettingsForOneType::const_iterator it
= settings
.begin();
347 it
!= settings
.end(); ++it
) {
348 if (it
->primary_pattern
== pattern
)
354 void NotificationsTest::DropOriginPreference(const GURL
& origin
) {
355 DesktopNotificationProfileUtil::ClearSetting(browser()->profile(),
356 ContentSettingsPattern::FromURLNoWildcard(origin
));
359 // Flaky on Windows, Mac, Linux: http://crbug.com/437414.
360 IN_PROC_BROWSER_TEST_F(NotificationsTest
, DISABLED_TestUserGestureInfobar
) {
361 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
363 ui_test_utils::NavigateToURL(
365 embedded_test_server()->GetURL(
366 "/notifications/notifications_request_function.html"));
368 // Request permission by calling request() while eval'ing an inline script;
369 // That's considered a user gesture to webkit, and should produce an infobar.
371 ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
372 GetActiveWebContents(browser()),
373 "window.domAutomationController.send(request());", &result
));
376 InfoBarService
* infobar_service
= InfoBarService::FromWebContents(
377 browser()->tab_strip_model()->GetWebContentsAt(0));
378 EXPECT_EQ(1U, infobar_service
->infobar_count());
381 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestCreateSimpleNotification
) {
382 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
384 // Creates a simple notification.
386 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
388 std::string result
= CreateSimpleNotification(browser(), true);
389 EXPECT_NE("-1", result
);
391 GURL EXPECTED_ICON_URL
= embedded_test_server()->GetURL(kExpectedIconUrl
);
392 ASSERT_EQ(1, GetNotificationCount());
393 message_center::NotificationList::Notifications notifications
=
394 message_center::MessageCenter::Get()->GetVisibleNotifications();
395 EXPECT_EQ(base::ASCIIToUTF16("My Title"),
396 (*notifications
.rbegin())->title());
397 EXPECT_EQ(base::ASCIIToUTF16("My Body"),
398 (*notifications
.rbegin())->message());
401 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestCloseNotification
) {
402 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
404 // Creates a notification and closes it.
406 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
408 std::string result
= CreateSimpleNotification(browser(), true);
409 EXPECT_NE("-1", result
);
410 ASSERT_EQ(1, GetNotificationCount());
412 message_center::NotificationList::Notifications notifications
=
413 message_center::MessageCenter::Get()->GetVisibleNotifications();
414 message_center::MessageCenter::Get()->RemoveNotification(
415 (*notifications
.rbegin())->id(),
418 ASSERT_EQ(0, GetNotificationCount());
421 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestCancelNotification
) {
422 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
424 // Creates a notification and cancels it in the origin page.
426 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
428 std::string note_id
= CreateSimpleNotification(browser(), true);
429 EXPECT_NE(note_id
, "-1");
431 ASSERT_EQ(1, GetNotificationCount());
432 ASSERT_TRUE(CancelNotification(note_id
.c_str(), browser()));
433 ASSERT_EQ(0, GetNotificationCount());
436 // Requests notification privileges and verifies the prompt appears.
437 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestPermissionRequestUIAppears
) {
438 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
440 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
441 EXPECT_TRUE(RequestPermissionAndWait(browser()));
442 ASSERT_EQ(0, GetNotificationCount());
445 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestAllowOnPermissionRequestUI
) {
446 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
448 // Tries to create a notification & clicks 'allow' on the prompt.
449 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
450 // This notification should not be shown because we do not have permission.
451 CreateSimpleNotification(browser(), false);
452 ASSERT_EQ(0, GetNotificationCount());
454 ASSERT_TRUE(RequestAndAcceptPermission(browser()));
456 CreateSimpleNotification(browser(), true);
457 EXPECT_EQ(1, GetNotificationCount());
460 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestDenyOnPermissionRequestUI
) {
461 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
463 // Test that no notification is created when Deny is chosen from prompt.
464 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
465 ASSERT_TRUE(RequestAndDenyPermission(browser()));
466 CreateSimpleNotification(browser(), false);
467 ASSERT_EQ(0, GetNotificationCount());
468 ContentSettingsForOneType settings
;
469 GetPrefsByContentSetting(CONTENT_SETTING_BLOCK
, &settings
);
470 EXPECT_TRUE(CheckOriginInSetting(settings
, GetTestPageURL()));
473 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestClosePermissionRequestUI
) {
474 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
476 // Test that no notification is created when prompt is dismissed.
477 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
478 ASSERT_TRUE(RequestAndDismissPermission(browser()));
479 CreateSimpleNotification(browser(), false);
480 ASSERT_EQ(0, GetNotificationCount());
481 ContentSettingsForOneType settings
;
482 GetPrefsByContentSetting(CONTENT_SETTING_BLOCK
, &settings
);
483 EXPECT_EQ(0U, settings
.size());
486 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestAllowNotificationsFromAllSites
) {
487 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
489 // Verify that all domains can be allowed to show notifications.
490 SetDefaultContentSetting(CONTENT_SETTING_ALLOW
);
491 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
493 std::string result
= CreateSimpleNotification(browser(), true);
494 EXPECT_NE("-1", result
);
496 ASSERT_EQ(1, GetNotificationCount());
499 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestDenyNotificationsFromAllSites
) {
500 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
502 // Verify that no domain can show notifications.
503 SetDefaultContentSetting(CONTENT_SETTING_BLOCK
);
504 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
506 std::string result
= CreateSimpleNotification(browser(), false);
507 EXPECT_EQ("-1", result
);
509 ASSERT_EQ(0, GetNotificationCount());
512 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestDenyDomainAndAllowAll
) {
513 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
515 // Verify that denying a domain and allowing all shouldn't show
516 // notifications from the denied domain.
517 DenyOrigin(GetTestPageURL().GetOrigin());
518 SetDefaultContentSetting(CONTENT_SETTING_ALLOW
);
520 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
522 std::string result
= CreateSimpleNotification(browser(), false);
523 EXPECT_EQ("-1", result
);
525 ASSERT_EQ(0, GetNotificationCount());
528 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestAllowDomainAndDenyAll
) {
529 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
531 // Verify that allowing a domain and denying all others should show
532 // notifications from the allowed domain.
533 AllowOrigin(GetTestPageURL().GetOrigin());
534 SetDefaultContentSetting(CONTENT_SETTING_BLOCK
);
536 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
538 std::string result
= CreateSimpleNotification(browser(), true);
539 EXPECT_NE("-1", result
);
541 ASSERT_EQ(1, GetNotificationCount());
544 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestDenyAndThenAllowDomain
) {
545 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
547 // Verify that denying and again allowing should show notifications.
548 DenyOrigin(GetTestPageURL().GetOrigin());
550 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
552 std::string result
= CreateSimpleNotification(browser(), false);
553 EXPECT_EQ("-1", result
);
555 ASSERT_EQ(0, GetNotificationCount());
557 AllowOrigin(GetTestPageURL().GetOrigin());
558 result
= CreateSimpleNotification(browser(), true);
559 EXPECT_NE("-1", result
);
561 ASSERT_EQ(1, GetNotificationCount());
564 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestCreateDenyCloseNotifications
) {
565 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
567 // Verify able to create, deny, and close the notification.
569 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
570 CreateSimpleNotification(browser(), true);
571 ASSERT_EQ(1, GetNotificationCount());
573 DenyOrigin(GetTestPageURL().GetOrigin());
574 ContentSettingsForOneType settings
;
575 GetPrefsByContentSetting(CONTENT_SETTING_BLOCK
, &settings
);
576 ASSERT_TRUE(CheckOriginInSetting(settings
, GetTestPageURL().GetOrigin()));
578 EXPECT_EQ(1, GetNotificationCount());
579 message_center::NotificationList::Notifications notifications
=
580 message_center::MessageCenter::Get()->GetVisibleNotifications();
581 message_center::MessageCenter::Get()->RemoveNotification(
582 (*notifications
.rbegin())->id(),
584 ASSERT_EQ(0, GetNotificationCount());
587 // Crashes on Linux/Win. See http://crbug.com/160657.
588 IN_PROC_BROWSER_TEST_F(
590 DISABLED_TestOriginPrefsNotSavedInIncognito
) {
591 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
593 // Verify that allow/deny origin preferences are not saved in incognito.
594 Browser
* incognito
= CreateIncognitoBrowser();
595 ui_test_utils::NavigateToURL(incognito
, GetTestPageURL());
596 ASSERT_TRUE(RequestAndDenyPermission(incognito
));
597 CloseBrowserWindow(incognito
);
599 incognito
= CreateIncognitoBrowser();
600 ui_test_utils::NavigateToURL(incognito
, GetTestPageURL());
601 ASSERT_TRUE(RequestAndAcceptPermission(incognito
));
602 CreateSimpleNotification(incognito
, true);
603 ASSERT_EQ(1, GetNotificationCount());
604 CloseBrowserWindow(incognito
);
606 incognito
= CreateIncognitoBrowser();
607 ui_test_utils::NavigateToURL(incognito
, GetTestPageURL());
608 ASSERT_TRUE(RequestPermissionAndWait(incognito
));
610 ContentSettingsForOneType settings
;
611 GetPrefsByContentSetting(CONTENT_SETTING_BLOCK
, &settings
);
612 EXPECT_EQ(0U, settings
.size());
613 GetPrefsByContentSetting(CONTENT_SETTING_ALLOW
, &settings
);
614 EXPECT_EQ(0U, settings
.size());
617 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestIncognitoNotification
) {
618 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
620 // Test notifications in incognito window.
621 Browser
* browser
= CreateIncognitoBrowser();
622 ui_test_utils::NavigateToURL(browser
, GetTestPageURL());
623 browser
->tab_strip_model()->ActivateTabAt(0, true);
624 ASSERT_TRUE(RequestAndAcceptPermission(browser
));
625 CreateSimpleNotification(browser
, true);
626 ASSERT_EQ(1, GetNotificationCount());
629 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestCloseTabWithPermissionRequestUI
) {
630 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
632 // Test that user can close tab when bubble present.
633 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
634 EXPECT_TRUE(RequestPermissionAndWait(browser()));
635 content::WebContentsDestroyedWatcher
destroyed_watcher(
636 browser()->tab_strip_model()->GetWebContentsAt(0));
637 browser()->tab_strip_model()->CloseWebContentsAt(0,
638 TabStripModel::CLOSE_NONE
);
639 destroyed_watcher
.Wait();
642 // See crbug.com/248470
643 #if defined(OS_LINUX)
644 #define MAYBE_TestCrashRendererNotificationRemain \
645 DISABLED_TestCrashRendererNotificationRemain
647 #define MAYBE_TestCrashRendererNotificationRemain \
648 TestCrashRendererNotificationRemain
651 IN_PROC_BROWSER_TEST_F(NotificationsTest
,
652 MAYBE_TestCrashRendererNotificationRemain
) {
653 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
655 // Test crashing renderer does not close or crash notification.
657 ui_test_utils::NavigateToURLWithDisposition(
661 ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB
);
662 browser()->tab_strip_model()->ActivateTabAt(0, true);
663 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
664 CreateSimpleNotification(browser(), true);
665 ASSERT_EQ(1, GetNotificationCount());
666 CrashTab(browser(), 0);
667 ASSERT_EQ(1, GetNotificationCount());
670 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestNotificationReplacement
) {
671 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
673 // Test that we can replace a notification using the replaceId.
676 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
678 std::string result
= CreateNotification(
679 browser(), true, "abc.png", "Title1", "Body1", "chat");
680 EXPECT_NE("-1", result
);
682 ASSERT_EQ(1, GetNotificationCount());
684 result
= CreateNotification(
685 browser(), false, "no_such_file.png", "Title2", "Body2", "chat");
686 EXPECT_NE("-1", result
);
688 ASSERT_EQ(1, GetNotificationCount());
689 message_center::NotificationList::Notifications notifications
=
690 message_center::MessageCenter::Get()->GetVisibleNotifications();
691 EXPECT_EQ(base::ASCIIToUTF16("Title2"), (*notifications
.rbegin())->title());
692 EXPECT_EQ(base::ASCIIToUTF16("Body2"),
693 (*notifications
.rbegin())->message());
696 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestLastUsage
) {
697 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
699 HostContentSettingsMap
* settings_map
=
700 browser()->profile()->GetHostContentSettingsMap();
701 base::SimpleTestClock
* clock
= new base::SimpleTestClock();
702 settings_map
->SetPrefClockForTesting(scoped_ptr
<base::Clock
>(clock
));
703 clock
->SetNow(base::Time::UnixEpoch() + base::TimeDelta::FromSeconds(10));
705 // Creates a simple notification.
707 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
709 std::string result
= CreateSimpleNotification(browser(), true);
710 EXPECT_NE("-1", result
);
712 EXPECT_EQ(settings_map
->GetLastUsage(GetTestPageURL().GetOrigin(),
713 GetTestPageURL().GetOrigin(),
714 CONTENT_SETTINGS_TYPE_NOTIFICATIONS
)
718 clock
->Advance(base::TimeDelta::FromSeconds(3));
720 result
= CreateSimpleNotification(browser(), true);
721 EXPECT_NE("-1", result
);
723 EXPECT_EQ(settings_map
->GetLastUsage(GetTestPageURL().GetOrigin(),
724 GetTestPageURL().GetOrigin(),
725 CONTENT_SETTINGS_TYPE_NOTIFICATIONS
)
730 IN_PROC_BROWSER_TEST_F(NotificationsTest
,
731 TestNotificationReplacementReappearance
) {
732 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
734 // Test that we can replace a notification using the tag, and that it will
735 // cause the notification to reappear as a popup again.
738 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
740 ASSERT_EQ(0, GetNotificationPopupCount());
742 std::string result
= CreateNotification(
743 browser(), true, "abc.png", "Title1", "Body1", "chat");
744 EXPECT_NE("-1", result
);
746 ASSERT_EQ(1, GetNotificationPopupCount());
748 message_center::NotificationList::Notifications notifications
=
749 message_center::MessageCenter::Get()->GetVisibleNotifications();
750 message_center::MessageCenter::Get()->ClickOnNotification(
751 (*notifications
.rbegin())->id());
753 ASSERT_EQ(0, GetNotificationPopupCount());
755 result
= CreateNotification(
756 browser(), true, "abc.png", "Title2", "Body2", "chat");
757 EXPECT_NE("-1", result
);
759 ASSERT_EQ(1, GetNotificationPopupCount());
762 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestNotificationValidIcon
) {
763 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
766 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
767 ASSERT_EQ(0, GetNotificationPopupCount());
769 std::string result
= CreateNotification(
770 browser(), true, "icon.png", "Title1", "Body1", "chat");
771 EXPECT_NE("-1", result
);
773 message_center::NotificationList::PopupNotifications notifications
=
774 message_center::MessageCenter::Get()->GetPopupNotifications();
775 ASSERT_EQ(1u, notifications
.size());
777 auto* notification
= *notifications
.rbegin();
779 EXPECT_EQ(100, notification
->icon().Width());
780 EXPECT_EQ(100, notification
->icon().Height());
783 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestNotificationInvalidIcon
) {
784 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
787 ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
788 ASSERT_EQ(0, GetNotificationPopupCount());
790 // Not supplying an icon URL.
791 std::string result
= CreateNotification(
792 browser(), true, "", "Title1", "Body1", "chat");
793 EXPECT_NE("-1", result
);
795 message_center::NotificationList::PopupNotifications notifications
=
796 message_center::MessageCenter::Get()->GetPopupNotifications();
797 ASSERT_EQ(1u, notifications
.size());
799 auto* notification
= *notifications
.rbegin();
800 EXPECT_TRUE(notification
->icon().IsEmpty());
802 // Supplying an invalid icon URL.
803 result
= CreateNotification(
804 browser(), true, "invalid.png", "Title1", "Body1", "chat");
805 EXPECT_NE("-1", result
);
807 notifications
= message_center::MessageCenter::Get()->GetPopupNotifications();
808 ASSERT_EQ(1u, notifications
.size());
810 notification
= *notifications
.rbegin();
811 EXPECT_TRUE(notification
->icon().IsEmpty());
814 IN_PROC_BROWSER_TEST_F(NotificationsTest
, TestNotificationDoubleClose
) {
815 ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
818 ui_test_utils::NavigateToURL(
819 browser(), GetTestPageURLForFile("notification-double-close.html"));
820 ASSERT_EQ(0, GetNotificationPopupCount());
822 std::string result
= CreateNotification(
823 browser(), true, "", "Title1", "Body1", "chat");
824 EXPECT_NE("-1", result
);
826 ASSERT_EQ(1, GetNotificationCount());
827 message_center::NotificationList::Notifications notifications
=
828 message_center::MessageCenter::Get()->GetVisibleNotifications();
829 message_center::MessageCenter::Get()->RemoveNotification(
830 (*notifications
.rbegin())->id(),
833 ASSERT_EQ(0, GetNotificationCount());
835 // Calling WebContents::IsCrashed() will return FALSE here, even if the WC did
836 // crash. Work around this timing issue by creating another notification,
837 // which requires interaction with the renderer process.
838 result
= CreateNotification(browser(), true, "", "Title1", "Body1", "chat");
839 EXPECT_NE("-1", result
);