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); |
} |