Index: content/browser/service_worker/service_worker_version.cc |
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc |
index 274daf03f7b27dec91fd9967beb0a8d5e9645fe6..16c4ca82af46a01445f291795d2344a530c110e9 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -302,6 +302,34 @@ void ServiceWorkerVersion::DispatchSyncEvent(const StatusCallback& callback) { |
} |
} |
+void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback) { |
+ DCHECK_EQ(ACTIVE, status()) << status(); |
+ |
+ //~ if (!CommandLine::ForCurrentProcess()->HasSwitch( |
Peter Beverloo
2014/05/22 16:52:25
Guard behind experimental web platform features (a
Michael van Ouwerkerk
2014/05/23 18:24:50
Done.
|
+ //~ switches::kEnableServiceWorkerPush)) { |
+ //~ callback.Run(SERVICE_WORKER_ERROR_ABORT); |
+ //~ return; |
+ //~ } |
+ |
+ if (running_status() != RUNNING) { |
+ // Schedule calling this method after starting the worker. |
+ StartWorker(base::Bind(&RunTaskAfterStartWorker, |
+ weak_factory_.GetWeakPtr(), callback, |
+ base::Bind(&self::DispatchPushEvent, |
+ weak_factory_.GetWeakPtr(), |
+ callback))); |
+ return; |
+ } |
+ |
+ int request_id = push_callbacks_.Add(new StatusCallback(callback)); |
+ ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
+ ServiceWorkerMsg_PushEvent(request_id)); |
+ if (status != SERVICE_WORKER_OK) { |
+ push_callbacks_.Remove(request_id); |
+ RunSoon(base::Bind(callback, status)); |
+ } |
+} |
+ |
void ServiceWorkerVersion::AddProcessToWorker(int process_id) { |
embedded_worker_->AddProcessReference(process_id); |
} |
@@ -394,6 +422,9 @@ void ServiceWorkerVersion::OnStopped() { |
RunIDMapCallbacks(&sync_callbacks_, |
&StatusCallback::Run, |
MakeTuple(SERVICE_WORKER_ERROR_FAILED)); |
+ RunIDMapCallbacks(&push_callbacks_, |
+ &StatusCallback::Run, |
+ MakeTuple(SERVICE_WORKER_ERROR_FAILED)); |
FOR_EACH_OBSERVER(Listener, listeners_, OnWorkerStopped(this)); |
} |
@@ -438,6 +469,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
OnFetchEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SyncEventFinished, |
OnSyncEventFinished) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
+ OnPushEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, |
OnPostMessageToDocument) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -558,6 +591,19 @@ void ServiceWorkerVersion::OnSyncEventFinished( |
sync_callbacks_.Remove(request_id); |
} |
+void ServiceWorkerVersion::OnPushEventFinished( |
+ int request_id) { |
+ StatusCallback* callback = push_callbacks_.Lookup(request_id); |
+ if (!callback) { |
+ NOTREACHED() << "Got unexpected message: " << request_id; |
+ return; |
+ } |
+ |
+ scoped_refptr<ServiceWorkerVersion> protect(this); |
+ callback->Run(SERVICE_WORKER_OK); |
+ push_callbacks_.Remove(request_id); |
+} |
+ |
void ServiceWorkerVersion::OnPostMessageToDocument( |
int client_id, |
const base::string16& message, |