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 802ed2e7311ad813ac91b579c6338dcc31bbdf32..c748b3dc712c4ee81d3df7bad7080e55070d795d 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -676,6 +676,7 @@ void ServiceWorkerVersion::DeferScheduledUpdate() { |
} |
void ServiceWorkerVersion::DispatchMessageEvent( |
+ ServiceWorkerProviderHost* provider_host, |
const base::string16& message, |
const std::vector<TransferredMessagePort>& sent_message_ports, |
const StatusCallback& callback) { |
@@ -683,21 +684,44 @@ void ServiceWorkerVersion::DispatchMessageEvent( |
MessagePortService::GetInstance()->HoldMessages(port.id); |
} |
- DispatchMessageEventInternal(message, sent_message_ports, callback); |
+ if (provider_host->provider_type() == |
+ SERVICE_WORKER_PROVIDER_FOR_CONTROLLER) { |
+ ServiceWorkerObjectInfo worker_info = |
+ provider_host->GetOrCreateServiceWorkerHandle( |
+ provider_host->running_hosted_version()); |
+ DispatchWorkerMessageEventInternal(message, sent_message_ports, worker_info, |
+ callback); |
+ } else if (provider_host->provider_type() == |
+ SERVICE_WORKER_PROVIDER_FOR_WINDOW) { |
+ provider_host->GetWindowClientInfo( |
+ base::Bind(&ServiceWorkerVersion::DispatchClientMessageEventInternal, |
+ weak_factory_.GetWeakPtr(), message, sent_message_ports, |
+ provider_host->client_uuid(), callback)); |
+ } else { |
+ ServiceWorkerClientInfo client_info(blink::WebPageVisibilityStateHidden, |
+ false, // is_focused |
+ provider_host->document_url(), |
+ REQUEST_CONTEXT_FRAME_TYPE_NONE, |
+ provider_host->client_type()); |
+ DispatchClientMessageEventInternal(message, sent_message_ports, |
+ provider_host->client_uuid(), callback, |
+ client_info); |
+ } |
} |
-void ServiceWorkerVersion::DispatchMessageEventInternal( |
+void ServiceWorkerVersion::DispatchWorkerMessageEventInternal( |
const base::string16& message, |
const std::vector<TransferredMessagePort>& sent_message_ports, |
+ const ServiceWorkerObjectInfo& worker_info, |
const StatusCallback& callback) { |
if (running_status() != RUNNING) { |
// Schedule calling this method after starting the worker. |
StartWorker(base::Bind( |
&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), |
- base::Bind(&self::DispatchMessageEventInternal, |
+ base::Bind(&self::DispatchWorkerMessageEventInternal, |
weak_factory_.GetWeakPtr(), message, sent_message_ports, |
- callback))); |
+ worker_info, callback))); |
return; |
} |
@@ -705,14 +729,55 @@ void ServiceWorkerVersion::DispatchMessageEventInternal( |
// event becomes extendable, round-trip event. (crbug.com/498596) |
RestartTick(&idle_time_); |
+ int request_id = AddRequest(callback, &message_callbacks_, REQUEST_MESSAGE); |
+ MessagePortMessageFilter* filter = |
+ embedded_worker_->message_port_message_filter(); |
+ std::vector<int> new_routing_ids; |
+ filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
+ ServiceWorkerStatusCode status = embedded_worker_->SendMessage( |
+ ServiceWorkerMsg_WorkerMessageEvent(request_id, worker_info, message, |
+ sent_message_ports, new_routing_ids)); |
+ if (status != SERVICE_WORKER_OK) { |
+ message_callbacks_.Remove(request_id); |
+ RunSoon(base::Bind(callback, status)); |
+ } |
+} |
+ |
+void ServiceWorkerVersion::DispatchClientMessageEventInternal( |
+ const base::string16& message, |
+ const std::vector<TransferredMessagePort>& sent_message_ports, |
+ const std::string& client_uuid, |
+ const StatusCallback& callback, |
+ const ServiceWorkerClientInfo& client_info) { |
+ if (running_status() != RUNNING) { |
+ // Schedule calling this method after starting the worker. |
+ StartWorker(base::Bind( |
+ &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), |
+ base::Bind(&RunErrorMessageCallback, sent_message_ports, callback), |
+ base::Bind(&self::DispatchClientMessageEventInternal, |
+ weak_factory_.GetWeakPtr(), message, sent_message_ports, |
+ client_uuid, callback, client_info))); |
+ return; |
+ } |
+ |
+ // TODO(kinuko): Cleanup this (and corresponding unit test) when message |
+ // event becomes extendable, round-trip event. (crbug.com/498596) |
+ RestartTick(&idle_time_); |
+ |
+ int request_id = AddRequest(callback, &message_callbacks_, REQUEST_MESSAGE); |
+ ServiceWorkerClientInfo client(client_info); |
+ client.client_uuid = client_uuid; |
MessagePortMessageFilter* filter = |
embedded_worker_->message_port_message_filter(); |
std::vector<int> new_routing_ids; |
filter->UpdateMessagePortsWithNewRoutes(sent_message_ports, &new_routing_ids); |
ServiceWorkerStatusCode status = |
- embedded_worker_->SendMessage(ServiceWorkerMsg_MessageToWorker( |
- message, sent_message_ports, new_routing_ids)); |
- RunSoon(base::Bind(callback, status)); |
+ embedded_worker_->SendMessage(ServiceWorkerMsg_ClientMessageEvent( |
+ request_id, client, message, sent_message_ports, new_routing_ids)); |
+ if (status != SERVICE_WORKER_OK) { |
+ message_callbacks_.Remove(request_id); |
+ RunSoon(base::Bind(callback, status)); |
+ } |
} |
void ServiceWorkerVersion::DispatchInstallEvent( |
@@ -1188,6 +1253,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
OnGeofencingEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished, |
OnCrossOriginConnectEventFinished) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_MessageEventFinished, |
+ OnMessageEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_OpenWindow, |
OnOpenWindow) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_SetCachedMetadata, |
@@ -1444,6 +1511,20 @@ void ServiceWorkerVersion::OnCrossOriginConnectEventFinished( |
request_id); |
} |
+void ServiceWorkerVersion::OnMessageEventFinished(int request_id) { |
+ TRACE_EVENT1("ServiceWorker", "ServiceWorkerVersion::OnMessageEventFinished", |
+ "Request id", request_id); |
+ StatusCallback* callback = message_callbacks_.Lookup(request_id); |
+ if (!callback) { |
+ NOTREACHED() << "Got unexpected message: " << request_id; |
+ return; |
+ } |
+ |
+ scoped_refptr<ServiceWorkerVersion> protect(this); |
+ callback->Run(SERVICE_WORKER_OK); |
+ RemoveCallbackAndStopIfRedundant(&message_callbacks_, request_id); |
+} |
+ |
void ServiceWorkerVersion::OnOpenWindow(int request_id, GURL url) { |
// Just abort if we are shutting down. |
if (!context_) |
@@ -2039,6 +2120,9 @@ bool ServiceWorkerVersion::OnRequestTimeout(const RequestInfo& info) { |
return RunIDMapCallback(&cross_origin_connect_callbacks_, info.id, |
SERVICE_WORKER_ERROR_TIMEOUT, |
false /* accept_connection */); |
+ case REQUEST_MESSAGE: |
+ return RunIDMapCallback(&message_callbacks_, info.id, |
+ SERVICE_WORKER_ERROR_TIMEOUT); |
} |
NOTREACHED() << "Got unexpected request type: " << info.type; |
return false; |