status_tray_win_unittest.cc revision 5c02ac1a9c1b504631c0a3d2b6e737b5d738bae1
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 "chrome/browser/ui/views/status_icons/status_tray_win.h"
6
7#include <commctrl.h>
8
9#include "base/strings/string_util.h"
10#include "base/strings/utf_string_conversions.h"
11#include "chrome/browser/status_icons/status_icon_menu_model.h"
12#include "chrome/browser/status_icons/status_icon_observer.h"
13#include "chrome/browser/ui/views/status_icons/status_icon_win.h"
14#include "grit/chrome_unscaled_resources.h"
15#include "testing/gtest/include/gtest/gtest.h"
16#include "ui/base/resource/resource_bundle.h"
17#include "ui/gfx/image/image_skia.h"
18
19class FakeStatusTrayStateChangerProxy : public StatusTrayStateChangerProxy {
20 public:
21  FakeStatusTrayStateChangerProxy()
22      : enqueue_called_(false), icon_id_(0), window_(NULL) {}
23
24  virtual void EnqueueChange(UINT icon_id, HWND window) {
25    enqueue_called_ = true;
26    icon_id_ = icon_id;
27    window_ = window;
28  }
29
30  bool enqueue_called() { return enqueue_called_; }
31  UINT icon_id() { return icon_id_; }
32  HWND window() { return window_; }
33
34 private:
35  bool enqueue_called_;
36  UINT icon_id_;
37  HWND window_;
38
39  DISALLOW_COPY_AND_ASSIGN(FakeStatusTrayStateChangerProxy);
40};
41
42class FakeStatusIconObserver : public StatusIconObserver {
43 public:
44  FakeStatusIconObserver()
45      : balloon_clicked_(false),
46        status_icon_click_count_(0) {}
47  virtual void OnStatusIconClicked() {
48    ++status_icon_click_count_;
49  }
50  virtual void OnBalloonClicked() { balloon_clicked_ = true; }
51  bool balloon_clicked() const { return balloon_clicked_; }
52  size_t status_icon_click_count() const {
53    return status_icon_click_count_;
54  }
55
56 private:
57  size_t status_icon_click_count_;
58  bool balloon_clicked_;
59};
60
61TEST(StatusTrayWinTest, CreateTray) {
62  // Just tests creation/destruction.
63  StatusTrayWin tray;
64}
65
66TEST(StatusTrayWinTest, CreateIconAndMenu) {
67  // Create an icon, set the images, tooltip, and context menu, then shut it
68  // down.
69  StatusTrayWin tray;
70  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
71  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
72  StatusIcon* icon = tray.CreateStatusIcon(
73      StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip"));
74  icon->SetPressedImage(*image);
75  scoped_ptr<StatusIconMenuModel> menu(new StatusIconMenuModel(NULL));
76  menu->AddItem(0, L"foo");
77  icon->SetContextMenu(menu.Pass());
78}
79
80#if !defined(USE_AURA)  // http://crbug.com/156370
81TEST(StatusTrayWinTest, ClickOnIcon) {
82  // Create an icon, send a fake click event, make sure observer is called.
83  StatusTrayWin tray;
84  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
85  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
86
87  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
88      StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")));
89  FakeStatusIconObserver observer;
90  icon->AddObserver(&observer);
91  // Mimic a click.
92  tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_LBUTTONDOWN);
93  // Mimic a right-click - observer should not be called.
94  tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_RBUTTONDOWN);
95  EXPECT_EQ(1, observer.status_icon_click_count());
96  icon->RemoveObserver(&observer);
97}
98
99TEST(StatusTrayWinTest, ClickOnBalloon) {
100  // Create an icon, send a fake click event, make sure observer is called.
101  StatusTrayWin tray;
102  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
103  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
104
105  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
106      StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")));
107  FakeStatusIconObserver observer;
108  icon->AddObserver(&observer);
109  // Mimic a click.
110  tray.WndProc(
111      NULL, icon->message_id(), icon->icon_id(), TB_INDETERMINATE);
112  EXPECT_TRUE(observer.balloon_clicked());
113  icon->RemoveObserver(&observer);
114}
115
116TEST(StatusTrayWinTest, HandleOldIconId) {
117  StatusTrayWin tray;
118  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
119  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
120
121  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
122      StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")));
123  UINT message_id = icon->message_id();
124  UINT icon_id = icon->icon_id();
125
126  tray.RemoveStatusIcon(icon);
127  tray.WndProc(NULL, message_id, icon_id, WM_LBUTTONDOWN);
128}
129#endif  // !defined(USE_AURA)
130
131TEST(StatusTrayWinTest, EnsureVisibleTest) {
132  StatusTrayWin tray;
133  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
134  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
135
136  FakeStatusTrayStateChangerProxy* proxy =
137      new FakeStatusTrayStateChangerProxy();
138  tray.SetStatusTrayStateChangerProxyForTest(make_scoped_ptr(proxy));
139
140  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
141      StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")));
142
143  icon->ForceVisible();
144  EXPECT_TRUE(proxy->enqueue_called());
145  EXPECT_EQ(proxy->window(), icon->window());
146  EXPECT_EQ(proxy->icon_id(), icon->icon_id());
147}
148