Upstream version 6.35.121.0
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / Source / modules / device_orientation / DeviceOrientationController.cpp
1 /*
2  * Copyright 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2012 Samsung Electronics. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *  * Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  *  * Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "modules/device_orientation/DeviceOrientationController.h"
29
30 #include "RuntimeEnabledFeatures.h"
31 #include "core/dom/Document.h"
32 #include "core/page/Page.h"
33 #include "modules/device_orientation/DeviceOrientationData.h"
34 #include "modules/device_orientation/DeviceOrientationDispatcher.h"
35 #include "modules/device_orientation/DeviceOrientationEvent.h"
36
37 namespace WebCore {
38
39 DeviceOrientationController::DeviceOrientationController(Document& document)
40     : DeviceSensorEventController(document)
41     , DOMWindowLifecycleObserver(document.domWindow())
42 {
43 }
44
45 DeviceOrientationController::~DeviceOrientationController()
46 {
47     stopUpdating();
48 }
49
50 void DeviceOrientationController::didChangeDeviceOrientation(DeviceOrientationData* deviceOrientationData)
51 {
52     if (m_overrideOrientationData)
53         return;
54     dispatchDeviceEvent(DeviceOrientationEvent::create(EventTypeNames::deviceorientation, deviceOrientationData));
55 }
56
57 const char* DeviceOrientationController::supplementName()
58 {
59     return "DeviceOrientationController";
60 }
61
62 DeviceOrientationController& DeviceOrientationController::from(Document& document)
63 {
64     DeviceOrientationController* controller = static_cast<DeviceOrientationController*>(DocumentSupplement::from(document, supplementName()));
65     if (!controller) {
66         controller = new DeviceOrientationController(document);
67         DocumentSupplement::provideTo(document, supplementName(), adoptPtr(controller));
68     }
69     return *controller;
70 }
71
72 DeviceOrientationData* DeviceOrientationController::lastData()
73 {
74     return m_overrideOrientationData ? m_overrideOrientationData.get() : DeviceOrientationDispatcher::instance().latestDeviceOrientationData();
75 }
76
77 bool DeviceOrientationController::hasLastData()
78 {
79     return lastData();
80 }
81
82 PassRefPtr<Event> DeviceOrientationController::getLastEvent()
83 {
84     return DeviceOrientationEvent::create(EventTypeNames::deviceorientation, lastData());
85 }
86
87 void DeviceOrientationController::registerWithDispatcher()
88 {
89     DeviceOrientationDispatcher::instance().addDeviceOrientationController(this);
90 }
91
92 void DeviceOrientationController::unregisterWithDispatcher()
93 {
94     DeviceOrientationDispatcher::instance().removeDeviceOrientationController(this);
95 }
96
97 bool DeviceOrientationController::isNullEvent(Event* event)
98 {
99     DeviceOrientationEvent* orientationEvent = toDeviceOrientationEvent(event);
100     return !orientationEvent->orientation()->canProvideEventData();
101 }
102
103 void DeviceOrientationController::didAddEventListener(DOMWindow* window, const AtomicString& eventType)
104 {
105     if (eventType == EventTypeNames::deviceorientation && RuntimeEnabledFeatures::deviceOrientationEnabled()) {
106         if (page() && page()->visibilityState() == PageVisibilityStateVisible)
107             startUpdating();
108         m_hasEventListener = true;
109     }
110 }
111
112 void DeviceOrientationController::didRemoveEventListener(DOMWindow* window, const AtomicString& eventType)
113 {
114     if (eventType == EventTypeNames::deviceorientation) {
115         stopUpdating();
116         m_hasEventListener = false;
117     }
118 }
119
120 void DeviceOrientationController::didRemoveAllEventListeners(DOMWindow* window)
121 {
122     stopUpdating();
123     m_hasEventListener = false;
124 }
125
126 void DeviceOrientationController::setOverride(DeviceOrientationData* deviceOrientationData)
127 {
128     m_overrideOrientationData.clear();
129     didChangeDeviceOrientation(deviceOrientationData);
130     m_overrideOrientationData = deviceOrientationData;
131 }
132
133 void DeviceOrientationController::clearOverride()
134 {
135     if (!m_overrideOrientationData)
136         return;
137     m_overrideOrientationData.clear();
138     DeviceOrientationData* orientation = lastData();
139     if (orientation)
140         didChangeDeviceOrientation(orientation);
141 }
142
143 } // namespace WebCore