diff options
author | dimich@chromium.org <dimich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 04:26:40 +0000 |
---|---|---|
committer | dimich@chromium.org <dimich@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-12-18 04:26:40 +0000 |
commit | a93e63f51978209ca3bef8e92c3ec11ce162153f (patch) | |
tree | 5b321866bf554c0726100e51dbb2402f72f363e6 | |
parent | 7a3adb111a6cd0d35fdca47c8938e78086a5f64a (diff) | |
download | chromium_src-a93e63f51978209ca3bef8e92c3ec11ce162153f.zip chromium_src-a93e63f51978209ca3bef8e92c3ec11ce162153f.tar.gz chromium_src-a93e63f51978209ca3bef8e92c3ec11ce162153f.tar.bz2 |
Add initial plumbing to route Notifications to MessageCenter on Windows.
NotificationUIManager interface now does not expose BallonCollection and any Balloon-related data.
Also it splits the existing NotificationUIManagerImpl into 2 classes:
1. NotificationUIManagerImpl - contains 'wait_queue', where incoming notifications sit while screen is locked or in fullscreen etc, waiting for display.
2. BalloonNotificationUIManager (subclass of NotificationUIManagerImpl) - the BalloonCollection-based display manager, supporting Balloons and related logic. Still used on Win/Mac/Linux and ChromeOS (temporarily).
Also, introduces a new class, MessageCenterBridge (subclass of NotificationUIManager), which is empty in this CL, in next it will delegate the work to MessageCenter instance.
Tests that expect to see BalloonCollection now use BalloonNotificationUIManager::GetInstanceForTest() which logs an error and returns NULL if MessageCenter is used. This should not happen on bots as new code is under a flag.
R=stevenjb@chromium.org
TBR=ben@chromium.org (gypi changes)
Review URL: https://chromiumcodereview.appspot.com/11543011
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@173645 0039d316-1c4b-4281-b951-d872f2087c98
20 files changed, 486 insertions, 241 deletions
diff --git a/chrome/browser/automation/automation_provider_observers.cc b/chrome/browser/automation/automation_provider_observers.cc index d726ef0..736072a 100644 --- a/chrome/browser/automation/automation_provider_observers.cc +++ b/chrome/browser/automation/automation_provider_observers.cc @@ -43,8 +43,8 @@ #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" #include "chrome/browser/notifications/balloon_host.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/notification.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/password_manager/password_store_change.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/renderer_host/chrome_render_message_filter.h" @@ -2088,7 +2088,8 @@ namespace { // Returns whether all active notifications have an associated process ID. bool AreActiveNotificationProcessesReady() { - NotificationUIManager* manager = g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); const BalloonCollection::Balloons& balloons = manager->balloon_collection()->GetActiveBalloons(); BalloonCollection::Balloons::const_iterator iter; @@ -2140,8 +2141,8 @@ base::DictionaryValue* GetAllNotificationsObserver::NotificationToJson( } void GetAllNotificationsObserver::SendMessage() { - NotificationUIManager* manager = - g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); const BalloonCollection::Balloons& balloons = manager->balloon_collection()->GetActiveBalloons(); DictionaryValue return_value; @@ -2200,8 +2201,8 @@ OnNotificationBalloonCountObserver::OnNotificationBalloonCountObserver( int count) : automation_(provider->AsWeakPtr()), reply_message_(reply_message), - collection_( - g_browser_process->notification_ui_manager()->balloon_collection()), + collection_(BalloonNotificationUIManager::GetInstanceForTesting()-> + balloon_collection()), count_(count) { registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED, content::NotificationService::AllSources()); diff --git a/chrome/browser/automation/testing_automation_provider.cc b/chrome/browser/automation/testing_automation_provider.cc index 2bcd2c4..62a2254 100644 --- a/chrome/browser/automation/testing_automation_provider.cc +++ b/chrome/browser/automation/testing_automation_provider.cc @@ -68,8 +68,8 @@ #include "chrome/browser/lifetime/application_lifetime.h" #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/notification.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/password_manager/password_store.h" #include "chrome/browser/password_manager/password_store_change.h" #include "chrome/browser/password_manager/password_store_factory.h" @@ -4436,7 +4436,8 @@ void TestingAutomationProvider::CloseNotification( .SendError("'index' missing or invalid."); return; } - NotificationUIManager* manager = g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); BalloonCollection* collection = manager->balloon_collection(); const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); int balloon_count = static_cast<int>(balloons.size()); diff --git a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc index 61e5a83..c90a037 100644 --- a/chrome/browser/extensions/extension_crash_recovery_browsertest.cc +++ b/chrome/browser/extensions/extension_crash_recovery_browsertest.cc @@ -12,9 +12,9 @@ #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" #include "chrome/browser/notifications/balloon_host.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_delegate.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_commands.h" @@ -52,14 +52,14 @@ class ExtensionCrashRecoveryTest : public ExtensionBrowserTest { void CancelNotification(size_t index) { Balloon* balloon = GetNotificationDelegate(index); ASSERT_TRUE(balloon); - NotificationUIManager* manager = - g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); ASSERT_TRUE(manager->CancelById(balloon->notification().notification_id())); } size_t CountBalloons() { - NotificationUIManager* manager = - g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); BalloonCollection::Balloons balloons = manager->balloon_collection()->GetActiveBalloons(); return balloons.size(); @@ -122,8 +122,8 @@ class ExtensionCrashRecoveryTest : public ExtensionBrowserTest { private: Balloon* GetNotificationDelegate(size_t index) { - NotificationUIManager* manager = - g_browser_process->notification_ui_manager(); + BalloonNotificationUIManager* manager = + BalloonNotificationUIManager::GetInstanceForTesting(); BalloonCollection::Balloons balloons = manager->balloon_collection()->GetActiveBalloons(); return index < balloons.size() ? balloons.at(index) : NULL; diff --git a/chrome/browser/notifications/balloon_notification_ui_manager.cc b/chrome/browser/notifications/balloon_notification_ui_manager.cc new file mode 100644 index 0000000..7fce9db --- /dev/null +++ b/chrome/browser/notifications/balloon_notification_ui_manager.cc @@ -0,0 +1,147 @@ +// Copyright (c) 2012 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/notifications/balloon_notification_ui_manager.h" + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "base/stl_util.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/fullscreen.h" +#include "chrome/browser/idle.h" +#include "chrome/browser/notifications/balloon_collection.h" +#include "chrome/browser/notifications/notification.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/common/chrome_notification_types.h" +#include "chrome/common/pref_names.h" +#include "content/public/browser/notification_service.h" + +BalloonNotificationUIManager::BalloonNotificationUIManager( + PrefService* local_state) + : NotificationUIManagerImpl(), + balloon_collection_(NULL) { + position_pref_.Init( + prefs::kDesktopNotificationPosition, + local_state, + base::Bind( + &BalloonNotificationUIManager::OnDesktopNotificationPositionChanged, + base::Unretained(this))); +} + +BalloonNotificationUIManager::~BalloonNotificationUIManager() { +} + +void BalloonNotificationUIManager::SetBalloonCollection( + BalloonCollection* balloon_collection) { + DCHECK(!balloon_collection_.get() || + balloon_collection_->GetActiveBalloons().size() == 0); + DCHECK(balloon_collection); + balloon_collection_.reset(balloon_collection); + balloon_collection_->SetPositionPreference( + static_cast<BalloonCollection::PositionPreference>( + position_pref_.GetValue())); + balloon_collection_->set_space_change_listener(this); +} + +bool BalloonNotificationUIManager::CancelById(const std::string& id) { + // See if this ID hasn't been shown yet. + if (NotificationUIManagerImpl::CancelById(id)) + return true; + // If it has been shown, remove it from the balloon collections. + return balloon_collection_->RemoveById(id); +} + +bool BalloonNotificationUIManager::CancelAllBySourceOrigin(const GURL& source) { + // Same pattern as CancelById, but more complicated than the above + // because there may be multiple notifications from the same source. + bool removed = NotificationUIManagerImpl::CancelAllBySourceOrigin(source); + return balloon_collection_->RemoveBySourceOrigin(source) || removed; +} + +bool BalloonNotificationUIManager::CancelAllByProfile(Profile* profile) { + // Same pattern as CancelAllBySourceOrigin. + bool removed = NotificationUIManagerImpl::CancelAllByProfile(profile); + return balloon_collection_->RemoveByProfile(profile) || removed; +} + +void BalloonNotificationUIManager::CancelAll() { + NotificationUIManagerImpl::CancelAll(); + balloon_collection_->RemoveAll(); +} + +BalloonCollection* BalloonNotificationUIManager::balloon_collection() { + return balloon_collection_.get(); +} + +NotificationPrefsManager* BalloonNotificationUIManager::prefs_manager() { + return this; +} + +bool BalloonNotificationUIManager::ShowNotification( + const Notification& notification, Profile* profile) { + if (!balloon_collection_->HasSpace()) + return false; + balloon_collection_->Add(notification, profile); + return true; +} + +void BalloonNotificationUIManager::OnBalloonSpaceChanged() { + CheckAndShowNotifications(); +} + +bool BalloonNotificationUIManager::UpdateNotification( + const Notification& notification) { + const GURL& origin = notification.origin_url(); + const string16& replace_id = notification.replace_id(); + + DCHECK(!replace_id.empty()); + + const BalloonCollection::Balloons& balloons = + balloon_collection_->GetActiveBalloons(); + for (BalloonCollection::Balloons::const_iterator iter = balloons.begin(); + iter != balloons.end(); ++iter) { + if (origin == (*iter)->notification().origin_url() && + replace_id == (*iter)->notification().replace_id()) { + (*iter)->Update(notification); + return true; + } + } + + return false; +} + +BalloonCollection::PositionPreference +BalloonNotificationUIManager::GetPositionPreference() const { + LOG(INFO) << "Current position preference: " << position_pref_.GetValue(); + + return static_cast<BalloonCollection::PositionPreference>( + position_pref_.GetValue()); +} + +void BalloonNotificationUIManager::SetPositionPreference( + BalloonCollection::PositionPreference preference) { + LOG(INFO) << "Setting position preference: " << preference; + position_pref_.SetValue(static_cast<int>(preference)); + balloon_collection_->SetPositionPreference(preference); +} + +void BalloonNotificationUIManager::OnDesktopNotificationPositionChanged() { + balloon_collection_->SetPositionPreference( + static_cast<BalloonCollection::PositionPreference>( + position_pref_.GetValue())); +} + +// static +BalloonNotificationUIManager* + BalloonNotificationUIManager::GetInstanceForTesting() { + if (NotificationUIManager::DelegatesToMessageCenter()) { + LOG(ERROR) << "Attempt to run a test that requires " + << "BalloonNotificationUIManager while delegating to a " + << "native MessageCenter. Test will fail. Ask dimich@"; + return NULL; + } + return static_cast<BalloonNotificationUIManager*>( + g_browser_process->notification_ui_manager()); +} + diff --git a/chrome/browser/notifications/balloon_notification_ui_manager.h b/chrome/browser/notifications/balloon_notification_ui_manager.h new file mode 100644 index 0000000..89db2b8 --- /dev/null +++ b/chrome/browser/notifications/balloon_notification_ui_manager.h @@ -0,0 +1,75 @@ +// Copyright (c) 2012 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_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_ +#define CHROME_BROWSER_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_ + +#include <string> + +#include "base/memory/scoped_ptr.h" +#include "base/prefs/public/pref_member.h" +#include "chrome/browser/notifications/balloon.h" +#include "chrome/browser/notifications/balloon_collection.h" +#include "chrome/browser/notifications/notification_prefs_manager.h" +#include "chrome/browser/notifications/notification_ui_manager.h" +#include "chrome/browser/notifications/notification_ui_manager_impl.h" + +class Notification; +class PrefService; +class Profile; + +// The notification manager manages use of the desktop for notifications. +// It maintains a queue of pending notifications when space becomes constrained. +class BalloonNotificationUIManager + : public NotificationUIManagerImpl, + public NotificationPrefsManager, + public BalloonCollection::BalloonSpaceChangeListener { + public: + explicit BalloonNotificationUIManager(PrefService* local_state); + virtual ~BalloonNotificationUIManager(); + + // Initializes the UI manager with a balloon collection; this object + // takes ownership of the balloon collection. + void SetBalloonCollection(BalloonCollection* balloon_collection); + + // NotificationUIManager: + virtual bool CancelById(const std::string& notification_id) OVERRIDE; + virtual bool CancelAllBySourceOrigin(const GURL& source_origin) OVERRIDE; + virtual bool CancelAllByProfile(Profile* profile) OVERRIDE; + virtual void CancelAll() OVERRIDE; + + // NotificationUIManagerImpl: + virtual bool ShowNotification(const Notification& notification, + Profile* profile) OVERRIDE; + virtual bool UpdateNotification(const Notification& notification) OVERRIDE; + + // NotificationPrefsManager: + virtual BalloonCollection::PositionPreference + GetPositionPreference() const OVERRIDE; + virtual void SetPositionPreference( + BalloonCollection::PositionPreference preference) OVERRIDE; + + BalloonCollection* balloon_collection(); + NotificationPrefsManager* prefs_manager(); + + // Helper used to pull the static instance for testing. + // In tests, use this instead of g_browser_process->notification_ui_manager(). + static BalloonNotificationUIManager* GetInstanceForTesting(); + + private: + void OnDesktopNotificationPositionChanged(); + + // BalloonCollectionObserver implementation. + virtual void OnBalloonSpaceChanged() OVERRIDE; + + // An owned pointer to the collection of active balloons. + scoped_ptr<BalloonCollection> balloon_collection_; + + // Prefs listener for the position preference. + IntegerPrefMember position_pref_; + + DISALLOW_COPY_AND_ASSIGN(BalloonNotificationUIManager); +}; + +#endif // CHROME_BROWSER_NOTIFICATIONS_BALLOON_NOTIFICATION_UI_MANAGER_H_ diff --git a/chrome/browser/notifications/desktop_notifications_unittest.cc b/chrome/browser/notifications/desktop_notifications_unittest.cc index 6e5c308..a78b946 100644 --- a/chrome/browser/notifications/desktop_notifications_unittest.cc +++ b/chrome/browser/notifications/desktop_notifications_unittest.cc @@ -6,6 +6,7 @@ #include "base/string_util.h" #include "base/utf_string_conversions.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/fake_balloon_view.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/common/pref_names.h" @@ -104,9 +105,9 @@ void DesktopNotificationsTest::SetUp() { chrome::RegisterLocalState(&local_state_); profile_.reset(new TestingProfile()); + ui_manager_.reset(new BalloonNotificationUIManager(&local_state_)); balloon_collection_ = new MockBalloonCollection(); - ui_manager_.reset(NotificationUIManager::Create(&local_state_, - balloon_collection_)); + ui_manager_->SetBalloonCollection(balloon_collection_); service_.reset(new DesktopNotificationService(profile(), ui_manager_.get())); log_output_.clear(); } diff --git a/chrome/browser/notifications/desktop_notifications_unittest.h b/chrome/browser/notifications/desktop_notifications_unittest.h index 43ddecc..b5ddb29 100644 --- a/chrome/browser/notifications/desktop_notifications_unittest.h +++ b/chrome/browser/notifications/desktop_notifications_unittest.h @@ -10,10 +10,10 @@ #include "base/message_loop.h" #include "chrome/browser/notifications/balloon_collection_impl.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/notification.h" #include "chrome/browser/notifications/notification_test_util.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/test/base/testing_pref_service.h" #include "chrome/test/base/testing_profile.h" #include "content/public/test/render_view_test.h" @@ -109,7 +109,7 @@ class DesktopNotificationsTest : public testing::Test { MockBalloonCollection* balloon_collection_; // Real UI manager. - scoped_ptr<NotificationUIManager> ui_manager_; + scoped_ptr<BalloonNotificationUIManager> ui_manager_; // Real DesktopNotificationService scoped_ptr<DesktopNotificationService> service_; diff --git a/chrome/browser/notifications/message_center_notification_manager.cc b/chrome/browser/notifications/message_center_notification_manager.cc new file mode 100644 index 0000000..ca42a47 --- /dev/null +++ b/chrome/browser/notifications/message_center_notification_manager.cc @@ -0,0 +1,65 @@ +// Copyright (c) 2012 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/notifications/message_center_notification_manager.h" + +#include "base/logging.h" +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/notifications/notification.h" +#include "chrome/browser/prefs/pref_service.h" +#include "chrome/common/pref_names.h" + +MessageCenterNotificationManager::MessageCenterNotificationManager() { +} + +MessageCenterNotificationManager::~MessageCenterNotificationManager() { +} + +bool MessageCenterNotificationManager::CancelById(const std::string& id) { + // See if this ID hasn't been shown yet. + if (NotificationUIManagerImpl::CancelById(id)) + return true; + + // If it has been shown, remove it. + NOTIMPLEMENTED(); + return false; +} + +bool MessageCenterNotificationManager::CancelAllBySourceOrigin( + const GURL& source) { + // Same pattern as CancelById, but more complicated than the above + // because there may be multiple notifications from the same source. + bool removed = NotificationUIManagerImpl::CancelAllBySourceOrigin(source); + + NOTIMPLEMENTED(); + return false || removed; +} + +bool MessageCenterNotificationManager::CancelAllByProfile(Profile* profile) { + // Same pattern as CancelAllBySourceOrigin. + bool removed = NotificationUIManagerImpl::CancelAllByProfile(profile); + + NOTIMPLEMENTED(); + return false || removed; +} + +void MessageCenterNotificationManager::CancelAll() { + NotificationUIManagerImpl::CancelAll(); + NOTIMPLEMENTED(); +} + +bool MessageCenterNotificationManager::ShowNotification( + const Notification& notification, Profile* profile) { + NOTIMPLEMENTED(); + return true; +} + +bool MessageCenterNotificationManager::UpdateNotification( + const Notification& notification) { + const string16& replace_id = notification.replace_id(); + DCHECK(!replace_id.empty()); + + NOTIMPLEMENTED(); + return false; +} diff --git a/chrome/browser/notifications/message_center_notification_manager.h b/chrome/browser/notifications/message_center_notification_manager.h new file mode 100644 index 0000000..d4b2651 --- /dev/null +++ b/chrome/browser/notifications/message_center_notification_manager.h @@ -0,0 +1,41 @@ +// Copyright (c) 2012 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_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_ +#define CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_ + +#include <string> + +#include "base/memory/scoped_ptr.h" +#include "chrome/browser/notifications/notification_ui_manager.h" +#include "chrome/browser/notifications/notification_ui_manager_impl.h" + +class Notification; +class Profile; + +// This class extends NotificationUIManagerImpl and delegates actual display +// of notifications to MessageCenter, doing necessary conversions. +class MessageCenterNotificationManager : public NotificationUIManagerImpl { + public: + MessageCenterNotificationManager(); + virtual ~MessageCenterNotificationManager(); + + // NotificationUIManager: + virtual bool CancelById(const std::string& notification_id) OVERRIDE; + virtual bool CancelAllBySourceOrigin(const GURL& source_origin) OVERRIDE; + virtual bool CancelAllByProfile(Profile* profile) OVERRIDE; + virtual void CancelAll() OVERRIDE; + + // NotificationUIManagerImpl: + virtual bool ShowNotification(const Notification& notification, + Profile* profile) OVERRIDE; + virtual bool UpdateNotification(const Notification& notification) OVERRIDE; + + private: + DISALLOW_COPY_AND_ASSIGN(MessageCenterNotificationManager); +}; + +#endif // CHROME_BROWSER_NOTIFICATIONS_MESSAGE_CENTER_NOTIFICATION_MANAGER_H_ + + diff --git a/chrome/browser/notifications/notification_browsertest.cc b/chrome/browser/notifications/notification_browsertest.cc index a0fb41a..a171425 100644 --- a/chrome/browser/notifications/notification_browsertest.cc +++ b/chrome/browser/notifications/notification_browsertest.cc @@ -19,10 +19,10 @@ #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" #include "chrome/browser/notifications/balloon_host.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/desktop_notification_service_factory.h" #include "chrome/browser/notifications/notification.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_tabstrip.h" @@ -59,8 +59,8 @@ enum InfobarAction { class NotificationBalloonChangeObserver : public content::NotificationObserver { public: NotificationBalloonChangeObserver() - : collection_( - g_browser_process->notification_ui_manager()->balloon_collection()), + : collection_(BalloonNotificationUIManager::GetInstanceForTesting()-> + balloon_collection()), collection_changed_(false), notification_received_(false), running_(false), @@ -191,19 +191,19 @@ void NotificationsTest::SetUpInProcessBrowserTestFixture() { } const std::deque<Balloon*>& NotificationsTest::GetActiveBalloons() { - return g_browser_process->notification_ui_manager()-> + return BalloonNotificationUIManager::GetInstanceForTesting()-> balloon_collection()->GetActiveBalloons(); } int NotificationsTest::GetNotificationCount() { - return g_browser_process->notification_ui_manager()-> + return BalloonNotificationUIManager::GetInstanceForTesting()-> balloon_collection()->GetActiveBalloons().size(); } bool NotificationsTest::CloseNotificationAndWait( const Notification& notification) { NotificationBalloonChangeObserver observer; - bool success = g_browser_process->notification_ui_manager()-> + bool success = BalloonNotificationUIManager::GetInstanceForTesting()-> CancelById(notification.notification_id()); if (success) return observer.Wait(); diff --git a/chrome/browser/notifications/notification_options_menu_model.cc b/chrome/browser/notifications/notification_options_menu_model.cc index 753037a..3949025 100644 --- a/chrome/browser/notifications/notification_options_menu_model.cc +++ b/chrome/browser/notifications/notification_options_menu_model.cc @@ -12,6 +12,7 @@ #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/desktop_notification_service_factory.h" #include "chrome/browser/notifications/notification.h" @@ -69,8 +70,14 @@ CornerSelectionMenuModel::~CornerSelectionMenuModel() { } bool CornerSelectionMenuModel::IsCommandIdChecked(int command_id) const { + // TODO(dimich): MessageCenter does not use this preference (yet?) + if (NotificationUIManager::DelegatesToMessageCenter()) + return false; + NotificationPrefsManager* prefs = - g_browser_process->notification_ui_manager()->prefs_manager(); + static_cast<BalloonNotificationUIManager*>( + g_browser_process->notification_ui_manager())->prefs_manager(); + BalloonCollection::PositionPreference current = prefs->GetPositionPreference(); @@ -101,8 +108,13 @@ bool CornerSelectionMenuModel::GetAcceleratorForCommandId( } void CornerSelectionMenuModel::ExecuteCommand(int command_id) { + // TODO(dimich): MessageCenter does not use this preference (yet?) + if (NotificationUIManager::DelegatesToMessageCenter()) + return; + NotificationPrefsManager* prefs = - g_browser_process->notification_ui_manager()->prefs_manager(); + static_cast<BalloonNotificationUIManager*>( + g_browser_process->notification_ui_manager())->prefs_manager(); if (command_id == kCornerUpperLeft) prefs->SetPositionPreference(BalloonCollection::UPPER_LEFT); diff --git a/chrome/browser/notifications/notification_ui_manager.cc b/chrome/browser/notifications/notification_ui_manager.cc index af6dc6a..af48cb3 100644 --- a/chrome/browser/notifications/notification_ui_manager.cc +++ b/chrome/browser/notifications/notification_ui_manager.cc @@ -4,23 +4,32 @@ #include "chrome/browser/notifications/notification_ui_manager.h" -#include "chrome/browser/notifications/balloon_collection.h" -#include "chrome/browser/notifications/notification_ui_manager_impl.h" +#include "base/command_line.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" +#include "chrome/browser/notifications/message_center_notification_manager.h" +#include "chrome/common/chrome_switches.h" // static -NotificationUIManager* NotificationUIManager::Create(PrefService* local_state) { - return Create(local_state, BalloonCollection::Create()); +bool NotificationUIManager::DelegatesToMessageCenter() { +#if defined(OS_WIN) || defined(OS_CHROMEOS) + return CommandLine::ForCurrentProcess()->HasSwitch( + switches::kEnableRichNotifications); +#else + return false; +#endif } #if !defined(OS_MACOSX) // static -NotificationUIManager* NotificationUIManager::Create( - PrefService* local_state, - BalloonCollection* balloons) { - NotificationUIManagerImpl* instance = - new NotificationUIManagerImpl(local_state); - instance->Initialize(balloons); - balloons->set_space_change_listener(instance); - return instance; +NotificationUIManager* NotificationUIManager::Create(PrefService* local_state) { + if (DelegatesToMessageCenter()) { + return new MessageCenterNotificationManager(); + } else { + BalloonNotificationUIManager* balloon_manager = + new BalloonNotificationUIManager(local_state); + balloon_manager->SetBalloonCollection(BalloonCollection::Create()); + return balloon_manager; + } } -#endif // !OS_MACOSX +#endif + diff --git a/chrome/browser/notifications/notification_ui_manager.h b/chrome/browser/notifications/notification_ui_manager.h index 38a0c12..5b031a0 100644 --- a/chrome/browser/notifications/notification_ui_manager.h +++ b/chrome/browser/notifications/notification_ui_manager.h @@ -10,10 +10,8 @@ #include "base/basictypes.h" -class BalloonCollection; class GURL; class Notification; -class NotificationPrefsManager; class PrefService; class Profile; @@ -23,17 +21,9 @@ class NotificationUIManager { public: virtual ~NotificationUIManager() {} - // Creates an initialized UI manager with a new balloon collection - // and the listener relationship setup. - // Except for unit tests, this is the way to construct the object. + // Creates an initialized UI manager. static NotificationUIManager* Create(PrefService* local_state); - // Creates an initialized UI manager with the given balloon collection - // and the listener relationship setup. - // Used primarily by unit tests. - static NotificationUIManager* Create(PrefService* local_state, - BalloonCollection* balloons); - // Adds a notification to be displayed. Virtual for unit test override. virtual void Add(const Notification& notification, Profile* profile) = 0; @@ -53,16 +43,12 @@ class NotificationUIManager { // Used when the app is terminating. virtual void CancelAll() = 0; - // Returns balloon collection. - virtual BalloonCollection* balloon_collection() = 0; - - // Returns the impl, for use primarily by testing. - virtual NotificationPrefsManager* prefs_manager() = 0; - - // Retrieves an ordered list of all queued notifications. - // Used only for automation/testing. - virtual void GetQueuedNotificationsForTesting( - std::vector<const Notification*>* notifications) {} + // Temporary, while we have two implementations of Notifications UI Managers. + // One is older BalloonCollection-based and uses renderers to show + // notifications, another delegates to the new MessageCenter and uses native + // UI widgets. + // TODO(dimich): remove these eventually. + static bool DelegatesToMessageCenter(); protected: NotificationUIManager() {} diff --git a/chrome/browser/notifications/notification_ui_manager_impl.cc b/chrome/browser/notifications/notification_ui_manager_impl.cc index f62d472..79cfef7 100644 --- a/chrome/browser/notifications/notification_ui_manager_impl.cc +++ b/chrome/browser/notifications/notification_ui_manager_impl.cc @@ -46,17 +46,10 @@ class QueuedNotification { DISALLOW_COPY_AND_ASSIGN(QueuedNotification); }; -NotificationUIManagerImpl::NotificationUIManagerImpl(PrefService* local_state) - : balloon_collection_(NULL), - is_user_active_(true) { +NotificationUIManagerImpl::NotificationUIManagerImpl() + : is_user_active_(true) { registrar_.Add(this, chrome::NOTIFICATION_APP_TERMINATING, content::NotificationService::AllSources()); - position_pref_.Init( - prefs::kDesktopNotificationPosition, - local_state, - base::Bind( - &NotificationUIManagerImpl::OnDesktopNotificationPositionChanged, - base::Unretained(this))); #if defined(OS_MACOSX) InitFullScreenMonitor(); InitIdleMonitor(); @@ -71,16 +64,6 @@ NotificationUIManagerImpl::~NotificationUIManagerImpl() { #endif } -void NotificationUIManagerImpl::Initialize( - BalloonCollection* balloon_collection) { - DCHECK(!balloon_collection_.get()); - DCHECK(balloon_collection); - balloon_collection_.reset(balloon_collection); - balloon_collection_->SetPositionPreference( - static_cast<BalloonCollection::PositionPreference>( - position_pref_.GetValue())); -} - void NotificationUIManagerImpl::Add(const Notification& notification, Profile* profile) { if (TryReplacement(notification)) { @@ -103,8 +86,7 @@ bool NotificationUIManagerImpl::CancelById(const std::string& id) { return true; } } - // If it has been shown, remove it from the balloon collections. - return balloon_collection_->RemoveById(id); + return false; } bool NotificationUIManagerImpl::CancelAllBySourceOrigin(const GURL& source) { @@ -119,7 +101,7 @@ bool NotificationUIManagerImpl::CancelAllBySourceOrigin(const GURL& source) { removed = true; } } - return balloon_collection_->RemoveBySourceOrigin(source) || removed; + return removed; } bool NotificationUIManagerImpl::CancelAllByProfile(Profile* profile) { @@ -133,20 +115,11 @@ bool NotificationUIManagerImpl::CancelAllByProfile(Profile* profile) { removed = true; } } - return balloon_collection_->RemoveByProfile(profile) || removed; + return removed; } void NotificationUIManagerImpl::CancelAll() { STLDeleteElements(&show_queue_); - balloon_collection_->RemoveAll(); -} - -BalloonCollection* NotificationUIManagerImpl::balloon_collection() { - return balloon_collection_.get(); -} - -NotificationPrefsManager* NotificationUIManagerImpl::prefs_manager() { - return this; } void NotificationUIManagerImpl::CheckAndShowNotifications() { @@ -175,18 +148,18 @@ void NotificationUIManagerImpl::CheckUserState() { } void NotificationUIManagerImpl::ShowNotifications() { - while (!show_queue_.empty() && balloon_collection_->HasSpace()) { + while (!show_queue_.empty()) { scoped_ptr<QueuedNotification> queued_notification(show_queue_.front()); show_queue_.pop_front(); - balloon_collection_->Add(queued_notification->notification(), - queued_notification->profile()); + if (!ShowNotification(queued_notification->notification(), + queued_notification->profile())) { + // Subclass could not show notification, put it back in the queue. + show_queue_.push_front(queued_notification.release()); + return; + } } } -void NotificationUIManagerImpl::OnBalloonSpaceChanged() { - CheckAndShowNotifications(); -} - bool NotificationUIManagerImpl::TryReplacement( const Notification& notification) { const GURL& origin = notification.origin_url(); @@ -206,33 +179,8 @@ bool NotificationUIManagerImpl::TryReplacement( } } - const BalloonCollection::Balloons& balloons = - balloon_collection_->GetActiveBalloons(); - for (BalloonCollection::Balloons::const_iterator iter = balloons.begin(); - iter != balloons.end(); ++iter) { - if (origin == (*iter)->notification().origin_url() && - replace_id == (*iter)->notification().replace_id()) { - (*iter)->Update(notification); - return true; - } - } - - return false; -} - -BalloonCollection::PositionPreference -NotificationUIManagerImpl::GetPositionPreference() const { - LOG(INFO) << "Current position preference: " << position_pref_.GetValue(); - - return static_cast<BalloonCollection::PositionPreference>( - position_pref_.GetValue()); -} - -void NotificationUIManagerImpl::SetPositionPreference( - BalloonCollection::PositionPreference preference) { - LOG(INFO) << "Setting position preference: " << preference; - position_pref_.SetValue(static_cast<int>(preference)); - balloon_collection_->SetPositionPreference(preference); + // Give the subclass the opportunity to update existing notification. + return UpdateNotification(notification); } void NotificationUIManagerImpl::GetQueuedNotificationsForTesting( @@ -253,9 +201,3 @@ void NotificationUIManagerImpl::Observe( NOTREACHED(); } } - -void NotificationUIManagerImpl::OnDesktopNotificationPositionChanged() { - balloon_collection_->SetPositionPreference( - static_cast<BalloonCollection::PositionPreference>( - position_pref_.GetValue())); -} diff --git a/chrome/browser/notifications/notification_ui_manager_impl.h b/chrome/browser/notifications/notification_ui_manager_impl.h index e22c4c5..5f89c97 100644 --- a/chrome/browser/notifications/notification_ui_manager_impl.h +++ b/chrome/browser/notifications/notification_ui_manager_impl.h @@ -13,33 +13,24 @@ #include "base/memory/scoped_ptr.h" #include "base/prefs/public/pref_member.h" #include "base/timer.h" -#include "chrome/browser/notifications/balloon.h" -#include "chrome/browser/notifications/balloon_collection.h" -#include "chrome/browser/notifications/notification_prefs_manager.h" #include "chrome/browser/notifications/notification_ui_manager.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" class Notification; -class PrefService; class Profile; class QueuedNotification; // The notification manager manages use of the desktop for notifications. // It maintains a queue of pending notifications when space becomes constrained. +// Subclasses manage actual display and UI. class NotificationUIManagerImpl : public NotificationUIManager, - public NotificationPrefsManager, - public BalloonCollection::BalloonSpaceChangeListener, public content::NotificationObserver { public: - explicit NotificationUIManagerImpl(PrefService* local_state); + NotificationUIManagerImpl(); virtual ~NotificationUIManagerImpl(); - // Initializes the UI manager with a balloon collection; this object - // takes ownership of the balloon collection. - void Initialize(BalloonCollection* balloon_collection); - // NotificationUIManager: virtual void Add(const Notification& notification, Profile* profile) OVERRIDE; @@ -47,16 +38,28 @@ class NotificationUIManagerImpl virtual bool CancelAllBySourceOrigin(const GURL& source_origin) OVERRIDE; virtual bool CancelAllByProfile(Profile* profile) OVERRIDE; virtual void CancelAll() OVERRIDE; - virtual BalloonCollection* balloon_collection() OVERRIDE; - virtual NotificationPrefsManager* prefs_manager() OVERRIDE; - virtual void GetQueuedNotificationsForTesting( - std::vector<const Notification*>* notifications) OVERRIDE; - // NotificationPrefsManager: - virtual BalloonCollection::PositionPreference - GetPositionPreference() const OVERRIDE; - virtual void SetPositionPreference( - BalloonCollection::PositionPreference preference) OVERRIDE; + void GetQueuedNotificationsForTesting( + std::vector<const Notification*>* notifications); + + protected: + // Attempts to pass a notification from a waiting queue to the sublass + // for presentation. Subclass can return 'false' if it can not show + // notificaiton right away. In this case it should invoke + // CheckAndShowNotificaitons() later. + virtual bool ShowNotification(const Notification& notification, + Profile* profile) = 0; + + // Replace an existing notification of the same id with this one if applicable; + // subclass returns 'true' if the replacement happened. + virtual bool UpdateNotification(const Notification& notification) = 0; + + // Attempts to display notifications from the show_queue. Invoked by subclasses + // if they previously returned 'false' from ShowNotifications, which may happen + // when there is no room to show another notification. When room appears, the + // subclass should call this method to cause an attempt to show more + // notifications from the waiting queue. + void CheckAndShowNotifications(); private: // content::NotificationObserver override. @@ -64,18 +67,9 @@ class NotificationUIManagerImpl const content::NotificationSource& source, const content::NotificationDetails& details) OVERRIDE; - void OnDesktopNotificationPositionChanged(); - - // Attempts to display notifications from the show_queue if the user - // is active. - void CheckAndShowNotifications(); - // Attempts to display notifications from the show_queue. void ShowNotifications(); - // BalloonCollectionObserver implementation. - virtual void OnBalloonSpaceChanged() OVERRIDE; - // Replace an existing notification with this one if applicable; // returns true if the replacement happened. bool TryReplacement(const Notification& notification); @@ -83,9 +77,6 @@ class NotificationUIManagerImpl // Checks the user state to decide if we want to show the notification. void CheckUserState(); - // An owned pointer to the collection of active balloons. - scoped_ptr<BalloonCollection> balloon_collection_; - // A queue of notifications which are waiting to be shown. typedef std::deque<QueuedNotification*> NotificationDeque; NotificationDeque show_queue_; @@ -93,9 +84,6 @@ class NotificationUIManagerImpl // Registrar for the other kind of notifications (event signaling). content::NotificationRegistrar registrar_; - // Prefs listener for the position preference. - IntegerPrefMember position_pref_; - // Used by screen-saver and full-screen handling support. bool is_user_active_; base::RepeatingTimer<NotificationUIManagerImpl> user_state_check_timer_; diff --git a/chrome/browser/notifications/notification_ui_manager_mac.h b/chrome/browser/notifications/notification_ui_manager_mac.h index e962fdb..6b95ee2 100644 --- a/chrome/browser/notifications/notification_ui_manager_mac.h +++ b/chrome/browser/notifications/notification_ui_manager_mac.h @@ -13,21 +13,19 @@ #include "base/memory/scoped_nsobject.h" #include "base/memory/scoped_ptr.h" #include "base/string16.h" -#include "chrome/browser/notifications/notification_ui_manager.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" @protocol CrUserNotification; class Notification; @class NotificationCenterDelegate; -class NotificationUIManagerImpl; class PrefService; class Profile; -// This class is an implementation of NotificationUIManager that will send -// text-only (non-HTML) notifications to Notification Center on 10.8. This +// This class is an implementation of BalloonNotificationUIManager that will +// send text-only (non-HTML) notifications to Notification Center on 10.8. This // class is only instantiated on 10.8 and above. For HTML notifications, -// this class uses an instance of NotificationUIManagerImpl to present -// notifications in the typical way. -class NotificationUIManagerMac : public NotificationUIManager { +// this class delegates to the base class. +class NotificationUIManagerMac : public BalloonNotificationUIManager { public: explicit NotificationUIManagerMac(PrefService* local_state); virtual ~NotificationUIManagerMac(); @@ -39,20 +37,12 @@ class NotificationUIManagerMac : public NotificationUIManager { virtual bool CancelAllBySourceOrigin(const GURL& source_origin) OVERRIDE; virtual bool CancelAllByProfile(Profile* profile) OVERRIDE; virtual void CancelAll() OVERRIDE; - virtual BalloonCollection* balloon_collection() OVERRIDE; - virtual NotificationPrefsManager* prefs_manager() OVERRIDE; - virtual void GetQueuedNotificationsForTesting( - std::vector<const Notification*>* notifications) OVERRIDE; // Returns the corresponding C++ object for the Cocoa notification object, // or NULL if it could not be found. const Notification* FindNotificationWithCocoaNotification( id<CrUserNotification> notification) const; - NotificationUIManagerImpl* builtin_manager() const { - return builtin_manager_.get(); - } - private: // A ControllerNotification links the Cocoa (view) notification to the C++ // (model) notification. This assumes ownership (i.e. does not retain a_view) @@ -80,10 +70,6 @@ class NotificationUIManagerMac : public NotificationUIManager { id<CrUserNotification> FindNotificationWithReplacementId( const string16& replacement_id) const; - // The class used to present HTML notifications that can't be sent to - // Notification Center. - scoped_ptr<NotificationUIManagerImpl> builtin_manager_; - // Cocoa class that receives callbacks from the NSUserNotificationCenter. scoped_nsobject<NotificationCenterDelegate> delegate_; diff --git a/chrome/browser/notifications/notification_ui_manager_mac.mm b/chrome/browser/notifications/notification_ui_manager_mac.mm index 52f7c75..872d0bf 100644 --- a/chrome/browser/notifications/notification_ui_manager_mac.mm +++ b/chrome/browser/notifications/notification_ui_manager_mac.mm @@ -8,7 +8,7 @@ #include "base/mac/mac_util.h" #include "base/sys_string_conversions.h" #include "chrome/browser/notifications/notification.h" -#include "chrome/browser/notifications/notification_ui_manager_impl.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" @class NSUserNotificationCenter; @@ -76,28 +76,6 @@ NSString* const kNotificationIDKey = @"notification_id"; //////////////////////////////////////////////////////////////////////////////// -// static -NotificationUIManager* NotificationUIManager::Create( - PrefService* local_state, - BalloonCollection* balloons) { - NotificationUIManager* instance = NULL; - NotificationUIManagerImpl* impl = NULL; - - if (base::mac::IsOSMountainLionOrLater()) { - NotificationUIManagerMac* mac_instance = - new NotificationUIManagerMac(local_state); - instance = mac_instance; - impl = mac_instance->builtin_manager(); - } else { - instance = impl = new NotificationUIManagerImpl(local_state); - } - - impl->Initialize(balloons); - balloons->set_space_change_listener(impl); - - return instance; -} - NotificationUIManagerMac::ControllerNotification::ControllerNotification( Profile* a_profile, id<CrUserNotification> a_view, @@ -114,8 +92,19 @@ NotificationUIManagerMac::ControllerNotification::~ControllerNotification() { //////////////////////////////////////////////////////////////////////////////// +// static +NotificationUIManager* NotificationUIManager::Create(PrefService* local_state) { + BalloonNotificationUIManager* balloon_manager = NULL; + if (base::mac::IsOSMountainLionOrLater()) + balloon_manager = new NotificationUIManagerMac(local_state); + else + balloon_manager = new BalloonNotificationUIManager(local_state); + balloon_manager->SetBalloonCollection(BalloonCollection::Create()); + return balloon_manager; +} + NotificationUIManagerMac::NotificationUIManagerMac(PrefService* local_state) - : builtin_manager_(new NotificationUIManagerImpl(local_state)), + : BalloonNotificationUIManager(local_state), delegate_(ALLOW_THIS_IN_INITIALIZER_LIST( [[NotificationCenterDelegate alloc] initWithManager:this])) { DCHECK(!GetNotificationCenter().delegate); @@ -129,7 +118,7 @@ NotificationUIManagerMac::~NotificationUIManagerMac() { void NotificationUIManagerMac::Add(const Notification& notification, Profile* profile) { if (notification.is_html()) { - builtin_manager_->Add(notification, profile); + BalloonNotificationUIManager::Add(notification, profile); } else { if (!notification.replace_id().empty()) { id<CrUserNotification> replacee = FindNotificationWithReplacementId( @@ -166,14 +155,15 @@ void NotificationUIManagerMac::Add(const Notification& notification, bool NotificationUIManagerMac::CancelById(const std::string& notification_id) { NotificationMap::iterator it = notification_map_.find(notification_id); if (it == notification_map_.end()) - return builtin_manager_->CancelById(notification_id); + return BalloonNotificationUIManager::CancelById(notification_id); return RemoveNotification(it->second->view); } bool NotificationUIManagerMac::CancelAllBySourceOrigin( const GURL& source_origin) { - bool success = builtin_manager_->CancelAllBySourceOrigin(source_origin); + bool success = + BalloonNotificationUIManager::CancelAllBySourceOrigin(source_origin); for (NotificationMap::iterator it = notification_map_.begin(); it != notification_map_.end();) { @@ -190,7 +180,7 @@ bool NotificationUIManagerMac::CancelAllBySourceOrigin( } bool NotificationUIManagerMac::CancelAllByProfile(Profile* profile) { - bool success = builtin_manager_->CancelAllByProfile(profile); + bool success = BalloonNotificationUIManager::CancelAllByProfile(profile); for (NotificationMap::iterator it = notification_map_.begin(); it != notification_map_.end();) { @@ -222,20 +212,7 @@ void NotificationUIManagerMac::CancelAll() { // Clean up any lingering ones in the system tray. [center removeAllDeliveredNotifications]; - builtin_manager_->CancelAll(); -} - -BalloonCollection* NotificationUIManagerMac::balloon_collection() { - return builtin_manager_->balloon_collection(); -} - -NotificationPrefsManager* NotificationUIManagerMac::prefs_manager() { - return builtin_manager_.get(); -} - -void NotificationUIManagerMac::GetQueuedNotificationsForTesting( - std::vector<const Notification*>* notifications) { - return builtin_manager_->GetQueuedNotificationsForTesting(notifications); + BalloonNotificationUIManager::CancelAll(); } const Notification* diff --git a/chrome/browser/task_manager/task_manager_notification_resource_provider.cc b/chrome/browser/task_manager/task_manager_notification_resource_provider.cc index db61f13..8fbbce0 100644 --- a/chrome/browser/task_manager/task_manager_notification_resource_provider.cc +++ b/chrome/browser/task_manager/task_manager_notification_resource_provider.cc @@ -11,6 +11,7 @@ #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection.h" #include "chrome/browser/notifications/balloon_host.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/common/chrome_notification_types.h" #include "content/public/browser/notification_service.h" @@ -114,20 +115,26 @@ TaskManager::Resource* TaskManagerNotificationResourceProvider::GetResource( } void TaskManagerNotificationResourceProvider::StartUpdating() { + // MessageCenter does not use Balloons. + if (NotificationUIManager::DelegatesToMessageCenter()) + return; + DCHECK(!updating_); updating_ = true; // Add all the existing BalloonHosts. - BalloonCollection* collection = - g_browser_process->notification_ui_manager()->balloon_collection(); - const BalloonCollection::Balloons& balloons = collection->GetActiveBalloons(); + BalloonNotificationUIManager* balloon_manager = + static_cast<BalloonNotificationUIManager*>( + g_browser_process->notification_ui_manager()); + BalloonCollection* collection = balloon_manager->balloon_collection(); + const BalloonCollection::Balloons& balloons = + collection->GetActiveBalloons(); for (BalloonCollection::Balloons::const_iterator it = balloons.begin(); it != balloons.end(); ++it) { BalloonHost* balloon_host = (*it)->balloon_view()->GetHost(); if (balloon_host) AddToTaskManager(balloon_host); } - // Register for notifications about extension process changes. registrar_.Add(this, chrome::NOTIFICATION_NOTIFY_BALLOON_CONNECTED, content::NotificationService::AllSources()); @@ -136,6 +143,10 @@ void TaskManagerNotificationResourceProvider::StartUpdating() { } void TaskManagerNotificationResourceProvider::StopUpdating() { + // MessageCenter does not use Balloons. + if (NotificationUIManager::DelegatesToMessageCenter()) + return; + DCHECK(updating_); updating_ = false; diff --git a/chrome/browser/ui/panels/panel_and_desktop_notification_browsertest.cc b/chrome/browser/ui/panels/panel_and_desktop_notification_browsertest.cc index 90fc718..0baa6db 100644 --- a/chrome/browser/ui/panels/panel_and_desktop_notification_browsertest.cc +++ b/chrome/browser/ui/panels/panel_and_desktop_notification_browsertest.cc @@ -6,9 +6,9 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/notifications/balloon.h" #include "chrome/browser/notifications/balloon_collection_impl.h" +#include "chrome/browser/notifications/balloon_notification_ui_manager.h" #include "chrome/browser/notifications/desktop_notification_service.h" #include "chrome/browser/notifications/notification.h" -#include "chrome/browser/notifications/notification_ui_manager.h" #include "chrome/browser/prefs/pref_service.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/panels/base_panel_browser_test.h" @@ -40,15 +40,15 @@ class PanelAndDesktopNotificationTest : public BasePanelBrowserTest { g_browser_process->local_state()->SetInteger( prefs::kDesktopNotificationPosition, BalloonCollection::LOWER_RIGHT); - balloons_ = new BalloonCollectionImpl(); - ui_manager_.reset(NotificationUIManager::Create( - g_browser_process->local_state(), balloons_)); + ui_manager_.reset(new BalloonNotificationUIManager( + g_browser_process->local_state())); + ui_manager_->SetBalloonCollection(BalloonCollection::Create()); service_.reset(new DesktopNotificationService(browser()->profile(), ui_manager_.get())); } virtual void CleanUpOnMainThread() OVERRIDE { - balloons_->RemoveAll(); + ui_manager_->balloon_collection()->RemoveAll(); MessageLoopForUI::current()->RunUntilIdle(); service_.reset(); @@ -111,12 +111,11 @@ class PanelAndDesktopNotificationTest : public BasePanelBrowserTest { DesktopNotificationService* service() const { return service_.get(); } const BalloonCollection::Balloons& balloons() const { - return balloons_->GetActiveBalloons(); + return ui_manager_->balloon_collection()->GetActiveBalloons(); } private: - BalloonCollectionImpl* balloons_; // Owned by NotificationUIManager. - scoped_ptr<NotificationUIManager> ui_manager_; + scoped_ptr<BalloonNotificationUIManager> ui_manager_; scoped_ptr<DesktopNotificationService> service_; }; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index 59aebda..d36a923 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -1164,6 +1164,8 @@ 'browser/notifications/balloon_collection_impl.h', 'browser/notifications/balloon_host.cc', 'browser/notifications/balloon_host.h', + 'browser/notifications/balloon_notification_ui_manager.cc', + 'browser/notifications/balloon_notification_ui_manager.h', 'browser/notifications/desktop_notification_service.cc', 'browser/notifications/desktop_notification_service.h', 'browser/notifications/desktop_notification_service_factory.cc', @@ -1171,6 +1173,8 @@ 'browser/notifications/desktop_notification_service_win.cc', 'browser/notifications/fake_balloon_view.cc', 'browser/notifications/fake_balloon_view.h', + 'browser/notifications/message_center_notification_manager.cc', + 'browser/notifications/message_center_notification_manager.h', 'browser/notifications/notification.cc', 'browser/notifications/notification.h', 'browser/notifications/notification_delegate.cc', |