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