Chromium Code Reviews| Index: chrome/browser/notifications/notification_platform_bridge_mac.mm |
| diff --git a/chrome/browser/notifications/notification_platform_bridge_mac.mm b/chrome/browser/notifications/notification_platform_bridge_mac.mm |
| index 76da2bd9856b70d2036912640c44e84412da5c58..ca4e4bf26f94fe5c555360cf5c4279b96539c6a0 100644 |
| --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm |
| +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm |
| @@ -11,6 +11,7 @@ |
| #include "base/strings/string_number_conversions.h" |
| #include "base/strings/sys_string_conversions.h" |
| #include "chrome/browser/browser_process.h" |
| +#include "chrome/browser/notifications/native_notification_display_service.h" |
| #include "chrome/browser/notifications/notification.h" |
| #include "chrome/browser/notifications/notification_common.h" |
| #include "chrome/browser/notifications/notification_display_service_factory.h" |
| @@ -47,6 +48,31 @@ |
| // - Sound names can be implemented by setting soundName in NSUserNotification |
| // NSUserNotificationDefaultSoundName gives you the platform default. |
| +namespace { |
| +// Callback to run once the profile has been loaded in order to perform a |
|
Peter Beverloo
2016/07/05 14:25:35
micro nit: blank line above here
Miguel Garcia
2016/07/05 17:12:53
Done.
|
| +// given |operation| in a notification. |
| +void ProfileLoadedCallback(NotificationCommon::Operation operation, |
| + NotificationCommon::Type notification_type, |
| + const std::string& origin, |
| + const std::string& notification_id, |
| + int action_index, |
| + Profile* profile) { |
| + if (!profile) { |
| + // TODO(miguelg): Add UMA for this condition. |
| + // Perhaps propagate this through PersistentNotificationStatus. |
| + LOG(WARNING) << "Profile not loaded correctly"; |
| + return; |
| + } |
| + |
| + NotificationDisplayService* display_service = |
| + NotificationDisplayServiceFactory::GetForProfile(profile); |
| + |
| + static_cast<NativeNotificationDisplayService*>(display_service) |
| + ->ProcessNotificationOperation(operation, notification_type, origin, |
| + notification_id, action_index); |
| +} |
| + |
| +} // namespace |
| // static |
| NotificationPlatformBridge* NotificationPlatformBridge::Create() { |
| @@ -77,10 +103,12 @@ NotificationPlatformBridgeMac::~NotificationPlatformBridgeMac() { |
| [notification_center_ removeAllDeliveredNotifications]; |
| } |
| -void NotificationPlatformBridgeMac::Display(const std::string& notification_id, |
| - const std::string& profile_id, |
| - bool incognito, |
| - const Notification& notification) { |
| +void NotificationPlatformBridgeMac::Display( |
| + NotificationCommon::Type notification_type, |
| + const std::string& notification_id, |
| + const std::string& profile_id, |
| + bool incognito, |
| + const Notification& notification) { |
| base::scoped_nsobject<NotificationBuilder> builder( |
| [[NotificationBuilder alloc] init]); |
| @@ -137,6 +165,7 @@ void NotificationPlatformBridgeMac::Display(const std::string& notification_id, |
| [builder setNotificationId:base::SysUTF8ToNSString(notification_id)]; |
| [builder setProfileId:base::SysUTF8ToNSString(profile_id)]; |
| [builder setIncognito:incognito]; |
| + [builder setNotificationType:[NSNumber numberWithInteger:notification_type]]; |
| NSUserNotification* toast = [builder buildUserNotification]; |
| [notification_center_ deliverNotification:toast]; |
| @@ -154,6 +183,7 @@ void NotificationPlatformBridgeMac::Close(const std::string& profile_id, |
| NSString* persistent_profile_id = [toast.userInfo |
| objectForKey:notification_constants::kNotificationProfileId]; |
| + |
| if ([toast_id isEqualToString:candidate_id] && |
| [persistent_profile_id isEqualToString:current_profile_id]) { |
| [notification_center_ removeDeliveredNotification:toast]; |
| @@ -192,7 +222,8 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData( |
| ![response objectForKey:notification_constants::kNotificationOperation] || |
| ![response objectForKey:notification_constants::kNotificationId] || |
| ![response objectForKey:notification_constants::kNotificationProfileId] || |
| - ![response objectForKey:notification_constants::kNotificationIncognito]) { |
| + ![response objectForKey:notification_constants::kNotificationIncognito] || |
| + ![response objectForKey:notification_constants::kNotificationType]) { |
| LOG(ERROR) << "Missing required key"; |
| return false; |
| } |
| @@ -205,6 +236,8 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData( |
| [response objectForKey:notification_constants::kNotificationId]; |
| NSString* profile_id = |
| [response objectForKey:notification_constants::kNotificationProfileId]; |
| + NSNumber* notification_type = |
| + [response objectForKey:notification_constants::kNotificationType]; |
| if (button_index.intValue < -1 || |
| button_index.intValue >= |
| @@ -226,7 +259,13 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData( |
| } |
| if (profile_id.length <= 0) { |
| - LOG(ERROR) << "Profile Id is empty"; |
| + LOG(ERROR) << "ProfileId not provided"; |
|
Peter Beverloo
2016/07/05 14:25:35
Bad merge?
Miguel Garcia
2016/07/05 17:12:53
Yeah sorry.
|
| + return false; |
| + } |
| + |
| + if (notification_type.unsignedIntValue > NotificationCommon::TYPE_MAX) { |
| + LOG(ERROR) << notification_type.unsignedIntValue |
| + << " Does not correspond to a valid operation."; |
| return false; |
| } |
| @@ -264,24 +303,24 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData( |
| [response objectForKey:notification_constants::kNotificationId]; |
| std::string persistentNotificationId = |
| base::SysNSStringToUTF8(notificationId); |
| - int64_t persistentId; |
| - if (!base::StringToInt64(persistentNotificationId, &persistentId)) { |
| - LOG(ERROR) << "Unable to convert notification ID: " |
| - << persistentNotificationId << " to integer."; |
| - return; |
| - } |
| std::string profileId = base::SysNSStringToUTF8( |
| [response objectForKey:notification_constants::kNotificationProfileId]); |
| NSNumber* isIncognito = |
| [response objectForKey:notification_constants::kNotificationIncognito]; |
| - |
| - GURL origin(notificationOrigin); |
| - |
| - PlatformNotificationServiceImpl::GetInstance() |
| - ->ProcessPersistentNotificationOperation( |
| - static_cast<NotificationCommon::Operation>(operation.intValue), |
| - profileId, [isIncognito boolValue], origin, persistentId, |
| - buttonIndex.intValue); |
| + NSNumber* notificationType = |
| + [response objectForKey:notification_constants::kNotificationType]; |
| + |
| + ProfileManager* profileManager = g_browser_process->profile_manager(); |
| + DCHECK(profileManager); |
| + |
| + profileManager->LoadProfile( |
| + profileId, [isIncognito boolValue], |
| + base::Bind( |
| + &ProfileLoadedCallback, static_cast<NotificationCommon::Operation>( |
| + operation.unsignedIntValue), |
| + static_cast<NotificationCommon::Type>( |
| + notificationType.unsignedIntValue), |
| + notificationOrigin, persistentNotificationId, buttonIndex.intValue)); |
| } |
| - (BOOL)userNotificationCenter:(NSUserNotificationCenter*)center |