Index: content/browser/service_worker/service_worker_dispatcher_host.cc |
diff --git a/content/browser/service_worker/service_worker_dispatcher_host.cc b/content/browser/service_worker/service_worker_dispatcher_host.cc |
index 4dd4cb348ee776748791e255cadf972d3bea5f09..1d9d9ecd2a1bb6ef0994f976ca22028563a0da36 100644 |
--- a/content/browser/service_worker/service_worker_dispatcher_host.cc |
+++ b/content/browser/service_worker/service_worker_dispatcher_host.cc |
@@ -701,6 +701,19 @@ void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
return; |
} |
+ DispatchExtendableMessageEvent( |
+ make_scoped_refptr(handle->version()), message, source_origin, |
+ sent_message_ports, sender_provider_host, |
+ base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
+} |
+ |
+void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent( |
+ scoped_refptr<ServiceWorkerVersion> worker, |
+ const base::string16& message, |
+ const url::Origin& source_origin, |
+ const std::vector<TransferredMessagePort>& sent_message_ports, |
+ ServiceWorkerProviderHost* sender_provider_host, |
+ const StatusCallback& callback) { |
for (const TransferredMessagePort& port : sent_message_ports) |
MessagePortService::GetInstance()->HoldMessages(port.id); |
@@ -710,20 +723,17 @@ void ServiceWorkerDispatcherHost::OnPostMessageToWorker( |
case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER: |
service_worker_client_utils::GetClient( |
sender_provider_host, |
- base::Bind( |
- &ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent< |
- ServiceWorkerClientInfo>, |
- this, make_scoped_refptr(handle->version()), message, |
- source_origin, sent_message_ports)); |
+ base::Bind(&ServiceWorkerDispatcherHost:: |
+ DispatchExtendableMessageEventInternal< |
+ ServiceWorkerClientInfo>, |
+ this, worker, message, source_origin, sent_message_ports, |
+ callback)); |
break; |
case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER: |
- // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting |
- // worker fails (http://crbug.com/543198). |
RunSoon(base::Bind( |
- &ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent< |
+ &ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal< |
ServiceWorkerObjectInfo>, |
- this, make_scoped_refptr(handle->version()), message, source_origin, |
- sent_message_ports, |
+ this, worker, message, source_origin, sent_message_ports, callback, |
sender_provider_host->GetOrCreateServiceWorkerHandle( |
sender_provider_host->running_hosted_version()))); |
break; |
@@ -866,25 +876,27 @@ void ServiceWorkerDispatcherHost::OnSetHostedVersionId(int provider_id, |
} |
template <typename SourceInfo> |
-void ServiceWorkerDispatcherHost::DispatchExtendableMessageEvent( |
+void ServiceWorkerDispatcherHost::DispatchExtendableMessageEventInternal( |
scoped_refptr<ServiceWorkerVersion> worker, |
const base::string16& message, |
const url::Origin& source_origin, |
const std::vector<TransferredMessagePort>& sent_message_ports, |
+ const StatusCallback& callback, |
const SourceInfo& source_info) { |
if (!source_info.IsValid()) { |
- DidFailToDispatchExtendableMessageEvent(sent_message_ports, |
- SERVICE_WORKER_ERROR_FAILED); |
+ DidFailToDispatchExtendableMessageEvent<SourceInfo>( |
+ sent_message_ports, source_info, callback, SERVICE_WORKER_ERROR_FAILED); |
return; |
} |
worker->RunAfterStartWorker( |
base::Bind(&ServiceWorkerDispatcherHost:: |
DispatchExtendableMessageEventAfterStartWorker, |
this, worker, message, source_origin, sent_message_ports, |
- ExtendableMessageEventSource(source_info)), |
+ ExtendableMessageEventSource(source_info), callback), |
base::Bind( |
- &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent, |
- this, sent_message_ports)); |
+ &ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent< |
+ SourceInfo>, |
+ this, sent_message_ports, source_info, callback)); |
} |
void ServiceWorkerDispatcherHost:: |
@@ -893,10 +905,10 @@ void ServiceWorkerDispatcherHost:: |
const base::string16& message, |
const url::Origin& source_origin, |
const std::vector<TransferredMessagePort>& sent_message_ports, |
- const ExtendableMessageEventSource& source) { |
+ const ExtendableMessageEventSource& source, |
+ const StatusCallback& callback) { |
int request_id = |
- worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, |
- base::Bind(&ServiceWorkerUtils::NoOpStatusCallback)); |
+ worker->StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback); |
MessagePortMessageFilter* filter = |
worker->embedded_worker()->message_port_message_filter(); |
@@ -923,12 +935,35 @@ void ServiceWorkerDispatcherHost:: |
request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params)); |
} |
+template <typename SourceInfo> |
+void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent( |
+ const std::vector<TransferredMessagePort>& sent_message_ports, |
+ const SourceInfo& source_info, |
+ const StatusCallback& callback, |
+ ServiceWorkerStatusCode status) { |
+ // Transfering the message ports failed, so destroy the ports. |
+ for (const TransferredMessagePort& port : sent_message_ports) |
+ MessagePortService::GetInstance()->ClosePort(port.id); |
+ callback.Run(status); |
+} |
+ |
+template <> |
void ServiceWorkerDispatcherHost::DidFailToDispatchExtendableMessageEvent( |
falken
2016/03/17 05:10:49
I'm kind of confused why there are two ServiceWork
nhiroki
2016/03/17 06:05:30
"typename SourceInfo" is resolved to ServiceWorker
nhiroki
2016/03/17 06:33:28
FYI: I tried to use overloaded functions instead o
|
const std::vector<TransferredMessagePort>& sent_message_ports, |
+ const ServiceWorkerObjectInfo& source_info, |
+ const StatusCallback& callback, |
ServiceWorkerStatusCode status) { |
// Transfering the message ports failed, so destroy the ports. |
for (const TransferredMessagePort& port : sent_message_ports) |
MessagePortService::GetInstance()->ClosePort(port.id); |
+ if (source_info.IsValid()) { |
+ ServiceWorkerHandle* handle = handles_.Lookup(source_info.handle_id); |
+ DCHECK(handle); |
+ handle->DecrementRefCount(); |
+ if (handle->HasNoRefCount()) |
+ handles_.Remove(source_info.handle_id); |
+ } |
+ callback.Run(status); |
} |
ServiceWorkerRegistrationHandle* |