diff options
Diffstat (limited to 'chrome')
7 files changed, 133 insertions, 7 deletions
diff --git a/chrome/browser/status_icons/desktop_notification_balloon.cc b/chrome/browser/status_icons/desktop_notification_balloon.cc new file mode 100644 index 0000000..4f1777a --- /dev/null +++ b/chrome/browser/status_icons/desktop_notification_balloon.cc @@ -0,0 +1,82 @@ +// Copyright (c) 2011 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/desktop_notification_balloon.h" + +#include "base/bind.h" +#include "base/string_number_conversions.h" +#include "base/threading/thread_restrictions.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/notifications/desktop_notification_service.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_manager.h" +#include "chrome/browser/ui/webui/web_ui_util.h" +#include "third_party/skia/include/core/SkBitmap.h" + +namespace { + +void CloseBalloon(const std::string& id) { + g_browser_process->notification_ui_manager()->CancelById(id); +} + +// Prefix added to the notification ids. +const char kNotificationPrefix[] = "desktop_notification_balloon."; + +// Timeout for automatically dismissing the notification balloon. +const size_t kTimeoutMilliseconds = 6000; + +class DummyNotificationDelegate : public NotificationDelegate { + public: + explicit DummyNotificationDelegate(const std::string& id) + : id_(kNotificationPrefix + id) {} + virtual ~DummyNotificationDelegate() {} + + virtual void Display() OVERRIDE { + MessageLoop::current()->PostDelayedTask(FROM_HERE, + base::Bind(&CloseBalloon, id()), kTimeoutMilliseconds); + } + virtual void Error() OVERRIDE {} + virtual void Close(bool by_user) OVERRIDE {} + virtual void Click() OVERRIDE {} + virtual std::string id() const OVERRIDE { return id_; } + + private: + std::string id_; +}; + +} // anonymous namespace + +int DesktopNotificationBalloon::id_count_ = 1; + +DesktopNotificationBalloon::DesktopNotificationBalloon() { +} + +DesktopNotificationBalloon::~DesktopNotificationBalloon() { + if (notification_.get()) + CloseBalloon(notification_->notification_id()); +} + +void DesktopNotificationBalloon::DisplayBalloon(const SkBitmap& icon, + const string16& title, + const string16& contents) { + GURL icon_url; + if (!icon.empty()) + icon_url = GURL(web_ui_util::GetImageDataUrl(icon)); + + GURL content_url(DesktopNotificationService::CreateDataUrl( + icon_url, title, contents, WebKit::WebTextDirectionDefault)); + + notification_.reset(new Notification( + GURL(), content_url, string16(), string16(), + new DummyNotificationDelegate(base::IntToString(id_count_++)))); + + // Allowing IO access is required here to cover the corner case where + // there is no last used profile and the default one is loaded. + // IO access won't be required for normal uses. + base::ThreadRestrictions::ScopedAllowIO allow_io; + g_browser_process->notification_ui_manager()->Add( + *notification_.get(), ProfileManager::GetLastUsedProfile()); +} diff --git a/chrome/browser/status_icons/desktop_notification_balloon.h b/chrome/browser/status_icons/desktop_notification_balloon.h new file mode 100644 index 0000000..2a44f2b --- /dev/null +++ b/chrome/browser/status_icons/desktop_notification_balloon.h @@ -0,0 +1,37 @@ +// Copyright (c) 2011 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_DESKTOP_NOTIFICATION_BALLOON_H_ +#define CHROME_BROWSER_STATUS_ICONS_DESKTOP_NOTIFICATION_BALLOON_H_ +#pragma once + +#include "base/compiler_specific.h" +#include "base/memory/scoped_ptr.h" +#include "base/string16.h" + +class Notification; +class SkBitmap; + +// Provides the notification balloon functionality by using desktop +// notifications to platforms that don't have a specific native API. +class DesktopNotificationBalloon { + public: + DesktopNotificationBalloon(); + virtual ~DesktopNotificationBalloon(); + + void DisplayBalloon(const SkBitmap& icon, + const string16& title, + const string16& contents); + + private: + // Notification balloon. + scoped_ptr<Notification> notification_; + + // Counter to provide unique ids to notifications. + static int id_count_; + + DISALLOW_COPY_AND_ASSIGN(DesktopNotificationBalloon); +}; + +#endif // CHROME_BROWSER_STATUS_ICONS_DESKTOP_NOTIFICATION_BALLOON_H_ diff --git a/chrome/browser/ui/cocoa/status_icons/status_icon_mac.h b/chrome/browser/ui/cocoa/status_icons/status_icon_mac.h index ff6e078..0316e02 100644 --- a/chrome/browser/ui/cocoa/status_icons/status_icon_mac.h +++ b/chrome/browser/ui/cocoa/status_icons/status_icon_mac.h @@ -11,6 +11,7 @@ #include "base/compiler_specific.h" #include "base/memory/scoped_nsobject.h" #include "base/string16.h" +#include "chrome/browser/status_icons/desktop_notification_balloon.h" #include "chrome/browser/status_icons/status_icon.h" class SkBitmap; @@ -22,7 +23,7 @@ class StatusIconMac : public StatusIcon { StatusIconMac(); virtual ~StatusIconMac(); - // Overridden from StatusIcon + // Overridden from StatusIcon. virtual void SetImage(const SkBitmap& image) OVERRIDE; virtual void SetPressedImage(const SkBitmap& image) OVERRIDE; virtual void SetToolTip(const string16& tool_tip) OVERRIDE; @@ -41,6 +42,9 @@ class StatusIconMac : public StatusIcon { scoped_nsobject<StatusItemController> controller_; + // Notification balloon. + DesktopNotificationBalloon notification_; + DISALLOW_COPY_AND_ASSIGN(StatusIconMac); }; diff --git a/chrome/browser/ui/cocoa/status_icons/status_icon_mac.mm b/chrome/browser/ui/cocoa/status_icons/status_icon_mac.mm index 8104298..9832358 100644 --- a/chrome/browser/ui/cocoa/status_icons/status_icon_mac.mm +++ b/chrome/browser/ui/cocoa/status_icons/status_icon_mac.mm @@ -79,9 +79,7 @@ void StatusIconMac::SetToolTip(const string16& tool_tip) { void StatusIconMac::DisplayBalloon(const SkBitmap& icon, const string16& title, const string16& contents) { - // TODO(atwilson): Figure out the right UI to display here when actually - // needed (not yet called). - // http://crbug.com/74970 + notification_.DisplayBalloon(icon, title, contents); } void StatusIconMac::UpdatePlatformContextMenu(ui::MenuModel* menu) { diff --git a/chrome/browser/ui/gtk/status_icons/status_icon_gtk.cc b/chrome/browser/ui/gtk/status_icons/status_icon_gtk.cc index 53b16425..93c5fc4 100644 --- a/chrome/browser/ui/gtk/status_icons/status_icon_gtk.cc +++ b/chrome/browser/ui/gtk/status_icons/status_icon_gtk.cc @@ -45,8 +45,7 @@ void StatusIconGtk::SetToolTip(const string16& tool_tip) { void StatusIconGtk::DisplayBalloon(const SkBitmap& icon, const string16& title, const string16& contents) { - // TODO(atwilson): Figure out the right thing to do here. - // http://crbug.com/74970 + notification_.DisplayBalloon(icon, title, contents); } void StatusIconGtk::OnClick(GtkWidget* widget) { diff --git a/chrome/browser/ui/gtk/status_icons/status_icon_gtk.h b/chrome/browser/ui/gtk/status_icons/status_icon_gtk.h index 4985d1d..7492b23 100644 --- a/chrome/browser/ui/gtk/status_icons/status_icon_gtk.h +++ b/chrome/browser/ui/gtk/status_icons/status_icon_gtk.h @@ -9,6 +9,7 @@ #include <gtk/gtk.h> #include "base/compiler_specific.h" +#include "chrome/browser/status_icons/desktop_notification_balloon.h" #include "chrome/browser/status_icons/status_icon.h" #include "ui/base/gtk/gtk_signal.h" @@ -26,7 +27,7 @@ class StatusIconGtk : public StatusIcon { virtual void SetToolTip(const string16& tool_tip) OVERRIDE; virtual void DisplayBalloon(const SkBitmap& icon, const string16& title, - const string16& contents); + const string16& contents) OVERRIDE; // Exposed for testing. CHROMEGTK_CALLBACK_0(StatusIconGtk, void, OnClick); @@ -45,6 +46,9 @@ class StatusIconGtk : public StatusIcon { // The context menu for this icon (if any). scoped_ptr<MenuGtk> menu_; + // Notification balloon. + DesktopNotificationBalloon notification_; + DISALLOW_COPY_AND_ASSIGN(StatusIconGtk); }; diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index a3f81a2..298055f 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi @@ -2159,6 +2159,8 @@ 'browser/ssl/ssl_error_info.cc', 'browser/ssl/ssl_error_info.h', 'browser/ssl_client_certificate_selector.h', + 'browser/status_icons/desktop_notification_balloon.cc', + 'browser/status_icons/desktop_notification_balloon.h', 'browser/status_icons/status_icon.cc', 'browser/status_icons/status_icon.h', 'browser/status_icons/status_tray.cc', |