Index: content/renderer/service_worker/service_worker_context_client.cc |
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc |
index ba478477f916dc3791bbc9a0879e72a89fafb950..4b2904578ebadc96d140bc966bc680234df13da0 100644 |
--- a/content/renderer/service_worker/service_worker_context_client.cc |
+++ b/content/renderer/service_worker/service_worker_context_client.cc |
@@ -18,6 +18,7 @@ |
#include "content/child/notifications/notification_data_conversions.h" |
#include "content/child/request_extra_data.h" |
#include "content/child/service_worker/service_worker_dispatcher.h" |
+#include "content/child/service_worker/service_worker_handle_reference.h" |
#include "content/child/service_worker/service_worker_network_provider.h" |
#include "content/child/service_worker/service_worker_provider_context.h" |
#include "content/child/service_worker/service_worker_registration_handle_reference.h" |
@@ -742,13 +743,33 @@ void ServiceWorkerContextClient::OnExtendableMessageEvent( |
int request_id, |
const base::string16& message, |
const std::vector<TransferredMessagePort>& sent_message_ports, |
- const std::vector<int>& new_routing_ids) { |
+ const std::vector<int>& new_routing_ids, |
+ const ExtendableMessageEventSource& source) { |
TRACE_EVENT0("ServiceWorker", |
"ServiceWorkerContextClient::OnExtendableMessageEvent"); |
blink::WebMessagePortChannelArray ports = |
WebMessagePortChannelImpl::CreatePorts( |
sent_message_ports, new_routing_ids, main_thread_task_runner_); |
- proxy_->dispatchExtendableMessageEvent(request_id, message, ports); |
+ |
+ if (source.client_info.IsValid()) { |
+ blink::WebServiceWorkerClientInfo web_client = |
+ ToWebServiceWorkerClientInfo(source.client_info); |
+ proxy_->dispatchExtendableMessageEvent(request_id, message, ports, |
+ web_client); |
+ return; |
+ } |
+ |
+ DCHECK(source.service_worker_info.IsValid()); |
+ scoped_ptr<ServiceWorkerHandleReference> handle = |
+ ServiceWorkerHandleReference::Adopt(source.service_worker_info, |
+ sender_.get()); |
+ ServiceWorkerDispatcher* dispatcher = |
+ ServiceWorkerDispatcher::GetOrCreateThreadSpecificInstance( |
+ sender_.get(), main_thread_task_runner_.get()); |
+ scoped_refptr<WebServiceWorkerImpl> worker = |
+ dispatcher->GetOrCreateServiceWorker(std::move(handle)); |
+ proxy_->dispatchExtendableMessageEvent( |
+ request_id, message, ports, WebServiceWorkerImpl::CreateHandle(worker)); |
} |
void ServiceWorkerContextClient::OnInstallEvent(int request_id) { |