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/push_messaging/push_messaging_message_filter.h" | 5 #include "content/browser/push_messaging/push_messaging_message_filter.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 | 8 |
9 #include "base/bind.h" | 9 #include "base/bind.h" |
10 #include "base/bind_helpers.h" | 10 #include "base/bind_helpers.h" |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
218 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 218 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
219 // TODO(mvanouwerkerk): Validate arguments? | 219 // TODO(mvanouwerkerk): Validate arguments? |
220 // TODO(peter): Persist |user_visible| in Service Worker storage. | 220 // TODO(peter): Persist |user_visible| in Service Worker storage. |
221 RegisterData data; | 221 RegisterData data; |
222 data.request_id = request_id; | 222 data.request_id = request_id; |
223 data.service_worker_registration_id = service_worker_registration_id; | 223 data.service_worker_registration_id = service_worker_registration_id; |
224 data.render_frame_id = render_frame_id; | 224 data.render_frame_id = render_frame_id; |
225 data.user_visible = user_visible; | 225 data.user_visible = user_visible; |
226 | 226 |
227 ServiceWorkerRegistration* service_worker_registration = | 227 ServiceWorkerRegistration* service_worker_registration = |
228 service_worker_context_->context()->GetLiveRegistration( | 228 service_worker_context_->GetLiveRegistration( |
229 service_worker_registration_id); | 229 service_worker_registration_id); |
230 if (!service_worker_registration || | 230 if (!service_worker_registration || |
231 !service_worker_registration->active_version()) { | 231 !service_worker_registration->active_version()) { |
232 SendRegisterError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); | 232 SendRegisterError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); |
233 return; | 233 return; |
234 } | 234 } |
235 data.requesting_origin = service_worker_registration->pattern().GetOrigin(); | 235 data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
236 | 236 |
237 service_worker_context_->context()->storage()->StoreUserData( | 237 service_worker_context_->StoreRegistrationUserData( |
238 service_worker_registration_id, | 238 service_worker_registration_id, |
239 data.requesting_origin, | 239 data.requesting_origin, |
240 kPushSenderIdServiceWorkerKey, | 240 kPushSenderIdServiceWorkerKey, |
241 sender_id, | 241 sender_id, |
242 base::Bind(&PushMessagingMessageFilter::DidPersistSenderId, | 242 base::Bind(&PushMessagingMessageFilter::DidPersistSenderId, |
243 weak_factory_io_to_io_.GetWeakPtr(), | 243 weak_factory_io_to_io_.GetWeakPtr(), |
244 data, sender_id)); | 244 data, sender_id)); |
245 } | 245 } |
246 | 246 |
247 void PushMessagingMessageFilter::OnRegisterFromWorker( | 247 void PushMessagingMessageFilter::OnRegisterFromWorker( |
248 int request_id, | 248 int request_id, |
249 int64_t service_worker_registration_id, | 249 int64_t service_worker_registration_id, |
250 bool user_visible) { | 250 bool user_visible) { |
251 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 251 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
252 RegisterData data; | 252 RegisterData data; |
253 data.request_id = request_id; | 253 data.request_id = request_id; |
254 data.service_worker_registration_id = service_worker_registration_id; | 254 data.service_worker_registration_id = service_worker_registration_id; |
255 data.user_visible = user_visible; | 255 data.user_visible = user_visible; |
256 | 256 |
257 ServiceWorkerRegistration* service_worker_registration = | 257 ServiceWorkerRegistration* service_worker_registration = |
258 service_worker_context_->context()->GetLiveRegistration( | 258 service_worker_context_->GetLiveRegistration( |
259 service_worker_registration_id); | 259 service_worker_registration_id); |
260 if (!service_worker_registration) { | 260 if (!service_worker_registration) { |
261 SendRegisterError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); | 261 SendRegisterError(data, PUSH_REGISTRATION_STATUS_NO_SERVICE_WORKER); |
262 return; | 262 return; |
263 } | 263 } |
264 data.requesting_origin = service_worker_registration->pattern().GetOrigin(); | 264 data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
265 | 265 |
266 // This sender_id will be ignored; instead it will be fetched from storage. | 266 // This sender_id will be ignored; instead it will be fetched from storage. |
267 CheckForExistingRegistration(data, std::string() /* sender_id */); | 267 CheckForExistingRegistration(data, std::string() /* sender_id */); |
268 } | 268 } |
269 | 269 |
270 void PushMessagingMessageFilter::DidPersistSenderId( | 270 void PushMessagingMessageFilter::DidPersistSenderId( |
271 const RegisterData& data, | 271 const RegisterData& data, |
272 const std::string& sender_id, | 272 const std::string& sender_id, |
273 ServiceWorkerStatusCode service_worker_status) { | 273 ServiceWorkerStatusCode service_worker_status) { |
274 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 274 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
275 if (service_worker_status != SERVICE_WORKER_OK) | 275 if (service_worker_status != SERVICE_WORKER_OK) |
276 SendRegisterError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR); | 276 SendRegisterError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR); |
277 else | 277 else |
278 CheckForExistingRegistration(data, sender_id); | 278 CheckForExistingRegistration(data, sender_id); |
279 } | 279 } |
280 | 280 |
281 void PushMessagingMessageFilter::CheckForExistingRegistration( | 281 void PushMessagingMessageFilter::CheckForExistingRegistration( |
282 const RegisterData& data, | 282 const RegisterData& data, |
283 const std::string& sender_id) { | 283 const std::string& sender_id) { |
284 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 284 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
285 service_worker_context_->context()->storage()->GetUserData( | 285 service_worker_context_->GetRegistrationUserData( |
286 data.service_worker_registration_id, | 286 data.service_worker_registration_id, |
287 kPushRegistrationIdServiceWorkerKey, | 287 kPushRegistrationIdServiceWorkerKey, |
288 base::Bind(&PushMessagingMessageFilter::DidCheckForExistingRegistration, | 288 base::Bind(&PushMessagingMessageFilter::DidCheckForExistingRegistration, |
289 weak_factory_io_to_io_.GetWeakPtr(), data, sender_id)); | 289 weak_factory_io_to_io_.GetWeakPtr(), data, sender_id)); |
290 } | 290 } |
291 | 291 |
292 void PushMessagingMessageFilter::DidCheckForExistingRegistration( | 292 void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
293 const RegisterData& data, | 293 const RegisterData& data, |
294 const std::string& sender_id, | 294 const std::string& sender_id, |
295 const std::string& push_registration_id, | 295 const std::string& push_registration_id, |
296 ServiceWorkerStatusCode service_worker_status) { | 296 ServiceWorkerStatusCode service_worker_status) { |
297 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 297 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
298 if (service_worker_status == SERVICE_WORKER_OK) { | 298 if (service_worker_status == SERVICE_WORKER_OK) { |
299 SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE, | 299 SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE, |
300 push_registration_id); | 300 push_registration_id); |
301 return; | 301 return; |
302 } | 302 } |
303 // TODO(johnme): The spec allows the register algorithm to reject with an | 303 // TODO(johnme): The spec allows the register algorithm to reject with an |
304 // AbortError when accessing storage fails. Perhaps we should do that if | 304 // AbortError when accessing storage fails. Perhaps we should do that if |
305 // service_worker_status != SERVICE_WORKER_ERROR_NOT_FOUND instead of | 305 // service_worker_status != SERVICE_WORKER_ERROR_NOT_FOUND instead of |
306 // attempting to do a fresh registration? | 306 // attempting to do a fresh registration? |
307 // https://w3c.github.io/push-api/#widl-PushRegistrationManager-register-Promi
se-PushRegistration | 307 // https://w3c.github.io/push-api/#widl-PushRegistrationManager-register-Promi
se-PushRegistration |
308 if (data.FromDocument()) { | 308 if (data.FromDocument()) { |
309 BrowserThread::PostTask( | 309 BrowserThread::PostTask( |
310 BrowserThread::UI, FROM_HERE, | 310 BrowserThread::UI, FROM_HERE, |
311 base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), | 311 base::Bind(&Core::RegisterOnUI, base::Unretained(ui_core_.get()), |
312 data, sender_id)); | 312 data, sender_id)); |
313 } else { | 313 } else { |
314 service_worker_context_->context()->storage()->GetUserData( | 314 service_worker_context_->GetRegistrationUserData( |
315 data.service_worker_registration_id, | 315 data.service_worker_registration_id, |
316 kPushSenderIdServiceWorkerKey, | 316 kPushSenderIdServiceWorkerKey, |
317 base::Bind(&PushMessagingMessageFilter::DidGetSenderIdFromStorage, | 317 base::Bind(&PushMessagingMessageFilter::DidGetSenderIdFromStorage, |
318 weak_factory_io_to_io_.GetWeakPtr(), data)); | 318 weak_factory_io_to_io_.GetWeakPtr(), data)); |
319 } | 319 } |
320 } | 320 } |
321 | 321 |
322 void PushMessagingMessageFilter::DidGetSenderIdFromStorage( | 322 void PushMessagingMessageFilter::DidGetSenderIdFromStorage( |
323 const RegisterData& data, | 323 const RegisterData& data, |
324 const std::string& sender_id, | 324 const std::string& sender_id, |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
396 BrowserThread::IO, FROM_HERE, | 396 BrowserThread::IO, FROM_HERE, |
397 base::Bind(&PushMessagingMessageFilter::SendRegisterError, io_parent_, | 397 base::Bind(&PushMessagingMessageFilter::SendRegisterError, io_parent_, |
398 data, status)); | 398 data, status)); |
399 } | 399 } |
400 } | 400 } |
401 | 401 |
402 void PushMessagingMessageFilter::PersistRegistrationOnIO( | 402 void PushMessagingMessageFilter::PersistRegistrationOnIO( |
403 const RegisterData& data, | 403 const RegisterData& data, |
404 const std::string& push_registration_id) { | 404 const std::string& push_registration_id) { |
405 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 405 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
406 service_worker_context_->context()->storage()->StoreUserData( | 406 service_worker_context_->StoreRegistrationUserData( |
407 data.service_worker_registration_id, | 407 data.service_worker_registration_id, |
408 data.requesting_origin, | 408 data.requesting_origin, |
409 kPushRegistrationIdServiceWorkerKey, | 409 kPushRegistrationIdServiceWorkerKey, |
410 push_registration_id, | 410 push_registration_id, |
411 base::Bind(&PushMessagingMessageFilter::DidPersistRegistrationOnIO, | 411 base::Bind(&PushMessagingMessageFilter::DidPersistRegistrationOnIO, |
412 weak_factory_io_to_io_.GetWeakPtr(), | 412 weak_factory_io_to_io_.GetWeakPtr(), |
413 data, push_registration_id)); | 413 data, push_registration_id)); |
414 } | 414 } |
415 | 415 |
416 void PushMessagingMessageFilter::DidPersistRegistrationOnIO( | 416 void PushMessagingMessageFilter::DidPersistRegistrationOnIO( |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
467 } | 467 } |
468 | 468 |
469 // Unregister methods on both IO and UI threads, merged in order of use from | 469 // Unregister methods on both IO and UI threads, merged in order of use from |
470 // PushMessagingMessageFilter and Core. | 470 // PushMessagingMessageFilter and Core. |
471 // ----------------------------------------------------------------------------- | 471 // ----------------------------------------------------------------------------- |
472 | 472 |
473 void PushMessagingMessageFilter::OnUnregister( | 473 void PushMessagingMessageFilter::OnUnregister( |
474 int request_id, int64_t service_worker_registration_id) { | 474 int request_id, int64_t service_worker_registration_id) { |
475 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 475 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
476 ServiceWorkerRegistration* service_worker_registration = | 476 ServiceWorkerRegistration* service_worker_registration = |
477 service_worker_context_->context()->GetLiveRegistration( | 477 service_worker_context_->GetLiveRegistration( |
478 service_worker_registration_id); | 478 service_worker_registration_id); |
479 if (!service_worker_registration) { | 479 if (!service_worker_registration) { |
480 DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER); | 480 DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER); |
481 return; | 481 return; |
482 } | 482 } |
483 | 483 |
484 service_worker_context_->context()->storage()->GetUserData( | 484 service_worker_context_->GetRegistrationUserData( |
485 service_worker_registration_id, | 485 service_worker_registration_id, |
486 kPushRegistrationIdServiceWorkerKey, | 486 kPushRegistrationIdServiceWorkerKey, |
487 base::Bind( | 487 base::Bind( |
488 &PushMessagingMessageFilter::UnregisterHavingGottenPushRegistrationId, | 488 &PushMessagingMessageFilter::UnregisterHavingGottenPushRegistrationId, |
489 weak_factory_io_to_io_.GetWeakPtr(), request_id, | 489 weak_factory_io_to_io_.GetWeakPtr(), request_id, |
490 service_worker_registration_id, | 490 service_worker_registration_id, |
491 service_worker_registration->pattern().GetOrigin())); | 491 service_worker_registration->pattern().GetOrigin())); |
492 } | 492 } |
493 | 493 |
494 void PushMessagingMessageFilter::UnregisterHavingGottenPushRegistrationId( | 494 void PushMessagingMessageFilter::UnregisterHavingGottenPushRegistrationId( |
495 int request_id, | 495 int request_id, |
496 int64_t service_worker_registration_id, | 496 int64_t service_worker_registration_id, |
497 const GURL& requesting_origin, | 497 const GURL& requesting_origin, |
498 const std::string& push_registration_id, // Unused, we just want the status | 498 const std::string& push_registration_id, // Unused, we just want the status |
499 ServiceWorkerStatusCode service_worker_status) { | 499 ServiceWorkerStatusCode service_worker_status) { |
500 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 500 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
501 | 501 |
502 if (service_worker_status == SERVICE_WORKER_OK) { | 502 if (service_worker_status == SERVICE_WORKER_OK) { |
503 service_worker_context_->context()->storage()->GetUserData( | 503 service_worker_context_->GetRegistrationUserData( |
504 service_worker_registration_id, | 504 service_worker_registration_id, |
505 kPushSenderIdServiceWorkerKey, | 505 kPushSenderIdServiceWorkerKey, |
506 base::Bind( | 506 base::Bind( |
507 &PushMessagingMessageFilter::UnregisterHavingGottenSenderId, | 507 &PushMessagingMessageFilter::UnregisterHavingGottenSenderId, |
508 weak_factory_io_to_io_.GetWeakPtr(), | 508 weak_factory_io_to_io_.GetWeakPtr(), |
509 request_id, | 509 request_id, |
510 service_worker_registration_id, | 510 service_worker_registration_id, |
511 requesting_origin)); | 511 requesting_origin)); |
512 } else { | 512 } else { |
513 // Errors are handled the same, whether we were trying to get the | 513 // Errors are handled the same, whether we were trying to get the |
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
618 break; | 618 break; |
619 } | 619 } |
620 } | 620 } |
621 | 621 |
622 void PushMessagingMessageFilter::ClearRegistrationData( | 622 void PushMessagingMessageFilter::ClearRegistrationData( |
623 int request_id, | 623 int request_id, |
624 int64_t service_worker_registration_id, | 624 int64_t service_worker_registration_id, |
625 PushUnregistrationStatus unregistration_status) { | 625 PushUnregistrationStatus unregistration_status) { |
626 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 626 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
627 | 627 |
628 service_worker_context_->context()->storage()->ClearUserData( | 628 service_worker_context_->ClearRegistrationUserData( |
629 service_worker_registration_id, | 629 service_worker_registration_id, |
630 kPushRegistrationIdServiceWorkerKey, | 630 kPushRegistrationIdServiceWorkerKey, |
631 base::Bind(&PushMessagingMessageFilter::DidClearRegistrationData, | 631 base::Bind(&PushMessagingMessageFilter::DidClearRegistrationData, |
632 weak_factory_io_to_io_.GetWeakPtr(), | 632 weak_factory_io_to_io_.GetWeakPtr(), |
633 request_id, unregistration_status)); | 633 request_id, unregistration_status)); |
634 } | 634 } |
635 | 635 |
636 void PushMessagingMessageFilter::DidClearRegistrationData( | 636 void PushMessagingMessageFilter::DidClearRegistrationData( |
637 int request_id, | 637 int request_id, |
638 PushUnregistrationStatus unregistration_status, | 638 PushUnregistrationStatus unregistration_status, |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 | 679 |
680 // GetRegistration methods on both IO and UI threads, merged in order of use | 680 // GetRegistration methods on both IO and UI threads, merged in order of use |
681 // from PushMessagingMessageFilter and Core. | 681 // from PushMessagingMessageFilter and Core. |
682 // ----------------------------------------------------------------------------- | 682 // ----------------------------------------------------------------------------- |
683 | 683 |
684 void PushMessagingMessageFilter::OnGetRegistration( | 684 void PushMessagingMessageFilter::OnGetRegistration( |
685 int request_id, | 685 int request_id, |
686 int64_t service_worker_registration_id) { | 686 int64_t service_worker_registration_id) { |
687 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 687 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
688 // TODO(johnme): Validate arguments? | 688 // TODO(johnme): Validate arguments? |
689 service_worker_context_->context()->storage()->GetUserData( | 689 service_worker_context_->GetRegistrationUserData( |
690 service_worker_registration_id, | 690 service_worker_registration_id, |
691 kPushRegistrationIdServiceWorkerKey, | 691 kPushRegistrationIdServiceWorkerKey, |
692 base::Bind(&PushMessagingMessageFilter::DidGetRegistration, | 692 base::Bind(&PushMessagingMessageFilter::DidGetRegistration, |
693 weak_factory_io_to_io_.GetWeakPtr(), request_id)); | 693 weak_factory_io_to_io_.GetWeakPtr(), request_id)); |
694 } | 694 } |
695 | 695 |
696 void PushMessagingMessageFilter::DidGetRegistration( | 696 void PushMessagingMessageFilter::DidGetRegistration( |
697 int request_id, | 697 int request_id, |
698 const std::string& push_registration_id, | 698 const std::string& push_registration_id, |
699 ServiceWorkerStatusCode service_worker_status) { | 699 ServiceWorkerStatusCode service_worker_status) { |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
747 // GetPermission methods on both IO and UI threads, merged in order of use from | 747 // GetPermission methods on both IO and UI threads, merged in order of use from |
748 // PushMessagingMessageFilter and Core. | 748 // PushMessagingMessageFilter and Core. |
749 // ----------------------------------------------------------------------------- | 749 // ----------------------------------------------------------------------------- |
750 | 750 |
751 void PushMessagingMessageFilter::OnGetPermissionStatus( | 751 void PushMessagingMessageFilter::OnGetPermissionStatus( |
752 int request_id, | 752 int request_id, |
753 int64_t service_worker_registration_id, | 753 int64_t service_worker_registration_id, |
754 bool user_visible) { | 754 bool user_visible) { |
755 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 755 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
756 ServiceWorkerRegistration* service_worker_registration = | 756 ServiceWorkerRegistration* service_worker_registration = |
757 service_worker_context_->context()->GetLiveRegistration( | 757 service_worker_context_->GetLiveRegistration( |
758 service_worker_registration_id); | 758 service_worker_registration_id); |
759 if (!service_worker_registration) { | 759 if (!service_worker_registration) { |
760 Send(new PushMessagingMsg_GetPermissionStatusError(request_id)); | 760 Send(new PushMessagingMsg_GetPermissionStatusError(request_id)); |
761 return; | 761 return; |
762 } | 762 } |
763 | 763 |
764 BrowserThread::PostTask( | 764 BrowserThread::PostTask( |
765 BrowserThread::UI, FROM_HERE, | 765 BrowserThread::UI, FROM_HERE, |
766 base::Bind(&Core::GetPermissionStatusOnUI, | 766 base::Bind(&Core::GetPermissionStatusOnUI, |
767 base::Unretained(ui_core_.get()), | 767 base::Unretained(ui_core_.get()), |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
808 PushMessagingService* PushMessagingMessageFilter::Core::service() { | 808 PushMessagingService* PushMessagingMessageFilter::Core::service() { |
809 DCHECK_CURRENTLY_ON(BrowserThread::UI); | 809 DCHECK_CURRENTLY_ON(BrowserThread::UI); |
810 RenderProcessHost* process_host = | 810 RenderProcessHost* process_host = |
811 RenderProcessHost::FromID(render_process_id_); | 811 RenderProcessHost::FromID(render_process_id_); |
812 return process_host | 812 return process_host |
813 ? process_host->GetBrowserContext()->GetPushMessagingService() | 813 ? process_host->GetBrowserContext()->GetPushMessagingService() |
814 : nullptr; | 814 : nullptr; |
815 } | 815 } |
816 | 816 |
817 } // namespace content | 817 } // namespace content |
OLD | NEW |