|  | /* | 
|  | * Copyright (C) 2010, 2011 Apple Inc. All rights reserved. | 
|  | * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies) | 
|  | * | 
|  | * Redistribution and use in source and binary forms, with or without | 
|  | * modification, are permitted provided that the following conditions | 
|  | * are met: | 
|  | * 1. Redistributions of source code must retain the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer. | 
|  | * 2. Redistributions in binary form must reproduce the above copyright | 
|  | *    notice, this list of conditions and the following disclaimer in the | 
|  | *    documentation and/or other materials provided with the distribution. | 
|  | * | 
|  | * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' | 
|  | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, | 
|  | * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR | 
|  | * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS | 
|  | * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR | 
|  | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF | 
|  | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS | 
|  | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN | 
|  | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) | 
|  | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF | 
|  | * THE POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | #ifndef WebEvent_h | 
|  | #define WebEvent_h | 
|  |  | 
|  | // FIXME: We should probably move to makeing the WebCore/PlatformFooEvents trivial classes so that | 
|  | // we can use them as the event type. | 
|  |  | 
|  | #include <WebCore/FloatPoint.h> | 
|  | #include <WebCore/FloatSize.h> | 
|  | #include <WebCore/IntPoint.h> | 
|  | #include <WebCore/IntSize.h> | 
|  | #include <wtf/text/WTFString.h> | 
|  |  | 
|  | namespace CoreIPC { | 
|  | class ArgumentDecoder; | 
|  | class ArgumentEncoder; | 
|  | } | 
|  |  | 
|  | namespace WebKit { | 
|  |  | 
|  | class WebEvent { | 
|  | public: | 
|  | enum Type { | 
|  | NoType = -1, | 
|  |  | 
|  | // WebMouseEvent | 
|  | MouseDown, | 
|  | MouseUp, | 
|  | MouseMove, | 
|  |  | 
|  | // WebWheelEvent | 
|  | Wheel, | 
|  |  | 
|  | // WebKeyboardEvent | 
|  | KeyDown, | 
|  | KeyUp, | 
|  | RawKeyDown, | 
|  | Char, | 
|  |  | 
|  | #if ENABLE(GESTURE_EVENTS) | 
|  | // WebGestureEvent | 
|  | GestureScrollBegin, | 
|  | GestureScrollEnd, | 
|  | GestureSingleTap, | 
|  | #endif | 
|  |  | 
|  | #if ENABLE(TOUCH_EVENTS) | 
|  | // WebTouchEvent | 
|  | TouchStart, | 
|  | TouchMove, | 
|  | TouchEnd, | 
|  | TouchCancel, | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | enum Modifiers { | 
|  | ShiftKey    = 1 << 0, | 
|  | ControlKey  = 1 << 1, | 
|  | AltKey      = 1 << 2, | 
|  | MetaKey     = 1 << 3, | 
|  | CapsLockKey = 1 << 4, | 
|  | }; | 
|  |  | 
|  | Type type() const { return static_cast<Type>(m_type); } | 
|  |  | 
|  | bool shiftKey() const { return m_modifiers & ShiftKey; } | 
|  | bool controlKey() const { return m_modifiers & ControlKey; } | 
|  | bool altKey() const { return m_modifiers & AltKey; } | 
|  | bool metaKey() const { return m_modifiers & MetaKey; } | 
|  | bool capsLockKey() const { return m_modifiers & CapsLockKey; } | 
|  |  | 
|  | Modifiers modifiers() const { return static_cast<Modifiers>(m_modifiers); } | 
|  |  | 
|  | double timestamp() const { return m_timestamp; } | 
|  |  | 
|  | protected: | 
|  | WebEvent(); | 
|  |  | 
|  | WebEvent(Type, Modifiers, double timestamp); | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebEvent&); | 
|  |  | 
|  | private: | 
|  | uint32_t m_type; // Type | 
|  | uint32_t m_modifiers; // Modifiers | 
|  | double m_timestamp; | 
|  | }; | 
|  |  | 
|  | // FIXME: Move this class to its own header file. | 
|  | class WebMouseEvent : public WebEvent { | 
|  | public: | 
|  | enum Button { | 
|  | NoButton = -1, | 
|  | LeftButton, | 
|  | MiddleButton, | 
|  | RightButton | 
|  | }; | 
|  |  | 
|  | WebMouseEvent(); | 
|  |  | 
|  | WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp); | 
|  |  | 
|  | Button button() const { return static_cast<Button>(m_button); } | 
|  | const WebCore::IntPoint& position() const { return m_position; } | 
|  | const WebCore::IntPoint& globalPosition() const { return m_globalPosition; } | 
|  | float deltaX() const { return m_deltaX; } | 
|  | float deltaY() const { return m_deltaY; } | 
|  | float deltaZ() const { return m_deltaZ; } | 
|  | int32_t clickCount() const { return m_clickCount; } | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebMouseEvent&); | 
|  |  | 
|  | private: | 
|  | static bool isMouseEventType(Type); | 
|  |  | 
|  | uint32_t m_button; | 
|  | WebCore::IntPoint m_position; | 
|  | WebCore::IntPoint m_globalPosition; | 
|  | float m_deltaX; | 
|  | float m_deltaY; | 
|  | float m_deltaZ; | 
|  | int32_t m_clickCount; | 
|  | }; | 
|  |  | 
|  | // FIXME: Move this class to its own header file. | 
|  | class WebWheelEvent : public WebEvent { | 
|  | public: | 
|  | enum Granularity { | 
|  | ScrollByPageWheelEvent, | 
|  | ScrollByPixelWheelEvent | 
|  | }; | 
|  |  | 
|  | #if PLATFORM(MAC) | 
|  | enum Phase { | 
|  | PhaseNone        = 0, | 
|  | PhaseBegan       = 1 << 0, | 
|  | PhaseStationary  = 1 << 1, | 
|  | PhaseChanged     = 1 << 2, | 
|  | PhaseEnded       = 1 << 3, | 
|  | PhaseCancelled   = 1 << 4, | 
|  | PhaseMayBegin    = 1 << 5, | 
|  | }; | 
|  | #endif | 
|  |  | 
|  | WebWheelEvent() { } | 
|  |  | 
|  | WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Modifiers, double timestamp); | 
|  | #if PLATFORM(MAC) | 
|  | WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, bool directionInvertedFromDevice, Phase, Phase momentumPhase, bool hasPreciseScrollingDeltas, uint32_t scrollCount, const WebCore::FloatSize& unacceleratedScrollingDelta, Modifiers, double timestamp); | 
|  | #endif | 
|  |  | 
|  | const WebCore::IntPoint position() const { return m_position; } | 
|  | const WebCore::IntPoint globalPosition() const { return m_globalPosition; } | 
|  | const WebCore::FloatSize delta() const { return m_delta; } | 
|  | const WebCore::FloatSize wheelTicks() const { return m_wheelTicks; } | 
|  | Granularity granularity() const { return static_cast<Granularity>(m_granularity); } | 
|  | bool directionInvertedFromDevice() const { return m_directionInvertedFromDevice; } | 
|  | #if PLATFORM(MAC) | 
|  | Phase phase() const { return static_cast<Phase>(m_phase); } | 
|  | Phase momentumPhase() const { return static_cast<Phase>(m_momentumPhase); } | 
|  | bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; } | 
|  | uint32_t scrollCount() const { return m_scrollCount; } | 
|  | const WebCore::FloatSize& unacceleratedScrollingDelta() const { return m_unacceleratedScrollingDelta; } | 
|  | #endif | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebWheelEvent&); | 
|  |  | 
|  | private: | 
|  | static bool isWheelEventType(Type); | 
|  |  | 
|  | WebCore::IntPoint m_position; | 
|  | WebCore::IntPoint m_globalPosition; | 
|  | WebCore::FloatSize m_delta; | 
|  | WebCore::FloatSize m_wheelTicks; | 
|  | uint32_t m_granularity; // Granularity | 
|  | bool m_directionInvertedFromDevice; | 
|  | #if PLATFORM(MAC) | 
|  | uint32_t m_phase; // Phase | 
|  | uint32_t m_momentumPhase; // Phase | 
|  | bool m_hasPreciseScrollingDeltas; | 
|  | uint32_t m_scrollCount; | 
|  | WebCore::FloatSize m_unacceleratedScrollingDelta; | 
|  | #endif | 
|  | }; | 
|  |  | 
|  | // FIXME: Move this class to its own header file. | 
|  | class WebKeyboardEvent : public WebEvent { | 
|  | public: | 
|  | WebKeyboardEvent() { } | 
|  |  | 
|  | WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, double timestamp); | 
|  |  | 
|  | const String& text() const { return m_text; } | 
|  | const String& unmodifiedText() const { return m_unmodifiedText; } | 
|  | const String& keyIdentifier() const { return m_keyIdentifier; } | 
|  | int32_t windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; } | 
|  | int32_t nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; } | 
|  | int32_t macCharCode() const { return m_macCharCode; } | 
|  | bool isAutoRepeat() const { return m_isAutoRepeat; } | 
|  | bool isKeypad() const { return m_isKeypad; } | 
|  | bool isSystemKey() const { return m_isSystemKey; } | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebKeyboardEvent&); | 
|  |  | 
|  | static bool isKeyboardEventType(Type); | 
|  |  | 
|  | private: | 
|  | String m_text; | 
|  | String m_unmodifiedText; | 
|  | String m_keyIdentifier; | 
|  | int32_t m_windowsVirtualKeyCode; | 
|  | int32_t m_nativeVirtualKeyCode; | 
|  | int32_t m_macCharCode; | 
|  | bool m_isAutoRepeat; | 
|  | bool m_isKeypad; | 
|  | bool m_isSystemKey; | 
|  | }; | 
|  |  | 
|  |  | 
|  | #if ENABLE(GESTURE_EVENTS) | 
|  | // FIXME: Move this class to its own header file. | 
|  | class WebGestureEvent : public WebEvent { | 
|  | public: | 
|  | WebGestureEvent() { } | 
|  | WebGestureEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, Modifiers, double timestamp); | 
|  | WebGestureEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, Modifiers, double timestamp, const WebCore::IntSize& area, const WebCore::FloatPoint& delta); | 
|  |  | 
|  | const WebCore::IntPoint position() const { return m_position; } | 
|  | const WebCore::IntPoint globalPosition() const { return m_globalPosition; } | 
|  | const WebCore::IntSize area() const { return m_area; } | 
|  | const WebCore::FloatPoint delta() const { return m_delta; } | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebGestureEvent&); | 
|  |  | 
|  | private: | 
|  | static bool isGestureEventType(Type); | 
|  |  | 
|  | WebCore::IntPoint m_position; | 
|  | WebCore::IntPoint m_globalPosition; | 
|  | WebCore::IntSize m_area; | 
|  | WebCore::FloatPoint m_delta; | 
|  | }; | 
|  | #endif // ENABLE(GESTURE_EVENTS) | 
|  |  | 
|  |  | 
|  | #if ENABLE(TOUCH_EVENTS) | 
|  | // FIXME: Move this class to its own header file. | 
|  | // FIXME: Having "Platform" in the name makes it sound like this event is platform-specific or low- | 
|  | // level in some way. That doesn't seem to be the case. | 
|  | 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(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebPlatformTouchPoint&); | 
|  |  | 
|  | 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; | 
|  | }; | 
|  |  | 
|  | // FIXME: Move this class to its own header file. | 
|  | class WebTouchEvent : public WebEvent { | 
|  | public: | 
|  | WebTouchEvent() { } | 
|  |  | 
|  | // FIXME: It would be nice not to have to copy the Vector here. | 
|  | WebTouchEvent(Type, Vector<WebPlatformTouchPoint>, Modifiers, double timestamp); | 
|  |  | 
|  | const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; } | 
|  |  | 
|  | void encode(CoreIPC::ArgumentEncoder&) const; | 
|  | static bool decode(CoreIPC::ArgumentDecoder&, WebTouchEvent&); | 
|  |  | 
|  | private: | 
|  | static bool isTouchEventType(Type); | 
|  |  | 
|  | Vector<WebPlatformTouchPoint> m_touchPoints; | 
|  | }; | 
|  |  | 
|  | #endif // ENABLE(TOUCH_EVENTS) | 
|  |  | 
|  | } // namespace WebKit | 
|  |  | 
|  | #endif // WebEvent_h |