diff options
9 files changed, 51 insertions, 11 deletions
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc index fc5218a..2fe0538 100644 --- a/content/browser/push_messaging/push_messaging_router.cc +++ b/content/browser/push_messaging/push_messaging_router.cc @@ -8,6 +8,7 @@ #include "content/browser/service_worker/service_worker_context_wrapper.h" #include "content/browser/service_worker/service_worker_registration.h" #include "content/browser/service_worker/service_worker_storage.h" +#include "content/common/service_worker/service_worker_status_code.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/storage_partition.h" @@ -92,9 +93,32 @@ void PushMessagingRouter::DeliverMessageEnd( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); // TODO(mvanouwerkerk): UMA logging. PushDeliveryStatus delivery_status = - service_worker_status == SERVICE_WORKER_OK - ? PUSH_DELIVERY_STATUS_SUCCESS - : PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; + PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; + switch (service_worker_status) { + case SERVICE_WORKER_OK: + delivery_status = PUSH_DELIVERY_STATUS_SUCCESS; + break; + case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: + delivery_status = PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED; + break; + case SERVICE_WORKER_ERROR_FAILED: + case SERVICE_WORKER_ERROR_ABORT: + case SERVICE_WORKER_ERROR_START_WORKER_FAILED: + case SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND: + case SERVICE_WORKER_ERROR_NOT_FOUND: + case SERVICE_WORKER_ERROR_IPC_FAILED: + delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; + break; + case SERVICE_WORKER_ERROR_EXISTS: + case SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED: + case SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED: + case SERVICE_WORKER_ERROR_NETWORK: + case SERVICE_WORKER_ERROR_SECURITY: + NOTREACHED() << "Got unexpected error code: " << service_worker_status + << " " << ServiceWorkerStatusToString(service_worker_status); + delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; + break; + } BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, diff --git a/content/browser/service_worker/service_worker_registration_status.cc b/content/browser/service_worker/service_worker_registration_status.cc index e67b833..250fb3b 100644 --- a/content/browser/service_worker/service_worker_registration_status.cc +++ b/content/browser/service_worker/service_worker_registration_status.cc @@ -48,6 +48,7 @@ void GetServiceWorkerRegistrationStatusResponse( case SERVICE_WORKER_ERROR_FAILED: case SERVICE_WORKER_ERROR_PROCESS_NOT_FOUND: case SERVICE_WORKER_ERROR_EXISTS: + case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: // Unexpected, or should have bailed out before calling this, or we don't // have a corresponding blink error code yet. break; // Fall through to NOTREACHED(). diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index bea893b..ea621e5 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc @@ -737,7 +737,8 @@ void ServiceWorkerVersion::OnSyncEventFinished( } void ServiceWorkerVersion::OnPushEventFinished( - int request_id) { + int request_id, + blink::WebServiceWorkerEventResult result) { TRACE_EVENT1("ServiceWorker", "ServiceWorkerVersion::OnPushEventFinished", "Request id", request_id); @@ -746,9 +747,12 @@ void ServiceWorkerVersion::OnPushEventFinished( NOTREACHED() << "Got unexpected message: " << request_id; return; } + ServiceWorkerStatusCode status = SERVICE_WORKER_OK; + if (result == blink::WebServiceWorkerEventResultRejected) + status = SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED; scoped_refptr<ServiceWorkerVersion> protect(this); - callback->Run(SERVICE_WORKER_OK); + callback->Run(status); push_callbacks_.Remove(request_id); } diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index fd8db5a..01383064 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h @@ -287,7 +287,8 @@ class CONTENT_EXPORT ServiceWorkerVersion ServiceWorkerFetchEventResult result, const ServiceWorkerResponse& response); void OnSyncEventFinished(int request_id); - void OnPushEventFinished(int request_id); + void OnPushEventFinished(int request_id, + blink::WebServiceWorkerEventResult result); void OnGeofencingEventFinished(int request_id); void OnPostMessageToDocument(int client_id, const base::string16& message, diff --git a/content/common/service_worker/service_worker_messages.h b/content/common/service_worker/service_worker_messages.h index 7672048..f9ebecc 100644 --- a/content/common/service_worker/service_worker_messages.h +++ b/content/common/service_worker/service_worker_messages.h @@ -187,8 +187,9 @@ IPC_MESSAGE_ROUTED3(ServiceWorkerHostMsg_FetchEventFinished, content::ServiceWorkerResponse) IPC_MESSAGE_ROUTED1(ServiceWorkerHostMsg_SyncEventFinished, int /* request_id */) -IPC_MESSAGE_ROUTED1(ServiceWorkerHostMsg_PushEventFinished, - int /* request_id */) +IPC_MESSAGE_ROUTED2(ServiceWorkerHostMsg_PushEventFinished, + int /* request_id */, + blink::WebServiceWorkerEventResult) IPC_MESSAGE_ROUTED1(ServiceWorkerHostMsg_GeofencingEventFinished, int /* request_id */) diff --git a/content/common/service_worker/service_worker_status_code.cc b/content/common/service_worker/service_worker_status_code.cc index a402a8a..f5c1e02 100644 --- a/content/common/service_worker/service_worker_status_code.cc +++ b/content/common/service_worker/service_worker_status_code.cc @@ -34,6 +34,9 @@ const char* ServiceWorkerStatusToString(ServiceWorkerStatusCode status) { return "Operation failed by network issue"; case SERVICE_WORKER_ERROR_SECURITY: return "Operation failed by security issue"; + case SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED: + return "ServiceWorker failed to handle event (event.waitUntil " + "Promise rejected)"; } NOTREACHED(); return ""; diff --git a/content/common/service_worker/service_worker_status_code.h b/content/common/service_worker/service_worker_status_code.h index 953d533..e87e5c3 100644 --- a/content/common/service_worker/service_worker_status_code.h +++ b/content/common/service_worker/service_worker_status_code.h @@ -48,6 +48,9 @@ enum ServiceWorkerStatusCode { // Operation is failed by security issue. SERVICE_WORKER_ERROR_SECURITY, + + // Event handling failed (event.waitUntil Promise rejected). + SERVICE_WORKER_ERROR_EVENT_WAITUNTIL_REJECTED, }; CONTENT_EXPORT const char* ServiceWorkerStatusToString( diff --git a/content/public/common/push_messaging_status.h b/content/public/common/push_messaging_status.h index 22351ca..6ac9d96 100644 --- a/content/public/common/push_messaging_status.h +++ b/content/public/common/push_messaging_status.h @@ -51,10 +51,14 @@ enum PushDeliveryStatus { // The message could not be delivered because of a service worker error. PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR, + // The message was delivered, but the Service Worker passed a Promise to + // event.waitUntil that got rejected. + PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED, + // When making changes, update PUSH_DELIVERY_STATUS_LAST below. // Used for IPC message range checks. - PUSH_DELIVERY_STATUS_LAST = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR + PUSH_DELIVERY_STATUS_LAST = PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED }; const char* PushRegistrationStatusToString(PushRegistrationStatus status); diff --git a/content/renderer/service_worker/service_worker_script_context.cc b/content/renderer/service_worker/service_worker_script_context.cc index 33f4dd0..baf9060 100644 --- a/content/renderer/service_worker/service_worker_script_context.cc +++ b/content/renderer/service_worker/service_worker_script_context.cc @@ -132,7 +132,6 @@ void ServiceWorkerScriptContext::DidHandleFetchEvent( void ServiceWorkerScriptContext::DidHandlePushEvent( int request_id, blink::WebServiceWorkerEventResult result) { - // TODO(johnme): Plumb through the result. if (result == blink::WebServiceWorkerEventResultCompleted) { UMA_HISTOGRAM_TIMES( "ServiceWorker.PushEventExecutionTime", @@ -141,7 +140,7 @@ void ServiceWorkerScriptContext::DidHandlePushEvent( push_start_timings_.erase(request_id); Send(new ServiceWorkerHostMsg_PushEventFinished( - GetRoutingID(), request_id)); + GetRoutingID(), request_id, result)); } void ServiceWorkerScriptContext::DidHandleSyncEvent(int request_id) { |