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