Chromium Code Reviews| Index: content/renderer/service_worker/service_worker_script_context.cc |
| diff --git a/content/renderer/service_worker/service_worker_script_context.cc b/content/renderer/service_worker/service_worker_script_context.cc |
| index c97cd86f948be304cb7fc0041bddc70af8061aba..7df08084e6d9fc205db3b45a4a9e52f4766feb30 100644 |
| --- a/content/renderer/service_worker/service_worker_script_context.cc |
| +++ b/content/renderer/service_worker/service_worker_script_context.cc |
| @@ -5,6 +5,7 @@ |
| #include "content/renderer/service_worker/service_worker_script_context.h" |
| #include "base/logging.h" |
| +#include "content/child/thread_safe_sender.h" |
| #include "content/child/webmessageportchannel_impl.h" |
| #include "content/common/service_worker/service_worker_messages.h" |
| #include "content/renderer/service_worker/embedded_worker_context_client.h" |
| @@ -14,6 +15,20 @@ |
| namespace content { |
| +namespace { |
| + |
| +void SendPostMessageToDocumentOnMainThread( |
| + ThreadSafeSender* sender, |
| + int routing_id, |
| + int client_id, |
| + const base::string16& message, |
| + const std::vector<int>& message_port_ids) { |
| + sender->Send(new ServiceWorkerHostMsg_PostMessageToDocument( |
| + routing_id, client_id, message, message_port_ids)); |
| +} |
| + |
| +} // namespace |
| + |
| ServiceWorkerScriptContext::ServiceWorkerScriptContext( |
| EmbeddedWorkerContextClient* embedded_context, |
| blink::WebServiceWorkerContextProxy* proxy) |
| @@ -31,7 +46,7 @@ void ServiceWorkerScriptContext::OnMessageReceived( |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FetchEvent, OnFetchEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_InstallEvent, OnInstallEvent) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
| - IPC_MESSAGE_HANDLER(ServiceWorkerMsg_Message, OnPostMessage) |
| + IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
| IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClientDocuments, |
| OnDidGetClientDocuments) |
| IPC_MESSAGE_UNHANDLED(handled = false) |
| @@ -74,6 +89,21 @@ void ServiceWorkerScriptContext::GetClientDocuments( |
| GetRoutingID(), request_id)); |
| } |
| +void ServiceWorkerScriptContext::PostMessageToDocument( |
| + int client_id, |
| + const base::string16& message, |
| + const std::vector<int>& message_port_ids) { |
| + // This may send IDs for MessagePorts, and all internal book-keeping |
| + // messages for MessagePort (e.g. QueueMessages) are sent from main thread |
| + // (with thread hopping), so we need to do the same thread hopping here not |
| + // to overtake those messages. |
|
michaeln
2014/05/08 00:00:27
ouch, that's a subtle ordering dependency
|
| + embedded_context_->main_thread_proxy()->PostTask( |
| + FROM_HERE, |
| + base::Bind(&SendPostMessageToDocumentOnMainThread, |
| + make_scoped_refptr(embedded_context_->thread_safe_sender()), |
| + GetRoutingID(), client_id, message, message_port_ids)); |
| +} |
| + |
| void ServiceWorkerScriptContext::Send(IPC::Message* message) { |
| embedded_context_->Send(message); |
| } |