| 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 e96756be9d07f2003944297157bc9d80f3a2cb7c..c425102a105446cb416f3d5208b7734be58de682 100644
|
| --- a/chrome/browser/notifications/notification_platform_bridge_mac.mm
|
| +++ b/chrome/browser/notifications/notification_platform_bridge_mac.mm
|
| @@ -29,6 +29,11 @@
|
| #include "url/gurl.h"
|
| #include "url/origin.h"
|
|
|
| +#import "base/mac/bundle_locations.h"
|
| +#import "chrome/browser/ui/cocoa/notifications/notification_delivery.h"
|
| +#include "base/bind.h"
|
| +#include "base/bind_helpers.h"
|
| +
|
| @class NSUserNotification;
|
| @class NSUserNotificationCenter;
|
|
|
| @@ -74,6 +79,21 @@ void ProfileLoadedCallback(NotificationCommon::Operation operation,
|
| }
|
|
|
| } // namespace
|
| +void ProcessNotificationResponse(NotificationCommon::Operation operation,
|
| + NotificationCommon::Type type,
|
| + const std::string& profile_id,
|
| + bool incognito,
|
| + const std::string& origin,
|
| + const std::string& notification_id,
|
| + int32_t button_index) {
|
| + DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
|
| + ProfileManager* profileManager = g_browser_process->profile_manager();
|
| + DCHECK(profileManager);
|
| +
|
| + profileManager->LoadProfile(
|
| + profile_id, incognito, base::Bind(&ProfileLoadedCallback, operation, type,
|
| + origin, notification_id, button_index));
|
| +}
|
|
|
| // static
|
| NotificationPlatformBridge* NotificationPlatformBridge::Create() {
|
| @@ -93,7 +113,9 @@ NotificationPlatformBridge* NotificationPlatformBridge::Create() {
|
| NotificationPlatformBridgeMac::NotificationPlatformBridgeMac(
|
| NSUserNotificationCenter* notification_center)
|
| : delegate_([NotificationCenterDelegate alloc]),
|
| - notification_center_(notification_center) {
|
| + notification_center_(notification_center),
|
| + notification_remote_dispatcher_(
|
| + [[NotificationRemoteDispatcher alloc] init]) {
|
| [notification_center_ setDelegate:delegate_.get()];
|
| }
|
|
|
| @@ -168,8 +190,19 @@ void NotificationPlatformBridgeMac::Display(
|
| [builder setIncognito:incognito];
|
| [builder setNotificationType:[NSNumber numberWithInteger:notification_type]];
|
|
|
| - NSUserNotification* toast = [builder buildUserNotification];
|
| - [notification_center_ deliverNotification:toast];
|
| + NSLog(@"BUNDLE %@",
|
| + [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]);
|
| + NSLog(@"NOTIFICATION TYPE %@",
|
| + [[NSBundle mainBundle]
|
| + objectForInfoDictionaryKey:@"NSUserNotificationAlertStyle"]);
|
| + if (notification.never_timeout()) {
|
| + NSDictionary* dict = [builder buildDictionary];
|
| + [notification_remote_dispatcher_ dispatchNotification:dict];
|
| + } else {
|
| + LOG(WARNING) << "DELIVER NOTIFICATION";
|
| + NSUserNotification* toast = [builder buildUserNotification];
|
| + [notification_center_ deliverNotification:toast];
|
| + }
|
| }
|
|
|
| void NotificationPlatformBridgeMac::Close(const std::string& profile_id,
|
| @@ -327,7 +360,84 @@ bool NotificationPlatformBridgeMac::VerifyNotificationData(
|
| - (BOOL)userNotificationCenter:(NSUserNotificationCenter*)center
|
| shouldPresentNotification:(NSUserNotification*)nsNotification {
|
| // Always display notifications, regardless of whether the app is foreground.
|
| + LOG(WARNING) << "SHOULD PRESENT? ";
|
| return YES;
|
| }
|
|
|
| @end
|
| +
|
| +@implementation NotificationRemoteDispatcher
|
| +
|
| +@synthesize xpcConnection = _xpcConnection;
|
| +
|
| +- (instancetype)init {
|
| + // scoped ns object probably?
|
| + _xpcConnection = [[NSXPCConnection alloc]
|
| + initWithServiceName:[NSString
|
| + stringWithFormat:@"%@.AlertNotificationService",
|
| + [base::mac::OuterBundle()
|
| + bundleIdentifier]]];
|
| + _xpcConnection.remoteObjectInterface =
|
| + [NSXPCInterface interfaceWithProtocol:@protocol(NotificationDelivery)];
|
| + _xpcConnection.interruptionHandler = ^{
|
| + NSLog(@"conn interruptionHandler: %@", _xpcConnection);
|
| + };
|
| + _xpcConnection.invalidationHandler = ^{
|
| + NSLog(@"conn invalidationHandler %@", _xpcConnection);
|
| + };
|
| +
|
| + _xpcConnection.exportedInterface =
|
| + [NSXPCInterface interfaceWithProtocol:@protocol(NotificationReply)];
|
| + _xpcConnection.exportedObject = self;
|
| + [_xpcConnection resume];
|
| +
|
| + return self;
|
| +}
|
| +
|
| +- (void)dispatchNotification:(NSDictionary*)data {
|
| + LOG(WARNING) << "DISPATCHING XPC ALERT";
|
| +
|
| + [[_xpcConnection remoteObjectProxy] deliverNotification:data];
|
| +
|
| + //[conn invalidate];
|
| + //[conn release];
|
| +}
|
| +
|
| +// NotificationReply implementation
|
| +//// Need to merge with local on clicks.
|
| +- (void)notificationClick:(NSDictionary*)notificationResponseData {
|
| + NSLog(@"ALERT CLICKED AND RECEIVED BACK IN CHROME with %@",
|
| + notificationResponseData);
|
| + if (!NotificationPlatformBridgeMac::VerifyNotificationData(
|
| + notificationResponseData))
|
| + return;
|
| +
|
| + NSNumber* buttonIndex = [notificationResponseData
|
| + objectForKey:notification_constants::kNotificationButtonIndex];
|
| + NSNumber* operation = [notificationResponseData
|
| + objectForKey:notification_constants::kNotificationOperation];
|
| +
|
| + std::string notificationOrigin =
|
| + base::SysNSStringToUTF8([notificationResponseData
|
| + objectForKey:notification_constants::kNotificationOrigin]);
|
| + std::string notificationId = base::SysNSStringToUTF8([notificationResponseData
|
| + objectForKey:notification_constants::kNotificationId]);
|
| + std::string profileId = base::SysNSStringToUTF8([notificationResponseData
|
| + objectForKey:notification_constants::kNotificationProfileId]);
|
| + NSNumber* isIncognito = [notificationResponseData
|
| + objectForKey:notification_constants::kNotificationIncognito];
|
| + NSNumber* notificationType = [notificationResponseData
|
| + objectForKey:notification_constants::kNotificationType];
|
| +
|
| + content::BrowserThread::PostTask(
|
| + content::BrowserThread::UI, FROM_HERE,
|
| + base::Bind(ProcessNotificationResponse,
|
| + static_cast<NotificationCommon::Operation>(
|
| + operation.unsignedIntValue),
|
| + static_cast<NotificationCommon::Type>(
|
| + notificationType.unsignedIntValue),
|
| + profileId, [isIncognito boolValue], notificationOrigin,
|
| + notificationId, buttonIndex.intValue));
|
| +}
|
| +
|
| +@end
|
|
|