Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(102)

Unified Diff: chrome/browser/notifications/notification_ui_manager_mac.mm

Issue 1814923002: Nuke NotificationUIManager from PlatformNotificationServiceImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@profile_manager_load
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/notifications/notification_ui_manager_mac.mm
diff --git a/chrome/browser/notifications/notification_ui_manager_mac.mm b/chrome/browser/notifications/notification_ui_manager_mac.mm
index 74023f7ab5a65b090c1cc9c51b39b7b7c671b489..d25bf0faba1916689a9c527b1b56a768fd99216f 100644
--- a/chrome/browser/notifications/notification_ui_manager_mac.mm
+++ b/chrome/browser/notifications/notification_ui_manager_mac.mm
@@ -6,17 +6,17 @@
#include <utility>
-#include "base/command_line.h"
#include "base/mac/foundation_util.h"
#include "base/mac/mac_util.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/sys_string_conversions.h"
+#include "chrome/browser/browser_process.h"
#include "chrome/browser/notifications/notification.h"
+#include "chrome/browser/notifications/notification_display_service_factory.h"
#include "chrome/browser/notifications/persistent_notification_delegate.h"
#include "chrome/browser/notifications/platform_notification_service_impl.h"
#include "chrome/browser/profiles/profile.h"
#include "chrome/browser/profiles/profile_manager.h"
-#include "chrome/common/chrome_switches.h"
#include "chrome/grit/generated_resources.h"
#include "ui/base/l10n/l10n_util_mac.h"
#include "url/gurl.h"
@@ -46,62 +46,46 @@ namespace {
// native ones.
NSString* const kNotificationOriginKey = @"notification_origin";
NSString* const kNotificationPersistentIdKey = @"notification_persistent_id";
-NSString* const kNotificationDelegateIdKey = @"notification_delegate_id";
-// TODO(miguelg) get rid of this key once ProfileID has been ported
-// from the void* it is today to the stable identifier provided
-// in kNotificationProfilePersistentIdKey.
-NSString* const kNotificationProfileIdKey = @"notification_profile_id";
NSString* const kNotificationProfilePersistentIdKey =
@"notification_profile_persistent_id";
NSString* const kNotificationIncognitoKey = @"notification_incognito";
} // namespace
-// Only use native notifications for web, behind a flag and on 10.8+
// static
-NotificationUIManager*
-NotificationUIManager::CreateNativeNotificationManager() {
- if (base::CommandLine::ForCurrentProcess()->HasSwitch(
- switches::kEnableNativeNotifications) &&
- base::mac::IsOSMountainLionOrLater()) {
- return new NotificationUIManagerMac();
- }
- return nullptr;
+NotificationPlatformBridge* NotificationPlatformBridge::Create() {
+ return new NotificationUIManagerMac(
+ [NSUserNotificationCenter defaultUserNotificationCenter]);
}
// A Cocoa class that represents the delegate of NSUserNotificationCenter and
// can forward commands to C++.
@interface NotificationCenterDelegate
: NSObject<NSUserNotificationCenterDelegate> {
- @private
- NotificationUIManagerMac* manager_; // Weak, owns self.
}
-- (id)initWithManager:(NotificationUIManagerMac*)manager;
@end
// /////////////////////////////////////////////////////////////////////////////
-NotificationUIManagerMac::NotificationUIManagerMac()
- : delegate_([[NotificationCenterDelegate alloc] initWithManager:this]) {
- [[NSUserNotificationCenter defaultUserNotificationCenter]
- setDelegate:delegate_.get()];
+NotificationUIManagerMac::NotificationUIManagerMac(
+ NSUserNotificationCenter* notification_center)
+ : delegate_([NotificationCenterDelegate alloc]),
+ notification_center_(notification_center) {
+ [notification_center_ setDelegate:delegate_.get()];
}
NotificationUIManagerMac::~NotificationUIManagerMac() {
- [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:nil];
- CancelAll();
-}
+ [notification_center_ setDelegate:nil];
-void NotificationUIManagerMac::Add(const Notification& notification,
- Profile* profile) {
- // The Mac notification UI manager only supports Web Notifications, which
- // have a PersistentNotificationDelegate. The persistent id of the
- // notification is exposed through it's interface.
- PersistentNotificationDelegate* delegate =
- static_cast<PersistentNotificationDelegate*>(notification.delegate());
- DCHECK(delegate);
+ // TODO(miguelg) lift this restriction if possible.
+ [notification_center_ removeAllDeliveredNotifications];
+}
+void NotificationUIManagerMac::Display(const std::string& notification_id,
+ const std::string& profile_id,
+ bool incognito,
+ const Notification& notification) {
base::scoped_nsobject<NSUserNotification> toast(
[[NSUserNotification alloc] init]);
[toast setTitle:base::SysUTF16ToNSString(notification.title())];
@@ -109,13 +93,13 @@ void NotificationUIManagerMac::Add(const Notification& notification,
// TODO(miguelg): try to elide the origin perhaps See NSString
// stringWithFormat. It seems that the informativeText font is constant.
- NSString* informativeText =
+ NSString* informative_text =
notification.context_message().empty()
? base::SysUTF8ToNSString(notification.origin_url().spec())
: base::SysUTF16ToNSString(notification.context_message());
- [toast setInformativeText:informativeText];
+ [toast setInformativeText:informative_text];
- // Some functionality is only available in 10.9+ or requires private APIs
+ // Some functionality requires private APIs
// Icon
if ([toast respondsToSelector:@selector(_identityImage)] &&
!notification.icon().IsEmpty()) {
@@ -186,120 +170,63 @@ void NotificationUIManagerMac::Add(const Notification& notification,
}
}
- int64_t persistent_notification_id = delegate->persistent_notification_id();
- int64_t profile_id = reinterpret_cast<int64_t>(GetProfileID(profile));
-
toast.get().userInfo = @{
kNotificationOriginKey :
base::SysUTF8ToNSString(notification.origin_url().spec()),
- kNotificationPersistentIdKey :
- [NSNumber numberWithLongLong:persistent_notification_id],
- kNotificationDelegateIdKey :
- base::SysUTF8ToNSString(notification.delegate_id()),
- kNotificationProfileIdKey : [NSNumber numberWithLongLong:profile_id],
- kNotificationProfilePersistentIdKey :
- base::SysUTF8ToNSString(profile->GetPath().BaseName().value()),
- kNotificationIncognitoKey :
- [NSNumber numberWithBool:profile->IsOffTheRecord()]
+ kNotificationPersistentIdKey : base::SysUTF8ToNSString(notification_id),
+ kNotificationProfilePersistentIdKey : base::SysUTF8ToNSString(profile_id),
+ kNotificationIncognitoKey : [NSNumber numberWithBool:incognito]
};
- [[NSUserNotificationCenter defaultUserNotificationCenter]
- deliverNotification:toast];
+ [notification_center_ deliverNotification:toast];
+ notification.delegate()->Display();
}
-bool NotificationUIManagerMac::Update(const Notification& notification,
- Profile* profile) {
- NOTREACHED();
- return false;
-}
+void NotificationUIManagerMac::Close(const std::string& profile_id,
+ const std::string& notification_id) {
+ NSString* candidate_id = base::SysUTF8ToNSString(notification_id);
-const Notification* NotificationUIManagerMac::FindById(
- const std::string& delegate_id,
- ProfileID profile_id) const {
- NOTREACHED();
- return nil;
-}
-
-bool NotificationUIManagerMac::CancelById(const std::string& delegate_id,
- ProfileID profile_id) {
- int64_t persistent_notification_id = 0;
- // TODO(peter): Use the |delegate_id| directly when notification ids are being
- // generated by content/ instead of us.
- if (!base::StringToInt64(delegate_id, &persistent_notification_id))
- return false;
-
- NSUserNotificationCenter* notificationCenter =
- [NSUserNotificationCenter defaultUserNotificationCenter];
+ NSString* current_profile_id = base::SysUTF8ToNSString(profile_id);
for (NSUserNotification* toast in
- [notificationCenter deliveredNotifications]) {
- NSNumber* toast_id =
+ [notification_center_ deliveredNotifications]) {
+ NSString* toast_id =
[toast.userInfo objectForKey:kNotificationPersistentIdKey];
- if (toast_id.longLongValue == persistent_notification_id) {
- [notificationCenter removeDeliveredNotification:toast];
- return true;
- }
- }
- return false;
-}
+ NSString* persistent_profile_id =
+ [toast.userInfo objectForKey:kNotificationProfilePersistentIdKey];
-std::set<std::string>
-NotificationUIManagerMac::GetAllIdsByProfileAndSourceOrigin(
- ProfileID profile_id,
- const GURL& source) {
- NOTREACHED();
- return std::set<std::string>();
+ if (toast_id == candidate_id &&
+ persistent_profile_id == current_profile_id) {
+ [notification_center_ removeDeliveredNotification:toast];
+ }
+ }
}
-std::set<std::string> NotificationUIManagerMac::GetAllIdsByProfile(
- ProfileID profile_id) {
- // ProfileID in mac is not safe to use across browser restarts
- // Therefore because when chrome quits we cancel all pending notifications.
- // TODO(miguelg) get rid of ProfileID as a void* for native notifications.
- std::set<std::string> delegate_ids;
- NSUserNotificationCenter* notificationCenter =
- [NSUserNotificationCenter defaultUserNotificationCenter];
+bool NotificationUIManagerMac::GetDisplayed(
+ const std::string& profile_id,
+ bool incognito,
+ std::set<std::string>* notifications) const {
+ DCHECK(notifications);
+ NSString* current_profile_id = base::SysUTF8ToNSString(profile_id);
for (NSUserNotification* toast in
- [notificationCenter deliveredNotifications]) {
- NSNumber* toast_profile_id =
- [toast.userInfo objectForKey:kNotificationProfileIdKey];
- if (toast_profile_id.longLongValue ==
- reinterpret_cast<int64_t>(profile_id)) {
- delegate_ids.insert(base::SysNSStringToUTF8(
- [toast.userInfo objectForKey:kNotificationDelegateIdKey]));
+ [notification_center_ deliveredNotifications]) {
+ NSString* toast_profile_id =
+ [toast.userInfo objectForKey:kNotificationProfilePersistentIdKey];
+ if (toast_profile_id == current_profile_id) {
+ notifications->insert(base::SysNSStringToUTF8(
+ [toast.userInfo objectForKey:kNotificationPersistentIdKey]));
}
}
- return delegate_ids;
-}
-
-bool NotificationUIManagerMac::CancelAllBySourceOrigin(
- const GURL& source_origin) {
- NOTREACHED();
- return false;
-}
-
-bool NotificationUIManagerMac::CancelAllByProfile(ProfileID profile_id) {
- NOTREACHED();
- return false;
+ return true;
}
-void NotificationUIManagerMac::CancelAll() {
- [[NSUserNotificationCenter defaultUserNotificationCenter]
- removeAllDeliveredNotifications];
+bool NotificationUIManagerMac::SupportsNotificationCenter() const {
+ return true;
}
// /////////////////////////////////////////////////////////////////////////////
@implementation NotificationCenterDelegate
-
-- (id)initWithManager:(NotificationUIManagerMac*)manager {
- if ((self = [super init])) {
- DCHECK(manager);
- manager_ = manager;
- }
- return self;
-}
-
- (void)userNotificationCenter:(NSUserNotificationCenter*)center
didActivateNotification:(NSUserNotification*)notification {
std::string notificationOrigin = base::SysNSStringToUTF8(

Powered by Google App Engine
This is Rietveld 408576698