web_notification_tray_browsertest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
1// Copyright 2013 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 "chrome/browser/ui/views/message_center/web_notification_tray.h" 6 7#include <set> 8 9#include "ash/root_window_controller.h" 10#include "ash/system/status_area_widget.h" 11#include "ash/system/tray/system_tray_item.h" 12#include "base/strings/stringprintf.h" 13#include "base/strings/utf_string_conversions.h" 14#include "chrome/browser/browser_process.h" 15#include "chrome/browser/notifications/message_center_notification_manager.h" 16#include "chrome/browser/notifications/notification.h" 17#include "chrome/browser/notifications/notification_delegate.h" 18#include "chrome/browser/notifications/notification_ui_manager.h" 19#include "chrome/browser/ui/browser.h" 20#include "chrome/test/base/in_process_browser_test.h" 21#include "content/public/test/test_utils.h" 22#include "ui/message_center/message_center_style.h" 23#include "ui/message_center/message_center_tray.h" 24#include "ui/message_center/notification_list.h" 25#include "ui/message_center/notification_types.h" 26#include "ui/message_center/views/message_center_bubble.h" 27#include "ui/message_center/views/message_popup_collection.h" 28#include "ui/views/controls/label.h" 29#include "ui/views/layout/fill_layout.h" 30#include "ui/views/view.h" 31#include "ui/views/widget/widget.h" 32 33namespace message_center { 34 35namespace { 36 37class WebNotificationTrayTest : public InProcessBrowserTest { 38 public: 39 WebNotificationTrayTest() {} 40 virtual ~WebNotificationTrayTest() {} 41 42 virtual void CleanUpOnMainThread() OVERRIDE { 43 message_center::MessageCenter::Get()->RemoveAllNotifications(false); 44 } 45 46 protected: 47 class TestNotificationDelegate : public ::NotificationDelegate { 48 public: 49 explicit TestNotificationDelegate(std::string id) : id_(id) {} 50 virtual void Display() OVERRIDE {} 51 virtual void Error() OVERRIDE {} 52 virtual void Close(bool by_user) OVERRIDE {} 53 virtual void Click() OVERRIDE {} 54 virtual std::string id() const OVERRIDE { return id_; } 55 virtual content::RenderViewHost* GetRenderViewHost() const OVERRIDE { 56 return NULL; 57 } 58 59 private: 60 virtual ~TestNotificationDelegate() {} 61 62 std::string id_; 63 }; 64 65 void AddNotification(const std::string& id, const std::string& replace_id) { 66 ::Notification notification(GURL("chrome-extension://abbccedd"), 67 GURL(), 68 base::ASCIIToUTF16("Test Web Notification"), 69 base::ASCIIToUTF16( 70 "Notification message body."), 71 blink::WebTextDirectionDefault, 72 base::string16(), 73 base::ASCIIToUTF16(replace_id), 74 new TestNotificationDelegate(id)); 75 76 g_browser_process->notification_ui_manager()->Add( 77 notification, browser()->profile()); 78 } 79 80 void UpdateNotification(const std::string& replace_id, 81 const std::string& new_id) { 82 ::Notification notification(GURL("chrome-extension://abbccedd"), 83 GURL(""), 84 base::ASCIIToUTF16("Updated Web Notification"), 85 base::ASCIIToUTF16("Updated message body."), 86 blink::WebTextDirectionDefault, 87 base::string16(), 88 base::ASCIIToUTF16(replace_id), 89 new TestNotificationDelegate(new_id)); 90 91 g_browser_process->notification_ui_manager()->Add( 92 notification, browser()->profile()); 93 } 94 95 void RemoveNotification(const std::string& id) { 96 g_browser_process->notification_ui_manager()->CancelById(id); 97 } 98 99 private: 100 DISALLOW_COPY_AND_ASSIGN(WebNotificationTrayTest); 101}; 102 103} // namespace 104 105 106// TODO(dewittj): More exhaustive testing. 107IN_PROC_BROWSER_TEST_F(WebNotificationTrayTest, WebNotifications) { 108 message_center::MessageCenter* message_center = 109 message_center::MessageCenter::Get(); 110 111 // Add a notification. 112 AddNotification("test_id1", "replace_id1"); 113 EXPECT_EQ(1u, message_center->NotificationCount()); 114 EXPECT_TRUE(message_center->HasNotification("test_id1")); 115 EXPECT_FALSE(message_center->HasNotification("test_id2")); 116 AddNotification("test_id2", "replace_id2"); 117 AddNotification("test_id2", "replace_id2"); 118 EXPECT_EQ(2u, message_center->NotificationCount()); 119 EXPECT_TRUE(message_center->HasNotification("test_id2")); 120 121 // Ensure that updating a notification does not affect the count. 122 UpdateNotification("replace_id2", "test_id3"); 123 UpdateNotification("replace_id2", "test_id3"); 124 EXPECT_EQ(2u, message_center->NotificationCount()); 125 EXPECT_FALSE(message_center->HasNotification("test_id2")); 126 127 // Ensure that Removing the first notification removes it from the tray. 128 RemoveNotification("test_id1"); 129 EXPECT_FALSE(message_center->HasNotification("test_id1")); 130 EXPECT_EQ(1u, message_center->NotificationCount()); 131 132 // Remove the remaining notification. 133 RemoveNotification("test_id3"); 134 EXPECT_EQ(0u, message_center->NotificationCount()); 135 EXPECT_FALSE(message_center->HasNotification("test_id3")); 136} 137 138IN_PROC_BROWSER_TEST_F(WebNotificationTrayTest, WebNotificationPopupBubble) { 139 scoped_ptr<WebNotificationTray> tray(new WebNotificationTray()); 140 tray->message_center(); 141 142 // Adding a notification should show the popup bubble. 143 AddNotification("test_id1", "replace_id1"); 144 EXPECT_TRUE(tray->message_center_tray_->popups_visible()); 145 146 // Updating a notification should not hide the popup bubble. 147 AddNotification("test_id2", "replace_id2"); 148 UpdateNotification("replace_id2", "test_id3"); 149 EXPECT_TRUE(tray->message_center_tray_->popups_visible()); 150 151 // Removing the first notification should not hide the popup bubble. 152 RemoveNotification("test_id1"); 153 EXPECT_TRUE(tray->message_center_tray_->popups_visible()); 154 155 // Removing the visible notification should hide the popup bubble. 156 RemoveNotification("test_id3"); 157 EXPECT_FALSE(tray->message_center_tray_->popups_visible()); 158} 159 160using message_center::NotificationList; 161 162// Flaky, see http://crbug.com/222500 . 163IN_PROC_BROWSER_TEST_F(WebNotificationTrayTest, 164 DISABLED_ManyMessageCenterNotifications) { 165 scoped_ptr<WebNotificationTray> tray(new WebNotificationTray()); 166 message_center::MessageCenter* message_center = tray->message_center(); 167 168 // Add the max visible notifications +1, ensure the correct visible number. 169 size_t notifications_to_add = kMaxVisibleMessageCenterNotifications + 1; 170 for (size_t i = 0; i < notifications_to_add; ++i) { 171 std::string id = base::StringPrintf("test_id%d", static_cast<int>(i)); 172 std::string replace_id = 173 base::StringPrintf("replace_id%d", static_cast<int>(i)); 174 AddNotification(id, replace_id); 175 } 176 bool shown = tray->message_center_tray_->ShowMessageCenterBubble(); 177 EXPECT_TRUE(shown); 178 content::RunAllPendingInMessageLoop(); 179 EXPECT_TRUE(tray->message_center_delegate_ != NULL); 180 EXPECT_EQ(notifications_to_add, message_center->NotificationCount()); 181 EXPECT_EQ(kMaxVisibleMessageCenterNotifications, 182 tray->message_center_delegate_->NumMessageViewsForTest()); 183} 184 185IN_PROC_BROWSER_TEST_F(WebNotificationTrayTest, ManyPopupNotifications) { 186 scoped_ptr<WebNotificationTray> tray(new WebNotificationTray()); 187 message_center::MessageCenter* message_center = tray->message_center(); 188 189 // Add the max visible popup notifications +1, ensure the correct num visible. 190 size_t notifications_to_add = kMaxVisiblePopupNotifications + 1; 191 for (size_t i = 0; i < notifications_to_add; ++i) { 192 std::string id = base::StringPrintf("test_id%d", static_cast<int>(i)); 193 std::string replace_id = 194 base::StringPrintf("replace_id%d", static_cast<int>(i)); 195 AddNotification(id, replace_id); 196 } 197 // Hide and reshow the bubble so that it is updated immediately, not delayed. 198 tray->message_center_tray_->HidePopupBubble(); 199 tray->message_center_tray_->ShowPopupBubble(); 200 EXPECT_TRUE(tray->message_center_tray_->popups_visible()); 201 EXPECT_EQ(notifications_to_add, message_center->NotificationCount()); 202 NotificationList::PopupNotifications popups = 203 message_center->GetPopupNotifications(); 204 EXPECT_EQ(kMaxVisiblePopupNotifications, popups.size()); 205} 206 207IN_PROC_BROWSER_TEST_F(WebNotificationTrayTest, 208 ManuallyCloseMessageCenter) { 209 NotificationUIManager* manager = g_browser_process->notification_ui_manager(); 210 ASSERT_TRUE(manager->DelegatesToMessageCenter()); 211 MessageCenterNotificationManager* mc_manager = 212 static_cast<MessageCenterNotificationManager*>(manager); 213 214 WebNotificationTray* tray = 215 static_cast<WebNotificationTray*>(mc_manager->tray_.get()); 216 ASSERT_TRUE(NULL != tray); 217 218 message_center::MessageCenter* message_center = tray->message_center(); 219 220 bool shown = tray->message_center_tray_->ShowMessageCenterBubble(); 221 EXPECT_TRUE(shown); 222 EXPECT_TRUE(message_center->IsMessageCenterVisible()); 223 224 mc_manager->EnsureMessageCenterClosed(); 225 226 EXPECT_FALSE(message_center->IsMessageCenterVisible()); 227 if (NULL != tray->message_center_delegate_) 228 EXPECT_TRUE(tray->message_center_delegate_->GetWidget()->IsClosed()); 229} 230 231} // namespace message_center 232