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 "JSDeviceMotionEvent.h" 28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(DEVICE_ORIENTATION) 30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "DeviceMotionData.h" 32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "DeviceMotionEvent.h" 33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 34dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochusing namespace JSC; 35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochnamespace WebCore { 37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 38bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic PassRefPtr<DeviceMotionData::Acceleration> readAccelerationArgument(JSValue value, ExecState* exec) 39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 40bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (value.isUndefinedOrNull()) 41bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 42bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 43bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Given the above test, this will always yield an object. 44bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSObject* object = value.toObject(exec); 45bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 46bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue xValue = object->get(exec, Identifier(exec, "x")); 47bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 48bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 49bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideX = !xValue.isUndefinedOrNull(); 50bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double x = xValue.toNumber(exec); 51bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 52bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 53bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 54bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue yValue = object->get(exec, Identifier(exec, "y")); 55bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 56bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 57bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideY = !yValue.isUndefinedOrNull(); 58bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double y = yValue.toNumber(exec); 59bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 60bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 61bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 62bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue zValue = object->get(exec, Identifier(exec, "z")); 63bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 64bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 65bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideZ = !zValue.isUndefinedOrNull(); 66bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double z = zValue.toNumber(exec); 67bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 68bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 69bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 70bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!canProvideX && !canProvideY && !canProvideZ) 71bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 72bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 73bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return DeviceMotionData::Acceleration::create(canProvideX, x, canProvideY, y, canProvideZ, z); 74dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 75dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 76bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic PassRefPtr<DeviceMotionData::RotationRate> readRotationRateArgument(JSValue value, ExecState* exec) 77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 78bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (value.isUndefinedOrNull()) 79bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 80bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 81bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen // Given the above test, this will always yield an object. 82bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSObject* object = value.toObject(exec); 83bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 84bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue alphaValue = object->get(exec, Identifier(exec, "alpha")); 85bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 86bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 87bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideAlpha = !alphaValue.isUndefinedOrNull(); 88bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double alpha = alphaValue.toNumber(exec); 89bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 90bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 91bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 92bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue betaValue = object->get(exec, Identifier(exec, "beta")); 93bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 94bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 95bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideBeta = !betaValue.isUndefinedOrNull(); 96bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double beta = betaValue.toNumber(exec); 97bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 98bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 99bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 100bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSValue gammaValue = object->get(exec, Identifier(exec, "gamma")); 101bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 102bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 103bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool canProvideGamma = !gammaValue.isUndefinedOrNull(); 104bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double gamma = gammaValue.toNumber(exec); 105bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 106bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 107bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 108bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!canProvideAlpha && !canProvideBeta && !canProvideGamma) 109bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return 0; 110bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 111bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return DeviceMotionData::RotationRate::create(canProvideAlpha, alpha, canProvideBeta, beta, canProvideGamma, gamma); 112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 114bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic JSObject* createAccelerationObject(const DeviceMotionData::Acceleration* acceleration, ExecState* exec) 115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 116bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSObject* object = constructEmptyObject(exec); 1172fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "x"), acceleration->canProvideX() ? jsNumber(acceleration->x()) : jsNull()); 1182fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "y"), acceleration->canProvideY() ? jsNumber(acceleration->y()) : jsNull()); 1192fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "z"), acceleration->canProvideZ() ? jsNumber(acceleration->z()) : jsNull()); 120bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return object; 121bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen} 122bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 123bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsenstatic JSObject* createRotationRateObject(const DeviceMotionData::RotationRate* rotationRate, ExecState* exec) 124bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen{ 125bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen JSObject* object = constructEmptyObject(exec); 1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "alpha"), rotationRate->canProvideAlpha() ? jsNumber(rotationRate->alpha()) : jsNull()); 1272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "beta"), rotationRate->canProvideBeta() ? jsNumber(rotationRate->beta()) : jsNull()); 1282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block object->putDirect(exec->globalData(), Identifier(exec, "gamma"), rotationRate->canProvideGamma() ? jsNumber(rotationRate->gamma()) : jsNull()); 129bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return object; 130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 131dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 132bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenJSValue JSDeviceMotionEvent::acceleration(ExecState* exec) const 133dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = static_cast<DeviceMotionEvent*>(impl()); 135bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->acceleration()) 136dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return jsNull(); 137bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createAccelerationObject(imp->deviceMotionData()->acceleration(), exec); 138dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 139dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 140bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenJSValue JSDeviceMotionEvent::accelerationIncludingGravity(ExecState* exec) const 141dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = static_cast<DeviceMotionEvent*>(impl()); 143bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->accelerationIncludingGravity()) 144dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return jsNull(); 145bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createAccelerationObject(imp->deviceMotionData()->accelerationIncludingGravity(), exec); 146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 148bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian MonsenJSValue JSDeviceMotionEvent::rotationRate(ExecState* exec) const 149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = static_cast<DeviceMotionEvent*>(impl()); 151bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (!imp->deviceMotionData()->rotationRate()) 152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return jsNull(); 153bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return createRotationRateObject(imp->deviceMotionData()->rotationRate(), exec); 154dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 155bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 1566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerJSValue JSDeviceMotionEvent::interval(ExecState*) const 157dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 158dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = static_cast<DeviceMotionEvent*>(impl()); 159dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch if (!imp->deviceMotionData()->canProvideInterval()) 160dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return jsNull(); 161e14391e94c850b8bd03680c23b38978db68687a8John Reck return jsNumber(imp->deviceMotionData()->interval()); 162dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 163bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 164dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochJSValue JSDeviceMotionEvent::initDeviceMotionEvent(ExecState* exec) 165dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{ 166dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch const String& type = ustringToString(exec->argument(0).toString(exec)); 167dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch bool bubbles = exec->argument(1).toBoolean(exec); 168dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch bool cancelable = exec->argument(2).toBoolean(exec); 169bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 170dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // If any of the parameters are null or undefined, mark them as not provided. 171dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch // Otherwise, use the standard JavaScript conversion. 172bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::Acceleration> acceleration = readAccelerationArgument(exec->argument(3), exec); 173bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 174bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return jsUndefined(); 175bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 176bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::Acceleration> accelerationIncludingGravity = readAccelerationArgument(exec->argument(4), exec); 177bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 178bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return jsUndefined(); 179bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 180bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData::RotationRate> rotationRate = readRotationRateArgument(exec->argument(5), exec); 181bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen if (exec->hadException()) 182bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen return jsUndefined(); 183bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen 184bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen bool intervalProvided = !exec->argument(6).isUndefinedOrNull(); 185bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen double interval = exec->argument(6).toNumber(exec); 186bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen RefPtr<DeviceMotionData> deviceMotionData = DeviceMotionData::create(acceleration, accelerationIncludingGravity, rotationRate, intervalProvided, interval); 187dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch DeviceMotionEvent* imp = static_cast<DeviceMotionEvent*>(impl()); 188dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch imp->initDeviceMotionEvent(type, bubbles, cancelable, deviceMotionData.get()); 189dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch return jsUndefined(); 190dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} 191dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 192dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch} // namespace WebCore 193dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch 194dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif // ENABLE(DEVICE_ORIENTATION) 195