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 de32db8ddc38c986363fbf03a1d28e4c4e16b48f..053f9de6e0b945e2b228dc6c3e69561c16b7dfbb 100644 |
--- a/content/renderer/service_worker/service_worker_script_context.cc |
+++ b/content/renderer/service_worker/service_worker_script_context.cc |
@@ -54,6 +54,16 @@ void SendCrossOriginMessageToClientOnMainThread( |
channels.release()))); |
} |
+void StashMessagePortOnMainThread(ThreadSafeSender* sender, |
+ int routing_id, |
+ WebMessagePortChannelImpl* channel, |
+ const base::string16& name) { |
+ DCHECK_GE(channel->message_port_id(), 0); |
+ channel->set_is_stashed(); |
+ sender->Send(new ServiceWorkerHostMsg_StashMessagePort( |
+ routing_id, channel->message_port_id(), name)); |
+} |
+ |
blink::WebURLRequest::FetchRequestMode GetBlinkFetchRequestMode( |
FetchRequestMode mode) { |
return static_cast<blink::WebURLRequest::FetchRequestMode>(mode); |
@@ -120,6 +130,8 @@ void ServiceWorkerScriptContext::OnMessageReceived( |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_MessageToWorker, OnPostMessage) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_CrossOriginMessageToWorker, |
OnCrossOriginMessageToWorker) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerMsg_SendStashedMessagePorts, |
+ OnSendStashedMessagePorts) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_DidGetClients, |
OnDidGetClients) |
IPC_MESSAGE_HANDLER(ServiceWorkerMsg_OpenWindowResponse, |
@@ -303,6 +315,21 @@ void ServiceWorkerScriptContext::SkipWaiting( |
Send(new ServiceWorkerHostMsg_SkipWaiting(GetRoutingID(), request_id)); |
} |
+void ServiceWorkerScriptContext::StashMessagePort( |
+ blink::WebMessagePortChannel* channel, |
+ const base::string16& name) { |
+ // All internal book-keeping messages for MessagePort are sent from main |
+ // thread (with thread hopping), so we need to do the same thread hopping here |
+ // not to overtake those messages. |
+ WebMessagePortChannelImpl* channel_impl = |
+ static_cast<WebMessagePortChannelImpl*>(channel); |
+ embedded_context_->main_thread_task_runner()->PostTask( |
+ FROM_HERE, |
+ base::Bind(&StashMessagePortOnMainThread, |
+ make_scoped_refptr(embedded_context_->thread_safe_sender()), |
+ GetRoutingID(), base::Unretained(channel_impl), name)); |
+} |
+ |
void ServiceWorkerScriptContext::Send(IPC::Message* message) { |
embedded_context_->Send(message); |
} |
@@ -448,6 +475,21 @@ void ServiceWorkerScriptContext::OnCrossOriginMessageToWorker( |
proxy_->dispatchCrossOriginMessageEvent(web_client, message, ports); |
} |
+void ServiceWorkerScriptContext::OnSendStashedMessagePorts( |
+ const std::vector<TransferredMessagePort>& stashed_message_ports, |
+ const std::vector<int>& new_routing_ids, |
+ const std::vector<base::string16>& port_names) { |
+ TRACE_EVENT0("ServiceWorker", |
+ "ServiceWorkerScriptContext::OnSendStashedMessagePorts"); |
+ blink::WebMessagePortChannelArray ports = |
+ WebMessagePortChannelImpl::CreatePorts( |
+ stashed_message_ports, new_routing_ids, |
+ embedded_context_->main_thread_task_runner()); |
+ for (blink::WebMessagePortChannel* port : ports) |
+ static_cast<WebMessagePortChannelImpl*>(port)->set_is_stashed(); |
+ proxy_->addStashedMessagePorts(ports, port_names); |
+} |
+ |
void ServiceWorkerScriptContext::OnDidGetClients( |
int request_id, const std::vector<ServiceWorkerClientInfo>& clients) { |
TRACE_EVENT0("ServiceWorker", |