| 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 ef2fea36d58c89f0108daaea60cdaa243a8709fb..15d32a2fe2f812eff01c5ca88f0e02a78a9de185 100644
 | 
| --- a/content/renderer/service_worker/service_worker_script_context.cc
 | 
| +++ b/content/renderer/service_worker/service_worker_script_context.cc
 | 
| @@ -10,6 +10,7 @@
 | 
|  #include "content/child/notifications/notification_data_conversions.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"
 | 
| @@ -37,6 +38,16 @@ void SendPostMessageToDocumentOnMainThread(
 | 
|        WebMessagePortChannelImpl::ExtractMessagePortIDs(channels.release())));
 | 
|  }
 | 
|  
 | 
| +void SendCrossOriginMessageToClientOnMainThread(
 | 
| +    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);
 | 
| @@ -86,6 +97,8 @@ void ServiceWorkerScriptContext::OnMessageReceived(
 | 
|      IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginConnectEvent,
 | 
|                          OnCrossOriginConnectEvent)
 | 
|      IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage)
 | 
| +    IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker,
 | 
| +                        OnCrossOriginMessageToWorker)
 | 
|      IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClientDocuments,
 | 
|                          OnDidGetClientDocuments)
 | 
|      IPC_MESSAGE_HANDLER(ServiceWorkerMsg_FocusClientResponse,
 | 
| @@ -200,6 +213,21 @@ void ServiceWorkerScriptContext::PostMessageToDocument(
 | 
|                   GetRoutingID(), client_id, message, base::Passed(&channels)));
 | 
|  }
 | 
|  
 | 
| +void ServiceWorkerScriptContext::PostCrossOriginMessageToClient(
 | 
| +    const blink::WebCrossOriginServiceWorkerClient& 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(&SendCrossOriginMessageToClientOnMainThread,
 | 
| +                 make_scoped_refptr(embedded_context_->thread_safe_sender()),
 | 
| +                 client.clientID, message, base::Passed(&channels)));
 | 
| +}
 | 
| +
 | 
|  void ServiceWorkerScriptContext::FocusClient(
 | 
|      int client_id, blink::WebServiceWorkerClientFocusCallback* callback) {
 | 
|    DCHECK(callback);
 | 
| @@ -346,6 +374,30 @@ void ServiceWorkerScriptContext::OnPostMessage(
 | 
|        base::TimeTicks::Now() - before);
 | 
|  }
 | 
|  
 | 
| +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;
 | 
| +  web_client.origin = client.origin;
 | 
| +  web_client.targetURL = client.target_url;
 | 
| +  web_client.clientID = client.message_port_id;
 | 
| +  proxy_->dispatchCrossOriginMessageEvent(web_client, message, ports);
 | 
| +}
 | 
| +
 | 
|  void ServiceWorkerScriptContext::OnDidGetClientDocuments(
 | 
|      int request_id, const std::vector<ServiceWorkerClientInfo>& clients) {
 | 
|    TRACE_EVENT0("ServiceWorker",
 | 
| 
 |