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