| Index: chrome/browser/notifications/notification_ui_manager_mac.mm
|
| diff --git a/chrome/browser/notifications/notification_ui_manager_mac.mm b/chrome/browser/notifications/notification_ui_manager_mac.mm
|
| index 74023f7ab5a65b090c1cc9c51b39b7b7c671b489..d25bf0faba1916689a9c527b1b56a768fd99216f 100644
|
| --- a/chrome/browser/notifications/notification_ui_manager_mac.mm
|
| +++ b/chrome/browser/notifications/notification_ui_manager_mac.mm
|
| @@ -6,17 +6,17 @@
|
|
|
| #include <utility>
|
|
|
| -#include "base/command_line.h"
|
| #include "base/mac/foundation_util.h"
|
| #include "base/mac/mac_util.h"
|
| #include "base/strings/string_number_conversions.h"
|
| #include "base/strings/sys_string_conversions.h"
|
| +#include "chrome/browser/browser_process.h"
|
| #include "chrome/browser/notifications/notification.h"
|
| +#include "chrome/browser/notifications/notification_display_service_factory.h"
|
| #include "chrome/browser/notifications/persistent_notification_delegate.h"
|
| #include "chrome/browser/notifications/platform_notification_service_impl.h"
|
| #include "chrome/browser/profiles/profile.h"
|
| #include "chrome/browser/profiles/profile_manager.h"
|
| -#include "chrome/common/chrome_switches.h"
|
| #include "chrome/grit/generated_resources.h"
|
| #include "ui/base/l10n/l10n_util_mac.h"
|
| #include "url/gurl.h"
|
| @@ -46,62 +46,46 @@ namespace {
|
| // native ones.
|
| NSString* const kNotificationOriginKey = @"notification_origin";
|
| NSString* const kNotificationPersistentIdKey = @"notification_persistent_id";
|
| -NSString* const kNotificationDelegateIdKey = @"notification_delegate_id";
|
|
|
| -// TODO(miguelg) get rid of this key once ProfileID has been ported
|
| -// from the void* it is today to the stable identifier provided
|
| -// in kNotificationProfilePersistentIdKey.
|
| -NSString* const kNotificationProfileIdKey = @"notification_profile_id";
|
| NSString* const kNotificationProfilePersistentIdKey =
|
| @"notification_profile_persistent_id";
|
| NSString* const kNotificationIncognitoKey = @"notification_incognito";
|
|
|
| } // namespace
|
|
|
| -// Only use native notifications for web, behind a flag and on 10.8+
|
| // static
|
| -NotificationUIManager*
|
| -NotificationUIManager::CreateNativeNotificationManager() {
|
| - if (base::CommandLine::ForCurrentProcess()->HasSwitch(
|
| - switches::kEnableNativeNotifications) &&
|
| - base::mac::IsOSMountainLionOrLater()) {
|
| - return new NotificationUIManagerMac();
|
| - }
|
| - return nullptr;
|
| +NotificationPlatformBridge* NotificationPlatformBridge::Create() {
|
| + return new NotificationUIManagerMac(
|
| + [NSUserNotificationCenter defaultUserNotificationCenter]);
|
| }
|
|
|
| // A Cocoa class that represents the delegate of NSUserNotificationCenter and
|
| // can forward commands to C++.
|
| @interface NotificationCenterDelegate
|
| : NSObject<NSUserNotificationCenterDelegate> {
|
| - @private
|
| - NotificationUIManagerMac* manager_; // Weak, owns self.
|
| }
|
| -- (id)initWithManager:(NotificationUIManagerMac*)manager;
|
| @end
|
|
|
| // /////////////////////////////////////////////////////////////////////////////
|
|
|
| -NotificationUIManagerMac::NotificationUIManagerMac()
|
| - : delegate_([[NotificationCenterDelegate alloc] initWithManager:this]) {
|
| - [[NSUserNotificationCenter defaultUserNotificationCenter]
|
| - setDelegate:delegate_.get()];
|
| +NotificationUIManagerMac::NotificationUIManagerMac(
|
| + NSUserNotificationCenter* notification_center)
|
| + : delegate_([NotificationCenterDelegate alloc]),
|
| + notification_center_(notification_center) {
|
| + [notification_center_ setDelegate:delegate_.get()];
|
| }
|
|
|
| NotificationUIManagerMac::~NotificationUIManagerMac() {
|
| - [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:nil];
|
| - CancelAll();
|
| -}
|
| + [notification_center_ setDelegate:nil];
|
|
|
| -void NotificationUIManagerMac::Add(const Notification& notification,
|
| - Profile* profile) {
|
| - // The Mac notification UI manager only supports Web Notifications, which
|
| - // have a PersistentNotificationDelegate. The persistent id of the
|
| - // notification is exposed through it's interface.
|
| - PersistentNotificationDelegate* delegate =
|
| - static_cast<PersistentNotificationDelegate*>(notification.delegate());
|
| - DCHECK(delegate);
|
| + // TODO(miguelg) lift this restriction if possible.
|
| + [notification_center_ removeAllDeliveredNotifications];
|
| +}
|
|
|
| +void NotificationUIManagerMac::Display(const std::string& notification_id,
|
| + const std::string& profile_id,
|
| + bool incognito,
|
| + const Notification& notification) {
|
| base::scoped_nsobject<NSUserNotification> toast(
|
| [[NSUserNotification alloc] init]);
|
| [toast setTitle:base::SysUTF16ToNSString(notification.title())];
|
| @@ -109,13 +93,13 @@ void NotificationUIManagerMac::Add(const Notification& notification,
|
|
|
| // TODO(miguelg): try to elide the origin perhaps See NSString
|
| // stringWithFormat. It seems that the informativeText font is constant.
|
| - NSString* informativeText =
|
| + NSString* informative_text =
|
| notification.context_message().empty()
|
| ? base::SysUTF8ToNSString(notification.origin_url().spec())
|
| : base::SysUTF16ToNSString(notification.context_message());
|
| - [toast setInformativeText:informativeText];
|
| + [toast setInformativeText:informative_text];
|
|
|
| - // Some functionality is only available in 10.9+ or requires private APIs
|
| + // Some functionality requires private APIs
|
| // Icon
|
| if ([toast respondsToSelector:@selector(_identityImage)] &&
|
| !notification.icon().IsEmpty()) {
|
| @@ -186,120 +170,63 @@ void NotificationUIManagerMac::Add(const Notification& notification,
|
| }
|
| }
|
|
|
| - int64_t persistent_notification_id = delegate->persistent_notification_id();
|
| - int64_t profile_id = reinterpret_cast<int64_t>(GetProfileID(profile));
|
| -
|
| toast.get().userInfo = @{
|
| kNotificationOriginKey :
|
| base::SysUTF8ToNSString(notification.origin_url().spec()),
|
| - kNotificationPersistentIdKey :
|
| - [NSNumber numberWithLongLong:persistent_notification_id],
|
| - kNotificationDelegateIdKey :
|
| - base::SysUTF8ToNSString(notification.delegate_id()),
|
| - kNotificationProfileIdKey : [NSNumber numberWithLongLong:profile_id],
|
| - kNotificationProfilePersistentIdKey :
|
| - base::SysUTF8ToNSString(profile->GetPath().BaseName().value()),
|
| - kNotificationIncognitoKey :
|
| - [NSNumber numberWithBool:profile->IsOffTheRecord()]
|
| + kNotificationPersistentIdKey : base::SysUTF8ToNSString(notification_id),
|
| + kNotificationProfilePersistentIdKey : base::SysUTF8ToNSString(profile_id),
|
| + kNotificationIncognitoKey : [NSNumber numberWithBool:incognito]
|
| };
|
|
|
| - [[NSUserNotificationCenter defaultUserNotificationCenter]
|
| - deliverNotification:toast];
|
| + [notification_center_ deliverNotification:toast];
|
| + notification.delegate()->Display();
|
| }
|
|
|
| -bool NotificationUIManagerMac::Update(const Notification& notification,
|
| - Profile* profile) {
|
| - NOTREACHED();
|
| - return false;
|
| -}
|
| +void NotificationUIManagerMac::Close(const std::string& profile_id,
|
| + const std::string& notification_id) {
|
| + NSString* candidate_id = base::SysUTF8ToNSString(notification_id);
|
|
|
| -const Notification* NotificationUIManagerMac::FindById(
|
| - const std::string& delegate_id,
|
| - ProfileID profile_id) const {
|
| - NOTREACHED();
|
| - return nil;
|
| -}
|
| -
|
| -bool NotificationUIManagerMac::CancelById(const std::string& delegate_id,
|
| - ProfileID profile_id) {
|
| - int64_t persistent_notification_id = 0;
|
| - // TODO(peter): Use the |delegate_id| directly when notification ids are being
|
| - // generated by content/ instead of us.
|
| - if (!base::StringToInt64(delegate_id, &persistent_notification_id))
|
| - return false;
|
| -
|
| - NSUserNotificationCenter* notificationCenter =
|
| - [NSUserNotificationCenter defaultUserNotificationCenter];
|
| + NSString* current_profile_id = base::SysUTF8ToNSString(profile_id);
|
| for (NSUserNotification* toast in
|
| - [notificationCenter deliveredNotifications]) {
|
| - NSNumber* toast_id =
|
| + [notification_center_ deliveredNotifications]) {
|
| + NSString* toast_id =
|
| [toast.userInfo objectForKey:kNotificationPersistentIdKey];
|
| - if (toast_id.longLongValue == persistent_notification_id) {
|
| - [notificationCenter removeDeliveredNotification:toast];
|
| - return true;
|
| - }
|
| - }
|
|
|
| - return false;
|
| -}
|
| + NSString* persistent_profile_id =
|
| + [toast.userInfo objectForKey:kNotificationProfilePersistentIdKey];
|
|
|
| -std::set<std::string>
|
| -NotificationUIManagerMac::GetAllIdsByProfileAndSourceOrigin(
|
| - ProfileID profile_id,
|
| - const GURL& source) {
|
| - NOTREACHED();
|
| - return std::set<std::string>();
|
| + if (toast_id == candidate_id &&
|
| + persistent_profile_id == current_profile_id) {
|
| + [notification_center_ removeDeliveredNotification:toast];
|
| + }
|
| + }
|
| }
|
|
|
| -std::set<std::string> NotificationUIManagerMac::GetAllIdsByProfile(
|
| - ProfileID profile_id) {
|
| - // ProfileID in mac is not safe to use across browser restarts
|
| - // Therefore because when chrome quits we cancel all pending notifications.
|
| - // TODO(miguelg) get rid of ProfileID as a void* for native notifications.
|
| - std::set<std::string> delegate_ids;
|
| - NSUserNotificationCenter* notificationCenter =
|
| - [NSUserNotificationCenter defaultUserNotificationCenter];
|
| +bool NotificationUIManagerMac::GetDisplayed(
|
| + const std::string& profile_id,
|
| + bool incognito,
|
| + std::set<std::string>* notifications) const {
|
| + DCHECK(notifications);
|
| + NSString* current_profile_id = base::SysUTF8ToNSString(profile_id);
|
| for (NSUserNotification* toast in
|
| - [notificationCenter deliveredNotifications]) {
|
| - NSNumber* toast_profile_id =
|
| - [toast.userInfo objectForKey:kNotificationProfileIdKey];
|
| - if (toast_profile_id.longLongValue ==
|
| - reinterpret_cast<int64_t>(profile_id)) {
|
| - delegate_ids.insert(base::SysNSStringToUTF8(
|
| - [toast.userInfo objectForKey:kNotificationDelegateIdKey]));
|
| + [notification_center_ deliveredNotifications]) {
|
| + NSString* toast_profile_id =
|
| + [toast.userInfo objectForKey:kNotificationProfilePersistentIdKey];
|
| + if (toast_profile_id == current_profile_id) {
|
| + notifications->insert(base::SysNSStringToUTF8(
|
| + [toast.userInfo objectForKey:kNotificationPersistentIdKey]));
|
| }
|
| }
|
| - return delegate_ids;
|
| -}
|
| -
|
| -bool NotificationUIManagerMac::CancelAllBySourceOrigin(
|
| - const GURL& source_origin) {
|
| - NOTREACHED();
|
| - return false;
|
| -}
|
| -
|
| -bool NotificationUIManagerMac::CancelAllByProfile(ProfileID profile_id) {
|
| - NOTREACHED();
|
| - return false;
|
| + return true;
|
| }
|
|
|
| -void NotificationUIManagerMac::CancelAll() {
|
| - [[NSUserNotificationCenter defaultUserNotificationCenter]
|
| - removeAllDeliveredNotifications];
|
| +bool NotificationUIManagerMac::SupportsNotificationCenter() const {
|
| + return true;
|
| }
|
|
|
| // /////////////////////////////////////////////////////////////////////////////
|
|
|
| @implementation NotificationCenterDelegate
|
| -
|
| -- (id)initWithManager:(NotificationUIManagerMac*)manager {
|
| - if ((self = [super init])) {
|
| - DCHECK(manager);
|
| - manager_ = manager;
|
| - }
|
| - return self;
|
| -}
|
| -
|
| - (void)userNotificationCenter:(NSUserNotificationCenter*)center
|
| didActivateNotification:(NSUserNotification*)notification {
|
| std::string notificationOrigin = base::SysNSStringToUTF8(
|
|
|