| 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 229a7d35cdb510770301ad45a893be34039cd140..7369578627efc1ec219a2c05f28e601e709071f3 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -526,16 +526,46 @@ void ServiceWorkerVersion::RunAfterStartWorker(
|
| }
|
|
|
| void ServiceWorkerVersion::DispatchExtendableMessageEvent(
|
| + ServiceWorkerProviderHost* sender_provider_host,
|
| const base::string16& message,
|
| + const url::Origin& source_origin,
|
| 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, source_origin,
|
| + 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, source_origin,
|
| + 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(
|
| @@ -908,9 +938,32 @@ void ServiceWorkerVersion::OnStartSentAndScriptEvaluated(
|
| }
|
| }
|
|
|
| +template <typename SourceInfo>
|
| +void ServiceWorkerVersion::DispatchExtendableMessageEventInternal(
|
| + 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()) {
|
| + RunErrorMessageCallback(sent_message_ports, callback,
|
| + SERVICE_WORKER_ERROR_FAILED);
|
| + return;
|
| + }
|
| + RunAfterStartWorker(
|
| + base::Bind(
|
| + &ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker,
|
| + weak_factory_.GetWeakPtr(), message, source_origin,
|
| + sent_message_ports, ExtendableMessageEventSource(source_info),
|
| + callback),
|
| + base::Bind(&RunErrorMessageCallback, sent_message_ports, callback));
|
| +}
|
| +
|
| void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker(
|
| const base::string16& message,
|
| + const url::Origin& source_origin,
|
| const std::vector<TransferredMessagePort>& sent_message_ports,
|
| + const ExtendableMessageEventSource& source,
|
| const StatusCallback& callback) {
|
| int request_id =
|
| StartRequest(ServiceWorkerMetrics::EventType::MESSAGE, callback);
|
| @@ -920,10 +973,23 @@ void ServiceWorkerVersion::DispatchExtendableMessageEventAfterStartWorker(
|
| std::vector<int> new_routing_ids;
|
| filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids);
|
|
|
| + ServiceWorkerMsg_ExtendableMessageEvent_Params params;
|
| + params.message = message;
|
| + params.source_origin = source_origin;
|
| + params.message_ports = sent_message_ports;
|
| + params.new_routing_ids = new_routing_ids;
|
| + params.source = source;
|
| +
|
| + // Hide the client url if the client has a unique origin.
|
| + if (source_origin.unique()) {
|
| + if (params.source.client_info.IsValid())
|
| + params.source.client_info.url = GURL();
|
| + else
|
| + params.source.service_worker_info.url = GURL();
|
| + }
|
| +
|
| DispatchSimpleEvent<ServiceWorkerHostMsg_ExtendableMessageEventFinished>(
|
| - request_id,
|
| - ServiceWorkerMsg_ExtendableMessageEvent(
|
| - request_id, message, sent_message_ports, new_routing_ids));
|
| + request_id, ServiceWorkerMsg_ExtendableMessageEvent(request_id, params));
|
| }
|
|
|
| void ServiceWorkerVersion::OnGetClient(int request_id,
|
|
|