| 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/push_messaging/push_messaging_notification_manager.h" | 5 #include "chrome/browser/push_messaging/push_messaging_notification_manager.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 | 8 |
| 9 #include <bitset> | 9 #include <bitset> |
| 10 | 10 |
| (...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 164 } | 164 } |
| 165 | 165 |
| 166 // If more than one notification is showing for this Service Worker, close | 166 // If more than one notification is showing for this Service Worker, close |
| 167 // the default notification if it happens to be part of this group. | 167 // the default notification if it happens to be part of this group. |
| 168 if (notification_count >= 2) { | 168 if (notification_count >= 2) { |
| 169 for (const auto& notification_database_data : data) { | 169 for (const auto& notification_database_data : data) { |
| 170 if (notification_database_data.notification_data.tag != | 170 if (notification_database_data.notification_data.tag != |
| 171 kPushMessagingForcedNotificationTag) | 171 kPushMessagingForcedNotificationTag) |
| 172 continue; | 172 continue; |
| 173 | 173 |
| 174 scoped_refptr<PlatformNotificationContext> notification_context = |
| 175 GetStoragePartition(profile_, origin) |
| 176 ->GetPlatformNotificationContext(); |
| 177 |
| 178 const std::string notification_id = |
| 179 notification_context->GenerateNotificationId( |
| 180 origin, kPushMessagingForcedNotificationTag, |
| 181 notification_database_data.notification_id); |
| 182 |
| 174 PlatformNotificationServiceImpl* platform_notification_service = | 183 PlatformNotificationServiceImpl* platform_notification_service = |
| 175 PlatformNotificationServiceImpl::GetInstance(); | 184 PlatformNotificationServiceImpl::GetInstance(); |
| 176 | 185 |
| 177 // First close the notification for the user's point of view, and then | 186 // First close the notification for the user's point of view, and then |
| 178 // manually tell the service that the notification has been closed in | 187 // manually tell the service that the notification has been closed in |
| 179 // order to avoid duplicating the thread-jump logic. | 188 // order to avoid duplicating the thread-jump logic. |
| 180 platform_notification_service->ClosePersistentNotification( | 189 platform_notification_service->ClosePersistentNotification( |
| 181 profile_, notification_database_data.notification_id); | 190 profile_, notification_id); |
| 182 platform_notification_service->OnPersistentNotificationClose( | 191 platform_notification_service->OnPersistentNotificationClose( |
| 183 profile_, notification_database_data.notification_id, | 192 profile_, notification_id, notification_database_data.origin, |
| 184 notification_database_data.origin, false /* by_user */); | 193 false /* by_user */); |
| 185 | 194 |
| 186 break; | 195 break; |
| 187 } | 196 } |
| 188 } | 197 } |
| 189 | 198 |
| 190 // Get the budget for the origin. | 199 // Get the budget for the origin. |
| 191 BudgetManager* manager = BudgetManagerFactory::GetForProfile(profile_); | 200 BudgetManager* manager = BudgetManagerFactory::GetForProfile(profile_); |
| 192 manager->GetBudget( | 201 manager->GetBudget( |
| 193 origin, | 202 origin, |
| 194 base::Bind(&PushMessagingNotificationManager::DidGetBudget, | 203 base::Bind(&PushMessagingNotificationManager::DidGetBudget, |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 321 message_handled_closure))); | 330 message_handled_closure))); |
| 322 } | 331 } |
| 323 | 332 |
| 324 // static | 333 // static |
| 325 void PushMessagingNotificationManager::DidWriteNotificationDataIOProxy( | 334 void PushMessagingNotificationManager::DidWriteNotificationDataIOProxy( |
| 326 const base::WeakPtr<PushMessagingNotificationManager>& ui_weak_ptr, | 335 const base::WeakPtr<PushMessagingNotificationManager>& ui_weak_ptr, |
| 327 const GURL& origin, | 336 const GURL& origin, |
| 328 const PlatformNotificationData& notification_data, | 337 const PlatformNotificationData& notification_data, |
| 329 const base::Closure& message_handled_closure, | 338 const base::Closure& message_handled_closure, |
| 330 bool success, | 339 bool success, |
| 331 int64_t persistent_notification_id) { | 340 const std::string& notification_id) { |
| 332 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 341 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 333 BrowserThread::PostTask( | 342 BrowserThread::PostTask( |
| 334 BrowserThread::UI, FROM_HERE, | 343 BrowserThread::UI, FROM_HERE, |
| 335 base::Bind(&PushMessagingNotificationManager::DidWriteNotificationData, | 344 base::Bind(&PushMessagingNotificationManager::DidWriteNotificationData, |
| 336 ui_weak_ptr, origin, notification_data, | 345 ui_weak_ptr, origin, notification_data, |
| 337 message_handled_closure, success, persistent_notification_id)); | 346 message_handled_closure, success, notification_id)); |
| 338 } | 347 } |
| 339 | 348 |
| 340 void PushMessagingNotificationManager::DidWriteNotificationData( | 349 void PushMessagingNotificationManager::DidWriteNotificationData( |
| 341 const GURL& origin, | 350 const GURL& origin, |
| 342 const PlatformNotificationData& notification_data, | 351 const PlatformNotificationData& notification_data, |
| 343 const base::Closure& message_handled_closure, | 352 const base::Closure& message_handled_closure, |
| 344 bool success, | 353 bool success, |
| 345 int64_t persistent_notification_id) { | 354 const std::string& notification_id) { |
| 346 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 355 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 347 if (!success) { | 356 if (!success) { |
| 348 DLOG(ERROR) << "Writing forced notification to database should not fail"; | 357 DLOG(ERROR) << "Writing forced notification to database should not fail"; |
| 349 message_handled_closure.Run(); | 358 message_handled_closure.Run(); |
| 350 return; | 359 return; |
| 351 } | 360 } |
| 352 | 361 |
| 353 // Do not pass service worker scope. The origin will be used instead of the | 362 // Do not pass service worker scope. The origin will be used instead of the |
| 354 // service worker scope to determine whether a notification should be | 363 // service worker scope to determine whether a notification should be |
| 355 // attributed to a WebAPK on Android. This is OK because this code path is hit | 364 // attributed to a WebAPK on Android. This is OK because this code path is hit |
| 356 // rarely. | 365 // rarely. |
| 357 PlatformNotificationServiceImpl::GetInstance()->DisplayPersistentNotification( | 366 PlatformNotificationServiceImpl::GetInstance()->DisplayPersistentNotification( |
| 358 profile_, persistent_notification_id, GURL() /* service_worker_scope */, | 367 profile_, notification_id, GURL() /* service_worker_scope */, origin, |
| 359 origin, notification_data, NotificationResources()); | 368 notification_data, NotificationResources()); |
| 360 | 369 |
| 361 message_handled_closure.Run(); | 370 message_handled_closure.Run(); |
| 362 } | 371 } |
| OLD | NEW |