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 NotificationOperationCallback = |
| 25 base::Callback<void(const ServiceWorkerRegistration*, |
| 26 const NotificationDatabaseData&)>; |
| 27 using NotificationOperationCallbackWithContext = |
| 28 base::Callback<void(const 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 NotificationOperationCallback& 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, | 155 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context, |
167 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 156 const scoped_refptr<PlatformNotificationContext>& notification_context, |
168 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 157 const NotificationOperationCallback& 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, | 189 const scoped_refptr<ServiceWorkerContextWrapper>& service_worker_context, |
201 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, | 190 const scoped_refptr<PlatformNotificationContext>& notification_context, |
202 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, | 191 const NotificationOperationCallback& notification_read_callback, |
203 scoped_refptr<PlatformNotificationContextImpl> notification_context) { | 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 const 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 const 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 NotificationOperationCallbackWithContext& |
233 const NotificationClickDispatchCompleteCallback& | 319 notification_action_callback, |
234 dispatch_complete_callback) { | 320 const NotificationDispatchCompleteCallback& notification_error_callback) { |
235 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 321 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
236 DCHECK_GT(persistent_notification_id, 0); | 322 DCHECK_GT(persistent_notification_id, 0); |
237 DCHECK(origin.is_valid()); | 323 DCHECK(origin.is_valid()); |
238 | 324 |
239 StoragePartition* partition = | 325 StoragePartition* partition = |
240 BrowserContext::GetStoragePartitionForSite(browser_context, origin); | 326 BrowserContext::GetStoragePartitionForSite(browser_context, origin); |
241 | 327 |
242 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = | 328 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = |
243 static_cast<ServiceWorkerContextWrapper*>( | 329 static_cast<ServiceWorkerContextWrapper*>( |
244 partition->GetServiceWorkerContext()); | 330 partition->GetServiceWorkerContext()); |
245 scoped_refptr<PlatformNotificationContextImpl> notification_context = | 331 scoped_refptr<PlatformNotificationContext> notification_context = |
246 static_cast<PlatformNotificationContextImpl*>( | 332 partition->GetPlatformNotificationContext(); |
247 partition->GetPlatformNotificationContext()); | |
248 | 333 |
249 BrowserThread::PostTask( | 334 BrowserThread::PostTask( |
250 BrowserThread::IO, FROM_HERE, | 335 BrowserThread::IO, FROM_HERE, |
251 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id, | 336 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id, |
252 origin, action_index, dispatch_complete_callback, | 337 origin, service_worker_context, notification_context, |
253 service_worker_context, notification_context)); | 338 base::Bind(notification_action_callback, notification_context), |
| 339 notification_error_callback)); |
| 340 } |
| 341 |
| 342 } // namespace |
| 343 |
| 344 // static |
| 345 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { |
| 346 return NotificationEventDispatcherImpl::GetInstance(); |
| 347 } |
| 348 |
| 349 NotificationEventDispatcherImpl* |
| 350 NotificationEventDispatcherImpl::GetInstance() { |
| 351 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| 352 return base::Singleton<NotificationEventDispatcherImpl>::get(); |
| 353 } |
| 354 |
| 355 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} |
| 356 |
| 357 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} |
| 358 |
| 359 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent( |
| 360 BrowserContext* browser_context, |
| 361 int64_t persistent_notification_id, |
| 362 const GURL& origin, |
| 363 int action_index, |
| 364 const NotificationDispatchCompleteCallback& dispatch_complete_callback) { |
| 365 DispatchNotificationEvent( |
| 366 browser_context, persistent_notification_id, origin, |
| 367 base::Bind(&DoDispatchNotificationClickEvent, action_index, |
| 368 dispatch_complete_callback), |
| 369 dispatch_complete_callback); |
| 370 } |
| 371 |
| 372 void NotificationEventDispatcherImpl::DispatchNotificationCloseEvent( |
| 373 BrowserContext* browser_context, |
| 374 int64_t persistent_notification_id, |
| 375 const GURL& origin, |
| 376 bool by_user, |
| 377 const NotificationDispatchCompleteCallback& dispatch_complete_callback) { |
| 378 DispatchNotificationEvent(browser_context, persistent_notification_id, origin, |
| 379 base::Bind(&DoDispatchNotificationCloseEvent, |
| 380 by_user, dispatch_complete_callback), |
| 381 dispatch_complete_callback); |
254 } | 382 } |
255 | 383 |
256 } // namespace content | 384 } // namespace content |
OLD | NEW |