1dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch/* 2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved. 3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Redistribution and use in source and binary forms, with or without 5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modification, are permitted provided that the following conditions 6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * are met: 7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * * Redistributions of source code must retain the above copyright 8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * notice, this list of conditions and the following disclaimer. 9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * * Redistributions in binary form must reproduce the above copyright 10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * notice, this list of conditions and the following disclaimer in the 11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * documentation and/or other materials provided with the distribution. 12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * 13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY 14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */ 25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "config.h" 27dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "V8DeviceMotionEvent.h" 28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(DEVICE_ORIENTATION) 30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "DeviceMotionData.h" 32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "V8Binding.h" 335ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen#include "V8BindingMacros.h" 34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "V8Proxy.h" 35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <v8.h> 37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 38dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochnamespace WebCore { 39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsennamespace { 41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenv8::Handle<v8::Value> createAccelerationObject(const DeviceMotionData::Acceleration* acceleration) 43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Object> object = v8::Object::New(); 45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("x"), acceleration->canProvideX() ? v8::Number::New(acceleration->x()) : v8::Null()); 46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("y"), acceleration->canProvideY() ? v8::Number::New(acceleration->y()) : v8::Null()); 47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("z"), acceleration->canProvideZ() ? v8::Number::New(acceleration->z()) : v8::Null()); 48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return object; 49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenv8::Handle<v8::Value> createRotationRateObject(const DeviceMotionData::RotationRate* rotationRate) 52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Object> object = v8::Object::New(); 54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("alpha"), rotationRate->canProvideAlpha() ? v8::Number::New(rotationRate->alpha()) : v8::Null()); 55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("beta"), rotationRate->canProvideBeta() ? v8::Number::New(rotationRate->beta()) : v8::Null()); 56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen object->Set(v8::String::New("gamma"), rotationRate->canProvideGamma() ? v8::Number::New(rotationRate->gamma()) : v8::Null()); 57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return object; 58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 59dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenRefPtr<DeviceMotionData::Acceleration> readAccelerationArgument(v8::Local<v8::Value> value) 61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUndefinedOrNull(value)) 63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Given the test above, this will always yield an object. 66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Object> object = value->ToObject(); 67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> xValue = object->Get(v8::String::New("x")); 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (xValue.IsEmpty()) 70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideX = !isUndefinedOrNull(xValue); 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double x = xValue->NumberValue(); 73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 74bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> yValue = object->Get(v8::String::New("y")); 75bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (yValue.IsEmpty()) 76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 77bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideY = !isUndefinedOrNull(yValue); 78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double y = yValue->NumberValue(); 79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> zValue = object->Get(v8::String::New("z")); 81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (zValue.IsEmpty()) 82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideZ = !isUndefinedOrNull(zValue); 84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double z = zValue->NumberValue(); 85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!canProvideX && !canProvideY && !canProvideZ) 87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return DeviceMotionData::Acceleration::create(canProvideX, x, canProvideY, y, canProvideZ, z); 90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenRefPtr<DeviceMotionData::RotationRate> readRotationRateArgument(v8::Local<v8::Value> value) 93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (isUndefinedOrNull(value)) 95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Given the test above, this will always yield an object. 98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Object> object = value->ToObject(); 99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> alphaValue = object->Get(v8::String::New("alpha")); 101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (alphaValue.IsEmpty()) 102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideAlpha = !isUndefinedOrNull(alphaValue); 104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double alpha = alphaValue->NumberValue(); 105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> betaValue = object->Get(v8::String::New("beta")); 107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (betaValue.IsEmpty()) 108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideBeta = !isUndefinedOrNull(betaValue); 110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double beta = betaValue->NumberValue(); 111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 112bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen v8::Local<v8::Value> gammaValue = object->Get(v8::String::New("gamma")); 113bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (gammaValue.IsEmpty()) 114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 115bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideGamma = !isUndefinedOrNull(gammaValue); 116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double gamma = gammaValue->NumberValue(); 117bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 118bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!canProvideAlpha && !canProvideBeta && !canProvideGamma) 119bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return DeviceMotionData::RotationRate::create(canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma); 122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} // namespace 125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 126bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenv8::Handle<v8::Value> V8DeviceMotionEvent::accelerationAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 127bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 128bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen INC_STATS("DOM.DeviceMotionEvent.acceleration._get"); 129dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch v8::Handle<v8::Object> holder = info.Holder(); 130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); 131bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->acceleration()) 132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Null(); 133bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createAccelerationObject(imp->deviceMotionData()->acceleration()); 134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 135dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 136bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenv8::Handle<v8::Value> V8DeviceMotionEvent::accelerationIncludingGravityAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 137dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 138bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen INC_STATS("DOM.DeviceMotionEvent.accelerationIncludingGravity._get"); 139dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch v8::Handle<v8::Object> holder = info.Holder(); 140dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); 141bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->accelerationIncludingGravity()) 142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Null(); 143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createAccelerationObject(imp->deviceMotionData()->accelerationIncludingGravity()); 144dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 145dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 146bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenv8::Handle<v8::Value> V8DeviceMotionEvent::rotationRateAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen INC_STATS("DOM.DeviceMotionEvent.rotationRate._get"); 149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch v8::Handle<v8::Object> holder = info.Holder(); 150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); 151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->rotationRate()) 152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Null(); 153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createRotationRateObject(imp->deviceMotionData()->rotationRate()); 154dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 155dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 156dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochv8::Handle<v8::Value> V8DeviceMotionEvent::intervalAccessorGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 157dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 158dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch INC_STATS("DOM.DeviceMotionEvent.interval._get"); 159dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch v8::Handle<v8::Object> holder = info.Holder(); 160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(holder); 161dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!imp->deviceMotionData()->canProvideInterval()) 162dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Null(); 163dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Number::New(imp->deviceMotionData()->interval()); 164dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 165dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochv8::Handle<v8::Value> V8DeviceMotionEvent::initDeviceMotionEventCallback(const v8::Arguments& args) 167dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 168dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = V8DeviceMotionEvent::toNative(args.Holder()); 1695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen STRING_TO_V8PARAMETER_EXCEPTION_BLOCK(V8Parameter<>, type, args[0]); 170dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch bool bubbles = args[1]->BooleanValue(); 171dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch bool cancelable = args[2]->BooleanValue(); 172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::Acceleration> acceleration = readAccelerationArgument(args[3]); 173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::Acceleration> accelerationIncludingGravity = readAccelerationArgument(args[4]); 174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::RotationRate> rotationRate = readRotationRateArgument(args[5]); 175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool intervalProvided = !isUndefinedOrNull(args[6]); 176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double interval = args[6]->NumberValue(); 177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData> deviceMotionData = DeviceMotionData::create(acceleration, accelerationIncludingGravity, rotationRate, intervalProvided, interval); 178dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch imp->initDeviceMotionEvent(type, bubbles, cancelable, deviceMotionData.get()); 179dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return v8::Handle<v8::Value>(); 180dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 182dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} // namespace WebCore 183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 184dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif // ENABLE(DEVICE_ORIENTATION) 185