Index: content/browser/push_messaging/push_messaging_router.cc |
diff --git a/content/browser/push_messaging/push_messaging_router.cc b/content/browser/push_messaging/push_messaging_router.cc |
index bc95216ad07698514323caf241f6a1542273660d..ac724ad5eb6b002e469de0b98383bd5e7ad198ec 100644 |
--- a/content/browser/push_messaging/push_messaging_router.cc |
+++ b/content/browser/push_messaging/push_messaging_router.cc |
@@ -10,6 +10,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_messages.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" |
@@ -22,6 +23,7 @@ namespace { |
void RunDeliverCallback( |
const PushMessagingRouter::DeliverMessageCallback& deliver_message_callback, |
PushDeliveryStatus delivery_status) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
BrowserThread::PostTask( |
BrowserThread::UI, FROM_HERE, |
base::Bind(deliver_message_callback, delivery_status)); |
@@ -87,15 +89,34 @@ void PushMessagingRouter::FindServiceWorkerRegistrationCallback( |
// alive until the callback dies. Otherwise the registration could be |
// released when this method returns - before the event is delivered to the |
// service worker. |
- base::Callback<void(ServiceWorkerStatusCode)> dispatch_event_callback = |
- base::Bind(&PushMessagingRouter::DeliverMessageEnd, |
- deliver_message_callback, service_worker_registration); |
+ version->RunAfterStartWorker( |
+ base::Bind(&PushMessagingRouter::DeliverMessageToWorker, |
+ make_scoped_refptr(version), service_worker_registration, data, |
+ deliver_message_callback), |
+ base::Bind(&PushMessagingRouter::DeliverMessageFailed, |
+ deliver_message_callback, service_worker_registration)); |
+} |
- version->DispatchPushEvent(dispatch_event_callback, data); |
+// static |
+void PushMessagingRouter::DeliverMessageToWorker( |
+ const scoped_refptr<ServiceWorkerVersion>& service_worker, |
+ const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, |
+ const std::string& data, |
+ const DeliverMessageCallback& deliver_message_callback) { |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ int request_id = service_worker->StartRequest( |
+ ServiceWorkerMetrics::EventType::PUSH, |
+ base::Bind(&PushMessagingRouter::DeliverMessageFailed, |
+ deliver_message_callback, service_worker_registration)); |
+ service_worker->DispatchEvent<ServiceWorkerHostMsg_PushEventFinished>( |
+ request_id, ServiceWorkerMsg_PushEvent(request_id, data), |
+ base::Bind(&PushMessagingRouter::DeliverMessageFinished, |
+ deliver_message_callback, service_worker, |
+ service_worker_registration)); |
} |
// static |
-void PushMessagingRouter::DeliverMessageEnd( |
+void PushMessagingRouter::DeliverMessageFailed( |
const DeliverMessageCallback& deliver_message_callback, |
const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, |
ServiceWorkerStatusCode service_worker_status) { |
@@ -104,9 +125,6 @@ void PushMessagingRouter::DeliverMessageEnd( |
PushDeliveryStatus delivery_status = |
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; |
@@ -123,6 +141,7 @@ void PushMessagingRouter::DeliverMessageEnd( |
case SERVICE_WORKER_ERROR_DISALLOWED: |
delivery_status = PUSH_DELIVERY_STATUS_SERVICE_WORKER_ERROR; |
break; |
+ case SERVICE_WORKER_OK: |
case SERVICE_WORKER_ERROR_EXISTS: |
case SERVICE_WORKER_ERROR_INSTALL_WORKER_FAILED: |
case SERVICE_WORKER_ERROR_ACTIVATE_WORKER_FAILED: |
@@ -138,4 +157,23 @@ void PushMessagingRouter::DeliverMessageEnd( |
RunDeliverCallback(deliver_message_callback, delivery_status); |
} |
+// static |
+void PushMessagingRouter::DeliverMessageFinished( |
+ const DeliverMessageCallback& deliver_message_callback, |
+ const scoped_refptr<ServiceWorkerVersion>& service_worker, |
+ const scoped_refptr<ServiceWorkerRegistration>& service_worker_registration, |
+ int request_id, |
+ blink::WebServiceWorkerEventResult result) { |
+ TRACE_EVENT1("ServiceWorker", "PushMessagingRouter::DeliverMessageFinished", |
+ "Request id", request_id); |
+ DCHECK_CURRENTLY_ON(BrowserThread::IO); |
+ if (!service_worker->FinishRequest(request_id)) |
+ NOTREACHED() << "Should only receive one reply per event"; |
+ |
+ PushDeliveryStatus delivery_status = PUSH_DELIVERY_STATUS_SUCCESS; |
+ if (result == blink::WebServiceWorkerEventResultRejected) |
+ delivery_status = PUSH_DELIVERY_STATUS_EVENT_WAITUNTIL_REJECTED; |
+ RunDeliverCallback(deliver_message_callback, delivery_status); |
+} |
+ |
} // namespace content |