c7df8b6df272dba244f83cc106c7c9684faa8740
[WebKit-https.git] / Source / WebKit2 / Shared / WebEventConversion.cpp
1 /*
2  * Copyright (C) 2010 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebEventConversion.h"
28
29 #include "WebEvent.h"
30
31 namespace WebKit {
32
33 class WebKit2PlatformMouseEvent : public WebCore::PlatformMouseEvent {
34 public:
35     WebKit2PlatformMouseEvent(const WebMouseEvent& webEvent)
36     {
37         // PlatformEvent
38         switch (webEvent.type()) {
39         case WebEvent::MouseDown:
40             m_type = WebCore::PlatformEvent::MousePressed;
41             break;
42         case WebEvent::MouseUp:
43             m_type = WebCore::PlatformEvent::MouseReleased;
44             break;
45         case WebEvent::MouseMove:
46             m_type = WebCore::PlatformEvent::MouseMoved;
47             break;
48         default:
49             ASSERT_NOT_REACHED();
50         }
51
52         m_modifiers = 0;
53         if (webEvent.shiftKey())
54             m_modifiers |= ShiftKey;
55         if (webEvent.controlKey())
56             m_modifiers |= CtrlKey;
57         if (webEvent.altKey())
58             m_modifiers |= AltKey;
59         if (webEvent.metaKey())
60             m_modifiers |= MetaKey;
61
62         m_timestamp = webEvent.timestamp();
63
64         // PlatformMouseEvent
65         switch (webEvent.button()) {
66         case WebMouseEvent::NoButton:
67             m_button = WebCore::NoButton;
68             break;
69         case WebMouseEvent::LeftButton:
70             m_button = WebCore::LeftButton;
71             break;
72         case WebMouseEvent::MiddleButton:
73             m_button = WebCore::MiddleButton;
74             break;
75         case WebMouseEvent::RightButton:
76             m_button = WebCore::RightButton;
77             break;
78         default:
79             ASSERT_NOT_REACHED();
80         }
81
82         m_position = webEvent.position();
83         m_globalPosition = webEvent.globalPosition();
84         m_clickCount = webEvent.clickCount();
85
86         m_modifierFlags = 0;
87         if (webEvent.shiftKey())
88             m_modifierFlags |= WebEvent::ShiftKey;
89         if (webEvent.controlKey())
90             m_modifierFlags |= WebEvent::ControlKey;
91         if (webEvent.altKey())
92             m_modifierFlags |= WebEvent::AltKey;
93         if (webEvent.metaKey())
94             m_modifierFlags |= WebEvent::MetaKey;
95     }
96 };
97
98 WebCore::PlatformMouseEvent platform(const WebMouseEvent& webEvent)
99 {
100     return WebKit2PlatformMouseEvent(webEvent);
101 }
102
103 class WebKit2PlatformWheelEvent : public WebCore::PlatformWheelEvent {
104 public:
105     WebKit2PlatformWheelEvent(const WebWheelEvent& webEvent)
106     {
107         // PlatformEvent
108         m_type = PlatformEvent::Wheel;
109
110         m_modifiers = 0;
111         if (webEvent.shiftKey())
112             m_modifiers |= ShiftKey;
113         if (webEvent.controlKey())
114             m_modifiers |= CtrlKey;
115         if (webEvent.altKey())
116             m_modifiers |= AltKey;
117         if (webEvent.metaKey())
118             m_modifiers |= MetaKey;
119
120         m_timestamp = webEvent.timestamp();
121
122         // PlatformWheelEvent
123         m_position = webEvent.position();
124         m_globalPosition = webEvent.globalPosition();
125         m_deltaX = webEvent.delta().width();
126         m_deltaY = webEvent.delta().height();
127         m_wheelTicksX = webEvent.wheelTicks().width();
128         m_wheelTicksY = webEvent.wheelTicks().height();
129         m_granularity = (webEvent.granularity() == WebWheelEvent::ScrollByPageWheelEvent) ? WebCore::ScrollByPageWheelEvent : WebCore::ScrollByPixelWheelEvent;
130         m_directionInvertedFromDevice = webEvent.directionInvertedFromDevice();
131 #if PLATFORM(COCOA)
132         m_phase = static_cast<WebCore::PlatformWheelEventPhase>(webEvent.phase());
133         m_momentumPhase = static_cast<WebCore::PlatformWheelEventPhase>(webEvent.momentumPhase());
134         m_hasPreciseScrollingDeltas = webEvent.hasPreciseScrollingDeltas();
135         m_scrollCount = webEvent.scrollCount();
136         m_unacceleratedScrollingDeltaX = webEvent.unacceleratedScrollingDelta().width();
137         m_unacceleratedScrollingDeltaY = webEvent.unacceleratedScrollingDelta().height();
138 #endif
139     }
140 };
141
142 WebCore::PlatformWheelEvent platform(const WebWheelEvent& webEvent)
143 {
144     return WebKit2PlatformWheelEvent(webEvent);
145 }
146
147 class WebKit2PlatformKeyboardEvent : public WebCore::PlatformKeyboardEvent {
148 public:
149     WebKit2PlatformKeyboardEvent(const WebKeyboardEvent& webEvent)
150     {
151         // PlatformEvent
152         switch (webEvent.type()) {
153         case WebEvent::KeyDown:
154             m_type = WebCore::PlatformEvent::KeyDown;
155             break;
156         case WebEvent::KeyUp:
157             m_type = WebCore::PlatformEvent::KeyUp;
158             break;
159         case WebEvent::RawKeyDown:
160             m_type = WebCore::PlatformEvent::RawKeyDown;
161             break;
162         case WebEvent::Char:
163             m_type = WebCore::PlatformEvent::Char;
164             break;
165         default:
166             ASSERT_NOT_REACHED();
167         }
168
169         m_modifiers = 0;
170         if (webEvent.shiftKey())
171             m_modifiers |= ShiftKey;
172         if (webEvent.controlKey())
173             m_modifiers |= CtrlKey;
174         if (webEvent.altKey())
175             m_modifiers |= AltKey;
176         if (webEvent.metaKey())
177             m_modifiers |= MetaKey;
178
179         m_timestamp = webEvent.timestamp();
180
181         // PlatformKeyboardEvent
182         m_text = webEvent.text();
183         m_unmodifiedText = webEvent.unmodifiedText();
184         m_keyIdentifier = webEvent.keyIdentifier();
185         m_windowsVirtualKeyCode = webEvent.windowsVirtualKeyCode();
186         m_nativeVirtualKeyCode = webEvent.nativeVirtualKeyCode();
187         m_macCharCode = webEvent.macCharCode();
188 #if USE(APPKIT)
189         m_handledByInputMethod = webEvent.handledByInputMethod();
190         m_commands = webEvent.commands();
191 #endif
192         m_autoRepeat = webEvent.isAutoRepeat();
193         m_isKeypad = webEvent.isKeypad();
194         m_isSystemKey = webEvent.isSystemKey();
195     }
196 };
197
198 WebCore::PlatformKeyboardEvent platform(const WebKeyboardEvent& webEvent)
199 {
200     return WebKit2PlatformKeyboardEvent(webEvent);
201 }
202
203 #if ENABLE(TOUCH_EVENTS)
204
205 #if PLATFORM(IOS)
206 static WebCore::PlatformTouchPoint::TouchPhaseType touchEventType(const WebPlatformTouchPoint& webTouchPoint)
207 {
208     switch (webTouchPoint.phase()) {
209     case WebPlatformTouchPoint::TouchReleased:
210         return WebCore::PlatformTouchPoint::TouchPhaseEnded;
211     case WebPlatformTouchPoint::TouchPressed:
212         return WebCore::PlatformTouchPoint::TouchPhaseBegan;
213     case WebPlatformTouchPoint::TouchMoved:
214         return WebCore::PlatformTouchPoint::TouchPhaseMoved;
215     case WebPlatformTouchPoint::TouchStationary:
216         return WebCore::PlatformTouchPoint::TouchPhaseStationary;
217     case WebPlatformTouchPoint::TouchCancelled:
218         return WebCore::PlatformTouchPoint::TouchPhaseCancelled;
219     }
220 }
221
222 class WebKit2PlatformTouchPoint : public WebCore::PlatformTouchPoint {
223 public:
224 WebKit2PlatformTouchPoint(const WebPlatformTouchPoint& webTouchPoint)
225     : PlatformTouchPoint(webTouchPoint.identifier(), webTouchPoint.location(), touchEventType(webTouchPoint))
226 {
227 }
228 };
229 #else
230
231 class WebKit2PlatformTouchPoint : public WebCore::PlatformTouchPoint {
232 public:
233     WebKit2PlatformTouchPoint(const WebPlatformTouchPoint& webTouchPoint)
234     {
235         m_id = webTouchPoint.id();
236
237         switch (webTouchPoint.state()) {
238         case WebPlatformTouchPoint::TouchReleased:
239             m_state = PlatformTouchPoint::TouchReleased;
240             break;
241         case WebPlatformTouchPoint::TouchPressed:
242             m_state = PlatformTouchPoint::TouchPressed;
243             break;
244         case WebPlatformTouchPoint::TouchMoved:
245             m_state = PlatformTouchPoint::TouchMoved;
246             break;
247         case WebPlatformTouchPoint::TouchStationary:
248             m_state = PlatformTouchPoint::TouchStationary;
249             break;
250         case WebPlatformTouchPoint::TouchCancelled:
251             m_state = PlatformTouchPoint::TouchCancelled;
252             break;
253         default:
254             ASSERT_NOT_REACHED();
255         }
256
257         m_screenPos = webTouchPoint.screenPosition();
258         m_pos = webTouchPoint.position();
259         m_radiusX = webTouchPoint.radius().width();
260         m_radiusY = webTouchPoint.radius().height();
261         m_force = webTouchPoint.force();
262         m_rotationAngle = webTouchPoint.rotationAngle();
263     }
264 };
265 #endif // PLATFORM(IOS)
266
267 class WebKit2PlatformTouchEvent : public WebCore::PlatformTouchEvent {
268 public:
269     WebKit2PlatformTouchEvent(const WebTouchEvent& webEvent)
270     {
271         // PlatformEvent
272         switch (webEvent.type()) {
273         case WebEvent::TouchStart: 
274             m_type = WebCore::PlatformEvent::TouchStart;
275             break;
276         case WebEvent::TouchMove: 
277             m_type = WebCore::PlatformEvent::TouchMove;
278             break;
279         case WebEvent::TouchEnd: 
280             m_type = WebCore::PlatformEvent::TouchEnd;
281             break;
282         case WebEvent::TouchCancel:
283             m_type = WebCore::PlatformEvent::TouchCancel;
284             break;
285         default:
286             ASSERT_NOT_REACHED();
287         }
288
289         m_modifiers = 0;
290         if (webEvent.shiftKey())
291             m_modifiers |= ShiftKey;
292         if (webEvent.controlKey())
293             m_modifiers |= CtrlKey;
294         if (webEvent.altKey())
295             m_modifiers |= AltKey;
296         if (webEvent.metaKey())
297             m_modifiers |= MetaKey;
298
299         m_timestamp = webEvent.timestamp();
300
301 #if PLATFORM(IOS)
302         unsigned touchCount = webEvent.touchPoints().size();
303         m_touchPoints.reserveInitialCapacity(touchCount);
304         for (unsigned i = 0; i < touchCount; ++i)
305             m_touchPoints.uncheckedAppend(WebKit2PlatformTouchPoint(webEvent.touchPoints().at(i)));
306
307         m_gestureScale = webEvent.gestureScale();
308         m_gestureRotation = webEvent.gestureRotation();
309         m_canPreventNativeGestures = webEvent.canPreventNativeGestures();
310         m_isGesture = webEvent.isGesture();
311         m_position = webEvent.position();
312         m_globalPosition = webEvent.position();
313 #else
314         // PlatformTouchEvent
315         for (size_t i = 0; i < webEvent.touchPoints().size(); ++i)
316             m_touchPoints.append(WebKit2PlatformTouchPoint(webEvent.touchPoints().at(i)));
317 #endif //PLATFORM(IOS)
318     }
319 };
320
321 WebCore::PlatformTouchEvent platform(const WebTouchEvent& webEvent)
322 {
323     return WebKit2PlatformTouchEvent(webEvent);
324 }
325 #endif
326
327 } // namespace WebKit