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

Side by Side Diff: content/browser/notifications/notification_event_dispatcher_impl.cc

Issue 1619703002: Implement notificationclose event (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Recovered a lost piece of logging. Created 4 years, 10 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 "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 =
Peter Beverloo 2016/01/27 19:03:58 Why are you forward-declaring this? To avoid wrapp
Nina 2016/01/28 11:59:01 Yes, it's being referenced in 12 other places so a
24 NotificationEventDispatcher::NotificationClickDispatchCompleteCallback; 23 NotificationEventDispatcher::NotificationDispatchCompleteCallback;
24 using NotificationActionCallback =
25 base::Callback<void(const ServiceWorkerRegistration*,
26 const NotificationDatabaseData&)>;
27 using CurriedNotificationActionCallback =
Peter Beverloo 2016/01/27 19:03:57 NotificationActionCallbackWithContext? "Curried"
Nina 2016/01/28 11:59:01 Done.
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
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 notificationclick event on |service_worker|. Must be called on
78 // the IO thread, and with the worker running. 90 // the IO thread, and with the worker running.
79 void DispatchNotificationClickEventOnWorker( 91 void DispatchNotificationClickEventOnWorker(
80 const scoped_refptr<ServiceWorkerVersion>& service_worker, 92 const scoped_refptr<ServiceWorkerVersion>& service_worker,
81 const NotificationDatabaseData& notification_database_data, 93 const NotificationDatabaseData& notification_database_data,
82 int action_index, 94 int action_index,
83 const ServiceWorkerVersion::StatusCallback& callback) { 95 const ServiceWorkerVersion::StatusCallback& callback) {
84 DCHECK_CURRENTLY_ON(BrowserThread::IO); 96 DCHECK_CURRENTLY_ON(BrowserThread::IO);
85 int request_id = service_worker->StartRequest( 97 int request_id = service_worker->StartRequest(
86 ServiceWorkerMetrics::EventType::NOTIFICATION_CLICK, callback); 98 ServiceWorkerMetrics::EventType::NOTIFICATION_CLICK, callback);
87 service_worker->DispatchSimpleEvent< 99 service_worker->DispatchSimpleEvent<
88 ServiceWorkerHostMsg_NotificationClickEventFinished>( 100 ServiceWorkerHostMsg_NotificationClickEventFinished>(
89 request_id, 101 request_id,
90 ServiceWorkerMsg_NotificationClickEvent( 102 ServiceWorkerMsg_NotificationClickEvent(
91 request_id, notification_database_data.notification_id, 103 request_id, notification_database_data.notification_id,
92 notification_database_data.notification_data, action_index)); 104 notification_database_data.notification_data, action_index));
93 } 105 }
94 106
95 // Dispatches the notificationclick on |service_worker_registration| if the 107 // Dispatches the notificationclose event on |service_worker|. Must be called on
96 // registration was available. Must be called on the IO thread. 108 // the IO thread, and with the worker running.
97 void DispatchNotificationClickEventOnRegistration( 109 void DispatchNotificationCloseEventOnWorker(
110 const scoped_refptr<ServiceWorkerVersion>& service_worker,
98 const NotificationDatabaseData& notification_database_data, 111 const NotificationDatabaseData& notification_database_data,
99 int action_index, 112 const ServiceWorkerVersion::StatusCallback& callback) {
100 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback, 113 DCHECK_CURRENTLY_ON(BrowserThread::IO);
114 int request_id = service_worker->StartRequest(
115 ServiceWorkerMetrics::EventType::NOTIFICATION_CLOSE, callback);
116 service_worker->DispatchSimpleEvent<
117 ServiceWorkerHostMsg_NotificationCloseEventFinished>(
118 request_id, ServiceWorkerMsg_NotificationCloseEvent(
119 request_id, notification_database_data.notification_id,
120 notification_database_data.notification_data));
121 }
122
123 // Dispatches the given notification action event on
124 // |service_worker_registration| if the registration was available. Must be
125 // called on the IO thread.
126 void DispatchNotificationEventOnRegistration(
127 const NotificationDatabaseData& notification_database_data,
128 const scoped_refptr<PlatformNotificationContext> notification_context,
129 const NotificationActionCallback& dispatch_event_action,
130 const NotificationDispatchCompleteCallback& dispatch_error_callback,
101 ServiceWorkerStatusCode service_worker_status, 131 ServiceWorkerStatusCode service_worker_status,
102 const scoped_refptr<ServiceWorkerRegistration>& 132 const scoped_refptr<ServiceWorkerRegistration>&
103 service_worker_registration) { 133 service_worker_registration) {
104 DCHECK_CURRENTLY_ON(BrowserThread::IO); 134 DCHECK_CURRENTLY_ON(BrowserThread::IO);
105 #if defined(OS_ANDROID) 135 #if defined(OS_ANDROID)
106 // This LOG(INFO) deliberately exists to help track down the cause of 136 // This LOG(INFO) deliberately exists to help track down the cause of
107 // https://crbug.com/534537, where notifications sometimes do not react to 137 // 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. 138 // the user clicking on them. It should be removed once that's fixed.
109 LOG(INFO) << "Trying to dispatch notification for SW with status: " 139 LOG(INFO) << "Trying to dispatch notification for SW with status: "
110 << service_worker_status << " action_index: " << action_index; 140 << service_worker_status;
111 #endif 141 #endif
112 if (service_worker_status == SERVICE_WORKER_OK) { 142 if (service_worker_status == SERVICE_WORKER_OK) {
113 ServiceWorkerVersion::StatusCallback dispatch_event_callback = 143 DCHECK(service_worker_registration->active_version());
114 base::Bind(&NotificationClickEventFinished, dispatch_complete_callback,
115 service_worker_registration);
116 144
117 DCHECK(service_worker_registration->active_version()); 145 dispatch_event_action.Run(service_worker_registration.get(),
118 service_worker_registration->active_version()->RunAfterStartWorker( 146 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; 147 return;
125 } 148 }
126 149
127 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS; 150 PersistentNotificationStatus status = PERSISTENT_NOTIFICATION_STATUS_SUCCESS;
128 switch (service_worker_status) { 151 switch (service_worker_status) {
129 case SERVICE_WORKER_ERROR_NOT_FOUND: 152 case SERVICE_WORKER_ERROR_NOT_FOUND:
130 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER; 153 status = PERSISTENT_NOTIFICATION_STATUS_NO_SERVICE_WORKER;
131 break; 154 break;
132 case SERVICE_WORKER_ERROR_FAILED: 155 case SERVICE_WORKER_ERROR_FAILED:
133 case SERVICE_WORKER_ERROR_ABORT: 156 case SERVICE_WORKER_ERROR_ABORT:
(...skipping 15 matching lines...) Expand all
149 case SERVICE_WORKER_ERROR_DISABLED_WORKER: 172 case SERVICE_WORKER_ERROR_DISABLED_WORKER:
150 case SERVICE_WORKER_ERROR_MAX_VALUE: 173 case SERVICE_WORKER_ERROR_MAX_VALUE:
151 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR; 174 status = PERSISTENT_NOTIFICATION_STATUS_SERVICE_WORKER_ERROR;
152 break; 175 break;
153 case SERVICE_WORKER_OK: 176 case SERVICE_WORKER_OK:
154 NOTREACHED(); 177 NOTREACHED();
155 break; 178 break;
156 } 179 }
157 180
158 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, 181 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE,
159 base::Bind(dispatch_complete_callback, status)); 182 base::Bind(dispatch_error_callback, status));
160 } 183 }
161 184
162 // Finds the ServiceWorkerRegistration associated with the |origin| and 185 // Finds the ServiceWorkerRegistration associated with the |origin| and
163 // |service_worker_registration_id|. Must be called on the IO thread. 186 // |service_worker_registration_id|. Must be called on the IO thread.
164 void FindServiceWorkerRegistration( 187 void FindServiceWorkerRegistration(
165 const GURL& origin, 188 const GURL& origin,
166 int action_index,
167 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback,
168 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, 189 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
190 scoped_refptr<PlatformNotificationContext> notification_context,
191 const NotificationActionCallback& notification_action_callback,
192 const NotificationDispatchCompleteCallback& dispatch_error_callback,
169 bool success, 193 bool success,
170 const NotificationDatabaseData& notification_database_data) { 194 const NotificationDatabaseData& notification_database_data) {
171 DCHECK_CURRENTLY_ON(BrowserThread::IO); 195 DCHECK_CURRENTLY_ON(BrowserThread::IO);
172 196
173 #if defined(OS_ANDROID) 197 #if defined(OS_ANDROID)
174 // This LOG(INFO) deliberately exists to help track down the cause of 198 // This LOG(INFO) deliberately exists to help track down the cause of
175 // https://crbug.com/534537, where notifications sometimes do not react to 199 // 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. 200 // the user clicking on them. It should be removed once that's fixed.
177 LOG(INFO) << "Lookup for ServiceWoker Registration: success:" << success 201 LOG(INFO) << "Lookup for ServiceWoker Registration: success: " << success;
178 << " action_index: " << action_index;
179 #endif 202 #endif
180 if (!success) { 203 if (!success) {
181 BrowserThread::PostTask( 204 BrowserThread::PostTask(
182 BrowserThread::UI, FROM_HERE, 205 BrowserThread::UI, FROM_HERE,
183 base::Bind(dispatch_complete_callback, 206 base::Bind(dispatch_error_callback,
184 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR)); 207 PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR));
185 return; 208 return;
186 } 209 }
187 210
188 service_worker_context->FindReadyRegistrationForId( 211 service_worker_context->FindReadyRegistrationForId(
189 notification_database_data.service_worker_registration_id, origin, 212 notification_database_data.service_worker_registration_id, origin,
190 base::Bind(&DispatchNotificationClickEventOnRegistration, 213 base::Bind(&DispatchNotificationEventOnRegistration,
191 notification_database_data, action_index, 214 notification_database_data, notification_context,
192 dispatch_complete_callback)); 215 notification_action_callback, dispatch_error_callback));
193 } 216 }
194 217
195 // Reads the data associated with the |persistent_notification_id| belonging to 218 // Reads the data associated with the |persistent_notification_id| belonging to
196 // |origin| from the notification context. 219 // |origin| from the notification context.
197 void ReadNotificationDatabaseData( 220 void ReadNotificationDatabaseData(
198 int64_t persistent_notification_id, 221 int64_t persistent_notification_id,
199 const GURL& origin, 222 const GURL& origin,
200 int action_index,
201 const NotificationClickDispatchCompleteCallback& dispatch_complete_callback,
202 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context, 223 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context,
203 scoped_refptr<PlatformNotificationContextImpl> notification_context) { 224 scoped_refptr<PlatformNotificationContext> notification_context,
225 const NotificationActionCallback& notification_read_callback,
226 const NotificationDispatchCompleteCallback& dispatch_error_callback) {
204 DCHECK_CURRENTLY_ON(BrowserThread::IO); 227 DCHECK_CURRENTLY_ON(BrowserThread::IO);
205 notification_context->ReadNotificationData( 228 notification_context->ReadNotificationData(
206 persistent_notification_id, origin, 229 persistent_notification_id, origin,
207 base::Bind(&FindServiceWorkerRegistration, origin, action_index, 230 base::Bind(&FindServiceWorkerRegistration, origin, service_worker_context,
208 dispatch_complete_callback, service_worker_context)); 231 notification_context, notification_read_callback,
232 dispatch_error_callback));
233 }
234
235 // Dispatches the notification click event on the |service_worker_registration|.
236 void DoDispatchNotificationClickEvent(
Peter Beverloo 2016/01/27 19:03:57 One thing you could do here to improve readability
Nina 2016/01/28 11:59:01 Done.
237 int action_index,
238 const NotificationDispatchCompleteCallback& dispatch_complete_callback,
239 const scoped_refptr<PlatformNotificationContext> notification_context,
240 const ServiceWorkerRegistration* service_worker_registration,
241 const NotificationDatabaseData& notification_database_data) {
242 ServiceWorkerVersion::StatusCallback status_callback = base::Bind(
243 &ServiceWorkerNotificationEventFinished, dispatch_complete_callback);
244 service_worker_registration->active_version()->RunAfterStartWorker(
245 base::Bind(
246 &DispatchNotificationClickEventOnWorker,
247 make_scoped_refptr(service_worker_registration->active_version()),
248 notification_database_data, action_index, status_callback),
249 status_callback);
250 }
251
252 // Called when the notification data has been deleted to finish the notification
253 // close event.
254 void OnPersistentNotificationDataDeleted(
255 ServiceWorkerStatusCode service_worker_status,
256 const NotificationDispatchCompleteCallback& dispatch_complete_callback,
257 bool success) {
258 if (service_worker_status != SERVICE_WORKER_OK) {
259 ServiceWorkerNotificationEventFinished(dispatch_complete_callback,
260 service_worker_status);
261 return;
262 }
263 NotificationEventFinished(
264 dispatch_complete_callback,
265 success ? PERSISTENT_NOTIFICATION_STATUS_SUCCESS
266 : PERSISTENT_NOTIFICATION_STATUS_DATABASE_ERROR);
267 }
268
269 // Called when the persistent notification close event has been handled
270 // to remove the notification from the database.
271 void OnDidDispatchNotificationCloseEvent(
Peter Beverloo 2016/01/27 19:03:57 What do you think of naming this method like what
Nina 2016/01/28 11:59:01 Done.
272 const int64_t notification_id,
273 const GURL& origin,
274 scoped_refptr<PlatformNotificationContext> notification_context,
275 const NotificationDispatchCompleteCallback& dispatch_complete_callback,
276 ServiceWorkerStatusCode status_code) {
277 notification_context->DeleteNotificationData(
278 notification_id, origin,
279 base::Bind(&OnPersistentNotificationDataDeleted, status_code,
280 dispatch_complete_callback));
281 }
282
283 // Actually dispatches the notification close event on the service worker
284 // registration.
285 void DoDispatchNotificationCloseEvent(
286 bool by_user,
287 const NotificationDispatchCompleteCallback& dispatch_complete_callback,
288 scoped_refptr<PlatformNotificationContext> notification_context,
289 const ServiceWorkerRegistration* service_worker_registration,
290 const NotificationDatabaseData& notification_database_data) {
291 const ServiceWorkerVersion::StatusCallback dispatch_event_callback =
292 base::Bind(&OnDidDispatchNotificationCloseEvent,
293 notification_database_data.notification_id,
294 notification_database_data.origin, notification_context,
295 dispatch_complete_callback);
296 if (by_user) {
297 service_worker_registration->active_version()->RunAfterStartWorker(
298 base::Bind(
299 &DispatchNotificationCloseEventOnWorker,
300 make_scoped_refptr(service_worker_registration->active_version()),
301 notification_database_data, dispatch_event_callback),
302 dispatch_event_callback);
303 } else {
304 dispatch_event_callback.Run(ServiceWorkerStatusCode::SERVICE_WORKER_OK);
305 }
209 } 306 }
210 307
211 } // namespace 308 } // namespace
212 309
213 // static 310 // static
214 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() { 311 NotificationEventDispatcher* NotificationEventDispatcher::GetInstance() {
215 return NotificationEventDispatcherImpl::GetInstance(); 312 return NotificationEventDispatcherImpl::GetInstance();
216 } 313 }
217 314
218 NotificationEventDispatcherImpl* 315 NotificationEventDispatcherImpl*
219 NotificationEventDispatcherImpl::GetInstance() { 316 NotificationEventDispatcherImpl::GetInstance() {
220 DCHECK_CURRENTLY_ON(BrowserThread::UI); 317 DCHECK_CURRENTLY_ON(BrowserThread::UI);
221 return base::Singleton<NotificationEventDispatcherImpl>::get(); 318 return base::Singleton<NotificationEventDispatcherImpl>::get();
222 } 319 }
223 320
224 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {} 321 // Dispatches any notification event. The actual, specific event dispatch should
225 322 // be done by the |notification_action_callback|.
226 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {} 323 void DispatchNotificationEvent(
Peter Beverloo 2016/01/27 19:03:57 This can be in the anonymous namespace above.
Nina 2016/01/28 11:59:01 Done.
227
228 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent(
229 BrowserContext* browser_context, 324 BrowserContext* browser_context,
230 int64_t persistent_notification_id, 325 int64_t persistent_notification_id,
231 const GURL& origin, 326 const GURL& origin,
232 int action_index, 327 const CurriedNotificationActionCallback& notification_action_callback,
233 const NotificationClickDispatchCompleteCallback& 328 const NotificationDispatchCompleteCallback& notification_error_callback) {
234 dispatch_complete_callback) {
235 DCHECK_CURRENTLY_ON(BrowserThread::UI); 329 DCHECK_CURRENTLY_ON(BrowserThread::UI);
236 DCHECK_GT(persistent_notification_id, 0); 330 DCHECK_GT(persistent_notification_id, 0);
237 DCHECK(origin.is_valid()); 331 DCHECK(origin.is_valid());
238 332
239 StoragePartition* partition = 333 StoragePartition* partition =
240 BrowserContext::GetStoragePartitionForSite(browser_context, origin); 334 BrowserContext::GetStoragePartitionForSite(browser_context, origin);
241 335
242 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context = 336 scoped_refptr<ServiceWorkerContextWrapper> service_worker_context =
243 static_cast<ServiceWorkerContextWrapper*>( 337 static_cast<ServiceWorkerContextWrapper*>(
244 partition->GetServiceWorkerContext()); 338 partition->GetServiceWorkerContext());
245 scoped_refptr<PlatformNotificationContextImpl> notification_context = 339 scoped_refptr<PlatformNotificationContext> notification_context =
246 static_cast<PlatformNotificationContextImpl*>( 340 partition->GetPlatformNotificationContext();
247 partition->GetPlatformNotificationContext());
248 341
249 BrowserThread::PostTask( 342 BrowserThread::PostTask(
250 BrowserThread::IO, FROM_HERE, 343 BrowserThread::IO, FROM_HERE,
251 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id, 344 base::Bind(&ReadNotificationDatabaseData, persistent_notification_id,
252 origin, action_index, dispatch_complete_callback, 345 origin, service_worker_context, notification_context,
253 service_worker_context, notification_context)); 346 base::Bind(notification_action_callback, notification_context),
347 notification_error_callback));
348 }
349
350 NotificationEventDispatcherImpl::NotificationEventDispatcherImpl() {}
351
352 NotificationEventDispatcherImpl::~NotificationEventDispatcherImpl() {}
353
354 void NotificationEventDispatcherImpl::DispatchNotificationClickEvent(
355 BrowserContext* browser_context,
356 int64_t persistent_notification_id,
357 const GURL& origin,
358 int action_index,
359 const NotificationDispatchCompleteCallback& dispatch_complete_callback) {
360 DispatchNotificationEvent(
361 browser_context, persistent_notification_id, origin,
362 base::Bind(&DoDispatchNotificationClickEvent, action_index,
363 dispatch_complete_callback),
364 dispatch_complete_callback);
365 }
366
367 void NotificationEventDispatcherImpl::DispatchNotificationCloseEvent(
368 BrowserContext* browser_context,
369 int64_t persistent_notification_id,
370 const GURL& origin,
371 bool by_user,
372 const NotificationDispatchCompleteCallback& dispatch_complete_callback) {
373 DispatchNotificationEvent(browser_context, persistent_notification_id, origin,
374 base::Bind(&DoDispatchNotificationCloseEvent,
375 by_user, dispatch_complete_callback),
376 dispatch_complete_callback);
254 } 377 }
255 378
256 } // namespace content 379 } // namespace content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698