Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(494)

Unified Diff: content/browser/service_worker/service_worker_version.cc

Issue 1235803003: ServiceWorker: Introduce ExtendableMessageEvent to replace MessageEvent Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/child/service_worker/service_worker_dispatcher.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698