Chromium Code Reviews| Index: Source/modules/geolocation/Geolocation.cpp |
| diff --git a/Source/modules/geolocation/Geolocation.cpp b/Source/modules/geolocation/Geolocation.cpp |
| index ee8c7742abe28fb86257e94d29b6fe2cb22d90e5..e43450008a07559fa1b7c5bdfdb189b989d540fc 100644 |
| --- a/Source/modules/geolocation/Geolocation.cpp |
| +++ b/Source/modules/geolocation/Geolocation.cpp |
| @@ -28,14 +28,24 @@ |
| #include "config.h" |
| #include "modules/geolocation/Geolocation.h" |
| +#include "bindings/core/v8/CallbackPromiseAdapter.h" |
|
Michael van Ouwerkerk
2014/07/15 18:04:41
As we discussed offline, it seems quite possible t
|
| +#include "bindings/core/v8/ScriptPromiseResolver.h" |
| +#include "bindings/core/v8/ScriptState.h" |
| #include "core/dom/DOMException.h" |
| #include "core/dom/Document.h" |
| #include "core/dom/ExceptionCode.h" |
| +#include "core/frame/LocalDOMWindow.h" |
| #include "modules/geolocation/Coordinates.h" |
| +#include "modules/geolocation/GeofencingController.h" |
| +#include "modules/geolocation/GeofencingError.h" |
| #include "modules/geolocation/GeofencingRegion.h" |
| #include "modules/geolocation/GeolocationController.h" |
| #include "modules/geolocation/GeolocationError.h" |
| #include "modules/geolocation/GeolocationPosition.h" |
| +#include "modules/serviceworkers/NavigatorServiceWorker.h" |
| +#include "modules/serviceworkers/ServiceWorkerContainer.h" |
| +#include "public/platform/WebGeofencingClient.h" |
| +#include "public/platform/WebGeofencingRegion.h" |
| #include "wtf/CurrentTime.h" |
| namespace WebCore { |
| @@ -684,19 +694,104 @@ void Geolocation::handlePendingPermissionNotifiers() |
| } |
| } |
| +namespace { |
| + |
| +// Copy of same class in ServiceWorkerContainer.cpp |
| +class UndefinedValue { |
| +public: |
| + typedef blink::WebGeofencingError WebType; |
| + static V8UndefinedType from(ScriptPromiseResolver* resolver, WebType* value) |
| + { |
| + ASSERT(!value); // Anything passed here will be leaked. |
| + return V8UndefinedType(); |
| + } |
| + |
| +private: |
| + UndefinedValue(); |
| +}; |
| + |
| +class RegionArray { |
| +public: |
| + typedef blink::WebVector<blink::WebGeofencingRegion> WebType; |
| + static HeapVector<Member<GeofencingRegion> > from(ScriptPromiseResolver* resolver, WebType* regionsRaw) |
| + { |
| + OwnPtr<WebType> webRegions = adoptPtr(regionsRaw); |
| + HeapVector<Member<GeofencingRegion> > regions; |
| + for (size_t i = 0; i < webRegions->size(); ++i) { |
| + regions.append((GeofencingRegion*)(*webRegions)[i]); |
| + } |
| + return regions; |
| + } |
| +private: |
| + RegionArray(); |
| +}; |
| + |
| +} |
| + |
| ScriptPromise Geolocation::registerRegion(ScriptState* scriptState, GeofencingRegion* region) |
| { |
| - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + ASSERT(scriptState->executionContext()->isDocument()); |
| + |
| + Document* document = toDocument(scriptState->executionContext()); |
| + if (!document->domWindow() || !document->frame()) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Document is detached from window.")); |
| + |
| + blink::WebServiceWorkerProvider* serviceWorkerProvider = NavigatorServiceWorker::serviceWorker(document->domWindow()->navigator())->provider(); |
| + if (!serviceWorkerProvider) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "No Service Worker installed for this document.")); |
| + |
| + blink::WebGeofencingClient* client = GeofencingController::clientFrom(document->frame()); |
| + if (!client) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + |
| + RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + client->registerRegion(region, new CallbackPromiseAdapter<UndefinedValue, GeofencingError>(resolver), serviceWorkerProvider); |
| + return promise; |
| } |
| ScriptPromise Geolocation::unregisterRegion(ScriptState* scriptState, const String& regionId) |
| { |
| - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + ASSERT(scriptState->executionContext()->isDocument()); |
| + |
| + Document* document = toDocument(scriptState->executionContext()); |
| + if (!document->domWindow() || !document->frame()) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Document is detached from window.")); |
| + |
| + blink::WebServiceWorkerProvider* serviceWorkerProvider = NavigatorServiceWorker::serviceWorker(document->domWindow()->navigator())->provider(); |
| + if (!serviceWorkerProvider) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "No Service Worker installed for this document.")); |
| + |
| + blink::WebGeofencingClient* client = GeofencingController::clientFrom(document->frame()); |
| + if (!client) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + |
| + RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + client->unregisterRegion(regionId, new CallbackPromiseAdapter<UndefinedValue, GeofencingError>(resolver), serviceWorkerProvider); |
| + return promise; |
| } |
| ScriptPromise Geolocation::getRegisteredRegions(ScriptState* scriptState) const |
| { |
| - return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + ASSERT(scriptState->executionContext()->isDocument()); |
| + |
| + Document* document = toDocument(scriptState->executionContext()); |
| + if (!document->domWindow() || !document->frame()) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "Document is detached from window.")); |
| + |
| + blink::WebServiceWorkerProvider* serviceWorkerProvider = NavigatorServiceWorker::serviceWorker(document->domWindow()->navigator())->provider(); |
| + if (!serviceWorkerProvider) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(AbortError, "No Service Worker installed for this document.")); |
| + |
| + blink::WebGeofencingClient* client = GeofencingController::clientFrom(document->frame()); |
| + if (!client) |
| + return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError)); |
| + |
| + RefPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState); |
| + ScriptPromise promise = resolver->promise(); |
| + client->getRegisteredRegions(new CallbackPromiseAdapter<RegionArray, GeofencingError>(resolver), serviceWorkerProvider); |
| + return promise; |
| } |
| } // namespace WebCore |