status_tray_win_unittest.cc revision a36e5920737c6adbddd3e43b760e5de8431db6e0
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/status_icons/status_tray_win.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
7eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include <commctrl.h>
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/string_util.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/status_icons/status_icon_observer.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/status_icons/status_icon_win.h"
132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "grit/chrome_unscaled_resources.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/models/simple_menu_model.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h"
17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "ui/gfx/image/image_skia.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochclass FakeStatusIconObserver : public StatusIconObserver {
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FakeStatusIconObserver()
22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      : balloon_clicked_(false),
23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch        status_icon_click_count_(0) {}
24eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnStatusIconClicked() {
25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    ++status_icon_click_count_;
26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual void OnBalloonClicked() { balloon_clicked_ = true; }
28eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool balloon_clicked() const { return balloon_clicked_; }
29eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t status_icon_click_count() const {
30eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    return status_icon_click_count_;
31eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  }
32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
33eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
34eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t status_icon_click_count_;
35eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  bool balloon_clicked_;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StatusTrayWinTest, CreateTray) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Just tests creation/destruction.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusTrayWin tray;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StatusTrayWinTest, CreateIconAndMenu) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an icon, set the images, tooltip, and context menu, then shut it
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // down.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusTrayWin tray;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  StatusIcon* icon = tray.CreateStatusIcon(
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      StatusTray::OTHER_ICON, *image, ASCIIToUTF16("tool tip"));
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon->SetPressedImage(*image);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ui::SimpleMenuModel* menu = new ui::SimpleMenuModel(NULL);
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  menu->AddItem(0, L"foo");
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon->SetContextMenu(menu);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(USE_AURA)  // http://crbug.com/156370
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(StatusTrayWinTest, ClickOnIcon) {
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create an icon, send a fake click event, make sure observer is called.
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StatusTrayWin tray;
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      StatusTray::OTHER_ICON, *image, ASCIIToUTF16("tool tip")));
66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FakeStatusIconObserver observer;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon->AddObserver(&observer);
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mimic a click.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_LBUTTONDOWN);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Mimic a right-click - observer should not be called.
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_RBUTTONDOWN);
72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_EQ(1, observer.status_icon_click_count());
73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  icon->RemoveObserver(&observer);
74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch}
75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen MurdochTEST(StatusTrayWinTest, ClickOnBalloon) {
77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Create an icon, send a fake click event, make sure observer is called.
78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  StatusTrayWin tray;
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON);
81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
82a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon(
83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      StatusTray::OTHER_ICON, *image, ASCIIToUTF16("tool tip")));
84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  FakeStatusIconObserver observer;
85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  icon->AddObserver(&observer);
86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Mimic a click.
87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  tray.WndProc(
88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch      NULL, icon->message_id(), icon->icon_id(), TB_INDETERMINATE);
89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  EXPECT_TRUE(observer.balloon_clicked());
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  icon->RemoveObserver(&observer);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // !defined(USE_AURA)
93