| 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 6b3c20dc60e789395257adb0ddd1f115608ac000..5890dc3422bd7f3537c70e970478c85f897ce877 100644
|
| --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm
|
| +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
|
| @@ -114,8 +114,16 @@ NotificationPlatformBridge* NotificationPlatformBridge::Create() {
|
| // Interface to communicate with the Alert XPC service.
|
| @interface NotificationRemoteDispatcher : NSObject
|
|
|
| +// Deliver a notification to the XPC service to be displayed as an alert.
|
| - (void)dispatchNotification:(NSDictionary*)data;
|
|
|
| +// Close a notification for a given |notificationId| and |profileId|.
|
| +- (void)closeNotificationWithId:(NSString*)notificationId
|
| + withProfileId:(NSString*)profileId;
|
| +
|
| +// Close all notifications.
|
| +- (void)closeAllNotifications;
|
| +
|
| @end
|
|
|
| // /////////////////////////////////////////////////////////////////////////////
|
| @@ -137,9 +145,11 @@ NotificationPlatformBridgeMac::NotificationPlatformBridgeMac(
|
| NotificationPlatformBridgeMac::~NotificationPlatformBridgeMac() {
|
| [notification_center_ setDelegate:nil];
|
|
|
| - // TODO(miguelg) remove only alerts shown by the XPC service.
|
| // TODO(miguelg) do not remove banners if possible.
|
| [notification_center_ removeAllDeliveredNotifications];
|
| +#if BUILDFLAG(ENABLE_XPC_NOTIFICATIONS)
|
| + [notification_remote_dispatcher_ closeAllNotifications];
|
| +#endif // BUILDFLAG(ENABLE_XPC_NOTIFICATIONS)
|
| }
|
|
|
| void NotificationPlatformBridgeMac::Display(
|
| @@ -231,8 +241,9 @@ void NotificationPlatformBridgeMac::Display(
|
| void NotificationPlatformBridgeMac::Close(const std::string& profile_id,
|
| const std::string& notification_id) {
|
| NSString* candidate_id = base::SysUTF8ToNSString(notification_id);
|
| -
|
| NSString* current_profile_id = base::SysUTF8ToNSString(profile_id);
|
| +
|
| + bool notification_removed = false;
|
| for (NSUserNotification* toast in
|
| [notification_center_ deliveredNotifications]) {
|
| NSString* toast_id =
|
| @@ -244,8 +255,19 @@ void NotificationPlatformBridgeMac::Close(const std::string& profile_id,
|
| if ([toast_id isEqualToString:candidate_id] &&
|
| [persistent_profile_id isEqualToString:current_profile_id]) {
|
| [notification_center_ removeDeliveredNotification:toast];
|
| + notification_removed = true;
|
| + break;
|
| }
|
| }
|
| +#if BUILDFLAG(ENABLE_XPC_NOTIFICATIONS)
|
| + // If no banner existed with that ID try to see if there is an alert
|
| + // in the xpc server.
|
| + if (!notification_removed) {
|
| + [notification_remote_dispatcher_
|
| + closeNotificationWithId:candidate_id
|
| + withProfileId:current_profile_id];
|
| + }
|
| +#endif // ENABLE_XPC_NOTIFICATIONS
|
| }
|
|
|
| bool NotificationPlatformBridgeMac::GetDisplayed(
|
| @@ -441,6 +463,16 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData(
|
| [[xpcConnection_ remoteObjectProxy] deliverNotification:data];
|
| }
|
|
|
| +- (void)closeNotificationWithId:(NSString*)notificationId
|
| + withProfileId:(NSString*)profileId {
|
| + [[xpcConnection_ remoteObjectProxy] closeNotificationWithId:notificationId
|
| + withProfileId:profileId];
|
| +}
|
| +
|
| +- (void)closeAllNotifications {
|
| + [[xpcConnection_ remoteObjectProxy] closeAllNotifications];
|
| +}
|
| +
|
| // NotificationReply implementation
|
| - (void)notificationClick:(NSDictionary*)notificationResponseData {
|
| NotificationPlatformBridgeMac::ProcessNotificationResponse(
|
|
|