| Index: content/browser/service_worker/service_worker_version.cc
|
| diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc
|
| index 40081be77911f58d011750df311647d310fa7da0..367be070d8acdce2672e85ffe61c4a4a665d39c9 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -538,16 +538,44 @@ void ServiceWorkerVersion::RunAfterStartWorker(
|
| }
|
|
|
| void ServiceWorkerVersion::DispatchExtendableMessageEvent(
|
| + ServiceWorkerProviderHost* sender_provider_host,
|
| const base::string16& message,
|
| const std::vector<TransferredMessagePort>& sent_message_ports,
|
| const StatusCallback& callback) {
|
| for (const TransferredMessagePort& port : sent_message_ports)
|
| MessagePortService::GetInstance()->HoldMessages(port.id);
|
| - RunAfterStartWorker(
|
| - base::Bind(
|
| - &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker,
|
| - weak_factory_.GetWeakPtr(), message, sent_message_ports, callback),
|
| - base::Bind(&RunErrorMessageCallback, sent_message_ports, callback));
|
| +
|
| + switch (sender_provider_host->provider_type()) {
|
| + case SERVICE_WORKER_PROVIDER_FOR_WINDOW:
|
| + case SERVICE_WORKER_PROVIDER_FOR_WORKER:
|
| + case SERVICE_WORKER_PROVIDER_FOR_SHARED_WORKER:
|
| + service_worker_client_utils::GetClient(
|
| + sender_provider_host,
|
| + base::Bind(
|
| + &ServiceWorkerVersion::DispatchExtendableMessageEventInternal<
|
| + ServiceWorkerClientInfo>,
|
| + weak_factory_.GetWeakPtr(), message, sent_message_ports,
|
| + callback));
|
| + break;
|
| + case SERVICE_WORKER_PROVIDER_FOR_CONTROLLER:
|
| + // TODO(nhiroki): Decrement a reference to ServiceWorkerHandle if starting
|
| + // worker fails. Handles are managed by ServiceWorkerDispatcherHost, and
|
| + // we might need to make a new path to ask the dispatcher host to release
|
| + // the handle from ServiceWorkerVersion (http://crbug.com/543198).
|
| + RunSoon(base::Bind(
|
| + &ServiceWorkerVersion::DispatchExtendableMessageEventInternal<
|
| + ServiceWorkerObjectInfo>,
|
| + weak_factory_.GetWeakPtr(), message, sent_message_ports, callback,
|
| + sender_provider_host->GetOrCreateServiceWorkerHandle(
|
| + sender_provider_host->running_hosted_version())));
|
| + break;
|
| + case SERVICE_WORKER_PROVIDER_FOR_SANDBOXED_FRAME:
|
| + case SERVICE_WORKER_PROVIDER_UNKNOWN:
|
| + NOTREACHED() << sender_provider_host->provider_type();
|
| + RunSoon(base::Bind(&RunErrorMessageCallback, sent_message_ports, callback,
|
| + SERVICE_WORKER_ERROR_FAILED));
|
| + break;
|
| + }
|
| }
|
|
|
| void ServiceWorkerVersion::DispatchMessageEvent(
|
| @@ -922,9 +950,29 @@ void ServiceWorkerVersion::OnStartSentAndScriptEvaluated(
|
| }
|
| }
|
|
|
| +template <typename SourceInfo>
|
| +void ServiceWorkerVersion::DispatchExtendableMessageEventInternal(
|
| + const base::string16& message,
|
| + const std::vector<TransferredMessagePort>& sent_message_ports,
|
| + const StatusCallback& callback,
|
| + const SourceInfo& source_info) {
|
| + if (!source_info.IsValid()) {
|
| + RunErrorMessageCallback(sent_message_ports, callback,
|
| + SERVICE_WORKER_ERROR_FAILED);
|
| + return;
|
| + }
|
| + RunAfterStartWorker(
|
| + base::Bind(
|
| + &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker,
|
| + weak_factory_.GetWeakPtr(), message, sent_message_ports,
|
| + ExtendableMessageEventSource(source_info), callback),
|
| + base::Bind(&RunErrorMessageCallback, sent_message_ports, callback));
|
| +}
|
| +
|
| void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker(
|
| const base::string16& message,
|
| const std::vector<TransferredMessagePort>& sent_message_ports,
|
| + const ExtendableMessageEventSource& source,
|
| const StatusCallback& callback) {
|
| int request_id =
|
| StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback);
|
| @@ -937,7 +985,7 @@ void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker(
|
| DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>(
|
| request_id,
|
| ServiceWorkerMsg_ExtendableMessageEvent(
|
| - request_id, message, sent_message_ports, new_routing_ids));
|
| + request_id, message, sent_message_ports, new_routing_ids, source));
|
| }
|
|
|
| void ServiceWorkerVersion::OnGetClient(int request_id,
|
|
|