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, |