• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 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 "ui/message_center/message_center_tray.h"
6 
7 #include "base/strings/utf_string_conversions.h"
8 #include "testing/gtest/include/gtest/gtest.h"
9 #include "ui/base/models/menu_model.h"
10 #include "ui/message_center/message_center.h"
11 #include "ui/message_center/notification.h"
12 #include "ui/message_center/notification_types.h"
13 
14 using base::ASCIIToUTF16;
15 
16 namespace message_center {
17 namespace {
18 
19 class MockDelegate : public MessageCenterTrayDelegate {
20  public:
MockDelegate()21   MockDelegate()
22       : show_popups_success_(true),
23         show_message_center_success_(true),
24         enable_context_menu_(true) {}
~MockDelegate()25   virtual ~MockDelegate() {}
OnMessageCenterTrayChanged()26   virtual void OnMessageCenterTrayChanged() OVERRIDE {}
ShowPopups()27   virtual bool ShowPopups() OVERRIDE {
28     return show_message_center_success_;
29   }
HidePopups()30   virtual void HidePopups() OVERRIDE {}
ShowMessageCenter()31   virtual bool ShowMessageCenter() OVERRIDE {
32     return show_popups_success_;
33   }
HideMessageCenter()34   virtual void HideMessageCenter() OVERRIDE {}
ShowNotifierSettings()35   virtual bool ShowNotifierSettings() OVERRIDE {
36     return true;
37   }
IsContextMenuEnabled() const38   virtual bool IsContextMenuEnabled() const OVERRIDE {
39     return enable_context_menu_;
40   }
41 
GetMessageCenterTray()42   virtual MessageCenterTray* GetMessageCenterTray() OVERRIDE {
43     return NULL;
44   }
45 
46   bool show_popups_success_;
47   bool show_message_center_success_;
48   bool enable_context_menu_;
49 
50  private:
51   DISALLOW_COPY_AND_ASSIGN(MockDelegate);
52 };
53 
54 }  // namespace
55 
56 class MessageCenterTrayTest : public testing::Test {
57  public:
MessageCenterTrayTest()58   MessageCenterTrayTest() {}
~MessageCenterTrayTest()59   virtual ~MessageCenterTrayTest() {}
60 
SetUp()61   virtual void SetUp() {
62     MessageCenter::Initialize();
63     delegate_.reset(new MockDelegate);
64     message_center_ = MessageCenter::Get();
65     message_center_tray_.reset(
66         new MessageCenterTray(delegate_.get(), message_center_));
67   }
68 
TearDown()69   virtual void TearDown() {
70     message_center_tray_.reset();
71     delegate_.reset();
72     message_center_ = NULL;
73     MessageCenter::Shutdown();
74   }
75 
76  protected:
DummyNotifierId()77   NotifierId DummyNotifierId() {
78     return NotifierId();
79   }
80 
AddNotification(const std::string & id)81   void AddNotification(const std::string& id) {
82     scoped_ptr<Notification> notification(
83         new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
84                          id,
85                          ASCIIToUTF16("Test Web Notification"),
86                          ASCIIToUTF16("Notification message body."),
87                          gfx::Image(),
88                          ASCIIToUTF16("www.test.org"),
89                          DummyNotifierId(),
90                          message_center::RichNotificationData(),
91                          NULL /* delegate */));
92     message_center_->AddNotification(notification.Pass());
93   }
94   scoped_ptr<MockDelegate> delegate_;
95   scoped_ptr<MessageCenterTray> message_center_tray_;
96   MessageCenter* message_center_;
97 
98  private:
99   DISALLOW_COPY_AND_ASSIGN(MessageCenterTrayTest);
100 };
101 
TEST_F(MessageCenterTrayTest,BasicMessageCenter)102 TEST_F(MessageCenterTrayTest, BasicMessageCenter) {
103   ASSERT_FALSE(message_center_tray_->popups_visible());
104   ASSERT_FALSE(message_center_tray_->message_center_visible());
105 
106   bool shown = message_center_tray_->ShowMessageCenterBubble();
107   EXPECT_TRUE(shown);
108 
109   ASSERT_FALSE(message_center_tray_->popups_visible());
110   ASSERT_TRUE(message_center_tray_->message_center_visible());
111 
112   message_center_tray_->HideMessageCenterBubble();
113 
114   ASSERT_FALSE(message_center_tray_->popups_visible());
115   ASSERT_FALSE(message_center_tray_->message_center_visible());
116 
117   message_center_tray_->ToggleMessageCenterBubble();
118 
119   ASSERT_FALSE(message_center_tray_->popups_visible());
120   ASSERT_TRUE(message_center_tray_->message_center_visible());
121 
122   message_center_tray_->ToggleMessageCenterBubble();
123 
124   ASSERT_FALSE(message_center_tray_->popups_visible());
125   ASSERT_FALSE(message_center_tray_->message_center_visible());
126 }
127 
TEST_F(MessageCenterTrayTest,BasicPopup)128 TEST_F(MessageCenterTrayTest, BasicPopup) {
129   ASSERT_FALSE(message_center_tray_->popups_visible());
130   ASSERT_FALSE(message_center_tray_->message_center_visible());
131 
132   message_center_tray_->ShowPopupBubble();
133 
134   ASSERT_FALSE(message_center_tray_->popups_visible());
135   ASSERT_FALSE(message_center_tray_->message_center_visible());
136 
137   AddNotification("BasicPopup");
138 
139   ASSERT_TRUE(message_center_tray_->popups_visible());
140   ASSERT_FALSE(message_center_tray_->message_center_visible());
141 
142   message_center_tray_->HidePopupBubble();
143 
144   ASSERT_FALSE(message_center_tray_->popups_visible());
145   ASSERT_FALSE(message_center_tray_->message_center_visible());
146 }
147 
TEST_F(MessageCenterTrayTest,MessageCenterClosesPopups)148 TEST_F(MessageCenterTrayTest, MessageCenterClosesPopups) {
149   ASSERT_FALSE(message_center_tray_->popups_visible());
150   ASSERT_FALSE(message_center_tray_->message_center_visible());
151 
152   AddNotification("MessageCenterClosesPopups");
153 
154   ASSERT_TRUE(message_center_tray_->popups_visible());
155   ASSERT_FALSE(message_center_tray_->message_center_visible());
156 
157   bool shown = message_center_tray_->ShowMessageCenterBubble();
158   EXPECT_TRUE(shown);
159 
160   ASSERT_FALSE(message_center_tray_->popups_visible());
161   ASSERT_TRUE(message_center_tray_->message_center_visible());
162 
163   // The notification is queued if it's added when message center is visible.
164   AddNotification("MessageCenterClosesPopups2");
165 
166   message_center_tray_->ShowPopupBubble();
167 
168   ASSERT_FALSE(message_center_tray_->popups_visible());
169   ASSERT_TRUE(message_center_tray_->message_center_visible());
170 
171   message_center_tray_->HideMessageCenterBubble();
172 
173   // The queued notification appears as a popup.
174   ASSERT_TRUE(message_center_tray_->popups_visible());
175   ASSERT_FALSE(message_center_tray_->message_center_visible());
176 
177   message_center_tray_->ShowMessageCenterBubble();
178   message_center_tray_->HideMessageCenterBubble();
179   ASSERT_FALSE(message_center_tray_->popups_visible());
180   ASSERT_FALSE(message_center_tray_->message_center_visible());
181 }
182 
TEST_F(MessageCenterTrayTest,MessageCenterReopenPopupsForSystemPriority)183 TEST_F(MessageCenterTrayTest, MessageCenterReopenPopupsForSystemPriority) {
184   ASSERT_FALSE(message_center_tray_->popups_visible());
185   ASSERT_FALSE(message_center_tray_->message_center_visible());
186 
187   scoped_ptr<Notification> notification(
188       new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
189                        "MessageCenterReopnPopupsForSystemPriority",
190                        ASCIIToUTF16("Test Web Notification"),
191                        ASCIIToUTF16("Notification message body."),
192                        gfx::Image(),
193                        ASCIIToUTF16("www.test.org"),
194                        DummyNotifierId(),
195                        message_center::RichNotificationData(),
196                        NULL /* delegate */));
197   notification->SetSystemPriority();
198   message_center_->AddNotification(notification.Pass());
199 
200   ASSERT_TRUE(message_center_tray_->popups_visible());
201   ASSERT_FALSE(message_center_tray_->message_center_visible());
202 
203   bool shown = message_center_tray_->ShowMessageCenterBubble();
204   EXPECT_TRUE(shown);
205 
206   ASSERT_FALSE(message_center_tray_->popups_visible());
207   ASSERT_TRUE(message_center_tray_->message_center_visible());
208 
209   message_center_tray_->HideMessageCenterBubble();
210 
211   ASSERT_TRUE(message_center_tray_->popups_visible());
212   ASSERT_FALSE(message_center_tray_->message_center_visible());
213 }
214 
TEST_F(MessageCenterTrayTest,ShowBubbleFails)215 TEST_F(MessageCenterTrayTest, ShowBubbleFails) {
216   // Now the delegate will signal that it was unable to show a bubble.
217   delegate_->show_popups_success_ = false;
218   delegate_->show_message_center_success_ = false;
219 
220   ASSERT_FALSE(message_center_tray_->popups_visible());
221   ASSERT_FALSE(message_center_tray_->message_center_visible());
222 
223   AddNotification("ShowBubbleFails");
224 
225   message_center_tray_->ShowPopupBubble();
226 
227   ASSERT_FALSE(message_center_tray_->popups_visible());
228   ASSERT_FALSE(message_center_tray_->message_center_visible());
229 
230   bool shown = message_center_tray_->ShowMessageCenterBubble();
231   EXPECT_FALSE(shown);
232 
233   ASSERT_FALSE(message_center_tray_->popups_visible());
234   ASSERT_FALSE(message_center_tray_->message_center_visible());
235 
236   message_center_tray_->HideMessageCenterBubble();
237 
238   ASSERT_FALSE(message_center_tray_->popups_visible());
239   ASSERT_FALSE(message_center_tray_->message_center_visible());
240 
241   message_center_tray_->ToggleMessageCenterBubble();
242 
243   ASSERT_FALSE(message_center_tray_->popups_visible());
244   ASSERT_FALSE(message_center_tray_->message_center_visible());
245 
246   message_center_tray_->HidePopupBubble();
247 
248   ASSERT_FALSE(message_center_tray_->popups_visible());
249   ASSERT_FALSE(message_center_tray_->message_center_visible());
250 }
251 
TEST_F(MessageCenterTrayTest,ContextMenuTest)252 TEST_F(MessageCenterTrayTest, ContextMenuTest) {
253   const std::string id1 = "id1";
254   const std::string id2 = "id2";
255   const std::string id3 = "id3";
256   AddNotification(id1);
257 
258   base::string16 display_source = ASCIIToUTF16("www.test.org");
259   NotifierId notifier_id = DummyNotifierId();
260 
261   NotifierId notifier_id2(NotifierId::APPLICATION, "sample-app");
262   scoped_ptr<Notification> notification(
263       new Notification(message_center::NOTIFICATION_TYPE_SIMPLE,
264                        id2,
265                        ASCIIToUTF16("Test Web Notification"),
266                        ASCIIToUTF16("Notification message body."),
267                        gfx::Image(),
268                        base::string16() /* empty display source */,
269                        notifier_id2,
270                        message_center::RichNotificationData(),
271                        NULL /* delegate */));
272   message_center_->AddNotification(notification.Pass());
273 
274   AddNotification(id3);
275 
276   scoped_ptr<ui::MenuModel> model(
277       message_center_tray_->CreateNotificationMenuModel(
278           notifier_id, display_source));
279   EXPECT_EQ(2, model->GetItemCount());
280   const int second_command = model->GetCommandIdAt(1);
281 
282   // The second item is to open the settings.
283   EXPECT_TRUE(model->IsEnabledAt(0));
284   EXPECT_TRUE(model->IsEnabledAt(1));
285   model->ActivatedAt(1);
286   EXPECT_TRUE(message_center_tray_->message_center_visible());
287 
288   message_center_tray_->HideMessageCenterBubble();
289 
290   // The first item is to disable notifications from the notifier id. It also
291   // removes all notifications from the same notifier, i.e. id1 and id3.
292   model->ActivatedAt(0);
293   NotificationList::Notifications notifications =
294       message_center_->GetVisibleNotifications();
295   EXPECT_EQ(1u, notifications.size());
296   EXPECT_EQ(id2, (*notifications.begin())->id());
297 
298   // Disables the context menu.
299   delegate_->enable_context_menu_ = false;
300 
301   // id2 doesn't have the display source, so it don't have the menu item for
302   // disabling notifications.
303   model = message_center_tray_->CreateNotificationMenuModel(
304       notifier_id2, base::string16());
305   EXPECT_EQ(1, model->GetItemCount());
306   EXPECT_EQ(second_command, model->GetCommandIdAt(0));
307 
308   // The command itself is disabled because delegate disables context menu.
309   EXPECT_FALSE(model->IsEnabledAt(0));
310 }
311 
312 }  // namespace message_center
313