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 4f9345ec8057d69e654314fd0b65e33d41841766..0ba0be20d6d86e79f9bedc3df24207f3f837166c 100644 |
| --- a/content/browser/push_messaging/push_messaging_message_filter.cc |
| +++ b/content/browser/push_messaging/push_messaging_message_filter.cc |
| @@ -20,6 +20,7 @@ |
| #include "content/public/browser/browser_thread.h" |
| #include "content/public/browser/push_messaging_service.h" |
| #include "content/public/common/child_process_host.h" |
| +#include "content/public/common/push_messaging_status.h" |
| #include "third_party/WebKit/public/platform/modules/push_messaging/WebPushPermissionStatus.h" |
| namespace content { |
| @@ -29,15 +30,27 @@ const char kPushRegistrationIdServiceWorkerKey[] = "push_registration_id"; |
| namespace { |
| +// These methods are only called from IO thread, but it would be acceptable |
| +// (even though slightly racy) to call them from UI thread as well, see |
| +// https://groups.google.com/a/chromium.org/d/msg/chromium-dev/FNzZRJtN2aw/Aw0CWAXJJ1kJ |
| void RecordRegistrationStatus(PushRegistrationStatus status) { |
| - // Only called from IO thread, but would be acceptable (even though slightly |
| - // racy) to call from UI thread as well, see |
| - // https://groups.google.com/a/chromium.org/d/msg/chromium-dev/FNzZRJtN2aw/Aw0CWAXJJ1kJ |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| UMA_HISTOGRAM_ENUMERATION("PushMessaging.RegistrationStatus", |
| status, |
| PUSH_REGISTRATION_STATUS_LAST + 1); |
| } |
|
Ilya Sherman
2015/02/19 21:01:45
nit: Please leave a blank line after this one.
johnme
2015/02/20 11:34:19
Done.
|
| +void RecordUnregistrationStatus(PushUnregistrationStatus status) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + UMA_HISTOGRAM_ENUMERATION("PushMessaging.UnregistrationStatus", |
| + status, |
| + PUSH_UNREGISTRATION_STATUS_LAST + 1); |
| +} |
|
Ilya Sherman
2015/02/19 21:01:45
nit: Please leave a blank line after this one.
johnme
2015/02/20 11:34:19
Done.
|
| +void RecordGetRegistrationStatus(PushGetRegistrationStatus status) { |
| + DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + UMA_HISTOGRAM_ENUMERATION("PushMessaging.GetRegistrationStatus", |
| + status, |
| + PUSH_GETREGISTRATION_STATUS_LAST + 1); |
| +} |
| } // namespace |
| @@ -337,7 +350,8 @@ void PushMessagingMessageFilter::Core::RegisterOnUI( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&PushMessagingMessageFilter::SendRegisterError, |
| io_parent_, |
| - data, PUSH_REGISTRATION_STATUS_PERMISSION_DENIED)); |
| + data, |
| + PUSH_REGISTRATION_STATUS_INCOGNITO_SERVICE_NOT_AVAILABLE_PERMISSION_DENIED)); |
| } |
| // Else leave the promise hanging forever, to simulate a user ignoring the |
| // infobar. TODO(johnme): Simulate the user dismissing the infobar after a |
| @@ -456,7 +470,7 @@ void PushMessagingMessageFilter::OnUnregister( |
| service_worker_context_->context()->GetLiveRegistration( |
| service_worker_registration_id); |
| if (!service_worker_registration) { |
| - DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); |
| + DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER); |
| return; |
| } |
| @@ -523,7 +537,7 @@ void PushMessagingMessageFilter::UnregisterHavingGottenSenderId( |
| return; |
| case SERVICE_WORKER_ERROR_FAILED: |
| DidUnregister(request_id, |
| - PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); |
| + PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR); |
| return; |
| case SERVICE_WORKER_ERROR_ABORT: |
| case SERVICE_WORKER_ERROR_START_WORKER_FAILED: |
| @@ -538,7 +552,7 @@ void PushMessagingMessageFilter::UnregisterHavingGottenSenderId( |
| case SERVICE_WORKER_ERROR_STATE: |
| NOTREACHED() << "Got unexpected error code: " << service_worker_status |
| << " " << ServiceWorkerStatusToString(service_worker_status); |
| - DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR); |
| + DidUnregister(request_id, PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR); |
| return; |
| } |
| } |
| @@ -557,7 +571,8 @@ void PushMessagingMessageFilter::Core::UnregisterFromService( |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&PushMessagingMessageFilter::DidUnregister, io_parent_, |
| - request_id, PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR)); |
| + request_id, |
| + PUSH_UNREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE)); |
| return; |
| } |
| @@ -576,26 +591,26 @@ void PushMessagingMessageFilter::Core::DidUnregisterFromService( |
| DCHECK_CURRENTLY_ON(BrowserThread::UI); |
| switch (unregistration_status) { |
| - case PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTER: |
| - break; |
| + case PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED: |
| case PUSH_UNREGISTRATION_STATUS_SUCCESS_WILL_RETRY_NETWORK_ERROR: |
| - NOTREACHED(); |
| - break; |
| case PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED: |
| + BrowserThread::PostTask( |
| + BrowserThread::IO, FROM_HERE, |
| + base::Bind(&PushMessagingMessageFilter::ClearRegistrationData, |
| + io_parent_, request_id, service_worker_registration_id, |
| + unregistration_status)); |
| + break; |
| + case PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER: |
| + case PUSH_UNREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE: |
| + case PUSH_UNREGISTRATION_STATUS_SERVICE_ERROR: |
| + case PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR: |
| case PUSH_UNREGISTRATION_STATUS_NETWORK_ERROR: |
| - case PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR: |
| BrowserThread::PostTask( |
| BrowserThread::IO, FROM_HERE, |
| base::Bind(&PushMessagingMessageFilter::DidUnregister, io_parent_, |
| request_id, unregistration_status)); |
| - return; |
| + break; |
| } |
| - |
| - BrowserThread::PostTask( |
| - BrowserThread::IO, FROM_HERE, |
| - base::Bind(&PushMessagingMessageFilter::ClearRegistrationData, io_parent_, |
| - request_id, service_worker_registration_id, |
| - unregistration_status)); |
| } |
| void PushMessagingMessageFilter::ClearRegistrationData( |
| @@ -618,9 +633,12 @@ void PushMessagingMessageFilter::DidClearRegistrationData( |
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - DCHECK(service_worker_status == SERVICE_WORKER_OK) |
| - << "Got unexpected error code: " << service_worker_status |
| - << " " << ServiceWorkerStatusToString(service_worker_status); |
| + if (service_worker_status != SERVICE_WORKER_OK && |
| + service_worker_status != SERVICE_WORKER_ERROR_NOT_FOUND) { |
| + unregistration_status = PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR; |
| + DLOG(WARNING) << "Got unexpected error code: " << service_worker_status |
| + << " " << ServiceWorkerStatusToString(service_worker_status); |
| + } |
| DidUnregister(request_id, unregistration_status); |
| } |
| @@ -630,25 +648,31 @@ void PushMessagingMessageFilter::DidUnregister( |
| PushUnregistrationStatus unregistration_status) { |
| // Only called from IO thread, but would be safe to call from UI thread. |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| + RecordUnregistrationStatus(unregistration_status); |
| + blink::WebPushError::ErrorType blinkError; |
| switch (unregistration_status) { |
| - case PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTER: |
| - case PUSH_UNREGISTRATION_STATUS_SUCCESS_WILL_RETRY_NETWORK_ERROR: |
| + case PUSH_UNREGISTRATION_STATUS_SUCCESS_UNREGISTERED: |
| Send(new PushMessagingMsg_UnregisterSuccess(request_id, true)); |
| return; |
| + case PUSH_UNREGISTRATION_STATUS_SUCCESS_WILL_RETRY_NETWORK_ERROR: |
| + NOTREACHED(); |
| + return; |
| case PUSH_UNREGISTRATION_STATUS_SUCCESS_WAS_NOT_REGISTERED: |
| Send(new PushMessagingMsg_UnregisterSuccess(request_id, false)); |
| return; |
| + case PUSH_UNREGISTRATION_STATUS_NO_SERVICE_WORKER: |
| + case PUSH_UNREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE: |
| + case PUSH_UNREGISTRATION_STATUS_SERVICE_ERROR: |
| + case PUSH_UNREGISTRATION_STATUS_STORAGE_ERROR: |
| + blinkError = blink::WebPushError::ErrorTypeAbort; |
| + break; |
| case PUSH_UNREGISTRATION_STATUS_NETWORK_ERROR: |
| - Send(new PushMessagingMsg_UnregisterError( |
| - request_id, blink::WebPushError::ErrorTypeNetwork, |
| - "Failed to connect to the push server.")); |
| - return; |
| - case PUSH_UNREGISTRATION_STATUS_UNKNOWN_ERROR: |
| - Send(new PushMessagingMsg_UnregisterError( |
| - request_id, blink::WebPushError::ErrorTypeUnknown, |
| - "Unexpected error while trying to unregister from the push server.")); |
| - return; |
| + blinkError = blink::WebPushError::ErrorTypeNetwork; |
| + break; |
| } |
| + Send(new PushMessagingMsg_UnregisterError( |
| + request_id, blinkError, |
| + PushUnregistrationStatusToString(unregistration_status))); |
| } |
| // GetRegistration methods on both IO and UI threads, merged in order of use |
| @@ -672,26 +696,27 @@ void PushMessagingMessageFilter::DidGetRegistration( |
| const std::string& push_registration_id, |
| ServiceWorkerStatusCode service_worker_status) { |
| DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| - PushGetRegistrationStatus get_status = |
| - PUSH_GETREGISTRATION_STATUS_SERVICE_WORKER_ERROR; |
| + PushGetRegistrationStatus get_status; |
| switch (service_worker_status) { |
| case SERVICE_WORKER_OK: |
| if (push_endpoint_.is_empty()) { |
| // Return not found in incognito mode, so websites can't detect it. |
| - get_status = ui_core_->is_incognito() |
| - ? PUSH_GETREGISTRATION_STATUS_REGISTRATION_NOT_FOUND |
| - : PUSH_GETREGISTRATION_STATUS_SERVICE_WORKER_ERROR; |
| + get_status = |
| + ui_core_->is_incognito() |
| + ? PUSH_GETREGISTRATION_STATUS_INCOGNITO_SERVICE_NOT_AVAILABLE_REGISTRATION_NOT_FOUND |
| + : PUSH_GETREGISTRATION_STATUS_SERVICE_NOT_AVAILABLE; |
| break; |
| } |
| Send(new PushMessagingMsg_GetRegistrationSuccess(request_id, |
| push_endpoint_, |
| push_registration_id)); |
| + RecordGetRegistrationStatus(PUSH_GETREGISTRATION_STATUS_SUCCESS); |
| return; |
| case SERVICE_WORKER_ERROR_NOT_FOUND: |
| get_status = PUSH_GETREGISTRATION_STATUS_REGISTRATION_NOT_FOUND; |
| break; |
| case SERVICE_WORKER_ERROR_FAILED: |
| - get_status = PUSH_GETREGISTRATION_STATUS_SERVICE_WORKER_ERROR; |
| + get_status = PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR; |
| break; |
| case SERVICE_WORKER_ERROR_ABORT: |
| case SERVICE_WORKER_ERROR_START_WORKER_FAILED: |
| @@ -706,11 +731,11 @@ void PushMessagingMessageFilter::DidGetRegistration( |
| case SERVICE_WORKER_ERROR_STATE: |
| NOTREACHED() << "Got unexpected error code: " << service_worker_status |
| << " " << ServiceWorkerStatusToString(service_worker_status); |
| - get_status = PUSH_GETREGISTRATION_STATUS_SERVICE_WORKER_ERROR; |
| + get_status = PUSH_GETREGISTRATION_STATUS_STORAGE_ERROR; |
| break; |
| } |
| Send(new PushMessagingMsg_GetRegistrationError(request_id, get_status)); |
| - // TODO(johnme): RecordGetRegistrationStatus(status); ? |
| + RecordGetRegistrationStatus(get_status); |
| } |
| // GetPermission methods on both IO and UI threads, merged in order of use from |