JSGeolocationCustom.cpp [plain text]
#include "config.h"
#include "JSGeolocation.h"
#if ENABLE(GEOLOCATION)
#include "CallbackFunction.h"
#include "DOMWindow.h"
#include "Geolocation.h"
#include "JSDOMWindow.h"
#include "JSDictionary.h"
#include "JSPositionCallback.h"
#include "JSPositionErrorCallback.h"
#include "PositionOptions.h"
using namespace JSC;
namespace WebCore {
static void setEnableHighAccuracy(PositionOptions* options, const bool& enableHighAccuracy)
{
options->setEnableHighAccuracy(enableHighAccuracy);
}
static void setTimeout(PositionOptions* options, const double& timeout)
{
if (!(std::isinf(timeout) && (timeout > 0))) {
options->setTimeout(std::max<int>(0, timeout));
}
}
static void setMaximumAge(PositionOptions* options, const double& maximumAge)
{
if (std::isinf(maximumAge) && (maximumAge > 0)) {
options->clearMaximumAge();
} else {
options->setMaximumAge(std::max<int>(0, maximumAge));
}
}
static RefPtr<PositionOptions> createPositionOptions(ExecState* exec, JSValue value)
{
auto options = PositionOptions::create();
if (value.isUndefinedOrNull()) {
return WTFMove(options);
}
JSObject* object = value.toObject(exec);
ASSERT(!exec->hadException());
JSDictionary dictionary(exec, object);
if (!dictionary.tryGetProperty("enableHighAccuracy", options.ptr(), setEnableHighAccuracy))
return nullptr;
if (!dictionary.tryGetProperty("timeout", options.ptr(), setTimeout))
return nullptr;
if (!dictionary.tryGetProperty("maximumAge", options.ptr(), setMaximumAge))
return nullptr;
return WTFMove(options);
}
JSValue JSGeolocation::getCurrentPosition(ExecState& state)
{
auto positionCallback = createFunctionOnlyCallback<JSPositionCallback>(&state, globalObject(), state.argument(0));
if (state.hadException())
return jsUndefined();
ASSERT(positionCallback);
auto positionErrorCallback = createFunctionOnlyCallback<JSPositionErrorCallback>(&state, globalObject(), state.argument(1), CallbackAllowUndefined | CallbackAllowNull);
if (state.hadException())
return jsUndefined();
auto positionOptions = createPositionOptions(&state, state.argument(2));
if (state.hadException())
return jsUndefined();
ASSERT(positionOptions);
wrapped().getCurrentPosition(WTFMove(positionCallback), WTFMove(positionErrorCallback), WTFMove(positionOptions));
return jsUndefined();
}
JSValue JSGeolocation::watchPosition(ExecState& state)
{
auto positionCallback = createFunctionOnlyCallback<JSPositionCallback>(&state, globalObject(), state.argument(0));
if (state.hadException())
return jsUndefined();
ASSERT(positionCallback);
auto positionErrorCallback = createFunctionOnlyCallback<JSPositionErrorCallback>(&state, globalObject(), state.argument(1), CallbackAllowUndefined | CallbackAllowNull);
if (state.hadException())
return jsUndefined();
auto positionOptions = createPositionOptions(&state, state.argument(2));
if (state.hadException())
return jsUndefined();
ASSERT(positionOptions);
int watchID = wrapped().watchPosition(WTFMove(positionCallback), WTFMove(positionErrorCallback), WTFMove(positionOptions));
return jsNumber(watchID);
}
}
#endif // ENABLE(GEOLOCATION)