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 f708a0bd47c32a8e8c116a12a92cf636e17bcc11..1c13ae7b4d4ac3d046b1fe4b48228cd037f90b64 100644 |
--- a/chrome/browser/notifications/notification_platform_bridge_mac.mm |
+++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm |
@@ -120,6 +120,15 @@ void DoProcessNotificationResponse(NotificationCommon::Operation operation, |
// Close all notifications. |
- (void)closeAllNotifications; |
+// Retrieves all the alerts currenlty displayed by the XPC server |
+// They are subsequently merged with the local ones (passed in |
+// |localNotifications| |
+// and included in |callback|. |
Peter Beverloo
2017/02/24 16:12:24
nit: weird line break
Miguel Garcia
2017/03/22 22:00:07
Done.
|
+- (void)getDisplayedAlertIds:(NSString*)profileId |
+ withLocalNotifications:(NSArray*)localNotifications |
+ withCallback: |
+ (NotificationCommon::NotificationResultCallback)callback; |
+ |
@end |
// ///////////////////////////////////////////////////////////////////////////// |
@@ -289,9 +298,23 @@ bool NotificationPlatformBridgeMac::GetDisplayed( |
objectForKey:notification_constants::kNotificationId])); |
} |
} |
+ |
return true; |
} |
+void NotificationPlatformBridgeMac::GetDisplayedAsync( |
+ const std::string& profile_id, |
+ bool incognito, |
+ const NotificationCommon::NotificationResultCallback& callback) const { |
+#if BUILDFLAG(ENABLE_XPC_NOTIFICATIONS) |
+ [alert_dispatcher_ |
+ getDisplayedAlertIds:base::SysUTF8ToNSString(profile_id) |
+ withLocalNotifications:[notification_center_ deliveredNotifications] |
+ withCallback:callback]; |
+ |
+#endif // ENABLE_XPC_NOTIFICATIONS |
+} |
+ |
// static |
void NotificationPlatformBridgeMac::ProcessNotificationResponse( |
NSDictionary* response) { |
@@ -476,6 +499,40 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData( |
[[xpcConnection_ remoteObjectProxy] closeAllNotifications]; |
} |
+- (void)getDisplayedAlertIds:(NSString*)profileId |
+ withLocalNotifications:(NSArray*)localNotifications |
+ withCallback: |
+ (NotificationCommon::NotificationResultCallback)callback { |
+ [[xpcConnection_ remoteObjectProxy] |
+ getDisplayedAlertIds:profileId |
+ withReply:^(NSArray* alerts) { |
Robert Sesek
2017/02/24 22:38:05
This is hard to read due to the amount of indent n
Miguel Garcia
2017/03/22 22:00:07
Done.
|
+ std::unique_ptr<std::set<std::string>> |
+ displayedNotifications = |
+ base::MakeUnique<std::set<std::string>>(); |
Peter Beverloo
2017/02/24 16:12:24
nit {}
Miguel Garcia
2017/03/22 22:00:07
Done.
|
+ |
+ for (NSUserNotification* toast in localNotifications) { |
Peter Beverloo
2017/02/24 16:12:24
Can it happen that the XPC service does not reply,
Robert Sesek
2017/02/24 22:38:05
Yes this is possible.
Miguel Garcia
2017/03/22 22:00:07
I have changed the flow now so that the xpc alerts
|
+ NSString* toast_profile_id = [toast.userInfo |
Peter Beverloo
2017/02/24 16:12:24
nit: toastProfileId
Miguel Garcia
2017/03/22 22:00:07
Done.
|
+ objectForKey:notification_constants:: |
+ kNotificationProfileId]; |
+ if ([toast_profile_id isEqualToString:profileId]) { |
+ displayedNotifications->insert(base::SysNSStringToUTF8( |
+ [toast.userInfo objectForKey:notification_constants:: |
+ kNotificationId])); |
+ } |
+ } |
+ |
+ for (NSString* alert in alerts) |
+ displayedNotifications->insert( |
+ base::SysNSStringToUTF8(alert)); |
Peter Beverloo
2017/02/24 16:12:24
nit: {}
Miguel Garcia
2017/03/22 22:00:07
Done.
|
+ |
+ content::BrowserThread::PostTask( |
+ content::BrowserThread::IO, FROM_HERE, |
+ base::Bind(callback, |
+ base::Passed(&displayedNotifications), |
+ true /* supports sync */)); |
+ }]; |
+} |
+ |
// NotificationReply implementation |
- (void)notificationClick:(NSDictionary*)notificationResponseData { |
NotificationPlatformBridgeMac::ProcessNotificationResponse( |