summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/browser/background/background_mode_manager.cc3
-rw-r--r--chrome/browser/extensions/api/system_indicator/system_indicator_manager.cc3
-rw-r--r--chrome/browser/media/media_stream_capture_indicator.cc3
-rw-r--r--chrome/browser/status_icons/status_tray.cc4
-rw-r--r--chrome/browser/status_icons/status_tray.h14
-rw-r--r--chrome/browser/status_icons/status_tray_unittest.cc21
-rw-r--r--chrome/browser/ui/cocoa/status_icons/status_tray_mac.h2
-rw-r--r--chrome/browser/ui/cocoa/status_icons/status_tray_mac.mm2
-rw-r--r--chrome/browser/ui/gtk/status_icons/status_tray_gtk.cc2
-rw-r--r--chrome/browser/ui/gtk/status_icons/status_tray_gtk.h2
-rw-r--r--chrome/browser/ui/gtk/status_icons/status_tray_gtk_unittest.cc5
-rw-r--r--chrome/browser/ui/views/message_center/web_notification_tray.cc3
-rw-r--r--chrome/browser/ui/views/status_icons/status_tray_win.cc31
-rw-r--r--chrome/browser/ui/views/status_icons/status_tray_win.h5
-rw-r--r--chrome/browser/ui/views/status_icons/status_tray_win_unittest.cc8
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.