diff options
Diffstat (limited to 'chrome/browser/status_icons')
-rw-r--r-- | chrome/browser/status_icons/status_tray.cc | 26 | ||||
-rw-r--r-- | chrome/browser/status_icons/status_tray.h | 35 | ||||
-rw-r--r-- | chrome/browser/status_icons/status_tray_manager.cc | 57 | ||||
-rw-r--r-- | chrome/browser/status_icons/status_tray_manager.h | 31 | ||||
-rw-r--r-- | chrome/browser/status_icons/status_tray_unittest.cc | 37 |
5 files changed, 43 insertions, 143 deletions
diff --git a/chrome/browser/status_icons/status_tray.cc b/chrome/browser/status_icons/status_tray.cc index b7ae49c..8648351 100644 --- a/chrome/browser/status_icons/status_tray.cc +++ b/chrome/browser/status_icons/status_tray.cc @@ -4,6 +4,8 @@ #include "chrome/browser/status_icons/status_tray.h" +#include <algorithm> + #include "base/stl_util-inl.h" #include "chrome/browser/status_icons/status_icon.h" @@ -16,29 +18,23 @@ StatusTray::~StatusTray() { void StatusTray::RemoveAllIcons() { // Walk any active status icons and delete them. - STLDeleteContainerPairSecondPointers(status_icons_.begin(), - status_icons_.end()); + STLDeleteContainerPointers(status_icons_.begin(), status_icons_.end()); status_icons_.clear(); } -StatusIcon* StatusTray::GetStatusIcon(const string16& identifier) { - StatusIconMap::const_iterator iter = status_icons_.find(identifier); - if (iter != status_icons_.end()) - return iter->second; - - // No existing StatusIcon, create a new one. - StatusIcon* icon = CreateStatusIcon(); +StatusIcon* StatusTray::CreateStatusIcon() { + StatusIcon* icon = CreatePlatformStatusIcon(); if (icon) - status_icons_[identifier] = icon; + status_icons_.push_back(icon); return icon; } -void StatusTray::RemoveStatusIcon(const string16& identifier) { - StatusIconMap::iterator iter = status_icons_.find(identifier); +void StatusTray::RemoveStatusIcon(StatusIcon* icon) { + StatusIconList::iterator iter = std::find( + status_icons_.begin(), status_icons_.end(), icon); if (iter != status_icons_.end()) { - // Free the StatusIcon from the map (can't put scoped_ptr in a map, so we - // have to do it manually). - delete iter->second; + // Free the StatusIcon from the list. + delete *iter; status_icons_.erase(iter); } } diff --git a/chrome/browser/status_icons/status_tray.h b/chrome/browser/status_icons/status_tray.h index 6052582..a0da771 100644 --- a/chrome/browser/status_icons/status_tray.h +++ b/chrome/browser/status_icons/status_tray.h @@ -6,8 +6,10 @@ #define CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_H_ #pragma once -#include "base/hash_tables.h" -#include "base/scoped_ptr.h" +#include <vector> + +#include "base/basictypes.h" +#include "base/gtest_prod_util.h" class StatusIcon; @@ -16,38 +18,37 @@ class StatusIcon; class StatusTray { public: // Static factory method that is implemented separately for each platform to - // produce the appropriate platform-specific instance. + // produce the appropriate platform-specific instance. Returns NULL if this + // platform does not support status icons. static StatusTray* Create(); virtual ~StatusTray(); - // Gets the current status icon associated with this identifier, or creates - // a new one if none exists. The StatusTray retains ownership of the - // StatusIcon. Returns NULL if the status tray icon could not be created. - StatusIcon* GetStatusIcon(const string16& identifier); + // Creates a new StatusIcon. The StatusTray retains ownership of the + // StatusIcon. Returns NULL if the StatusIcon could not be created. + StatusIcon* CreateStatusIcon(); // Removes the current status icon associated with this identifier, if any. - void RemoveStatusIcon(const string16& identifier); + void RemoveStatusIcon(StatusIcon* icon); protected: StatusTray(); - // Factory method for creating a status icon. - virtual StatusIcon* CreateStatusIcon() = 0; + // Factory method for creating a status icon for this platform. + virtual StatusIcon* CreatePlatformStatusIcon() = 0; // Removes all StatusIcons (used by derived classes to clean up in case they // track external state used by the StatusIcons). void RemoveAllIcons(); - typedef base::hash_map<string16, StatusIcon*> StatusIconMap; + typedef std::vector<StatusIcon*> StatusIconList; // Returns the list of active status icons so subclasses can operate on them. - const StatusIconMap& status_icons() { return status_icons_; } + const StatusIconList& status_icons() { return status_icons_; } private: - // Map containing all active StatusIcons. - // Key: String identifiers (passed in to GetStatusIcon) - // Value: The StatusIcon associated with that identifier (strong pointer - - // StatusIcons are freed when the StatusTray destructor is called). - StatusIconMap status_icons_; + FRIEND_TEST_ALL_PREFIXES(StatusTrayTest, CreateRemove); + + // List containing all active StatusIcons. + StatusIconList status_icons_; DISALLOW_COPY_AND_ASSIGN(StatusTray); }; diff --git a/chrome/browser/status_icons/status_tray_manager.cc b/chrome/browser/status_icons/status_tray_manager.cc deleted file mode 100644 index 57b6ed9..0000000 --- a/chrome/browser/status_icons/status_tray_manager.cc +++ /dev/null @@ -1,57 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/status_icons/status_tray_manager.h" - -#include "app/l10n_util.h" -#include "app/resource_bundle.h" -#include "base/logging.h" -#include "base/string_util.h" -#include "base/utf_string_conversions.h" -#include "chrome/browser/browser.h" -#include "chrome/browser/browser_list.h" -#include "chrome/browser/browser_window.h" -#include "chrome/browser/status_icons/status_tray.h" -#include "grit/browser_resources.h" -#include "grit/chromium_strings.h" -#include "grit/theme_resources.h" - -StatusTrayManager::StatusTrayManager() : profile_(NULL) { -} - -StatusTrayManager::~StatusTrayManager() { -} - -void StatusTrayManager::Init(Profile* profile) { -#if !(defined(OS_LINUX) && defined(TOOLKIT_VIEWS)) - DCHECK(profile); - profile_ = profile; - status_tray_.reset(StatusTray::Create()); - StatusIcon* icon = status_tray_->GetStatusIcon(ASCIIToUTF16("chrome_main")); - if (icon) { - // Create an icon and add ourselves as a click observer on it - SkBitmap* bitmap = ResourceBundle::GetSharedInstance().GetBitmapNamed( - IDR_STATUS_TRAY_ICON); - SkBitmap* pressed = ResourceBundle::GetSharedInstance().GetBitmapNamed( - IDR_STATUS_TRAY_ICON_PRESSED); - icon->SetImage(*bitmap); - icon->SetPressedImage(*pressed); - icon->SetToolTip(l10n_util::GetStringUTF16(IDS_PRODUCT_NAME)); - icon->AddObserver(this); - } -#endif -} - -void StatusTrayManager::OnClicked() { - // When the tray icon is clicked, bring up the extensions page for now. - Browser* browser = BrowserList::GetLastActiveWithProfile(profile_); - if (browser) { - // Bring up the existing browser window and show the extensions tab. - browser->window()->Activate(); - browser->ShowExtensionsTab(); - } else { - // No windows are currently open, so open a new one. - Browser::OpenExtensionsWindow(profile_); - } -} diff --git a/chrome/browser/status_icons/status_tray_manager.h b/chrome/browser/status_icons/status_tray_manager.h deleted file mode 100644 index 6829f94..0000000 --- a/chrome/browser/status_icons/status_tray_manager.h +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) 2010 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_MANAGER_H_ -#define CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_MANAGER_H_ -#pragma once - -#include "base/scoped_ptr.h" -#include "chrome/browser/status_icons/status_icon.h" - -class Profile; -class StatusTray; - -// Manages the set of status tray icons and associated UI. -class StatusTrayManager : private StatusIcon::Observer { - public: - StatusTrayManager(); - virtual ~StatusTrayManager(); - - void Init(Profile* profile); - - private: - // Overriden from StatusIcon::Observer: - virtual void OnClicked(); - - scoped_ptr<StatusTray> status_tray_; - Profile* profile_; -}; - -#endif // CHROME_BROWSER_STATUS_ICONS_STATUS_TRAY_MANAGER_H_ diff --git a/chrome/browser/status_icons/status_tray_unittest.cc b/chrome/browser/status_icons/status_tray_unittest.cc index 957faa7..26219bd 100644 --- a/chrome/browser/status_icons/status_tray_unittest.cc +++ b/chrome/browser/status_icons/status_tray_unittest.cc @@ -21,35 +21,26 @@ class MockStatusIcon : public StatusIcon { class TestStatusTray : public StatusTray { public: - MOCK_METHOD0(CreateStatusIcon, StatusIcon*()); + MOCK_METHOD0(CreatePlatformStatusIcon, StatusIcon*()); }; TEST(StatusTrayTest, Create) { // Check for creation and leaks. TestStatusTray tray; - EXPECT_CALL(tray, CreateStatusIcon()).WillOnce(Return(new MockStatusIcon())); - tray.GetStatusIcon(ASCIIToUTF16("test")); + EXPECT_CALL(tray, + CreatePlatformStatusIcon()).WillOnce(Return(new MockStatusIcon())); + tray.CreateStatusIcon(); } -TEST(StatusTrayTest, GetIconTwice) { +// Make sure that removing an icon removes it from the list. +TEST(StatusTrayTest, CreateRemove) { TestStatusTray tray; - string16 id = ASCIIToUTF16("test"); - // We should not try to create a new icon if we get the same ID twice. - EXPECT_CALL(tray, CreateStatusIcon()).WillOnce(Return(new MockStatusIcon())); - StatusIcon* icon = tray.GetStatusIcon(id); - EXPECT_EQ(icon, tray.GetStatusIcon(id)); -} - -TEST(StatusTrayTest, GetIconAfterRemove) { - TestStatusTray tray; - string16 id = ASCIIToUTF16("test"); - EXPECT_CALL(tray, CreateStatusIcon()).Times(2) - .WillOnce(Return(new MockStatusIcon())) - .WillOnce(Return(new MockStatusIcon())); - StatusIcon* icon = tray.GetStatusIcon(id); - EXPECT_EQ(icon, tray.GetStatusIcon(id)); - - // If we remove the icon, then we should create a new one the next time in. - tray.RemoveStatusIcon(id); - tray.GetStatusIcon(id); + EXPECT_CALL(tray, + CreatePlatformStatusIcon()).WillOnce(Return(new MockStatusIcon())); + StatusIcon* icon = tray.CreateStatusIcon(); + EXPECT_EQ(1U, tray.status_icons_.size()); + tray.RemoveStatusIcon(icon); + EXPECT_EQ(0U, tray.status_icons_.size()); + // Calling again should do nothing. + tray.RemoveStatusIcon(icon); } |