| 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(
 | 
| 
 |