Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3053)

Unified Diff: content/renderer/service_worker/service_worker_script_context.cc

Issue 246023007: Chromium-side plumbing for ServiceWorker -> Document postMessage (2/3) (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: message port threading fix Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « content/renderer/service_worker/service_worker_script_context.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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);
}
« no previous file with comments | « content/renderer/service_worker/service_worker_script_context.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698