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

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

Issue 668303004: WIP DO NOT COMMIT chromium side of navigator.connect (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: rebase Created 6 years 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 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,
« no previous file with comments | « content/browser/service_worker/service_worker_version.h ('k') | content/browser/shared_worker/shared_worker_host.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698