| 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,
|
|
|