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 6f41960e2ee3d144d1a516d3f395eb99e0a65e32..2db9062d23c74e62501fafdc6bdf14215cbc0415 100644 |
--- a/content/renderer/service_worker/service_worker_script_context.cc |
+++ b/content/renderer/service_worker/service_worker_script_context.cc |
@@ -7,8 +7,10 @@ |
#include "base/debug/trace_event.h" |
#include "base/logging.h" |
#include "base/metrics/histogram.h" |
+#include "content/child/service_worker/web_cross_origin_service_worker_client_impl.h" |
#include "content/child/thread_safe_sender.h" |
#include "content/child/webmessageportchannel_impl.h" |
+#include "content/common/message_port_messages.h" |
#include "content/common/service_worker/service_worker_messages.h" |
#include "content/renderer/service_worker/embedded_worker_context_client.h" |
#include "ipc/ipc_message.h" |
@@ -35,6 +37,16 @@ void SendPostMessageToDocumentOnMainThread( |
WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release()))); |
} |
+void SendCrossOriginMessageOnMainThread( |
+ ThreadSafeSender* sender, |
+ int message_port_id, |
+ const base::string16& message, |
+ scoped_ptr<blink::WebMessagePortChannelArray> channels) { |
+ sender->Send(new MessagePortHostMsg_PostMessage( |
+ message_port_id, message, |
+ WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release()))); |
+} |
+ |
blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( |
FetchRequestMode mode) { |
return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); |
@@ -79,6 +91,10 @@ void ServiceWorkerScriptContext::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SyncEvent, OnSyncEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_PushEvent, OnPushEvent) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_GeofencingEvent, OnGeofencingEvent) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent, |
+ OnCrossOriginConnectEvent) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
+ OnCrossOriginMessageToWorker) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClientDocuments, |
OnDidGetClientDocuments) |
@@ -161,6 +177,13 @@ void ServiceWorkerScriptContext::DidHandleSyncEvent(int request_id) { |
GetRoutingID(), request_id)); |
} |
+void ServiceWorkerScriptContext::DidHandleCrossOriginConnectEvent( |
+ int request_id, |
+ bool allow_connect) { |
+ Send(new ServiceWorkerHostMsg_CrossOriginConnectEventFinished( |
+ GetRoutingID(), request_id, allow_connect)); |
+} |
+ |
void ServiceWorkerScriptContext::GetClientDocuments( |
blink::WebServiceWorkerClientsCallbacks* callbacks) { |
DCHECK(callbacks); |
@@ -184,6 +207,21 @@ void ServiceWorkerScriptContext::PostMessageToDocument( |
GetRoutingID(), client_id, message, base::Passed(&channels))); |
} |
+void ServiceWorkerScriptContext::PostCrossOriginMessage( |
+ WebCrossOriginServiceWorkerClientImpl* client, |
+ const base::string16& message, |
+ scoped_ptr<blink::WebMessagePortChannelArray> channels) { |
+ // This may send channels 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. |
+ embedded_context_->main_thread_proxy()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&SendCrossOriginMessageOnMainThread, |
+ make_scoped_refptr(embedded_context_->thread_safe_sender()), |
+ client->message_port_id(), message, base::Passed(&channels))); |
+} |
+ |
void ServiceWorkerScriptContext::Send(IPC::Message* message) { |
embedded_context_->Send(message); |
} |
@@ -280,6 +318,40 @@ void ServiceWorkerScriptContext::OnGeofencingEvent( |
request_id)); |
} |
+void ServiceWorkerScriptContext::OnCrossOriginConnectEvent( |
+ int request_id, |
+ const CrossOriginServiceWorkerClient& client) { |
+ TRACE_EVENT0("ServiceWorker", |
+ "ServiceWorkerScriptContext::OnCrossOriginConnectEvent"); |
+ // base::MessageLoopProxy* loop_proxy = |
+ // embedded_context_->main_thread_proxy(); |
+ blink::WebCrossOriginServiceWorkerClient* web_client = |
+ new WebCrossOriginServiceWorkerClientImpl(client); |
+ proxy_->dispatchCrossOriginConnectEvent(request_id, web_client); |
+} |
+ |
+void ServiceWorkerScriptContext::OnCrossOriginMessageToWorker( |
+ const CrossOriginServiceWorkerClient& client, |
+ const base::string16& message, |
+ const std::vector<int>& sent_message_port_ids, |
+ const std::vector<int>& new_routing_ids) { |
+ TRACE_EVENT0("ServiceWorker", |
+ "ServiceWorkerScriptContext::OnCrossOriginMessageToWorker"); |
+ std::vector<WebMessagePortChannelImpl*> ports; |
+ if (!sent_message_port_ids.empty()) { |
+ base::MessageLoopProxy* loop_proxy = embedded_context_->main_thread_proxy(); |
+ ports.resize(sent_message_port_ids.size()); |
+ for (size_t i = 0; i < sent_message_port_ids.size(); ++i) { |
+ ports[i] = new WebMessagePortChannelImpl( |
+ new_routing_ids[i], sent_message_port_ids[i], loop_proxy); |
+ } |
+ } |
+ |
+ blink::WebCrossOriginServiceWorkerClient* web_client = |
+ new WebCrossOriginServiceWorkerClientImpl(client); |
+ proxy_->dispatchCrossOriginMessageEvent(web_client, message, ports); |
+} |
+ |
void ServiceWorkerScriptContext::OnPostMessage( |
const base::string16& message, |
const std::vector<int>& sent_message_port_ids, |