| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/notifications/notification_platform_bridge_mac.h" | 5 #include "chrome/browser/notifications/notification_platform_bridge_mac.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
| 11 #include "base/callback.h" |
| 11 #include "base/mac/bundle_locations.h" | 12 #include "base/mac/bundle_locations.h" |
| 12 #include "base/mac/foundation_util.h" | 13 #include "base/mac/foundation_util.h" |
| 13 #include "base/mac/mac_util.h" | 14 #include "base/mac/mac_util.h" |
| 14 #include "base/mac/scoped_mach_port.h" | 15 #include "base/mac/scoped_mach_port.h" |
| 15 #include "base/mac/scoped_nsobject.h" | 16 #include "base/mac/scoped_nsobject.h" |
| 16 #include "base/strings/nullable_string16.h" | 17 #include "base/strings/nullable_string16.h" |
| 17 #include "base/strings/string_number_conversions.h" | 18 #include "base/strings/string_number_conversions.h" |
| 18 #include "base/strings/sys_string_conversions.h" | 19 #include "base/strings/sys_string_conversions.h" |
| 19 #include "chrome/browser/browser_process.h" | 20 #include "chrome/browser/browser_process.h" |
| 20 #include "chrome/browser/notifications/native_notification_display_service.h" | 21 #include "chrome/browser/notifications/native_notification_display_service.h" |
| (...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 269 #if BUILDFLAG(ENABLE_XPC_NOTIFICATIONS) | 270 #if BUILDFLAG(ENABLE_XPC_NOTIFICATIONS) |
| 270 // If no banner existed with that ID try to see if there is an alert | 271 // If no banner existed with that ID try to see if there is an alert |
| 271 // in the xpc server. | 272 // in the xpc server. |
| 272 if (!notification_removed) { | 273 if (!notification_removed) { |
| 273 [alert_dispatcher_ closeNotificationWithId:candidate_id | 274 [alert_dispatcher_ closeNotificationWithId:candidate_id |
| 274 withProfileId:current_profile_id]; | 275 withProfileId:current_profile_id]; |
| 275 } | 276 } |
| 276 #endif // ENABLE_XPC_NOTIFICATIONS | 277 #endif // ENABLE_XPC_NOTIFICATIONS |
| 277 } | 278 } |
| 278 | 279 |
| 279 bool NotificationPlatformBridgeMac::GetDisplayed( | 280 void NotificationPlatformBridgeMac::GetDisplayed( |
| 280 const std::string& profile_id, | 281 const std::string& profile_id, |
| 281 bool incognito, | 282 bool incognito, |
| 282 std::set<std::string>* notifications) const { | 283 const DisplayedNotificationsCallback& callback) const { |
| 283 DCHECK(notifications); | 284 auto displayed_notifications = base::MakeUnique<std::set<std::string>>(); |
| 284 | |
| 285 NSString* current_profile_id = base::SysUTF8ToNSString(profile_id); | 285 NSString* current_profile_id = base::SysUTF8ToNSString(profile_id); |
| 286 for (NSUserNotification* toast in | 286 for (NSUserNotification* toast in |
| 287 [notification_center_ deliveredNotifications]) { | 287 [notification_center_ deliveredNotifications]) { |
| 288 NSString* toast_profile_id = [toast.userInfo | 288 NSString* toast_profile_id = [toast.userInfo |
| 289 objectForKey:notification_constants::kNotificationProfileId]; | 289 objectForKey:notification_constants::kNotificationProfileId]; |
| 290 if ([toast_profile_id isEqualToString:current_profile_id]) { | 290 if ([toast_profile_id isEqualToString:current_profile_id]) { |
| 291 notifications->insert(base::SysNSStringToUTF8([toast.userInfo | 291 displayed_notifications->insert(base::SysNSStringToUTF8([toast.userInfo |
| 292 objectForKey:notification_constants::kNotificationId])); | 292 objectForKey:notification_constants::kNotificationId])); |
| 293 } | 293 } |
| 294 } | 294 } |
| 295 return true; | 295 content::BrowserThread::PostTask( |
| 296 content::BrowserThread::UI, FROM_HERE, |
| 297 base::Bind(callback, base::Passed(&displayed_notifications), |
| 298 true /* supports_synchronization */)); |
| 296 } | 299 } |
| 297 | 300 |
| 298 // static | 301 // static |
| 299 void NotificationPlatformBridgeMac::ProcessNotificationResponse( | 302 void NotificationPlatformBridgeMac::ProcessNotificationResponse( |
| 300 NSDictionary* response) { | 303 NSDictionary* response) { |
| 301 if (!NotificationPlatformBridgeMac::VerifyNotificationData(response)) | 304 if (!NotificationPlatformBridgeMac::VerifyNotificationData(response)) |
| 302 return; | 305 return; |
| 303 | 306 |
| 304 NSNumber* button_index = | 307 NSNumber* button_index = |
| 305 [response objectForKey:notification_constants::kNotificationButtonIndex]; | 308 [response objectForKey:notification_constants::kNotificationButtonIndex]; |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 481 withProfileId:(NSString*)profileId { | 484 withProfileId:(NSString*)profileId { |
| 482 [[self serviceProxy] closeNotificationWithId:notificationId | 485 [[self serviceProxy] closeNotificationWithId:notificationId |
| 483 withProfileId:profileId]; | 486 withProfileId:profileId]; |
| 484 } | 487 } |
| 485 | 488 |
| 486 - (void)closeAllNotifications { | 489 - (void)closeAllNotifications { |
| 487 [[self serviceProxy] closeAllNotifications]; | 490 [[self serviceProxy] closeAllNotifications]; |
| 488 } | 491 } |
| 489 | 492 |
| 490 // NotificationReply: | 493 // NotificationReply: |
| 491 | |
| 492 - (void)notificationClick:(NSDictionary*)notificationResponseData { | 494 - (void)notificationClick:(NSDictionary*)notificationResponseData { |
| 493 NotificationPlatformBridgeMac::ProcessNotificationResponse( | 495 NotificationPlatformBridgeMac::ProcessNotificationResponse( |
| 494 notificationResponseData); | 496 notificationResponseData); |
| 495 } | 497 } |
| 496 | 498 |
| 497 // Private methods: | 499 // Private methods: |
| 498 | 500 |
| 499 // Retrieves the connection's remoteObjectProxy. Always use this as opposed | 501 // Retrieves the connection's remoteObjectProxy. Always use this as opposed |
| 500 // to going directly through the connection, since this will ensure that the | 502 // to going directly through the connection, since this will ensure that the |
| 501 // service has its exception port configured for crash reporting. | 503 // service has its exception port configured for crash reporting. |
| 502 - (id<NotificationDelivery>)serviceProxy { | 504 - (id<NotificationDelivery>)serviceProxy { |
| 503 id<NotificationDelivery> proxy = [xpcConnection_ remoteObjectProxy]; | 505 id<NotificationDelivery> proxy = [xpcConnection_ remoteObjectProxy]; |
| 504 | 506 |
| 505 if (!setExceptionPort_) { | 507 if (!setExceptionPort_) { |
| 506 base::mac::ScopedMachSendRight exceptionPort( | 508 base::mac::ScopedMachSendRight exceptionPort( |
| 507 crash_reporter::GetCrashpadClient().GetHandlerMachPort()); | 509 crash_reporter::GetCrashpadClient().GetHandlerMachPort()); |
| 508 base::scoped_nsobject<CrXPCMachPort> xpcPort( | 510 base::scoped_nsobject<CrXPCMachPort> xpcPort( |
| 509 [[CrXPCMachPort alloc] initWithMachSendRight:std::move(exceptionPort)]); | 511 [[CrXPCMachPort alloc] initWithMachSendRight:std::move(exceptionPort)]); |
| 510 [proxy setMachExceptionPort:xpcPort]; | 512 [proxy setMachExceptionPort:xpcPort]; |
| 511 setExceptionPort_ = YES; | 513 setExceptionPort_ = YES; |
| 512 } | 514 } |
| 513 | 515 |
| 514 return proxy; | 516 return proxy; |
| 515 } | 517 } |
| 516 | 518 |
| 517 @end | 519 @end |
| OLD | NEW |