1c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)// found in the LICENSE file. 4c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 5c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "config.h" 6c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "modules/geofencing/Geofencing.h" 7c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 87242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/CallbackPromiseAdapter.h" 9c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "bindings/core/v8/ScriptPromise.h" 107242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "bindings/core/v8/ScriptPromiseResolver.h" 11c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/DOMException.h" 12c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)#include "core/dom/ExceptionCode.h" 137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/geofencing/CircularGeofencingRegion.h" 147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/geofencing/GeofencingError.h" 157242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "modules/geofencing/GeofencingRegion.h" 167242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/Platform.h" 177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebCircularGeofencingRegion.h" 187242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebGeofencingProvider.h" 197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "public/platform/WebGeofencingRegistration.h" 20c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 22c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccinamespace { 247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci// For CallbackPromiseAdapter to convert a WebVector of regions to a HeapVector. 267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass RegionArray { 277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tuccipublic: 287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci typedef blink::WebVector<blink::WebGeofencingRegistration> WebType; 297242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static HeapVector<Member<GeofencingRegion> > take(ScriptPromiseResolver* resolver, WebType* regionsRaw) 307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci OwnPtr<WebType> webRegions = adoptPtr(regionsRaw); 327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HeapVector<Member<GeofencingRegion> > regions; 337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci for (size_t i = 0; i < webRegions->size(); ++i) 347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci regions.append(CircularGeofencingRegion::create((*webRegions)[i].id, (*webRegions)[i].region)); 357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return regions; 367242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 377242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 387242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci static void dispose(WebType* regionsRaw) 397242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci { 407242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci delete regionsRaw; 417242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci } 427242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 437242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciprivate: 447242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RegionArray(); 457242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci}; 467242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci} // namespace 487242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)Geofencing::Geofencing() 50c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 51c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 52c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 53c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise Geofencing::registerRegion(ScriptState* scriptState, GeofencingRegion* region) 54c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebGeofencingProvider* provider = Platform::current()->geofencingProvider(); 567242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!provider) 577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); 587242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 597242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); 607242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ScriptPromise promise = resolver->promise(); 617242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: somehow pass a reference to the current serviceworker to the provider. 627242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci provider->registerRegion(region->id(), toCircularGeofencingRegion(region)->webRegion(), new CallbackPromiseAdapter<void, GeofencingError>(resolver)); 637242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return promise; 64c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 65c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 66c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise Geofencing::unregisterRegion(ScriptState* scriptState, const String& regionId) 67c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 687242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebGeofencingProvider* provider = Platform::current()->geofencingProvider(); 697242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!provider) 707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); 717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); 737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ScriptPromise promise = resolver->promise(); 747242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: somehow pass a reference to the current serviceworker to the provider. 757242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci provider->unregisterRegion(regionId, new CallbackPromiseAdapter<void, GeofencingError>(resolver)); 767242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return promise; 77c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 78c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 79c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)ScriptPromise Geofencing::getRegisteredRegions(ScriptState* scriptState) const 80c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles){ 817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci WebGeofencingProvider* provider = Platform::current()->geofencingProvider(); 827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci if (!provider) 837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); 847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci 857242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); 867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci ScriptPromise promise = resolver->promise(); 877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci // FIXME: somehow pass a reference to the current serviceworker to the provider. 887242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci provider->getRegisteredRegions(new CallbackPromiseAdapter<RegionArray, GeofencingError>(resolver)); 897242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci return promise; 90c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} 91c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles) 92c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 93