1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "config.h"
#include "modules/geofencing/Geofencing.h"
#include "bindings/core/v8/CallbackPromiseAdapter.h"
#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "core/dom/DOMException.h"
#include "core/dom/ExceptionCode.h"
#include "modules/geofencing/CircularGeofencingRegion.h"
#include "modules/geofencing/GeofencingError.h"
#include "modules/geofencing/GeofencingRegion.h"
#include "modules/serviceworkers/ServiceWorkerRegistration.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCircularGeofencingRegion.h"
#include "public/platform/WebGeofencingProvider.h"
#include "public/platform/WebGeofencingRegistration.h"
namespace blink {
namespace {
// For CallbackPromiseAdapter to convert a WebVector of regions to a HeapVector.
class RegionArray {
public:
typedef blink::WebVector<blink::WebGeofencingRegistration> WebType;
static HeapVector<Member<GeofencingRegion> > take(ScriptPromiseResolver* resolver, WebType* regionsRaw)
{
OwnPtr<WebType> webRegions = adoptPtr(regionsRaw);
HeapVector<Member<GeofencingRegion> > regions;
for (size_t i = 0; i < webRegions->size(); ++i)
regions.append(CircularGeofencingRegion::create((*webRegions)[i].id, (*webRegions)[i].region));
return regions;
}
static void dispose(WebType* regionsRaw)
{
delete regionsRaw;
}
private:
RegionArray();
};
} // namespace
Geofencing::Geofencing(ServiceWorkerRegistration* registration)
: m_registration(registration)
{
}
ScriptPromise Geofencing::registerRegion(ScriptState* scriptState, GeofencingRegion* region)
{
WebGeofencingProvider* provider = Platform::current()->geofencingProvider();
if (!provider)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError));
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
WebGeofencingCallbacks* callbacks = new CallbackPromiseAdapter<void, GeofencingError>(resolver);
WebServiceWorkerRegistration* serviceWorkerRegistration = nullptr;
if (m_registration)
serviceWorkerRegistration = m_registration->webRegistration();
provider->registerRegion(region->id(), toCircularGeofencingRegion(region)->webRegion(), serviceWorkerRegistration, callbacks);
return promise;
}
ScriptPromise Geofencing::unregisterRegion(ScriptState* scriptState, const String& regionId)
{
WebGeofencingProvider* provider = Platform::current()->geofencingProvider();
if (!provider)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError));
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
WebGeofencingCallbacks* callbacks = new CallbackPromiseAdapter<void, GeofencingError>(resolver);
WebServiceWorkerRegistration* serviceWorkerRegistration = nullptr;
if (m_registration)
serviceWorkerRegistration = m_registration->webRegistration();
provider->unregisterRegion(regionId, serviceWorkerRegistration, callbacks);
return promise;
}
ScriptPromise Geofencing::getRegisteredRegions(ScriptState* scriptState) const
{
WebGeofencingProvider* provider = Platform::current()->geofencingProvider();
if (!provider)
return ScriptPromise::rejectWithDOMException(scriptState, DOMException::create(NotSupportedError));
RefPtrWillBeRawPtr<ScriptPromiseResolver> resolver = ScriptPromiseResolver::create(scriptState);
ScriptPromise promise = resolver->promise();
WebGeofencingRegionsCallbacks* callbacks = new CallbackPromiseAdapter<RegionArray, GeofencingError>(resolver);
WebServiceWorkerRegistration* serviceWorkerRegistration = nullptr;
if (m_registration)
serviceWorkerRegistration = m_registration->webRegistration();
provider->getRegisteredRegions(serviceWorkerRegistration, callbacks);
return promise;
}
void Geofencing::trace(Visitor* visitor)
{
visitor->trace(m_registration);
}
} // namespace blink
|