Chromium Code Reviews| Index: content/browser/push_messaging/push_messaging_message_filter.cc |
| diff --git a/content/browser/push_messaging/push_messaging_message_filter.cc b/content/browser/push_messaging/push_messaging_message_filter.cc |
| index 0ac0ce5b0a6e5c53c4d9dbc11b6b41fa62f02e25..8743a593e9896b99a85e4c074f297eb139a2e05f 100644 |
| --- a/content/browser/push_messaging/push_messaging_message_filter.cc |
| +++ b/content/browser/push_messaging/push_messaging_message_filter.cc |
| @@ -111,10 +111,7 @@ void PushMessagingMessageFilter::OnRegisterFromDocument( |
| data.render_frame_id = render_frame_id; |
| data.user_visible_only = user_visible_only; |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&PushMessagingMessageFilter::RegisterOnUI, |
| - this, data, sender_id)); |
| + CheckForExistingRegistration(data, sender_id); |
| } |
| void PushMessagingMessageFilter::OnRegisterFromWorker( |
| @@ -137,10 +134,7 @@ void PushMessagingMessageFilter::OnRegisterFromWorker( |
| data.requesting_origin = service_worker_registration->pattern().GetOrigin(); |
| data.service_worker_registration_id = service_worker_registration_id; |
| - BrowserThread::PostTask( |
| - BrowserThread::UI, FROM_HERE, |
| - base::Bind(&PushMessagingMessageFilter::RegisterOnUI, |
| - this, data, sender_id)); |
| + CheckForExistingRegistration(data, sender_id); |
| } |
| void PushMessagingMessageFilter::OnPermissionStatusRequest( |
| @@ -186,6 +180,41 @@ void PushMessagingMessageFilter::OnGetPermissionStatus( |
| request_id)); |
| } |
| +void PushMessagingMessageFilter::CheckForExistingRegistration( |
| + const RegisterData& data, |
| + const std::string& sender_id) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + service_worker_context_->context()->storage()->GetUserData( |
| + data.service_worker_registration_id, |
| + kPushRegistrationIdServiceWorkerKey, |
| + base::Bind(&PushMessagingMessageFilter::DidCheckForExistingRegistration, |
| + weak_factory_io_to_io_.GetWeakPtr(), |
| + data, sender_id)); |
| +} |
| + |
| +void PushMessagingMessageFilter::DidCheckForExistingRegistration( |
| + const RegisterData& data, |
| + const std::string& sender_id, |
| + const std::string& push_registration_id, |
| + ServiceWorkerStatusCode service_worker_status) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + if (service_worker_status == SERVICE_WORKER_OK) { |
| + GURL push_endpoint(service()->GetPushEndpoint()); |
|
Michael van Ouwerkerk
2014/12/11 17:12:53
The service() method is UI thread only, we're on t
johnme
2014/12/11 18:32:33
Done (sigh, more thread hops 8-)
|
| + SendRegisterSuccess(data, PUSH_REGISTRATION_STATUS_SUCCESS_FROM_CACHE, |
| + push_endpoint, push_registration_id); |
| + return; |
| + } |
| + // TODO(johnme): The spec allows the register algorithm to reject with an |
| + // AbortError when accessing storage fails. Perhaps we should do that if |
| + // service_worker_status != SERVICE_WORKER_ERROR_NOT_FOUND instead of |
| + // attempting to do a fresh registration? |
| + // https://w3c.github.io/push-api/#widl-PushRegistrationManager-register-Promise-PushRegistration |
| + BrowserThread::PostTask( |
| + BrowserThread::UI, FROM_HERE, |
| + base::Bind(&PushMessagingMessageFilter::RegisterOnUI, |
| + this, data, sender_id)); |
| +} |
| + |
| void PushMessagingMessageFilter::RegisterOnUI( |
| const RegisterData& data, |
| const std::string& sender_id) { |
| @@ -247,7 +276,7 @@ void PushMessagingMessageFilter::DidRegister( |
| const std::string& push_registration_id, |
| PushRegistrationStatus status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| - if (status == PUSH_REGISTRATION_STATUS_SUCCESS) { |
| + if (status == PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE) { |
| GURL push_endpoint(service()->GetPushEndpoint()); |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| @@ -279,10 +308,14 @@ void PushMessagingMessageFilter::DidPersistRegistrationOnIO( |
| const std::string& push_registration_id, |
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - if (service_worker_status == SERVICE_WORKER_OK) |
| - SendRegisterSuccess(data, push_endpoint, push_registration_id); |
| - else |
| + if (service_worker_status == SERVICE_WORKER_OK) { |
| + SendRegisterSuccess(data, |
| + PUSH_REGISTRATION_STATUS_SUCCESS_FROM_PUSH_SERVICE, |
| + push_endpoint, push_registration_id); |
| + } else { |
| + // TODO(johnme): Unregister, so PushMessagingServiceImpl can decrease count. |
| SendRegisterError(data, PUSH_REGISTRATION_STATUS_STORAGE_ERROR); |
| + } |
| } |
| void PushMessagingMessageFilter::SendRegisterError( |
| @@ -300,6 +333,7 @@ void PushMessagingMessageFilter::SendRegisterError( |
| void PushMessagingMessageFilter::SendRegisterSuccess( |
| const RegisterData& data, |
| + PushRegistrationStatus status, |
| const GURL& push_endpoint, |
| const std::string& push_registration_id) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| @@ -311,7 +345,7 @@ void PushMessagingMessageFilter::SendRegisterSuccess( |
| Send(new PushMessagingMsg_RegisterFromWorkerSuccess( |
| data.request_id, push_endpoint, push_registration_id)); |
| } |
| - RecordRegistrationStatus(PUSH_REGISTRATION_STATUS_SUCCESS); |
| + RecordRegistrationStatus(status); |
| } |
| PushMessagingService* PushMessagingMessageFilter::service() { |