| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/status_icons/status_tray_win.h" | 5 #include "chrome/browser/ui/views/status_icons/status_tray_win.h" |
| 6 | 6 |
| 7 #include <commctrl.h> | 7 #include <commctrl.h> |
| 8 | 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" | 9 #include "chrome/browser/status_icons/status_icon_menu_model.h" |
| 12 #include "chrome/browser/status_icons/status_icon_observer.h" | 10 #include "chrome/browser/status_icons/status_icon_observer.h" |
| 13 #include "chrome/browser/ui/views/status_icons/status_icon_win.h" | 11 #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" | 12 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "ui/base/resource/resource_bundle.h" | |
| 17 #include "ui/gfx/image/image_skia.h" | 13 #include "ui/gfx/image/image_skia.h" |
| 14 #include "ui/gfx/image/image_unittest_util.h" |
| 15 |
| 16 namespace { |
| 18 | 17 |
| 19 class FakeStatusTrayStateChangerProxy : public StatusTrayStateChangerProxy { | 18 class FakeStatusTrayStateChangerProxy : public StatusTrayStateChangerProxy { |
| 20 public: | 19 public: |
| 21 FakeStatusTrayStateChangerProxy() | 20 FakeStatusTrayStateChangerProxy() |
| 22 : enqueue_called_(false), icon_id_(0), window_(NULL) {} | 21 : enqueue_called_(false), icon_id_(0), window_(NULL) {} |
| 23 | 22 |
| 24 void EnqueueChange(UINT icon_id, HWND window) override { | 23 void EnqueueChange(UINT icon_id, HWND window) override { |
| 25 enqueue_called_ = true; | 24 enqueue_called_ = true; |
| 26 icon_id_ = icon_id; | 25 icon_id_ = icon_id; |
| 27 window_ = window; | 26 window_ = window; |
| (...skipping 20 matching lines...) Expand all Loading... |
| 48 bool balloon_clicked() const { return balloon_clicked_; } | 47 bool balloon_clicked() const { return balloon_clicked_; } |
| 49 size_t status_icon_click_count() const { | 48 size_t status_icon_click_count() const { |
| 50 return status_icon_click_count_; | 49 return status_icon_click_count_; |
| 51 } | 50 } |
| 52 | 51 |
| 53 private: | 52 private: |
| 54 size_t status_icon_click_count_; | 53 size_t status_icon_click_count_; |
| 55 bool balloon_clicked_; | 54 bool balloon_clicked_; |
| 56 }; | 55 }; |
| 57 | 56 |
| 57 StatusIconWin* CreateStatusIcon(StatusTray* tray) { |
| 58 return static_cast<StatusIconWin*>(tray->CreateStatusIcon( |
| 59 StatusTray::OTHER_ICON, gfx::test::CreateImageSkia(16, 16), |
| 60 base::string16())); |
| 61 } |
| 62 |
| 63 } // namespace |
| 64 |
| 58 TEST(StatusTrayWinTest, CreateTray) { | 65 TEST(StatusTrayWinTest, CreateTray) { |
| 59 // Just tests creation/destruction. | 66 // Just tests creation/destruction. |
| 60 StatusTrayWin tray; | 67 StatusTrayWin tray; |
| 61 } | 68 } |
| 62 | 69 |
| 63 TEST(StatusTrayWinTest, CreateIconAndMenu) { | 70 TEST(StatusTrayWinTest, CreateIconAndMenu) { |
| 64 // Create an icon, set the images, tooltip, and context menu, then shut it | 71 // Create an icon, set the images, tooltip, and context menu, then shut it |
| 65 // down. | 72 // down. |
| 66 StatusTrayWin tray; | 73 StatusTrayWin tray; |
| 67 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 74 StatusIcon* icon = CreateStatusIcon(&tray); |
| 68 gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); | |
| 69 StatusIcon* icon = tray.CreateStatusIcon( | |
| 70 StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip")); | |
| 71 scoped_ptr<StatusIconMenuModel> menu(new StatusIconMenuModel(NULL)); | 75 scoped_ptr<StatusIconMenuModel> menu(new StatusIconMenuModel(NULL)); |
| 72 menu->AddItem(0, L"foo"); | 76 menu->AddItem(0, L"foo"); |
| 73 icon->SetContextMenu(menu.Pass()); | 77 icon->SetContextMenu(menu.Pass()); |
| 74 } | 78 } |
| 75 | 79 |
| 76 #if !defined(USE_AURA) // http://crbug.com/156370 | 80 #if !defined(USE_AURA) // http://crbug.com/156370 |
| 77 TEST(StatusTrayWinTest, ClickOnIcon) { | 81 TEST(StatusTrayWinTest, ClickOnIcon) { |
| 78 // Create an icon, send a fake click event, make sure observer is called. | 82 // Create an icon, send a fake click event, make sure observer is called. |
| 79 StatusTrayWin tray; | 83 StatusTrayWin tray; |
| 80 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 81 gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); | |
| 82 | 84 |
| 83 StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon( | 85 StatusIconWin* icon = CreateStatusIcon(&tray); |
| 84 StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip"))); | |
| 85 FakeStatusIconObserver observer; | 86 FakeStatusIconObserver observer; |
| 86 icon->AddObserver(&observer); | 87 icon->AddObserver(&observer); |
| 87 // Mimic a click. | 88 // Mimic a click. |
| 88 tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_LBUTTONDOWN); | 89 tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_LBUTTONDOWN); |
| 89 // Mimic a right-click - observer should not be called. | 90 // Mimic a right-click - observer should not be called. |
| 90 tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_RBUTTONDOWN); | 91 tray.WndProc(NULL, icon->message_id(), icon->icon_id(), WM_RBUTTONDOWN); |
| 91 EXPECT_EQ(1, observer.status_icon_click_count()); | 92 EXPECT_EQ(1, observer.status_icon_click_count()); |
| 92 icon->RemoveObserver(&observer); | 93 icon->RemoveObserver(&observer); |
| 93 } | 94 } |
| 94 | 95 |
| 95 TEST(StatusTrayWinTest, ClickOnBalloon) { | 96 TEST(StatusTrayWinTest, ClickOnBalloon) { |
| 96 // Create an icon, send a fake click event, make sure observer is called. | 97 // Create an icon, send a fake click event, make sure observer is called. |
| 97 StatusTrayWin tray; | 98 StatusTrayWin tray; |
| 98 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 99 StatusIconWin* icon = CreateStatusIcon(&tray); |
| 99 gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); | |
| 100 | |
| 101 StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon( | |
| 102 StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip"))); | |
| 103 FakeStatusIconObserver observer; | 100 FakeStatusIconObserver observer; |
| 104 icon->AddObserver(&observer); | 101 icon->AddObserver(&observer); |
| 105 // Mimic a click. | 102 // Mimic a click. |
| 106 tray.WndProc( | 103 tray.WndProc( |
| 107 NULL, icon->message_id(), icon->icon_id(), TB_INDETERMINATE); | 104 NULL, icon->message_id(), icon->icon_id(), TB_INDETERMINATE); |
| 108 EXPECT_TRUE(observer.balloon_clicked()); | 105 EXPECT_TRUE(observer.balloon_clicked()); |
| 109 icon->RemoveObserver(&observer); | 106 icon->RemoveObserver(&observer); |
| 110 } | 107 } |
| 111 | 108 |
| 112 TEST(StatusTrayWinTest, HandleOldIconId) { | 109 TEST(StatusTrayWinTest, HandleOldIconId) { |
| 113 StatusTrayWin tray; | 110 StatusTrayWin tray; |
| 114 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | 111 StatusIconWin* icon = CreateStatusIcon(&tray); |
| 115 gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); | |
| 116 | |
| 117 StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon( | |
| 118 StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip"))); | |
| 119 UINT message_id = icon->message_id(); | 112 UINT message_id = icon->message_id(); |
| 120 UINT icon_id = icon->icon_id(); | 113 UINT icon_id = icon->icon_id(); |
| 121 | 114 |
| 122 tray.RemoveStatusIcon(icon); | 115 tray.RemoveStatusIcon(icon); |
| 123 tray.WndProc(NULL, message_id, icon_id, WM_LBUTTONDOWN); | 116 tray.WndProc(NULL, message_id, icon_id, WM_LBUTTONDOWN); |
| 124 } | 117 } |
| 125 #endif // !defined(USE_AURA) | 118 #endif // !defined(USE_AURA) |
| 126 | 119 |
| 127 TEST(StatusTrayWinTest, EnsureVisibleTest) { | 120 TEST(StatusTrayWinTest, EnsureVisibleTest) { |
| 128 StatusTrayWin tray; | 121 StatusTrayWin tray; |
| 129 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); | |
| 130 gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); | |
| 131 | 122 |
| 132 FakeStatusTrayStateChangerProxy* proxy = | 123 FakeStatusTrayStateChangerProxy* proxy = |
| 133 new FakeStatusTrayStateChangerProxy(); | 124 new FakeStatusTrayStateChangerProxy(); |
| 134 tray.SetStatusTrayStateChangerProxyForTest( | 125 tray.SetStatusTrayStateChangerProxyForTest( |
| 135 scoped_ptr<StatusTrayStateChangerProxy>(proxy)); | 126 scoped_ptr<StatusTrayStateChangerProxy>(proxy)); |
| 136 | 127 |
| 137 StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon( | 128 StatusIconWin* icon = CreateStatusIcon(&tray); |
| 138 StatusTray::OTHER_ICON, *image, base::ASCIIToUTF16("tool tip"))); | |
| 139 | 129 |
| 140 icon->ForceVisible(); | 130 icon->ForceVisible(); |
| 141 // |proxy| is owned by |tray|, and |tray| lives to the end of the scope, | 131 // |proxy| is owned by |tray|, and |tray| lives to the end of the scope, |
| 142 // so calling methods on |proxy| is safe. | 132 // so calling methods on |proxy| is safe. |
| 143 EXPECT_TRUE(proxy->enqueue_called()); | 133 EXPECT_TRUE(proxy->enqueue_called()); |
| 144 EXPECT_EQ(proxy->window(), icon->window()); | 134 EXPECT_EQ(proxy->window(), icon->window()); |
| 145 EXPECT_EQ(proxy->icon_id(), icon->icon_id()); | 135 EXPECT_EQ(proxy->icon_id(), icon->icon_id()); |
| 146 } | 136 } |
| OLD | NEW |