Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "content/browser/notifications/notification_event_dispatcher_impl.h" | 5 #include "content/browser/notifications/notification_event_dispatcher_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
| 9 #include "content/browser/notifications/platform_notification_context_impl.h" | 9 #include "content/browser/notifications/platform_notification_context_impl.h" |
| 10 #include "content/browser/service_worker/service_worker_context_wrapper.h" | 10 #include "content/browser/service_worker/service_worker_context_wrapper.h" |
| 11 #include "content/browser/service_worker/service_worker_registration.h" | 11 #include "content/browser/service_worker/service_worker_registration.h" |
| 12 #include "content/browser/service_worker/service_worker_storage.h" | 12 #include "content/browser/service_worker/service_worker_storage.h" |
| 13 #include "content/common/service_worker/service_worker_messages.h" | 13 #include "content/common/service_worker/service_worker_messages.h" |
| 14 #include "content/public/browser/browser_context.h" | 14 #include "content/public/browser/browser_context.h" |
| 15 #include "content/public/browser/browser_thread.h" | 15 #include "content/public/browser/browser_thread.h" |
| 16 #include "content/public/browser/notification_database_data.h" | |
| 17 #include "content/public/browser/storage_partition.h" | 16 #include "content/public/browser/storage_partition.h" |
| 18 #include "content/public/common/platform_notification_data.h" | 17 #include "content/public/common/platform_notification_data.h" |
| 19 | 18 |
| 20 namespace content { | 19 namespace content { |
| 21 namespace { | 20 namespace { |
| 22 | 21 |
| 23 using NotificationClickDispatchCompleteCallback = | 22 using NotificationDispatchCompleteCallback = |
| 24 NotificationEventDispatcher::NotificationClickDispatchCompleteCallback; | 23 NotificationEventDispatcher::NotificationDispatchCompleteCallback; |
| 24 using NotificationActionCallback = | |
|
Peter Beverloo
2016/01/28 16:14:23
One thing to consider - "notification action" coul
Nina
2016/02/01 17:59:06
Done.
| |
| 25 base::Callback<void(const ServiceWorkerRegistration*, | |
| 26 const NotificationDatabaseData&)>; | |
| 27 using NotificationActionCallbackWithContext = | |
| 28 base::Callback<void(scoped_refptr<PlatformNotificationContext>, | |
| 29 const ServiceWorkerRegistration*, | |
| 30 const NotificationDatabaseData&)>; | |
| 25 | 31 |
| 26 // To be called when the notificationclick event has finished executing. Will | 32 // To be called when a notification event has finished executing. Will post a |
| 27 // post a task to call |dispatch_complete_callback| on the UI thread. | 33 // task to call |dispatch_complete_callback| on the UI thread. |
| 28 void NotificationClickEventFinished( | 34 void NotificationEventFinished( |
| 29 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 35 const NotificationDispatchCompleteCallback& dispatch_complete_callback, |
| 30 const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, | 36 PersistentNotificationStatus status) { |
| 31 ServiceWorkerStatusCode service_worker_status) { | |
| 32 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 37 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 33 | 38 |
| 39 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 40 base::Bind(dispatch_complete_callback, status)); | |
| 41 } | |
| 42 | |
| 43 // To be called when a notification event has finished with a | |
| 44 // ServiceWorkerStatusCode result. Will call NotificationEventFinished with a | |
| 45 // PersistentNotificationStatus derived from the service worker status. | |
| 46 void ServiceWorkerNotificationEventFinished( | |
| 47 const NotificationDispatchCompleteCallback& dispatch_complete_callback, | |
| 48 ServiceWorkerStatusCode service_worker_status) { | |
| 34 #if defined(OS_ANDROID) | 49 #if defined(OS_ANDROID) |
| 35 // This LOG(INFO) deliberately exists to help track down the cause of | 50 // This LOG(INFO) deliberately exists to help track down the cause of |
| 36 // https://crbug.com/534537, where notifications sometimes do not react to | 51 // https://crbug.com/534537, where notifications sometimes do not react to |
| 37 // the user clicking on them. It should be removed once that's fixed. | 52 // the user clicking on them. It should be removed once that's fixed. |
| 38 LOG(INFO) << "The notificationclick event has finished: " | 53 LOG(INFO) << "The notification event has finished: " << service_worker_status; |
| 39 << service_worker_status; | |
| 40 #endif | 54 #endif |
| 41 | 55 |
| 42 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; | 56 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; |
| 43 switch (service_worker_status) { | 57 switch (service_worker_status) { |
| 44 case SERVICE_WORKER_OK: | 58 case SERVICE_WORKER_OK: |
| 45 // Success status was initialized above. | 59 // Success status was initialized above. |
| 46 break; | 60 break; |
| 47 case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: | 61 case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: |
| 48 status = PERSISTENT_NOTIFICATION_STATUS_EVENT_WAITUNTIL_REJECTED; | 62 status = PERSISTENT_NOTIFICATION_STATUS_EVENT_WAITUNTIL_REJECTED; |
| 49 break; | 63 break; |
| (...skipping 12 matching lines...) Expand all Loading... | |
| 62 case SERVICE_WORKER_ERROR_TIMEOUT: | 76 case SERVICE_WORKER_ERROR_TIMEOUT: |
| 63 case SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED: | 77 case SERVICE_WORKER_ERROR_SCRIPT_EVALUATE_FAILED: |
| 64 case SERVICE_WORKER_ERROR_DISK_CACHE: | 78 case SERVICE_WORKER_ERROR_DISK_CACHE: |
| 65 case SERVICE_WORKER_ERROR_REDUNDANT: | 79 case SERVICE_WORKER_ERROR_REDUNDANT: |
| 66 case SERVICE_WORKER_ERROR_DISALLOWED: | 80 case SERVICE_WORKER_ERROR_DISALLOWED: |
| 67 case SERVICE_WORKER_ERROR_DISABLED_WORKER: | 81 case SERVICE_WORKER_ERROR_DISABLED_WORKER: |
| 68 case SERVICE_WORKER_ERROR_MAX_VALUE: | 82 case SERVICE_WORKER_ERROR_MAX_VALUE: |
| 69 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR; | 83 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR; |
| 70 break; | 84 break; |
| 71 } | 85 } |
| 72 | 86 NotificationEventFinished(dispatch_complete_callback, status); |
| 73 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | |
| 74 base::Bind(dispatch_complete_callback, status)); | |
| 75 } | 87 } |
| 76 | 88 |
| 77 // Dispatches the notificationclick event on |service_worker|. Most be called on | 89 // Dispatches the given notification action event on |
| 78 // the IO thread, and with the worker running. | 90 // |service_worker_registration| if the registration was available. Must be |
| 79 void DispatchNotificationClickEventOnWorker( | 91 // called on the IO thread. |
| 80 const scoped_refptr<ServiceWorkerVersion>& service_worker, | 92 void DispatchNotificationEventOnRegistration( |
| 81 const NotificationDatabaseData& notification_database_data, | 93 const NotificationDatabaseData& notification_database_data, |
| 82 int action_index, | 94 const scoped_refptr<PlatformNotificationContext> notification_context, |
| 83 const ServiceWorkerVersion::StatusCallback& callback) { | 95 const NotificationActionCallback& dispatch_event_action, |
| 84 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 96 const NotificationDispatchCompleteCallback& dispatch_error_callback, |
| 85 int request_id = service_worker->StartRequest( | |
| 86 ServiceWorkerMetrics::EventType::NOTIFICATION_CLICK, callback); | |
| 87 service_worker->DispatchSimpleEvent< | |
| 88 ServiceWorkerHostMsg_NotificationClickEventFinished>( | |
| 89 request_id, | |
| 90 ServiceWorkerMsg_NotificationClickEvent( | |
| 91 request_id, notification_database_data.notification_id, | |
| 92 notification_database_data.notification_data, action_index)); | |
| 93 } | |
| 94 | |
| 95 // Dispatches the notificationclick on |service_worker_registration| if the | |
| 96 // registration was available. Must be called on the IO thread. | |
| 97 void DispatchNotificationClickEventOnRegistration( | |
| 98 const NotificationDatabaseData& notification_database_data, | |
| 99 int action_index, | |
| 100 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | |
| 101 ServiceWorkerStatusCode service_worker_status, | 97 ServiceWorkerStatusCode service_worker_status, |
| 102 const scoped_refptr<ServiceWorkerRegistration>& | 98 const scoped_refptr<ServiceWorkerRegistration>& |
| 103 service_worker_registration) { | 99 service_worker_registration) { |
| 104 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 105 #if defined(OS_ANDROID) | 101 #if defined(OS_ANDROID) |
| 106 // This LOG(INFO) deliberately exists to help track down the cause of | 102 // This LOG(INFO) deliberately exists to help track down the cause of |
| 107 // https://crbug.com/534537, where notifications sometimes do not react to | 103 // https://crbug.com/534537, where notifications sometimes do not react to |
| 108 // the user clicking on them. It should be removed once that's fixed. | 104 // the user clicking on them. It should be removed once that's fixed. |
| 109 LOG(INFO) << "Trying to dispatch notification for SW with status: " | 105 LOG(INFO) << "Trying to dispatch notification for SW with status: " |
| 110 << service_worker_status << " action_index: " << action_index; | 106 << service_worker_status; |
| 111 #endif | 107 #endif |
| 112 if (service_worker_status == SERVICE_WORKER_OK) { | 108 if (service_worker_status == SERVICE_WORKER_OK) { |
| 113 ServiceWorkerVersion::StatusCallback dispatch_event_callback = | 109 DCHECK(service_worker_registration->active_version()); |
| 114 base::Bind(&NotificationClickEventFinished, dispatch_complete_callback, | |
| 115 service_worker_registration); | |
| 116 | 110 |
| 117 DCHECK(service_worker_registration->active_version()); | 111 dispatch_event_action.Run(service_worker_registration.get(), |
| 118 service_worker_registration->active_version()->RunAfterStartWorker( | 112 notification_database_data); |
| 119 base::Bind( | |
| 120 &DispatchNotificationClickEventOnWorker, | |
| 121 make_scoped_refptr(service_worker_registration->active_version()), | |
| 122 notification_database_data, action_index, dispatch_event_callback), | |
| 123 dispatch_event_callback); | |
| 124 return; | 113 return; |
| 125 } | 114 } |
| 126 | 115 |
| 127 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; | 116 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; |
| 128 switch (service_worker_status) { | 117 switch (service_worker_status) { |
| 129 case SERVICE_WORKER_ERROR_NOT_FOUND: | 118 case SERVICE_WORKER_ERROR_NOT_FOUND: |
| 130 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER; | 119 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER; |
| 131 break; | 120 break; |
| 132 case SERVICE_WORKER_ERROR_FAILED: | 121 case SERVICE_WORKER_ERROR_FAILED: |
| 133 case SERVICE_WORKER_ERROR_ABORT: | 122 case SERVICE_WORKER_ERROR_ABORT: |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 149 case SERVICE_WORKER_ERROR_DISABLED_WORKER: | 138 case SERVICE_WORKER_ERROR_DISABLED_WORKER: |
| 150 case SERVICE_WORKER_ERROR_MAX_VALUE: | 139 case SERVICE_WORKER_ERROR_MAX_VALUE: |
| 151 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR; | 140 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR; |
| 152 break; | 141 break; |
| 153 case SERVICE_WORKER_OK: | 142 case SERVICE_WORKER_OK: |
| 154 NOTREACHED(); | 143 NOTREACHED(); |
| 155 break; | 144 break; |
| 156 } | 145 } |
| 157 | 146 |
| 158 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, | 147 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| 159 base::Bind(dispatch_complete_callback, status)); | 148 base::Bind(dispatch_error_callback, status)); |
| 160 } | 149 } |
| 161 | 150 |
| 162 // Finds the ServiceWorkerRegistration associated with the |origin| and | 151 // Finds the ServiceWorkerRegistration associated with the |origin| and |
| 163 // |service_worker_registration_id|. Must be called on the IO thread. | 152 // |service_worker_registration_id|. Must be called on the IO thread. |
| 164 void FindServiceWorkerRegistration( | 153 void FindServiceWorkerRegistration( |
| 165 const GURL& origin, | 154 const GURL& origin, |
| 166 int action_index, | |
| 167 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | |
| 168 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 155 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
| 156 scoped_refptr<PlatformNotificationContext> notification_context, | |
| 157 const NotificationActionCallback& notification_action_callback, | |
| 158 const NotificationDispatchCompleteCallback& dispatch_error_callback, | |
| 169 bool success, | 159 bool success, |
| 170 const NotificationDatabaseData& notification_database_data) { | 160 const NotificationDatabaseData& notification_database_data) { |
| 171 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 161 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 172 | 162 |
| 173 #if defined(OS_ANDROID) | 163 #if defined(OS_ANDROID) |
| 174 // This LOG(INFO) deliberately exists to help track down the cause of | 164 // This LOG(INFO) deliberately exists to help track down the cause of |
| 175 // https://crbug.com/534537, where notifications sometimes do not react to | 165 // https://crbug.com/534537, where notifications sometimes do not react to |
| 176 // the user clicking on them. It should be removed once that's fixed. | 166 // the user clicking on them. It should be removed once that's fixed. |
| 177 LOG(INFO) << "Lookup for ServiceWoker Registration: success:" << success | 167 LOG(INFO) << "Lookup for ServiceWoker Registration: success: " << success; |
| 178 << " action_index: " << action_index; | |
| 179 #endif | 168 #endif |
| 180 if (!success) { | 169 if (!success) { |
| 181 BrowserThread::PostTask( | 170 BrowserThread::PostTask( |
| 182 BrowserThread::UI, FROM_HERE, | 171 BrowserThread::UI, FROM_HERE, |
| 183 base::Bind(dispatch_complete_callback, | 172 base::Bind(dispatch_error_callback, |
| 184 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR)); | 173 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR)); |
| 185 return; | 174 return; |
| 186 } | 175 } |
| 187 | 176 |
| 188 service_worker_context->FindReadyRegistrationForId( | 177 service_worker_context->FindReadyRegistrationForId( |
| 189 notification_database_data.service_worker_registration_id, origin, | 178 notification_database_data.service_worker_registration_id, origin, |
| 190 base::Bind(&DispatchNotificationClickEventOnRegistration, | 179 base::Bind(&DispatchNotificationEventOnRegistration, |
| 191 notification_database_data, action_index, | 180 notification_database_data, notification_context, |
| 192 dispatch_complete_callback)); | 181 notification_action_callback, dispatch_error_callback)); |
| 193 } | 182 } |
| 194 | 183 |
| 195 // Reads the data associated with the |persistent_notification_id| belonging to | 184 // Reads the data associated with the |persistent_notification_id| belonging to |
| 196 // |origin| from the notification context. | 185 // |origin| from the notification context. |
| 197 void ReadNotificationDatabaseData( | 186 void ReadNotificationDatabaseData( |
| 198 int64_t persistent_notification_id, | 187 int64_t persistent_notification_id, |
| 199 const GURL& origin, | 188 const GURL& origin, |
| 200 int action_index, | |
| 201 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | |
| 202 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 189 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, |
| 203 scoped_refptr<PlatformNotificationContextImpl> notification_context) { | 190 scoped_refptr<PlatformNotificationContext> notification_context, |
| 191 const NotificationActionCallback& notification_read_callback, | |
| 192 const NotificationDispatchCompleteCallback& dispatch_error_callback) { | |
| 204 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 193 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 205 notification_context->ReadNotificationData( | 194 notification_context->ReadNotificationData( |
| 206 persistent_notification_id, origin, | 195 persistent_notification_id, origin, |
| 207 base::Bind(&FindServiceWorkerRegistration, origin, action_index, | 196 base::Bind(&FindServiceWorkerRegistration, origin, service_worker_context, |
| 208 dispatch_complete_callback, service_worker_context)); | 197 notification_context, notification_read_callback, |
| 198 dispatch_error_callback)); | |
| 209 } | 199 } |
| 210 | 200 |
| 211 } // namespace | 201 // ----------------------------------------------------------------------------- |
| 212 | 202 |
| 213 // static | 203 // Dispatches the notificationclick event on |service_worker|. Must be called on |
| 214 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { | 204 // the IO thread, and with the worker running. |
| 215 return NotificationEventDispatcherImpl::GetInstance(); | 205 void DispatchNotificationClickEventOnWorker( |
| 206 const scoped_refptr<ServiceWorkerVersion>& service_worker, | |
| 207 const NotificationDatabaseData& notification_database_data, | |
| 208 int action_index, | |
| 209 const ServiceWorkerVersion::StatusCallback& callback) { | |
| 210 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 211 int request_id = service_worker->StartRequest( | |
| 212 ServiceWorkerMetrics::EventType::NOTIFICATION_CLICK, callback); | |
| 213 service_worker->DispatchSimpleEvent< | |
| 214 ServiceWorkerHostMsg_NotificationClickEventFinished>( | |
| 215 request_id, | |
| 216 ServiceWorkerMsg_NotificationClickEvent( | |
| 217 request_id, notification_database_data.notification_id, | |
| 218 notification_database_data.notification_data, action_index)); | |
| 216 } | 219 } |
| 217 | 220 |
| 218 NotificationEventDispatcherImpl* | 221 // Dispatches the notification click event on the |service_worker_registration|. |
| 219 NotificationEventDispatcherImpl::GetInstance() { | 222 void DoDispatchNotificationClickEvent( |
| 220 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 223 int action_index, |
| 221 return base::Singleton<NotificationEventDispatcherImpl>::get(); | 224 const NotificationDispatchCompleteCallback& dispatch_complete_callback, |
| 225 const scoped_refptr<PlatformNotificationContext> notification_context, | |
| 226 const ServiceWorkerRegistration* service_worker_registration, | |
| 227 const NotificationDatabaseData& notification_database_data) { | |
| 228 ServiceWorkerVersion::StatusCallback status_callback = base::Bind( | |
| 229 &ServiceWorkerNotificationEventFinished, dispatch_complete_callback); | |
| 230 service_worker_registration->active_version()->RunAfterStartWorker( | |
| 231 base::Bind( | |
| 232 &DispatchNotificationClickEventOnWorker, | |
| 233 make_scoped_refptr(service_worker_registration->active_version()), | |
| 234 notification_database_data, action_index, status_callback), | |
| 235 status_callback); | |
| 222 } | 236 } |
| 223 | 237 |
| 224 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} | 238 // ----------------------------------------------------------------------------- |
| 225 | 239 |
| 226 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} | 240 // Called when the notification data has been deleted to finish the notification |
| 241 // close event. | |
| 242 void OnPersistentNotificationDataDeleted( | |
| 243 ServiceWorkerStatusCode service_worker_status, | |
| 244 const NotificationDispatchCompleteCallback& dispatch_complete_callback, | |
| 245 bool success) { | |
| 246 if (service_worker_status != SERVICE_WORKER_OK) { | |
| 247 ServiceWorkerNotificationEventFinished(dispatch_complete_callback, | |
| 248 service_worker_status); | |
| 249 return; | |
| 250 } | |
| 251 NotificationEventFinished( | |
| 252 dispatch_complete_callback, | |
| 253 success ? PERSISTENT_NOTIFICATION_STATUS_SUCCESS | |
| 254 : PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR); | |
| 255 } | |
| 227 | 256 |
| 228 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent( | 257 // Called when the persistent notification close event has been handled |
| 258 // to remove the notification from the database. | |
| 259 void DeleteNotificationDataFromDatabase( | |
| 260 const int64_t notification_id, | |
| 261 const GURL& origin, | |
| 262 scoped_refptr<PlatformNotificationContext> notification_context, | |
| 263 const NotificationDispatchCompleteCallback& dispatch_complete_callback, | |
| 264 ServiceWorkerStatusCode status_code) { | |
| 265 notification_context->DeleteNotificationData( | |
| 266 notification_id, origin, | |
| 267 base::Bind(&OnPersistentNotificationDataDeleted, status_code, | |
| 268 dispatch_complete_callback)); | |
| 269 } | |
| 270 | |
| 271 // Dispatches the notificationclose event on |service_worker|. Must be called on | |
| 272 // the IO thread, and with the worker running. | |
| 273 void DispatchNotificationCloseEventOnWorker( | |
| 274 const scoped_refptr<ServiceWorkerVersion>& service_worker, | |
| 275 const NotificationDatabaseData& notification_database_data, | |
| 276 const ServiceWorkerVersion::StatusCallback& callback) { | |
| 277 DCHECK_CURRENTLY_ON(BrowserThread::IO); | |
| 278 int request_id = service_worker->StartRequest( | |
| 279 ServiceWorkerMetrics::EventType::NOTIFICATION_CLOSE, callback); | |
| 280 service_worker->DispatchSimpleEvent< | |
| 281 ServiceWorkerHostMsg_NotificationCloseEventFinished>( | |
| 282 request_id, ServiceWorkerMsg_NotificationCloseEvent( | |
| 283 request_id, notification_database_data.notification_id, | |
| 284 notification_database_data.notification_data)); | |
| 285 } | |
| 286 | |
| 287 // Actually dispatches the notification close event on the service worker | |
| 288 // registration. | |
| 289 void DoDispatchNotificationCloseEvent( | |
| 290 bool by_user, | |
| 291 const NotificationDispatchCompleteCallback& dispatch_complete_callback, | |
| 292 scoped_refptr<PlatformNotificationContext> notification_context, | |
| 293 const ServiceWorkerRegistration* service_worker_registration, | |
| 294 const NotificationDatabaseData& notification_database_data) { | |
| 295 const ServiceWorkerVersion::StatusCallback dispatch_event_callback = | |
| 296 base::Bind(&DeleteNotificationDataFromDatabase, | |
| 297 notification_database_data.notification_id, | |
| 298 notification_database_data.origin, notification_context, | |
| 299 dispatch_complete_callback); | |
| 300 if (by_user) { | |
| 301 service_worker_registration->active_version()->RunAfterStartWorker( | |
| 302 base::Bind( | |
| 303 &DispatchNotificationCloseEventOnWorker, | |
| 304 make_scoped_refptr(service_worker_registration->active_version()), | |
| 305 notification_database_data, dispatch_event_callback), | |
| 306 dispatch_event_callback); | |
| 307 } else { | |
| 308 dispatch_event_callback.Run(ServiceWorkerStatusCode::SERVICE_WORKER_OK); | |
| 309 } | |
| 310 } | |
| 311 | |
| 312 // Dispatches any notification event. The actual, specific event dispatch should | |
| 313 // be done by the |notification_action_callback|. | |
| 314 void DispatchNotificationEvent( | |
| 229 BrowserContext* browser_context, | 315 BrowserContext* browser_context, |
| 230 int64_t persistent_notification_id, | 316 int64_t persistent_notification_id, |
| 231 const GURL& origin, | 317 const GURL& origin, |
| 232 int action_index, | 318 const NotificationActionCallbackWithContext& notification_action_callback, |
| 233 const NotificationClickDispatchCompleteCallback& | 319 const NotificationDispatchCompleteCallback& notification_error_callback) { |
| 234 dispatch_complete_callback) { | |
| 235 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 320 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 236 DCHECK_GT(persistent_notification_id, 0); | 321 DCHECK_GT(persistent_notification_id, 0); |
| 237 DCHECK(origin.is_valid()); | 322 DCHECK(origin.is_valid()); |
| 238 | 323 |
| 239 StoragePartition* partition = | 324 StoragePartition* partition = |
| 240 BrowserContext::GetStoragePartitionForSite(browser_context, origin); | 325 BrowserContext::GetStoragePartitionForSite(browser_context, origin); |
| 241 | 326 |
| 242 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = | 327 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = |
| 243 static_cast<ServiceWorkerContextWrapper*>( | 328 static_cast<ServiceWorkerContextWrapper*>( |
| 244 partition->GetServiceWorkerContext()); | 329 partition->GetServiceWorkerContext()); |
| 245 scoped_refptr<PlatformNotificationContextImpl> notification_context = | 330 scoped_refptr<PlatformNotificationContext> notification_context = |
| 246 static_cast<PlatformNotificationContextImpl*>( | 331 partition->GetPlatformNotificationContext(); |
| 247 partition->GetPlatformNotificationContext()); | |
| 248 | 332 |
| 249 BrowserThread::PostTask( | 333 BrowserThread::PostTask( |
| 250 BrowserThread::IO, FROM_HERE, | 334 BrowserThread::IO, FROM_HERE, |
| 251 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id, | 335 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id, |
| 252 origin, action_index, dispatch_complete_callback, | 336 origin, service_worker_context, notification_context, |
| 253 service_worker_context, notification_context)); | 337 base::Bind(notification_action_callback, notification_context), |
| 338 notification_error_callback)); | |
| 339 } | |
| 340 | |
| 341 } // namespace | |
| 342 | |
| 343 // static | |
| 344 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { | |
| 345 return NotificationEventDispatcherImpl::GetInstance(); | |
| 346 } | |
| 347 | |
| 348 NotificationEventDispatcherImpl* | |
| 349 NotificationEventDispatcherImpl::GetInstance() { | |
| 350 DCHECK_CURRENTLY_ON(BrowserThread::UI); | |
| 351 return base::Singleton<NotificationEventDispatcherImpl>::get(); | |
| 352 } | |
| 353 | |
| 354 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} | |
| 355 | |
| 356 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} | |
| 357 | |
| 358 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent( | |
| 359 BrowserContext* browser_context, | |
| 360 int64_t persistent_notification_id, | |
| 361 const GURL& origin, | |
| 362 int action_index, | |
| 363 const NotificationDispatchCompleteCallback& dispatch_complete_callback) { | |
| 364 DispatchNotificationEvent( | |
| 365 browser_context, persistent_notification_id, origin, | |
| 366 base::Bind(&DoDispatchNotificationClickEvent, action_index, | |
| 367 dispatch_complete_callback), | |
| 368 dispatch_complete_callback); | |
| 369 } | |
| 370 | |
| 371 void NotificationEventDispatcherImpl::DispatchNotificationCloseEvent( | |
| 372 BrowserContext* browser_context, | |
| 373 int64_t persistent_notification_id, | |
| 374 const GURL& origin, | |
| 375 bool by_user, | |
| 376 const NotificationDispatchCompleteCallback& dispatch_complete_callback) { | |
| 377 DispatchNotificationEvent(browser_context, persistent_notification_id, origin, | |
| 378 base::Bind(&DoDispatchNotificationCloseEvent, | |
| 379 by_user, dispatch_complete_callback), | |
| 380 dispatch_complete_callback); | |
| 254 } | 381 } |
| 255 | 382 |
| 256 } // namespace content | 383 } // namespace content |
| OLD | NEW |