7fc777e1f20f8289a1945f38befcd696e02fafab
[WebKit-https.git] / Source / WebKit / Shared / ios / NativeWebTouchEventIOS.mm
1 /*
2  * Copyright (C) 2012 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 #import "config.h"
27 #import "NativeWebTouchEvent.h"
28
29 #if PLATFORM(IOS) && ENABLE(TOUCH_EVENTS)
30
31 #import "UIKitSPI.h"
32 #import "WebEvent.h"
33 #import <UIKit/UITouch.h>
34 #import <WebCore/IntPoint.h>
35 #import <WebCore/WAKAppKitStubs.h>
36 #import <wtf/CurrentTime.h>
37
38 namespace WebKit {
39
40 static inline WebEvent::Type webEventTypeForUIWebTouchEventType(UIWebTouchEventType type)
41 {
42     switch (type) {
43     case UIWebTouchEventTouchBegin:
44         return WebEvent::TouchStart;
45     case UIWebTouchEventTouchChange:
46         return WebEvent::TouchMove;
47     case UIWebTouchEventTouchEnd:
48         return WebEvent::TouchEnd;
49     case UIWebTouchEventTouchCancel:
50         return WebEvent::TouchCancel;
51     }
52 }
53
54 static WebPlatformTouchPoint::TouchPointState convertTouchPhase(UITouchPhase touchPhase)
55 {
56     switch (touchPhase) {
57     case UITouchPhaseBegan:
58         return WebPlatformTouchPoint::TouchPressed;
59     case UITouchPhaseMoved:
60         return WebPlatformTouchPoint::TouchMoved;
61     case UITouchPhaseStationary:
62         return WebPlatformTouchPoint::TouchStationary;
63     case UITouchPhaseEnded:
64         return WebPlatformTouchPoint::TouchReleased;
65     case UITouchPhaseCancelled:
66         return WebPlatformTouchPoint::TouchCancelled;
67     default:
68         ASSERT_NOT_REACHED();
69         return WebPlatformTouchPoint::TouchStationary;
70     }
71 }
72
73 #if defined UI_WEB_TOUCH_EVENT_HAS_STYLUS_DATA && UI_WEB_TOUCH_EVENT_HAS_STYLUS_DATA
74 static WebPlatformTouchPoint::TouchType convertTouchType(UIWebTouchPointType touchType)
75 {
76     switch (touchType) {
77     case UIWebTouchPointTypeDirect:
78         return WebPlatformTouchPoint::TouchType::Direct;
79     case UIWebTouchPointTypeStylus:
80         return WebPlatformTouchPoint::TouchType::Stylus;
81     default:
82         ASSERT_NOT_REACHED();
83         return WebPlatformTouchPoint::TouchType::Direct;
84     }
85 }
86 #endif
87
88 static inline WebCore::IntPoint positionForCGPoint(CGPoint position)
89 {
90     return WebCore::IntPoint(position);
91 }
92
93 Vector<WebPlatformTouchPoint> NativeWebTouchEvent::extractWebTouchPoint(const _UIWebTouchEvent* event)
94 {
95     unsigned touchCount = event->touchPointCount;
96
97     Vector<WebPlatformTouchPoint> touchPointList;
98     touchPointList.reserveInitialCapacity(touchCount);
99     for (unsigned i = 0; i < touchCount; ++i) {
100         const _UIWebTouchPoint& touchPoint = event->touchPoints[i];
101         unsigned identifier = touchPoint.identifier;
102         WebCore::IntPoint location = positionForCGPoint(touchPoint.locationInDocumentCoordinates);
103         WebPlatformTouchPoint::TouchPointState phase = convertTouchPhase(touchPoint.phase);
104         WebPlatformTouchPoint platformTouchPoint = WebPlatformTouchPoint(identifier, location, phase);
105 #if ENABLE(IOS_TOUCH_EVENTS)
106         platformTouchPoint.setRadiusX(touchPoint.majorRadiusInScreenCoordinates);
107         platformTouchPoint.setRadiusY(touchPoint.majorRadiusInScreenCoordinates);
108         platformTouchPoint.setRotationAngle(0); // Not available in _UIWebTouchEvent yet.
109         platformTouchPoint.setForce(touchPoint.force);
110 #if defined UI_WEB_TOUCH_EVENT_HAS_STYLUS_DATA && UI_WEB_TOUCH_EVENT_HAS_STYLUS_DATA
111         platformTouchPoint.setAltitudeAngle(touchPoint.altitudeAngle);
112         platformTouchPoint.setAzimuthAngle(touchPoint.azimuthAngle);
113         platformTouchPoint.setTouchType(convertTouchType(touchPoint.touchType));
114 #endif
115 #endif
116         touchPointList.uncheckedAppend(platformTouchPoint);
117     }
118     return touchPointList;
119 }
120
121 NativeWebTouchEvent::NativeWebTouchEvent(const _UIWebTouchEvent* event)
122     : WebTouchEvent(
123         webEventTypeForUIWebTouchEventType(event->type),
124         static_cast<Modifiers>(0),
125         WallTime::fromRawSeconds(event->timestamp),
126         extractWebTouchPoint(event),
127         positionForCGPoint(event->locationInDocumentCoordinates),
128 #if defined UI_WEB_TOUCH_EVENT_HAS_IS_POTENTIAL_TAP && UI_WEB_TOUCH_EVENT_HAS_IS_POTENTIAL_TAP
129         event->isPotentialTap,
130 #else
131         true,
132 #endif
133         event->inJavaScriptGesture,
134         event->scale,
135         event->rotation)
136 {
137 }
138
139 } // namespace WebKit
140
141 #endif // PLATFORM(IOS) && ENABLE(TOUCH_EVENTS)