Index: chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm |
diff --git a/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf4df014184f8df80027d21ff31fe51e698472df |
--- /dev/null |
+++ b/chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.mm |
@@ -0,0 +1,98 @@ |
+// Copyright 2016 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#import "chrome/browser/ui/cocoa/notifications/notification_response_builder_mac.h" |
+ |
+#include "base/logging.h" |
+#include "chrome/browser/ui/cocoa/notifications/notification_constants_mac.h" |
+ |
+namespace { |
+ |
+// Make sure this Obj-C enum is kept in sync with the |
+// PlatformNotificationServiceImpl NotificationOperation enum. |
+// The latter cannot be reused because the XPC service is not aware of |
+// PlatformNotificationCenter. |
+enum NotificationOperation { |
+ NOTIFICATION_CLICK = 0, |
+ NOTIFICATION_CLOSE = 1, |
+ NOTIFICATION_SETTINGS = 2 |
+}; |
+} // namespace |
+ |
+@implementation NotificationResponseBuilder |
+ |
++ (NSDictionary*)buildDictionary:(NSUserNotification*)notification { |
+ NSString* origin = |
+ [[notification userInfo] |
+ objectForKey:notification_constants::kNotificationOrigin] |
+ ? [[notification userInfo] |
+ objectForKey:notification_constants::kNotificationOrigin] |
+ : @""; |
+ DCHECK([[notification userInfo] |
+ objectForKey:notification_constants::kNotificationId]); |
+ NSString* notificationId = [[notification userInfo] |
+ objectForKey:notification_constants::kNotificationId]; |
+ |
+ DCHECK([[notification userInfo] |
+ objectForKey:notification_constants::kNotificationProfileId]); |
+ NSString* profileId = [[notification userInfo] |
+ objectForKey:notification_constants::kNotificationProfileId]; |
+ |
+ DCHECK([[notification userInfo] |
+ objectForKey:notification_constants::kNotificationIncognito]); |
+ NSNumber* incognito = [[notification userInfo] |
+ objectForKey:notification_constants::kNotificationIncognito]; |
+ |
+ // Initialize operation and button index for the case where the |
+ // notification itself was clicked. |
+ NotificationOperation operation = NOTIFICATION_CLICK; |
+ int buttonIndex = -1; |
+ |
+ // Determine whether the user clicked on a button, and if they did, whether it |
+ // was a developer-provided button or the mandatory Settings button. |
+ if (notification.activationType == |
+ NSUserNotificationActivationTypeActionButtonClicked) { |
+ NSArray* alternateButtons = @[]; |
+ if ([notification |
+ respondsToSelector:@selector(_alternateActionButtonTitles)]) { |
+ alternateButtons = |
+ [notification valueForKey:@"_alternateActionButtonTitles"]; |
+ } |
+ |
+ bool multipleButtons = (alternateButtons.count > 0); |
+ |
+ // No developer actions, just the settings button. |
+ if (!multipleButtons) { |
+ operation = NOTIFICATION_SETTINGS; |
+ buttonIndex = -1; |
+ } else { |
+ // 0 based array containing. |
+ // Button 1 |
+ // Button 2 (optional) |
+ // Settings |
+ NSNumber* actionIndex = |
+ [notification valueForKey:@"_alternateActionIndex"]; |
+ operation = (actionIndex.unsignedLongValue == alternateButtons.count - 1) |
+ ? NOTIFICATION_SETTINGS |
+ : NOTIFICATION_CLICK; |
+ buttonIndex = |
+ (actionIndex.unsignedLongValue == alternateButtons.count - 1) |
+ ? -1 |
+ : actionIndex.intValue; |
+ } |
+ } |
+ |
+ return @{ |
+ notification_constants::kNotificationOrigin : origin, |
+ notification_constants::kNotificationId : notificationId, |
+ notification_constants::kNotificationProfileId : profileId, |
+ notification_constants::kNotificationIncognito : incognito, |
+ notification_constants::kNotificationOperation : |
+ [NSNumber numberWithInt:operation], |
+ notification_constants:: |
+ kNotificationButtonIndex : [NSNumber numberWithInt:buttonIndex], |
+ }; |
+} |
+ |
+@end |