• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.
4 
5 #include <deque>
6 #include <string>
7 
8 #include "base/bind.h"
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 "chrome/browser/browser_process.h"
17 #include "chrome/browser/chrome_notification_types.h"
18 #include "chrome/browser/infobars/infobar_service.h"
19 #include "chrome/browser/notifications/desktop_notification_service.h"
20 #include "chrome/browser/notifications/desktop_notification_service_factory.h"
21 #include "chrome/browser/notifications/notification.h"
22 #include "chrome/browser/profiles/profile.h"
23 #include "chrome/browser/ui/browser.h"
24 #include "chrome/browser/ui/browser_tabstrip.h"
25 #include "chrome/browser/ui/browser_window.h"
26 #include "chrome/browser/ui/tabs/tab_strip_model.h"
27 #include "chrome/common/content_settings.h"
28 #include "chrome/common/content_settings_pattern.h"
29 #include "chrome/test/base/in_process_browser_test.h"
30 #include "chrome/test/base/ui_test_utils.h"
31 #include "components/infobars/core/confirm_infobar_delegate.h"
32 #include "components/infobars/core/infobar.h"
33 #include "content/public/browser/notification_service.h"
34 #include "content/public/browser/notification_source.h"
35 #include "content/public/browser/notification_types.h"
36 #include "content/public/browser/render_view_host.h"
37 #include "content/public/browser/web_contents.h"
38 #include "content/public/test/browser_test_utils.h"
39 #include "content/public/test/test_utils.h"
40 #include "net/base/net_util.h"
41 #include "net/test/embedded_test_server/embedded_test_server.h"
42 #include "testing/gtest/include/gtest/gtest.h"
43 #include "ui/base/window_open_disposition.h"
44 #include "ui/message_center/message_center.h"
45 #include "ui/message_center/message_center_observer.h"
46 #include "url/gurl.h"
47 
48 namespace {
49 
50 const char kExpectedIconUrl[] = "/notifications/no_such_file.png";
51 
52 enum InfobarAction {
53   DISMISS = 0,
54   ALLOW,
55   DENY,
56 };
57 
58 class NotificationChangeObserver {
59 public:
~NotificationChangeObserver()60   virtual ~NotificationChangeObserver() {}
61   virtual bool Wait() = 0;
62 };
63 
64 class MessageCenterChangeObserver
65     : public message_center::MessageCenterObserver,
66       public NotificationChangeObserver {
67  public:
MessageCenterChangeObserver()68   MessageCenterChangeObserver()
69       : notification_received_(false) {
70     message_center::MessageCenter::Get()->AddObserver(this);
71   }
72 
~MessageCenterChangeObserver()73   virtual ~MessageCenterChangeObserver() {
74     message_center::MessageCenter::Get()->RemoveObserver(this);
75   }
76 
77   // NotificationChangeObserver:
Wait()78   virtual bool Wait() OVERRIDE {
79     if (notification_received_)
80       return true;
81 
82     message_loop_runner_ = new content::MessageLoopRunner;
83     message_loop_runner_->Run();
84     return notification_received_;
85   }
86 
87   // message_center::MessageCenterObserver:
OnNotificationAdded(const std::string & notification_id)88   virtual void OnNotificationAdded(
89       const std::string& notification_id) OVERRIDE {
90     OnMessageCenterChanged();
91   }
92 
OnNotificationRemoved(const std::string & notification_id,bool by_user)93   virtual void OnNotificationRemoved(const std::string& notification_id,
94                                      bool by_user) OVERRIDE {
95     OnMessageCenterChanged();
96   }
97 
OnNotificationUpdated(const std::string & notification_id)98   virtual void OnNotificationUpdated(
99       const std::string& notification_id) OVERRIDE {
100     OnMessageCenterChanged();
101   }
102 
OnMessageCenterChanged()103   void OnMessageCenterChanged() {
104     notification_received_ = true;
105     if (message_loop_runner_.get())
106       message_loop_runner_->Quit();
107   }
108 
109   bool notification_received_;
110   scoped_refptr<content::MessageLoopRunner> message_loop_runner_;
111 
112   DISALLOW_COPY_AND_ASSIGN(MessageCenterChangeObserver);
113 };
114 
115 }  // namespace
116 
117 class NotificationsTest : public InProcessBrowserTest {
118  public:
NotificationsTest()119   NotificationsTest() {}
120 
121  protected:
122   int GetNotificationCount();
123 
124   void CloseBrowserWindow(Browser* browser);
125   void CrashTab(Browser* browser, int index);
126 
127   void SetDefaultPermissionSetting(ContentSetting setting);
128   void DenyOrigin(const GURL& origin);
129   void AllowOrigin(const GURL& origin);
130   void AllowAllOrigins();
131 
132   void VerifyInfoBar(const Browser* browser, int index);
133   std::string CreateNotification(Browser* browser,
134                                  bool wait_for_new_balloon,
135                                  const char* icon,
136                                  const char* title,
137                                  const char* body,
138                                  const char* replace_id);
139   std::string CreateSimpleNotification(Browser* browser,
140                                        bool wait_for_new_balloon);
141   bool RequestPermissionAndWait(Browser* browser);
142   bool CancelNotification(const char* notification_id, Browser* browser);
143   bool PerformActionOnInfoBar(Browser* browser,
144                               InfobarAction action,
145                               size_t infobar_index,
146                               int tab_index);
147   void GetPrefsByContentSetting(ContentSetting setting,
148                                 ContentSettingsForOneType* settings);
149   bool CheckOriginInSetting(const ContentSettingsForOneType& settings,
150                             const GURL& origin);
151 
GetTestPageURL() const152   GURL GetTestPageURL() const {
153     return embedded_test_server()->GetURL(
154       "/notifications/notification_tester.html");
155   }
156 
157  private:
158   void DropOriginPreference(const GURL& origin);
159   DesktopNotificationService* GetDesktopNotificationService();
160 };
161 
GetNotificationCount()162 int NotificationsTest::GetNotificationCount() {
163   return message_center::MessageCenter::Get()->NotificationCount();
164 }
165 
CloseBrowserWindow(Browser * browser)166 void NotificationsTest::CloseBrowserWindow(Browser* browser) {
167   content::WindowedNotificationObserver observer(
168       chrome::NOTIFICATION_BROWSER_CLOSED,
169       content::Source<Browser>(browser));
170   browser->window()->Close();
171   observer.Wait();
172 }
173 
CrashTab(Browser * browser,int index)174 void NotificationsTest::CrashTab(Browser* browser, int index) {
175   content::CrashTab(browser->tab_strip_model()->GetWebContentsAt(index));
176 }
177 
SetDefaultPermissionSetting(ContentSetting setting)178 void NotificationsTest::SetDefaultPermissionSetting(ContentSetting setting) {
179   DesktopNotificationService* service = GetDesktopNotificationService();
180   service->SetDefaultContentSetting(setting);
181 }
182 
DenyOrigin(const GURL & origin)183 void NotificationsTest::DenyOrigin(const GURL& origin) {
184   DropOriginPreference(origin);
185   GetDesktopNotificationService()->DenyPermission(origin);
186 }
187 
AllowOrigin(const GURL & origin)188 void NotificationsTest::AllowOrigin(const GURL& origin) {
189   DropOriginPreference(origin);
190   GetDesktopNotificationService()->GrantPermission(origin);
191 }
192 
AllowAllOrigins()193 void NotificationsTest::AllowAllOrigins() {
194   GetDesktopNotificationService()->ResetAllOrigins();
195   GetDesktopNotificationService()->SetDefaultContentSetting(
196       CONTENT_SETTING_ALLOW);
197 }
198 
VerifyInfoBar(const Browser * browser,int index)199 void NotificationsTest::VerifyInfoBar(const Browser* browser, int index) {
200   InfoBarService* infobar_service = InfoBarService::FromWebContents(
201       browser->tab_strip_model()->GetWebContentsAt(index));
202 
203   ASSERT_EQ(1U, infobar_service->infobar_count());
204   ConfirmInfoBarDelegate* confirm_infobar =
205       infobar_service->infobar_at(0)->delegate()->AsConfirmInfoBarDelegate();
206   ASSERT_TRUE(confirm_infobar);
207   int buttons = confirm_infobar->GetButtons();
208   EXPECT_TRUE(buttons & ConfirmInfoBarDelegate::BUTTON_OK);
209   EXPECT_TRUE(buttons & ConfirmInfoBarDelegate::BUTTON_CANCEL);
210 }
211 
CreateNotification(Browser * browser,bool wait_for_new_balloon,const char * icon,const char * title,const char * body,const char * replace_id)212 std::string NotificationsTest::CreateNotification(
213     Browser* browser,
214     bool wait_for_new_balloon,
215     const char* icon,
216     const char* title,
217     const char* body,
218     const char* replace_id) {
219   std::string script = base::StringPrintf(
220       "createNotification('%s', '%s', '%s', '%s');",
221       icon, title, body, replace_id);
222 
223   MessageCenterChangeObserver observer;
224   std::string result;
225   bool success = content::ExecuteScriptAndExtractString(
226       browser->tab_strip_model()->GetActiveWebContents(),
227       script,
228       &result);
229   if (success && result != "-1" && wait_for_new_balloon)
230     success = observer.Wait();
231   EXPECT_TRUE(success);
232 
233   return result;
234 }
235 
CreateSimpleNotification(Browser * browser,bool wait_for_new_balloon)236 std::string NotificationsTest::CreateSimpleNotification(
237     Browser* browser,
238     bool wait_for_new_balloon) {
239   return CreateNotification(
240       browser, wait_for_new_balloon,
241       "no_such_file.png", "My Title", "My Body", "");
242 }
243 
RequestPermissionAndWait(Browser * browser)244 bool NotificationsTest::RequestPermissionAndWait(Browser* browser) {
245   InfoBarService* infobar_service = InfoBarService::FromWebContents(
246       browser->tab_strip_model()->GetActiveWebContents());
247   content::WindowedNotificationObserver observer(
248       chrome::NOTIFICATION_TAB_CONTENTS_INFOBAR_ADDED,
249       content::Source<InfoBarService>(infobar_service));
250   std::string result;
251   bool success = content::ExecuteScriptAndExtractString(
252       browser->tab_strip_model()->GetActiveWebContents(),
253       "requestPermission();",
254       &result);
255   if (!success || result != "1")
256     return false;
257   observer.Wait();
258   return true;
259 }
260 
CancelNotification(const char * notification_id,Browser * browser)261 bool NotificationsTest::CancelNotification(
262     const char* notification_id,
263     Browser* browser) {
264   std::string script = base::StringPrintf(
265       "cancelNotification('%s');",
266       notification_id);
267 
268   MessageCenterChangeObserver observer;
269   std::string result;
270   bool success = content::ExecuteScriptAndExtractString(
271       browser->tab_strip_model()->GetActiveWebContents(),
272       script,
273       &result);
274   if (!success || result != "1")
275     return false;
276   return observer.Wait();
277 }
278 
PerformActionOnInfoBar(Browser * browser,InfobarAction action,size_t infobar_index,int tab_index)279 bool NotificationsTest::PerformActionOnInfoBar(
280     Browser* browser,
281     InfobarAction action,
282     size_t infobar_index,
283     int tab_index) {
284   InfoBarService* infobar_service = InfoBarService::FromWebContents(
285       browser->tab_strip_model()->GetWebContentsAt(tab_index));
286   if (infobar_index >= infobar_service->infobar_count()) {
287     ADD_FAILURE();
288     return false;
289   }
290 
291   infobars::InfoBar* infobar = infobar_service->infobar_at(infobar_index);
292   infobars::InfoBarDelegate* infobar_delegate = infobar->delegate();
293   switch (action) {
294     case DISMISS:
295       infobar_delegate->InfoBarDismissed();
296       infobar_service->RemoveInfoBar(infobar);
297       return true;
298 
299     case ALLOW: {
300       ConfirmInfoBarDelegate* confirm_infobar_delegate =
301           infobar_delegate->AsConfirmInfoBarDelegate();
302       if (!confirm_infobar_delegate) {
303         ADD_FAILURE();
304       } else if (confirm_infobar_delegate->Accept()) {
305         infobar_service->RemoveInfoBar(infobar);
306         return true;
307       }
308     }
309 
310     case DENY: {
311       ConfirmInfoBarDelegate* confirm_infobar_delegate =
312           infobar_delegate->AsConfirmInfoBarDelegate();
313       if (!confirm_infobar_delegate) {
314         ADD_FAILURE();
315       } else if (confirm_infobar_delegate->Cancel()) {
316         infobar_service->RemoveInfoBar(infobar);
317         return true;
318       }
319     }
320   }
321 
322   return false;
323 }
324 
GetPrefsByContentSetting(ContentSetting setting,ContentSettingsForOneType * settings)325 void NotificationsTest::GetPrefsByContentSetting(
326     ContentSetting setting,
327     ContentSettingsForOneType* settings) {
328   DesktopNotificationService* service = GetDesktopNotificationService();
329   service->GetNotificationsSettings(settings);
330   for (ContentSettingsForOneType::iterator it = settings->begin();
331        it != settings->end(); ) {
332     if (it->setting != setting || it->source.compare("preference") != 0)
333       it = settings->erase(it);
334     else
335       ++it;
336   }
337 }
338 
CheckOriginInSetting(const ContentSettingsForOneType & settings,const GURL & origin)339 bool NotificationsTest::CheckOriginInSetting(
340     const ContentSettingsForOneType& settings,
341     const GURL& origin) {
342   ContentSettingsPattern pattern =
343       ContentSettingsPattern::FromURLNoWildcard(origin);
344   for (ContentSettingsForOneType::const_iterator it = settings.begin();
345        it != settings.end(); ++it) {
346     if (it->primary_pattern == pattern)
347       return true;
348   }
349   return false;
350 }
351 
DropOriginPreference(const GURL & origin)352 void NotificationsTest::DropOriginPreference(const GURL& origin) {
353   GetDesktopNotificationService()->ClearSetting(
354       ContentSettingsPattern::FromURLNoWildcard(origin));
355 }
356 
GetDesktopNotificationService()357 DesktopNotificationService* NotificationsTest::GetDesktopNotificationService() {
358   Profile* profile = browser()->profile();
359   return DesktopNotificationServiceFactory::GetForProfile(profile);
360 }
361 
362 // If this flakes, use http://crbug.com/62311 and http://crbug.com/74428.
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestUserGestureInfobar)363 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestUserGestureInfobar) {
364   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
365 
366   ui_test_utils::NavigateToURL(
367       browser(),
368       embedded_test_server()->GetURL(
369           "/notifications/notifications_request_function.html"));
370 
371   // Request permission by calling request() while eval'ing an inline script;
372   // That's considered a user gesture to webkit, and should produce an infobar.
373   bool result;
374   ASSERT_TRUE(content::ExecuteScriptAndExtractBool(
375       browser()->tab_strip_model()->GetActiveWebContents(),
376       "window.domAutomationController.send(request());",
377       &result));
378   EXPECT_TRUE(result);
379 
380   InfoBarService* infobar_service = InfoBarService::FromWebContents(
381       browser()->tab_strip_model()->GetWebContentsAt(0));
382   EXPECT_EQ(1U, infobar_service->infobar_count());
383 }
384 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestCreateSimpleNotification)385 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateSimpleNotification) {
386   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
387 
388   // Creates a simple notification.
389   AllowAllOrigins();
390   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
391 
392   std::string result = CreateSimpleNotification(browser(), true);
393   EXPECT_NE("-1", result);
394 
395   GURL EXPECTED_ICON_URL = embedded_test_server()->GetURL(kExpectedIconUrl);
396   ASSERT_EQ(1, GetNotificationCount());
397   message_center::NotificationList::Notifications notifications =
398       message_center::MessageCenter::Get()->GetVisibleNotifications();
399   EXPECT_EQ(base::ASCIIToUTF16("My Title"),
400             (*notifications.rbegin())->title());
401   EXPECT_EQ(base::ASCIIToUTF16("My Body"),
402             (*notifications.rbegin())->message());
403 }
404 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestCloseNotification)405 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCloseNotification) {
406   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
407 
408   // Creates a notification and closes it.
409   AllowAllOrigins();
410   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
411 
412   std::string result = CreateSimpleNotification(browser(), true);
413   EXPECT_NE("-1", result);
414   ASSERT_EQ(1, GetNotificationCount());
415 
416   message_center::NotificationList::Notifications notifications =
417       message_center::MessageCenter::Get()->GetVisibleNotifications();
418   message_center::MessageCenter::Get()->RemoveNotification(
419       (*notifications.rbegin())->id(),
420       true);  // by_user
421 
422   ASSERT_EQ(0, GetNotificationCount());
423 }
424 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestCancelNotification)425 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCancelNotification) {
426   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
427 
428   // Creates a notification and cancels it in the origin page.
429   AllowAllOrigins();
430   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
431 
432   std::string note_id = CreateSimpleNotification(browser(), true);
433   EXPECT_NE(note_id, "-1");
434 
435   ASSERT_EQ(1, GetNotificationCount());
436   ASSERT_TRUE(CancelNotification(note_id.c_str(), browser()));
437   ASSERT_EQ(0, GetNotificationCount());
438 }
439 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestPermissionInfobarAppears)440 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestPermissionInfobarAppears) {
441   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
442 
443   // Requests notification privileges and verifies the infobar appears.
444   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
445   ASSERT_TRUE(RequestPermissionAndWait(browser()));
446 
447   ASSERT_EQ(0, GetNotificationCount());
448   ASSERT_NO_FATAL_FAILURE(VerifyInfoBar(browser(), 0));
449 }
450 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestAllowOnPermissionInfobar)451 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowOnPermissionInfobar) {
452   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
453 
454   // Tries to create a notification and clicks allow on the infobar.
455   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
456   // This notification should not be shown because we do not have permission.
457   CreateSimpleNotification(browser(), false);
458   ASSERT_EQ(0, GetNotificationCount());
459 
460   ASSERT_TRUE(RequestPermissionAndWait(browser()));
461   ASSERT_TRUE(PerformActionOnInfoBar(browser(), ALLOW, 0, 0));
462 
463   CreateSimpleNotification(browser(), true);
464   EXPECT_EQ(1, GetNotificationCount());
465 }
466 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestDenyOnPermissionInfobar)467 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyOnPermissionInfobar) {
468   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
469 
470   // Test that no notification is created
471   // when Deny is chosen from permission infobar.
472   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
473   ASSERT_TRUE(RequestPermissionAndWait(browser()));
474   PerformActionOnInfoBar(browser(), DENY, 0, 0);
475   CreateSimpleNotification(browser(), false);
476   ASSERT_EQ(0, GetNotificationCount());
477   ContentSettingsForOneType settings;
478   GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
479   EXPECT_TRUE(CheckOriginInSetting(settings, GetTestPageURL()));
480 }
481 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestClosePermissionInfobar)482 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestClosePermissionInfobar) {
483   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
484 
485   // Test that no notification is created when permission infobar is dismissed.
486   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
487   ASSERT_TRUE(RequestPermissionAndWait(browser()));
488   PerformActionOnInfoBar(browser(), DISMISS, 0, 0);
489   CreateSimpleNotification(browser(), false);
490   ASSERT_EQ(0, GetNotificationCount());
491   ContentSettingsForOneType settings;
492   GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
493   EXPECT_EQ(0U, settings.size());
494 }
495 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestAllowNotificationsFromAllSites)496 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowNotificationsFromAllSites) {
497   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
498 
499   // Verify that all domains can be allowed to show notifications.
500   SetDefaultPermissionSetting(CONTENT_SETTING_ALLOW);
501   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
502 
503   std::string result = CreateSimpleNotification(browser(), true);
504   EXPECT_NE("-1", result);
505 
506   ASSERT_EQ(1, GetNotificationCount());
507   InfoBarService* infobar_service = InfoBarService::FromWebContents(
508       browser()->tab_strip_model()->GetWebContentsAt(0));
509   EXPECT_EQ(0U, infobar_service->infobar_count());
510 }
511 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestDenyNotificationsFromAllSites)512 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyNotificationsFromAllSites) {
513   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
514 
515   // Verify that no domain can show notifications.
516   SetDefaultPermissionSetting(CONTENT_SETTING_BLOCK);
517   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
518 
519   std::string result = CreateSimpleNotification(browser(), false);
520   EXPECT_EQ("-1", result);
521 
522   ASSERT_EQ(0, GetNotificationCount());
523 }
524 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestDenyDomainAndAllowAll)525 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyDomainAndAllowAll) {
526   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
527 
528   // Verify that denying a domain and allowing all shouldn't show
529   // notifications from the denied domain.
530   DenyOrigin(GetTestPageURL().GetOrigin());
531   SetDefaultPermissionSetting(CONTENT_SETTING_ALLOW);
532 
533   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
534 
535   std::string result = CreateSimpleNotification(browser(), false);
536   EXPECT_EQ("-1", result);
537 
538   ASSERT_EQ(0, GetNotificationCount());
539 }
540 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestAllowDomainAndDenyAll)541 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestAllowDomainAndDenyAll) {
542   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
543 
544   // Verify that allowing a domain and denying all others should show
545   // notifications from the allowed domain.
546   AllowOrigin(GetTestPageURL().GetOrigin());
547   SetDefaultPermissionSetting(CONTENT_SETTING_BLOCK);
548 
549   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
550 
551   std::string result = CreateSimpleNotification(browser(), true);
552   EXPECT_NE("-1", result);
553 
554   ASSERT_EQ(1, GetNotificationCount());
555 }
556 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestDenyAndThenAllowDomain)557 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestDenyAndThenAllowDomain) {
558   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
559 
560   // Verify that denying and again allowing should show notifications.
561   DenyOrigin(GetTestPageURL().GetOrigin());
562 
563   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
564 
565   std::string result = CreateSimpleNotification(browser(), false);
566   EXPECT_EQ("-1", result);
567 
568   ASSERT_EQ(0, GetNotificationCount());
569 
570   AllowOrigin(GetTestPageURL().GetOrigin());
571   result = CreateSimpleNotification(browser(), true);
572   EXPECT_NE("-1", result);
573 
574   ASSERT_EQ(1, GetNotificationCount());
575   InfoBarService* infobar_service = InfoBarService::FromWebContents(
576       browser()->tab_strip_model()->GetWebContentsAt(0));
577   EXPECT_EQ(0U, infobar_service->infobar_count());
578 }
579 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestCreateDenyCloseNotifications)580 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCreateDenyCloseNotifications) {
581   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
582 
583   // Verify able to create, deny, and close the notification.
584   AllowAllOrigins();
585   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
586   CreateSimpleNotification(browser(), true);
587   ASSERT_EQ(1, GetNotificationCount());
588 
589   DenyOrigin(GetTestPageURL().GetOrigin());
590   ContentSettingsForOneType settings;
591   GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
592   ASSERT_TRUE(CheckOriginInSetting(settings, GetTestPageURL().GetOrigin()));
593 
594   EXPECT_EQ(1, GetNotificationCount());
595   message_center::NotificationList::Notifications notifications =
596       message_center::MessageCenter::Get()->GetVisibleNotifications();
597   message_center::MessageCenter::Get()->RemoveNotification(
598       (*notifications.rbegin())->id(),
599       true);  // by_user
600   ASSERT_EQ(0, GetNotificationCount());
601 }
602 
603 // Crashes on Linux/Win. See http://crbug.com/160657.
IN_PROC_BROWSER_TEST_F(NotificationsTest,DISABLED_TestOriginPrefsNotSavedInIncognito)604 IN_PROC_BROWSER_TEST_F(
605     NotificationsTest,
606     DISABLED_TestOriginPrefsNotSavedInIncognito) {
607   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
608 
609   // Verify that allow/deny origin preferences are not saved in incognito.
610   Browser* incognito = CreateIncognitoBrowser();
611   ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
612   ASSERT_TRUE(RequestPermissionAndWait(incognito));
613   PerformActionOnInfoBar(incognito, DENY, 0, 0);
614   CloseBrowserWindow(incognito);
615 
616   incognito = CreateIncognitoBrowser();
617   ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
618   ASSERT_TRUE(RequestPermissionAndWait(incognito));
619   PerformActionOnInfoBar(incognito, ALLOW, 0, 0);
620   CreateSimpleNotification(incognito, true);
621   ASSERT_EQ(1, GetNotificationCount());
622   CloseBrowserWindow(incognito);
623 
624   incognito = CreateIncognitoBrowser();
625   ui_test_utils::NavigateToURL(incognito, GetTestPageURL());
626   ASSERT_TRUE(RequestPermissionAndWait(incognito));
627 
628   ContentSettingsForOneType settings;
629   GetPrefsByContentSetting(CONTENT_SETTING_BLOCK, &settings);
630   EXPECT_EQ(0U, settings.size());
631   GetPrefsByContentSetting(CONTENT_SETTING_ALLOW, &settings);
632   EXPECT_EQ(0U, settings.size());
633 }
634 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestExitBrowserWithInfobar)635 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestExitBrowserWithInfobar) {
636   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
637 
638   // Exit the browser window, when the infobar appears.
639   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
640   ASSERT_TRUE(RequestPermissionAndWait(browser()));
641 }
642 
643 // Times out on Windows and Linux. http://crbug.com/168976
644 #if defined(OS_WIN) || defined(OS_LINUX)
645 #define MAYBE_TestCrashTabWithPermissionInfobar \
646     DISABLED_TestCrashTabWithPermissionInfobar
647 #else
648 #define MAYBE_TestCrashTabWithPermissionInfobar \
649     TestCrashTabWithPermissionInfobar
650 #endif
IN_PROC_BROWSER_TEST_F(NotificationsTest,MAYBE_TestCrashTabWithPermissionInfobar)651 IN_PROC_BROWSER_TEST_F(NotificationsTest,
652                        MAYBE_TestCrashTabWithPermissionInfobar) {
653   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
654 
655   // Test crashing the tab with permission infobar doesn't crash Chrome.
656   ui_test_utils::NavigateToURLWithDisposition(
657       browser(),
658       embedded_test_server()->GetURL("/empty.html"),
659       NEW_BACKGROUND_TAB,
660       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
661   browser()->tab_strip_model()->ActivateTabAt(0, true);
662   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
663   ASSERT_TRUE(RequestPermissionAndWait(browser()));
664   CrashTab(browser(), 0);
665 }
666 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestIncognitoNotification)667 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestIncognitoNotification) {
668   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
669 
670   // Test notifications in incognito window.
671   Browser* browser = CreateIncognitoBrowser();
672   ui_test_utils::NavigateToURL(browser, GetTestPageURL());
673   browser->tab_strip_model()->ActivateTabAt(0, true);
674   ASSERT_TRUE(RequestPermissionAndWait(browser));
675   PerformActionOnInfoBar(browser, ALLOW, 0, 0);
676   CreateSimpleNotification(browser, true);
677   ASSERT_EQ(1, GetNotificationCount());
678 }
679 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestCloseTabWithPermissionInfobar)680 IN_PROC_BROWSER_TEST_F(NotificationsTest, TestCloseTabWithPermissionInfobar) {
681   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
682 
683   // Test that user can close tab when infobar present.
684   ui_test_utils::NavigateToURLWithDisposition(
685       browser(),
686       GURL("about:blank"),
687       NEW_BACKGROUND_TAB,
688       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
689   browser()->tab_strip_model()->ActivateTabAt(0, true);
690   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
691   ASSERT_TRUE(RequestPermissionAndWait(browser()));
692   content::WebContentsDestroyedWatcher destroyed_watcher(
693       browser()->tab_strip_model()->GetWebContentsAt(0));
694   browser()->tab_strip_model()->CloseWebContentsAt(0,
695                                                    TabStripModel::CLOSE_NONE);
696   destroyed_watcher.Wait();
697 }
698 
IN_PROC_BROWSER_TEST_F(NotificationsTest,TestNavigateAwayWithPermissionInfobar)699 IN_PROC_BROWSER_TEST_F(
700     NotificationsTest,
701     TestNavigateAwayWithPermissionInfobar) {
702   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
703 
704   // Test navigating away when an infobar is present,
705   // then trying to create a notification from the same page.
706   ui_test_utils::NavigateToURLWithDisposition(
707       browser(),
708       GURL("about:blank"),
709       NEW_BACKGROUND_TAB,
710       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
711   browser()->tab_strip_model()->ActivateTabAt(0, true);
712   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
713   ASSERT_TRUE(RequestPermissionAndWait(browser()));
714   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
715   ASSERT_TRUE(RequestPermissionAndWait(browser()));
716   PerformActionOnInfoBar(browser(), ALLOW, 0, 0);
717   CreateSimpleNotification(browser(), true);
718   ASSERT_EQ(1, GetNotificationCount());
719 }
720 
721 // See crbug.com/248470
722 #if defined(OS_LINUX)
723 #define MAYBE_TestCrashRendererNotificationRemain \
724     DISABLED_TestCrashRendererNotificationRemain
725 #else
726 #define MAYBE_TestCrashRendererNotificationRemain \
727     TestCrashRendererNotificationRemain
728 #endif
729 
IN_PROC_BROWSER_TEST_F(NotificationsTest,MAYBE_TestCrashRendererNotificationRemain)730 IN_PROC_BROWSER_TEST_F(NotificationsTest,
731                        MAYBE_TestCrashRendererNotificationRemain) {
732   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
733 
734   // Test crashing renderer does not close or crash notification.
735   AllowAllOrigins();
736   ui_test_utils::NavigateToURLWithDisposition(
737       browser(),
738       GURL("about:blank"),
739       NEW_BACKGROUND_TAB,
740       ui_test_utils::BROWSER_TEST_WAIT_FOR_TAB);
741   browser()->tab_strip_model()->ActivateTabAt(0, true);
742   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
743   CreateSimpleNotification(browser(), true);
744   ASSERT_EQ(1, GetNotificationCount());
745   CrashTab(browser(), 0);
746   ASSERT_EQ(1, GetNotificationCount());
747 }
748 
749 // See http://crbug.com/366539
750 #if defined(OS_LINUX)
751 #define MAYBE_TestNotificationReplacement DISABLED_TestNotificationReplacement
752 #else
753 #define MAYBE_TestNotificationReplacement TestNotificationReplacement
754 #endif
755 
IN_PROC_BROWSER_TEST_F(NotificationsTest,MAYBE_TestNotificationReplacement)756 IN_PROC_BROWSER_TEST_F(NotificationsTest, MAYBE_TestNotificationReplacement) {
757   ASSERT_TRUE(embedded_test_server()->InitializeAndWaitUntilReady());
758 
759   // Test that we can replace a notification using the replaceId.
760   AllowAllOrigins();
761 
762   ui_test_utils::NavigateToURL(browser(), GetTestPageURL());
763 
764   std::string result = CreateNotification(
765       browser(), true, "abc.png", "Title1", "Body1", "chat");
766   EXPECT_NE("-1", result);
767 
768   ASSERT_EQ(1, GetNotificationCount());
769 
770   result = CreateNotification(
771       browser(), false, "no_such_file.png", "Title2", "Body2", "chat");
772   EXPECT_NE("-1", result);
773 
774   ASSERT_EQ(1, GetNotificationCount());
775   message_center::NotificationList::Notifications notifications =
776       message_center::MessageCenter::Get()->GetVisibleNotifications();
777   EXPECT_EQ(base::ASCIIToUTF16("Title2"), (*notifications.rbegin())->title());
778   EXPECT_EQ(base::ASCIIToUTF16("Body2"),
779             (*notifications.rbegin())->message());
780 }
781