Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / views / status_icons / status_tray_win_unittest.cc
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
19 class 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
42 class 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
61 TEST(StatusTrayWinTest, CreateTray) {
62   // Just tests creation/destruction.
63   StatusTrayWin tray;
64 }
65
66 TEST(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
81 TEST(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
99 TEST(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
116 TEST(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
131 TEST(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(
139       scoped_ptr<StatusTrayStateChangerProxy>(proxy));
140
141   StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
142       StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")));
143
144   icon->ForceVisible();
145   // |proxy| is owned by |tray|, and |tray| lives to the end of the scope,
146   // so calling methods on |proxy| is safe.
147   EXPECT_TRUE(proxy->enqueue_called());
148   EXPECT_EQ(proxy->window(), icon->window());
149   EXPECT_EQ(proxy->icon_id(), icon->icon_id());
150 }