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

Side by Side Diff: chrome/browser/notifications/platform_notification_service_impl.cc

Issue 2093953002: Introduce a new API to handle native notification clicks (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: nits Created 4 years, 5 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/platform_notification_service_impl.h" 5 #include "chrome/browser/notifications/platform_notification_service_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/command_line.h" 10 #include "base/command_line.h"
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after
74 namespace { 74 namespace {
75 75
76 // Invalid id for a renderer process. Used in cases where we need to check for 76 // Invalid id for a renderer process. Used in cases where we need to check for
77 // permission without having an associated renderer process yet. 77 // permission without having an associated renderer process yet.
78 const int kInvalidRenderProcessId = -1; 78 const int kInvalidRenderProcessId = -1;
79 79
80 void OnCloseNonPersistentNotificationProfileLoaded( 80 void OnCloseNonPersistentNotificationProfileLoaded(
81 const std::string& notification_id, 81 const std::string& notification_id,
82 Profile* profile) { 82 Profile* profile) {
83 NotificationDisplayServiceFactory::GetForProfile(profile)->Close( 83 NotificationDisplayServiceFactory::GetForProfile(profile)->Close(
84 notification_id); 84 NotificationCommon::NON_PERSISTENT, notification_id);
85 }
86
87 // Callback to run once the profile has been loaded in order to perform a
88 // given |operation| in a notification.
89 void ProfileLoadedCallback(NotificationCommon::Operation operation,
90 const GURL& origin,
91 int64_t persistent_notification_id,
92 int action_index,
93 Profile* profile) {
94 if (!profile) {
95 // TODO(miguelg): Add UMA for this condition.
96 // Perhaps propagate this through PersistentNotificationStatus.
97 LOG(WARNING) << "Profile not loaded correctly";
98 return;
99 }
100
101 switch (operation) {
102 case NotificationCommon::CLICK:
103 PlatformNotificationServiceImpl::GetInstance()
104 ->OnPersistentNotificationClick(profile, persistent_notification_id,
105 origin, action_index);
106 break;
107 case NotificationCommon::CLOSE:
108 PlatformNotificationServiceImpl::GetInstance()
109 ->OnPersistentNotificationClose(profile, persistent_notification_id,
110 origin, true);
111 break;
112 case NotificationCommon::SETTINGS:
113 NotificationCommon::OpenNotificationSettings(profile);
114 break;
115 }
116 } 85 }
117 86
118 // Callback used to close an non-persistent notification from blink. 87 // Callback used to close an non-persistent notification from blink.
119 void CancelNotification(const std::string& notification_id, 88 void CancelNotification(const std::string& notification_id,
120 std::string profile_id, 89 std::string profile_id,
121 bool incognito) { 90 bool incognito) {
122 ProfileManager* profile_manager = g_browser_process->profile_manager(); 91 ProfileManager* profile_manager = g_browser_process->profile_manager();
123 DCHECK(profile_manager); 92 DCHECK(profile_manager);
124 profile_manager->LoadProfile( 93 profile_manager->LoadProfile(
125 profile_id, incognito, 94 profile_id, incognito,
(...skipping 11 matching lines...) Expand all
137 106
138 PlatformNotificationServiceImpl::PlatformNotificationServiceImpl() 107 PlatformNotificationServiceImpl::PlatformNotificationServiceImpl()
139 : test_display_service_(nullptr) { 108 : test_display_service_(nullptr) {
140 #if BUILDFLAG(ENABLE_BACKGROUND) 109 #if BUILDFLAG(ENABLE_BACKGROUND)
141 pending_click_dispatch_events_ = 0; 110 pending_click_dispatch_events_ = 0;
142 #endif 111 #endif
143 } 112 }
144 113
145 PlatformNotificationServiceImpl::~PlatformNotificationServiceImpl() {} 114 PlatformNotificationServiceImpl::~PlatformNotificationServiceImpl() {}
146 115
147 void PlatformNotificationServiceImpl::ProcessPersistentNotificationOperation(
148 NotificationCommon::Operation operation,
149 const std::string& profile_id,
150 bool incognito,
151 const GURL& origin,
152 int64_t persistent_notification_id,
153 int action_index) {
154 ProfileManager* profile_manager = g_browser_process->profile_manager();
155 DCHECK(profile_manager);
156
157 profile_manager->LoadProfile(
158 profile_id, incognito,
159 base::Bind(&ProfileLoadedCallback, operation, origin,
160 persistent_notification_id, action_index));
161 }
162
163 void PlatformNotificationServiceImpl::OnPersistentNotificationClick( 116 void PlatformNotificationServiceImpl::OnPersistentNotificationClick(
164 BrowserContext* browser_context, 117 BrowserContext* browser_context,
165 int64_t persistent_notification_id, 118 int64_t persistent_notification_id,
166 const GURL& origin, 119 const GURL& origin,
167 int action_index) { 120 int action_index) {
168 DCHECK_CURRENTLY_ON(BrowserThread::UI); 121 DCHECK_CURRENTLY_ON(BrowserThread::UI);
169 blink::mojom::PermissionStatus permission_status = 122 blink::mojom::PermissionStatus permission_status =
170 CheckPermissionOnUIThread(browser_context, origin, 123 CheckPermissionOnUIThread(browser_context, origin,
171 kInvalidRenderProcessId); 124 kInvalidRenderProcessId);
172 125
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 283
331 Profile* profile = Profile::FromBrowserContext(browser_context); 284 Profile* profile = Profile::FromBrowserContext(browser_context);
332 DCHECK(profile); 285 DCHECK(profile);
333 DCHECK_EQ(0u, notification_data.actions.size()); 286 DCHECK_EQ(0u, notification_data.actions.size());
334 DCHECK_EQ(0u, notification_resources.action_icons.size()); 287 DCHECK_EQ(0u, notification_resources.action_icons.size());
335 288
336 NotificationObjectProxy* proxy = 289 NotificationObjectProxy* proxy =
337 new NotificationObjectProxy(browser_context, std::move(delegate)); 290 new NotificationObjectProxy(browser_context, std::move(delegate));
338 Notification notification = CreateNotificationFromData( 291 Notification notification = CreateNotificationFromData(
339 profile, origin, notification_data, notification_resources, proxy); 292 profile, origin, notification_data, notification_resources, proxy);
340 GetNotificationDisplayService(profile)->Display(notification.delegate_id(), 293
341 notification); 294 GetNotificationDisplayService(profile)->Display(
295 NotificationCommon::NON_PERSISTENT, notification.delegate_id(),
296 notification);
342 if (cancel_callback) { 297 if (cancel_callback) {
343 #if defined(OS_WIN) 298 #if defined(OS_WIN)
344 std::string profile_id = 299 std::string profile_id =
345 base::WideToUTF8(profile->GetPath().BaseName().value()); 300 base::WideToUTF8(profile->GetPath().BaseName().value());
346 #elif defined(OS_POSIX) 301 #elif defined(OS_POSIX)
347 std::string profile_id = profile->GetPath().BaseName().value(); 302 std::string profile_id = profile->GetPath().BaseName().value();
348 #endif 303 #endif
349 *cancel_callback = 304 *cancel_callback =
350 base::Bind(&CancelNotification, notification.delegate_id(), profile_id, 305 base::Bind(&CancelNotification, notification.delegate_id(), profile_id,
351 profile->IsOffTheRecord()); 306 profile->IsOffTheRecord());
(...skipping 22 matching lines...) Expand all
374 settings_button_index); 329 settings_button_index);
375 330
376 Notification notification = CreateNotificationFromData( 331 Notification notification = CreateNotificationFromData(
377 profile, origin, notification_data, notification_resources, delegate); 332 profile, origin, notification_data, notification_resources, delegate);
378 333
379 // TODO(peter): Remove this mapping when we have reliable id generation for 334 // TODO(peter): Remove this mapping when we have reliable id generation for
380 // the message_center::Notification objects. 335 // the message_center::Notification objects.
381 persistent_notifications_[persistent_notification_id] = notification.id(); 336 persistent_notifications_[persistent_notification_id] = notification.id();
382 337
383 GetNotificationDisplayService(profile)->Display( 338 GetNotificationDisplayService(profile)->Display(
339 NotificationCommon::PERSISTENT,
384 base::Int64ToString(delegate->persistent_notification_id()), 340 base::Int64ToString(delegate->persistent_notification_id()),
385 notification); 341 notification);
386 content::RecordAction( 342 content::RecordAction(
387 base::UserMetricsAction("Notifications.Persistent.Shown")); 343 base::UserMetricsAction("Notifications.Persistent.Shown"));
388 344
389 HostContentSettingsMapFactory::GetForProfile(profile)->UpdateLastUsage( 345 HostContentSettingsMapFactory::GetForProfile(profile)->UpdateLastUsage(
390 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS); 346 origin, origin, CONTENT_SETTINGS_TYPE_NOTIFICATIONS);
391 } 347 }
392 348
393 void PlatformNotificationServiceImpl::ClosePersistentNotification( 349 void PlatformNotificationServiceImpl::ClosePersistentNotification(
(...skipping 10 matching lines...) Expand all
404 bool cancel_by_persistent_id = true; 360 bool cancel_by_persistent_id = true;
405 #else 361 #else
406 bool cancel_by_persistent_id = 362 bool cancel_by_persistent_id =
407 GetNotificationDisplayService(profile)->SupportsNotificationCenter(); 363 GetNotificationDisplayService(profile)->SupportsNotificationCenter();
408 #endif 364 #endif
409 365
410 if (cancel_by_persistent_id) { 366 if (cancel_by_persistent_id) {
411 // TODO(peter): Remove this conversion when the notification ids are being 367 // TODO(peter): Remove this conversion when the notification ids are being
412 // generated by the caller of this method. 368 // generated by the caller of this method.
413 GetNotificationDisplayService(profile)->Close( 369 GetNotificationDisplayService(profile)->Close(
370 NotificationCommon::PERSISTENT,
414 base::Int64ToString(persistent_notification_id)); 371 base::Int64ToString(persistent_notification_id));
415 } else { 372 } else {
416 auto iter = persistent_notifications_.find(persistent_notification_id); 373 auto iter = persistent_notifications_.find(persistent_notification_id);
417 if (iter == persistent_notifications_.end()) 374 if (iter == persistent_notifications_.end())
418 return; 375 return;
419 GetNotificationDisplayService(profile)->Close(iter->second); 376 GetNotificationDisplayService(profile)->Close(
377 NotificationCommon::PERSISTENT, iter->second);
420 } 378 }
421 379
422 persistent_notifications_.erase(persistent_notification_id); 380 persistent_notifications_.erase(persistent_notification_id);
423 } 381 }
424 382
425 bool PlatformNotificationServiceImpl::GetDisplayedPersistentNotifications( 383 bool PlatformNotificationServiceImpl::GetDisplayedPersistentNotifications(
426 BrowserContext* browser_context, 384 BrowserContext* browser_context,
427 std::set<std::string>* displayed_notifications) { 385 std::set<std::string>* displayed_notifications) {
428 DCHECK(displayed_notifications); 386 DCHECK(displayed_notifications);
429 387
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
538 } 496 }
539 #endif 497 #endif
540 498
541 return base::string16(); 499 return base::string16();
542 } 500 }
543 501
544 void PlatformNotificationServiceImpl::SetNotificationDisplayServiceForTesting( 502 void PlatformNotificationServiceImpl::SetNotificationDisplayServiceForTesting(
545 NotificationDisplayService* display_service) { 503 NotificationDisplayService* display_service) {
546 test_display_service_ = display_service; 504 test_display_service_ = display_service;
547 } 505 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698