diff options
15 files changed, 73 insertions, 35 deletions
diff --git a/chrome/browser/background/background_mode_manager.cc b/chrome/browser/background/background_mode_manager.cc index 6bbc13b..b925aba 100644 --- a/chrome/browser/background/background_mode_manager.cc +++ b/chrome/browser/background/background_mode_manager.cc @@ -665,7 +665,8 @@ void BackgroundModeManager::CreateStatusTrayIcon() { if (!status_tray_ || status_icon_) return; - status_icon_ = status_tray_->CreateStatusIcon(); + status_icon_ = + status_tray_->CreateStatusIcon(StatusTray::BACKGROUND_MODE_ICON); if (!status_icon_) return; diff --git a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc index f708074..4297abe 100644 --- a/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc +++ b/chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc @@ -167,7 +167,8 @@ void SystemIndicatorManager::CreateOrUpdateIndicator( return; } - StatusIcon* indicator_icon = status_tray_->CreateStatusIcon(); + StatusIcon* indicator_icon = + status_tray_->CreateStatusIcon(StatusTray::OTHER_ICON); if (indicator_icon != NULL) { ExtensionIndicatorIcon* status_icon = new ExtensionIndicatorIcon( extension, diff --git a/chrome/browser/media/media_stream_capture_indicator.cc b/chrome/browser/media/media_stream_capture_indicator.cc index 24fcd45..456fc9d 100644 --- a/chrome/browser/media/media_stream_capture_indicator.cc +++ b/chrome/browser/media/media_stream_capture_indicator.cc @@ -379,7 +379,8 @@ void MediaStreamCaptureIndicator::MaybeCreateStatusTrayIcon() { if (!status_tray) return; - status_icon_ = status_tray->CreateStatusIcon(); + status_icon_ = + status_tray->CreateStatusIcon(StatusTray::MEDIA_STREAM_CAPTURE_ICON); EnsureStatusTrayIconResources(); } diff --git a/chrome/browser/status_icons/status_tray.cc b/chrome/browser/status_icons/status_tray.cc index 3d99ad5..aaa7a57 100644 --- a/chrome/browser/status_icons/status_tray.cc +++ b/chrome/browser/status_icons/status_tray.cc @@ -11,8 +11,8 @@ StatusTray::~StatusTray() { } -StatusIcon* StatusTray::CreateStatusIcon() { - StatusIcon* icon = CreatePlatformStatusIcon(); +StatusIcon* StatusTray::CreateStatusIcon(StatusIconType type) { + StatusIcon* icon = CreatePlatformStatusIcon(type); if (icon) status_icons_.push_back(icon); return icon; diff --git a/chrome/browser/status_icons/status_tray.h b/chrome/browser/status_icons/status_tray.h index c715ec5..e4f240d 100644 --- a/chrome/browser/status_icons/status_tray.h +++ b/chrome/browser/status_icons/status_tray.h @@ -15,6 +15,14 @@ class StatusIcon; // APIs to add/remove icons to the tray and attach context menus. class StatusTray { public: + enum StatusIconType { + NOTIFICATION_TRAY_ICON = 0, + MEDIA_STREAM_CAPTURE_ICON, + BACKGROUND_MODE_ICON, + OTHER_ICON, + NAMED_STATUS_ICON_COUNT + }; + // Static factory method that is implemented separately for each platform to // produce the appropriate platform-specific instance. Returns NULL if this // platform does not support status icons. @@ -24,7 +32,7 @@ class StatusTray { // Creates a new StatusIcon. The StatusTray retains ownership of the // StatusIcon. Returns NULL if the StatusIcon could not be created. - StatusIcon* CreateStatusIcon(); + StatusIcon* CreateStatusIcon(StatusIconType type); // Removes |icon| from this status tray. void RemoveStatusIcon(StatusIcon* icon); @@ -35,14 +43,12 @@ class StatusTray { StatusTray(); // Factory method for creating a status icon for this platform. - virtual StatusIcon* CreatePlatformStatusIcon() = 0; + virtual StatusIcon* CreatePlatformStatusIcon(StatusIconType type) = 0; // Returns the list of active status icons so subclasses can operate on them. const StatusIcons& status_icons() const { return status_icons_; } private: - FRIEND_TEST_ALL_PREFIXES(StatusTrayTest, CreateRemove); - // List containing all active StatusIcons. The icons are owned by this // StatusTray. StatusIcons status_icons_; diff --git a/chrome/browser/status_icons/status_tray_unittest.cc b/chrome/browser/status_icons/status_tray_unittest.cc index 818a4fa..a71fa9a 100644 --- a/chrome/browser/status_icons/status_tray_unittest.cc +++ b/chrome/browser/status_icons/status_tray_unittest.cc @@ -24,25 +24,28 @@ class MockStatusIcon : public StatusIcon { class TestStatusTray : public StatusTray { public: - MOCK_METHOD0(CreatePlatformStatusIcon, StatusIcon*()); + MOCK_METHOD1(CreatePlatformStatusIcon, + StatusIcon*(StatusTray::StatusIconType type)); MOCK_METHOD1(UpdatePlatformContextMenu, void(ui::MenuModel*)); + + const StatusIcons& GetStatusIconsForTest() const { return status_icons(); } }; TEST(StatusTrayTest, Create) { // Check for creation and leaks. TestStatusTray tray; - EXPECT_CALL(tray, - CreatePlatformStatusIcon()).WillOnce(Return(new MockStatusIcon())); - tray.CreateStatusIcon(); + EXPECT_CALL(tray, CreatePlatformStatusIcon(StatusTray::OTHER_ICON)).WillOnce( + Return(new MockStatusIcon())); + tray.CreateStatusIcon(StatusTray::OTHER_ICON); } // Make sure that removing an icon removes it from the list. TEST(StatusTrayTest, CreateRemove) { TestStatusTray tray; - EXPECT_CALL(tray, - CreatePlatformStatusIcon()).WillOnce(Return(new MockStatusIcon())); - StatusIcon* icon = tray.CreateStatusIcon(); - EXPECT_EQ(1U, tray.status_icons_.size()); + EXPECT_CALL(tray, CreatePlatformStatusIcon(StatusTray::OTHER_ICON)).WillOnce( + Return(new MockStatusIcon())); + StatusIcon* icon = tray.CreateStatusIcon(StatusTray::OTHER_ICON); + EXPECT_EQ(1U, tray.GetStatusIconsForTest().size()); tray.RemoveStatusIcon(icon); - EXPECT_EQ(0U, tray.status_icons_.size()); + EXPECT_EQ(0U, tray.GetStatusIconsForTest().size()); } diff --git a/chrome/browser/ui/cocoa/status_icons/status_tray_mac.h b/chrome/browser/ui/cocoa/status_icons/status_tray_mac.h index 34aac19..2bb19c4 100644 --- a/chrome/browser/ui/cocoa/status_icons/status_tray_mac.h +++ b/chrome/browser/ui/cocoa/status_icons/status_tray_mac.h @@ -14,7 +14,7 @@ class StatusTrayMac : public StatusTray { protected: // Factory method for creating a status icon. - virtual StatusIcon* CreatePlatformStatusIcon() OVERRIDE; + virtual StatusIcon* CreatePlatformStatusIcon(StatusIconType type) OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(StatusTrayMac); diff --git a/chrome/browser/ui/cocoa/status_icons/status_tray_mac.mm b/chrome/browser/ui/cocoa/status_icons/status_tray_mac.mm index 5d6c3e2..7a4324d 100644 --- a/chrome/browser/ui/cocoa/status_icons/status_tray_mac.mm +++ b/chrome/browser/ui/cocoa/status_icons/status_tray_mac.mm @@ -13,6 +13,6 @@ StatusTray* StatusTray::Create() { StatusTrayMac::StatusTrayMac() { } -StatusIcon* StatusTrayMac::CreatePlatformStatusIcon() { +StatusIcon* StatusTrayMac::CreatePlatformStatusIcon(StatusIconType type) { return new StatusIconMac(); } diff --git a/chrome/browser/ui/gtk/status_icons/status_tray_gtk.cc b/chrome/browser/ui/gtk/status_icons/status_tray_gtk.cc index 04bc250..ecff525 100644 --- a/chrome/browser/ui/gtk/status_icons/status_tray_gtk.cc +++ b/chrome/browser/ui/gtk/status_icons/status_tray_gtk.cc @@ -12,7 +12,7 @@ StatusTrayGtk::StatusTrayGtk() { StatusTrayGtk::~StatusTrayGtk() { } -StatusIcon* StatusTrayGtk::CreatePlatformStatusIcon() { +StatusIcon* StatusTrayGtk::CreatePlatformStatusIcon(StatusIconType type) { return new StatusIconGtk(); } diff --git a/chrome/browser/ui/gtk/status_icons/status_tray_gtk.h b/chrome/browser/ui/gtk/status_icons/status_tray_gtk.h index cd7a0b4..3e010d7 100644 --- a/chrome/browser/ui/gtk/status_icons/status_tray_gtk.h +++ b/chrome/browser/ui/gtk/status_icons/status_tray_gtk.h @@ -15,7 +15,7 @@ class StatusTrayGtk : public StatusTray { protected: // Overriden from StatusTray: - virtual StatusIcon* CreatePlatformStatusIcon() OVERRIDE; + virtual StatusIcon* CreatePlatformStatusIcon(StatusIconType type) OVERRIDE; private: DISALLOW_COPY_AND_ASSIGN(StatusTrayGtk); diff --git a/chrome/browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc b/chrome/browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc index 8d96513..3cf40d0 100644 --- a/chrome/browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc +++ b/chrome/browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc @@ -29,7 +29,7 @@ TEST(StatusTrayGtkTest, CreateTray) { TEST(StatusTrayGtkTest, CreateIcon) { // Create an icon, set the images and tooltip, then shut it down. StatusTrayGtk tray; - StatusIcon* icon = tray.CreateStatusIcon(); + StatusIcon* icon = tray.CreateStatusIcon(StatusTray::OTHER_ICON); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); icon->SetImage(*image); @@ -43,7 +43,8 @@ TEST(StatusTrayGtkTest, CreateIcon) { TEST(StatusTrayGtkTest, ClickOnIcon) { // Create an icon, send a fake click event, make sure observer is called. StatusTrayGtk tray; - StatusIconGtk* icon = static_cast<StatusIconGtk*>(tray.CreateStatusIcon()); + StatusIconGtk* icon = static_cast<StatusIconGtk*>( + tray.CreateStatusIcon(StatusTray::OTHER_ICON)); MockStatusIconObserver observer; icon->AddObserver(&observer); EXPECT_CALL(observer, OnStatusIconClicked()); diff --git a/chrome/browser/ui/views/message_center/web_notification_tray.cc b/chrome/browser/ui/views/message_center/web_notification_tray.cc index eb65227..655bb3a 100644 --- a/chrome/browser/ui/views/message_center/web_notification_tray.cc +++ b/chrome/browser/ui/views/message_center/web_notification_tray.cc @@ -281,7 +281,8 @@ StatusIcon* WebNotificationTray::GetStatusIcon() { if (!status_tray) return NULL; - StatusIcon* status_icon = status_tray->CreateStatusIcon(); + StatusIcon* status_icon = + status_tray->CreateStatusIcon(StatusTray::NOTIFICATION_TRAY_ICON); if (!status_icon) return NULL; diff --git a/chrome/browser/ui/views/status_icons/status_tray_win.cc b/chrome/browser/ui/views/status_icons/status_tray_win.cc index 97792f7..8df1cf5 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_win.cc +++ b/chrome/browser/ui/views/status_icons/status_tray_win.cc @@ -15,6 +15,15 @@ static const UINT kStatusIconMessage = WM_APP + 1; +namespace { +// |kBaseIconId| is 2 to avoid conflicts with plugins that hard-code id 1. +const UINT kBaseIconId = 2; + +UINT ReservedIconId(StatusTray::StatusIconType type) { + return kBaseIconId + static_cast<UINT>(type); +} +} // namespace + StatusTrayWin::StatusTrayWin() : next_icon_id_(1), atom_(0), @@ -110,12 +119,22 @@ StatusTrayWin::~StatusTrayWin() { UnregisterClass(MAKEINTATOM(atom_), instance_); } -StatusIcon* StatusTrayWin::CreatePlatformStatusIcon() { - if (win8::IsSingleWindowMetroMode()) { - return new StatusIconMetro(next_icon_id_++); - } else { - return new StatusIconWin(next_icon_id_++, window_, kStatusIconMessage); - } +StatusIcon* StatusTrayWin::CreatePlatformStatusIcon( + StatusTray::StatusIconType type) { + UINT next_icon_id; + if (type == StatusTray::OTHER_ICON) + next_icon_id = NextIconId(); + else + next_icon_id = ReservedIconId(type); + + if (win8::IsSingleWindowMetroMode()) + return new StatusIconMetro(next_icon_id); + return new StatusIconWin(next_icon_id, window_, kStatusIconMessage); +} + +UINT StatusTrayWin::NextIconId() { + UINT icon_id = next_icon_id_++; + return kBaseIconId + static_cast<UINT>(NAMED_STATUS_ICON_COUNT) + icon_id; } StatusTray* StatusTray::Create() { diff --git a/chrome/browser/ui/views/status_icons/status_tray_win.h b/chrome/browser/ui/views/status_icons/status_tray_win.h index ba03e8f..87974f0 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_win.h +++ b/chrome/browser/ui/views/status_icons/status_tray_win.h @@ -20,9 +20,10 @@ class StatusTrayWin : public StatusTray { UINT message, WPARAM wparam, LPARAM lparam); + protected: // Overriden from StatusTray: - virtual StatusIcon* CreatePlatformStatusIcon() OVERRIDE; + virtual StatusIcon* CreatePlatformStatusIcon(StatusIconType type) OVERRIDE; private: // Static callback invoked when a message comes in to our messaging window. @@ -31,6 +32,8 @@ class StatusTrayWin : public StatusTray { WPARAM wparam, LPARAM lparam); + UINT NextIconId(); + // The unique icon ID we will assign to the next icon. UINT next_icon_id_; diff --git a/chrome/browser/ui/views/status_icons/status_tray_win_unittest.cc b/chrome/browser/ui/views/status_icons/status_tray_win_unittest.cc index 3968cdc..b42fd96 100644 --- a/chrome/browser/ui/views/status_icons/status_tray_win_unittest.cc +++ b/chrome/browser/ui/views/status_icons/status_tray_win_unittest.cc @@ -43,7 +43,7 @@ TEST(StatusTrayWinTest, CreateIconAndMenu) { // Create an icon, set the images, tooltip, and context menu, then shut it // down. StatusTrayWin tray; - StatusIcon* icon = tray.CreateStatusIcon(); + StatusIcon* icon = tray.CreateStatusIcon(StatusTray::OTHER_ICON); ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); gfx::ImageSkia* image = rb.GetImageSkiaNamed(IDR_STATUS_TRAY_ICON); icon->SetImage(*image); @@ -58,7 +58,8 @@ TEST(StatusTrayWinTest, CreateIconAndMenu) { TEST(StatusTrayWinTest, ClickOnIcon) { // Create an icon, send a fake click event, make sure observer is called. StatusTrayWin tray; - StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon()); + StatusIconWin* icon = static_cast<StatusIconWin*>( + tray.CreateStatusIcon(StatusTray::OTHER_ICON)); FakeStatusIconObserver observer; icon->AddObserver(&observer); // Mimic a click. @@ -72,7 +73,8 @@ TEST(StatusTrayWinTest, ClickOnIcon) { TEST(StatusTrayWinTest, ClickOnBalloon) { // Create an icon, send a fake click event, make sure observer is called. StatusTrayWin tray; - StatusIconWin* icon = static_cast<StatusIconWin*>(tray.CreateStatusIcon()); + StatusIconWin* icon = static_cast<StatusIconWin*>( + tray.CreateStatusIcon(StatusTray::OTHER_ICON)); FakeStatusIconObserver observer; icon->AddObserver(&observer); // Mimic a click. |