| 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 1e00b8227637cf7c82500244f7145911610324ca..8253fcac7285210fc5287c66fac10dc30804fe78 100644
|
| --- a/content/browser/service_worker/service_worker_version.cc
|
| +++ b/content/browser/service_worker/service_worker_version.cc
|
| @@ -89,6 +89,12 @@ void RunErrorFetchCallback(const ServiceWorkerVersion::FetchCallback& callback,
|
| ServiceWorkerResponse());
|
| }
|
|
|
| +void RunErrorCrossOriginConnectCallback(
|
| + const ServiceWorkerVersion::CrossOriginConnectCallback& callback,
|
| + ServiceWorkerStatusCode status) {
|
| + callback.Run(status, false);
|
| +}
|
| +
|
| void RunErrorMessageCallback(
|
| const std::vector<int>& sent_message_port_ids,
|
| const ServiceWorkerVersion::StatusCallback& callback,
|
| @@ -297,6 +303,31 @@ void ServiceWorkerVersion::DispatchMessageEventInternal(
|
| RunSoon(base::Bind(callback, status));
|
| }
|
|
|
| +void ServiceWorkerVersion::SendCrossOriginMessage(
|
| + const CrossOriginServiceWorkerClient& client,
|
| + const base::string16& message,
|
| + const std::vector<int>& sent_message_port_ids,
|
| + const ServiceWorkerVersion::StatusCallback& callback) {
|
| + if (running_status() != RUNNING) {
|
| + // Schedule calling this method after starting the worker.
|
| + StartWorker(base::Bind(
|
| + &RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(), callback,
|
| + base::Bind(&self::SendCrossOriginMessage, weak_factory_.GetWeakPtr(),
|
| + client, message, sent_message_port_ids, callback)));
|
| + return;
|
| + }
|
| +
|
| + MessagePortMessageFilter* filter =
|
| + embedded_worker_->message_port_message_filter();
|
| + std::vector<int> new_routing_ids;
|
| + filter->UpdateMessagePortsWithNewRoutes(sent_message_port_ids,
|
| + &new_routing_ids);
|
| + ServiceWorkerStatusCode status =
|
| + embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginMessageToWorker(
|
| + client, message, sent_message_port_ids, new_routing_ids));
|
| + RunSoon(base::Bind(callback, status));
|
| +}
|
| +
|
| void ServiceWorkerVersion::DispatchInstallEvent(
|
| int active_version_id,
|
| const StatusCallback& callback) {
|
| @@ -492,6 +523,41 @@ void ServiceWorkerVersion::DispatchGeofencingEvent(
|
| }
|
| }
|
|
|
| +void ServiceWorkerVersion::DispatchCrossOriginConnectEvent(
|
| + const CrossOriginConnectCallback& callback,
|
| + const GURL& target_url,
|
| + int message_port_id) {
|
| + DCHECK_EQ(ACTIVATED, status()) << status();
|
| +
|
| + if (!CommandLine::ForCurrentProcess()->HasSwitch(
|
| + switches::kEnableExperimentalWebPlatformFeatures)) {
|
| + callback.Run(SERVICE_WORKER_ERROR_ABORT, false);
|
| + return;
|
| + }
|
| +
|
| + if (running_status() != RUNNING) {
|
| + // Schedule calling this method after starting the worker.
|
| + StartWorker(
|
| + base::Bind(&RunTaskAfterStartWorker, weak_factory_.GetWeakPtr(),
|
| + base::Bind(&RunErrorCrossOriginConnectCallback, callback),
|
| + base::Bind(&self::DispatchCrossOriginConnectEvent,
|
| + weak_factory_.GetWeakPtr(), callback, target_url,
|
| + message_port_id)));
|
| + return;
|
| + }
|
| +
|
| + int request_id = cross_origin_connect_callbacks_.Add(
|
| + new CrossOriginConnectCallback(callback));
|
| + ServiceWorkerStatusCode status =
|
| + embedded_worker_->SendMessage(ServiceWorkerMsg_CrossOriginConnectEvent(
|
| + request_id,
|
| + CrossOriginServiceWorkerClient(target_url, message_port_id)));
|
| + if (status != SERVICE_WORKER_OK) {
|
| + cross_origin_connect_callbacks_.Remove(request_id);
|
| + RunSoon(base::Bind(callback, status, false));
|
| + }
|
| +}
|
| +
|
| void ServiceWorkerVersion::AddControllee(
|
| ServiceWorkerProviderHost* provider_host) {
|
| DCHECK(!ContainsKey(controllee_map_, provider_host));
|
| @@ -632,6 +698,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) {
|
| OnPushEventFinished)
|
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished,
|
| OnGeofencingEventFinished)
|
| + IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_CrossOriginConnectEventFinished,
|
| + OnCrossOriginConnectEventFinished)
|
| IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument,
|
| OnPostMessageToDocument)
|
| IPC_MESSAGE_UNHANDLED(handled = false)
|
| @@ -821,6 +889,24 @@ void ServiceWorkerVersion::OnGeofencingEventFinished(int request_id) {
|
| geofencing_callbacks_.Remove(request_id);
|
| }
|
|
|
| +void ServiceWorkerVersion::OnCrossOriginConnectEventFinished(
|
| + int request_id,
|
| + bool allow_connect) {
|
| + TRACE_EVENT1("ServiceWorker",
|
| + "ServiceWorkerVersion::OnCrossOriginConnectEventFinished",
|
| + "Request id", request_id);
|
| + CrossOriginConnectCallback* callback =
|
| + cross_origin_connect_callbacks_.Lookup(request_id);
|
| + if (!callback) {
|
| + NOTREACHED() << "Got unexpected message: " << request_id;
|
| + return;
|
| + }
|
| +
|
| + scoped_refptr<ServiceWorkerVersion> protect(this);
|
| + callback->Run(SERVICE_WORKER_OK, allow_connect);
|
| + cross_origin_connect_callbacks_.Remove(request_id);
|
| +}
|
| +
|
| void ServiceWorkerVersion::OnPostMessageToDocument(
|
| int client_id,
|
| const base::string16& message,
|
|
|