#pragma once
#include "WebEvent.h"
#include <WebCore/IntPoint.h>
namespace WebKit {
#if ENABLE(TOUCH_EVENTS)
#if PLATFORM(IOS_FAMILY)
class WebPlatformTouchPoint {
public:
enum TouchPointState {
TouchReleased,
TouchPressed,
TouchMoved,
TouchStationary,
TouchCancelled
};
enum class TouchType {
Direct,
Stylus
};
WebPlatformTouchPoint() = default;
WebPlatformTouchPoint(unsigned identifier, WebCore::IntPoint location, TouchPointState phase)
: m_identifier(identifier)
, m_location(location)
, m_phase(phase)
{
}
unsigned identifier() const { return m_identifier; }
WebCore::IntPoint location() const { return m_location; }
TouchPointState phase() const { return static_cast<TouchPointState>(m_phase); }
TouchPointState state() const { return phase(); }
#if ENABLE(IOS_TOUCH_EVENTS)
void setRadiusX(double radiusX) { m_radiusX = radiusX; }
double radiusX() const { return m_radiusX; }
void setRadiusY(double radiusY) { m_radiusY = radiusY; }
double radiusY() const { return m_radiusY; }
void setRotationAngle(double rotationAngle) { m_rotationAngle = rotationAngle; }
double rotationAngle() const { return m_rotationAngle; }
void setForce(double force) { m_force = force; }
double force() const { return m_force; }
void setAltitudeAngle(double altitudeAngle) { m_altitudeAngle = altitudeAngle; }
double altitudeAngle() const { return m_altitudeAngle; }
void setAzimuthAngle(double azimuthAngle) { m_azimuthAngle = azimuthAngle; }
double azimuthAngle() const { return m_azimuthAngle; }
void setTouchType(TouchType touchType) { m_touchType = static_cast<uint32_t>(touchType); }
TouchType touchType() const { return static_cast<TouchType>(m_touchType); }
#endif
void encode(IPC::Encoder&) const;
static Optional<WebPlatformTouchPoint> decode(IPC::Decoder&);
private:
unsigned m_identifier { 0 };
WebCore::IntPoint m_location;
uint32_t m_phase { TouchReleased };
#if ENABLE(IOS_TOUCH_EVENTS)
double m_radiusX { 0 };
double m_radiusY { 0 };
double m_rotationAngle { 0 };
double m_force { 0 };
double m_altitudeAngle { 0 };
double m_azimuthAngle { 0 };
uint32_t m_touchType { static_cast<uint32_t>(TouchType::Direct) };
#endif
};
class WebTouchEvent : public WebEvent {
public:
WebTouchEvent() = default;
WebTouchEvent(WebEvent::Type type, OptionSet<Modifier> modifiers, WallTime timestamp, const Vector<WebPlatformTouchPoint>& touchPoints, WebCore::IntPoint position, bool isPotentialTap, bool isGesture, float gestureScale, float gestureRotation)
: WebEvent(type, modifiers, timestamp)
, m_touchPoints(touchPoints)
, m_position(position)
, m_canPreventNativeGestures(true)
, m_isPotentialTap(isPotentialTap)
, m_isGesture(isGesture)
, m_gestureScale(gestureScale)
, m_gestureRotation(gestureRotation)
{
ASSERT(type == TouchStart || type == TouchMove || type == TouchEnd || type == TouchCancel);
}
const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
WebCore::IntPoint position() const { return m_position; }
bool isPotentialTap() const { return m_isPotentialTap; }
bool isGesture() const { return m_isGesture; }
float gestureScale() const { return m_gestureScale; }
float gestureRotation() const { return m_gestureRotation; }
bool canPreventNativeGestures() const { return m_canPreventNativeGestures; }
void setCanPreventNativeGestures(bool canPreventNativeGestures) { m_canPreventNativeGestures = canPreventNativeGestures; }
bool allTouchPointsAreReleased() const;
void encode(IPC::Encoder&) const;
static WARN_UNUSED_RETURN bool decode(IPC::Decoder&, WebTouchEvent&);
private:
Vector<WebPlatformTouchPoint> m_touchPoints;
WebCore::IntPoint m_position;
bool m_canPreventNativeGestures { false };
bool m_isPotentialTap { false };
bool m_isGesture { false };
float m_gestureScale { 0 };
float m_gestureRotation { 0 };
};
#else // !PLATFORM(IOS_FAMILY)
class WebPlatformTouchPoint {
public:
enum TouchPointState {
TouchReleased,
TouchPressed,
TouchMoved,
TouchStationary,
TouchCancelled
};
WebPlatformTouchPoint()
: m_rotationAngle(0.0), m_force(0.0) { }
WebPlatformTouchPoint(uint32_t id, TouchPointState, const WebCore::IntPoint& screenPosition, const WebCore::IntPoint& position);
WebPlatformTouchPoint(uint32_t id, TouchPointState, const WebCore::IntPoint& screenPosition, const WebCore::IntPoint& position, const WebCore::IntSize& radius, float rotationAngle = 0.0, float force = 0.0);
uint32_t id() const { return m_id; }
TouchPointState state() const { return static_cast<TouchPointState>(m_state); }
const WebCore::IntPoint& screenPosition() const { return m_screenPosition; }
const WebCore::IntPoint& position() const { return m_position; }
const WebCore::IntSize& radius() const { return m_radius; }
float rotationAngle() const { return m_rotationAngle; }
float force() const { return m_force; }
void setState(TouchPointState state) { m_state = state; }
void encode(IPC::Encoder&) const;
static Optional<WebPlatformTouchPoint> decode(IPC::Decoder&);
private:
uint32_t m_id;
uint32_t m_state;
WebCore::IntPoint m_screenPosition;
WebCore::IntPoint m_position;
WebCore::IntSize m_radius;
float m_rotationAngle;
float m_force;
};
class WebTouchEvent : public WebEvent {
public:
WebTouchEvent() { }
WebTouchEvent(Type, Vector<WebPlatformTouchPoint>&&, OptionSet<Modifier>, WallTime timestamp);
const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
bool allTouchPointsAreReleased() const;
void encode(IPC::Encoder&) const;
static WARN_UNUSED_RETURN bool decode(IPC::Decoder&, WebTouchEvent&);
private:
static bool isTouchEventType(Type);
Vector<WebPlatformTouchPoint> m_touchPoints;
};
#endif // PLATFORM(IOS_FAMILY)
#endif // ENABLE(TOUCH_EVENTS)
}