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 88d8e482705452cf45e45419d774a190f9c6ecd7..d805b14b1f08bd96061aa4ed67d2f0d3254c7e21 100644 |
--- a/content/browser/service_worker/service_worker_version.cc |
+++ b/content/browser/service_worker/service_worker_version.cc |
@@ -374,6 +374,43 @@ void ServiceWorkerVersion::DispatchPushEvent(const StatusCallback& callback, |
} |
} |
+void ServiceWorkerVersion::DispatchGeofencingEvent( |
+ const StatusCallback& callback, |
+ blink::WebGeofencingEventType event_type, |
+ const std::string& region_id, |
+ const blink::WebCircularGeofencingRegion& region) { |
+ DCHECK_EQ(ACTIVATED, status()) << status(); |
+ |
+ if (!CommandLine::ForCurrentProcess()->HasSwitch( |
+ switches::kEnableExperimentalWebPlatformFeatures)) { |
+ callback.Run(SERVICE_WORKER_ERROR_ABORT); |
+ return; |
+ } |
+ |
+ if (running_status() != RUNNING) { |
+ // Schedule calling this method after starting the worker. |
+ StartWorker(base::Bind(&RunTaskAfterStartWorker, |
+ weak_factory_.GetWeakPtr(), |
+ callback, |
+ base::Bind(&self::DispatchGeofencingEvent, |
+ weak_factory_.GetWeakPtr(), |
+ callback, |
+ event_type, |
+ region_id, |
+ region))); |
+ return; |
+ } |
+ |
+ int request_id = geofencing_callbacks_.Add(new StatusCallback(callback)); |
+ ServiceWorkerStatusCode status = |
+ embedded_worker_->SendMessage(ServiceWorkerMsg_GeofencingEvent( |
+ request_id, event_type, region_id, region)); |
+ if (status != SERVICE_WORKER_OK) { |
+ geofencing_callbacks_.Remove(request_id); |
+ RunSoon(base::Bind(callback, status)); |
+ } |
+} |
+ |
void ServiceWorkerVersion::AddControllee( |
ServiceWorkerProviderHost* provider_host) { |
DCHECK(!ContainsKey(controllee_map_, provider_host)); |
@@ -501,6 +538,8 @@ bool ServiceWorkerVersion::OnMessageReceived(const IPC::Message& message) { |
OnSyncEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PushEventFinished, |
OnPushEventFinished) |
+ IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_GeofencingEventFinished, |
+ OnGeofencingEventFinished) |
IPC_MESSAGE_HANDLER(ServiceWorkerHostMsg_PostMessageToDocument, |
OnPostMessageToDocument) |
IPC_MESSAGE_UNHANDLED(handled = false) |
@@ -654,6 +693,22 @@ void ServiceWorkerVersion::OnPushEventFinished( |
push_callbacks_.Remove(request_id); |
} |
+void ServiceWorkerVersion::OnGeofencingEventFinished(int request_id) { |
+ TRACE_EVENT1("ServiceWorker", |
+ "ServiceWorkerVersion::OnGeofencingEventFinished", |
+ "Request id", |
+ request_id); |
+ StatusCallback* callback = geofencing_callbacks_.Lookup(request_id); |
+ if (!callback) { |
+ NOTREACHED() << "Got unexpected message: " << request_id; |
+ return; |
+ } |
+ |
+ scoped_refptr<ServiceWorkerVersion> protect(this); |
+ callback->Run(SERVICE_WORKER_OK); |
+ geofencing_callbacks_.Remove(request_id); |
+} |
+ |
void ServiceWorkerVersion::OnPostMessageToDocument( |
int client_id, |
const base::string16& message, |