Safari clears selection when its window gets activated via mouse down
[WebKit-https.git] / Source / WebKit2 / Shared / WebEvent.h
1 /*
2  * Copyright (C) 2010, 2011 Apple Inc. All rights reserved.
3  * Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies)
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  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. 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 APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24  * THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #ifndef WebEvent_h
28 #define WebEvent_h
29
30 // FIXME: We should probably move to makeing the WebCore/PlatformFooEvents trivial classes so that
31 // we can use them as the event type.
32
33 #include <WebCore/FloatPoint.h>
34 #include <WebCore/FloatSize.h>
35 #include <WebCore/IntPoint.h>
36 #include <WebCore/IntSize.h>
37 #include <wtf/text/WTFString.h>
38
39 namespace IPC {
40     class ArgumentDecoder;
41     class ArgumentEncoder;
42 }
43
44 #if USE(APPKIT)
45 namespace WebCore {
46 struct KeypressCommand;
47 }
48 #endif
49
50 namespace WebKit {
51
52 class WebEvent {
53 public:
54     enum Type {
55         NoType = -1,
56         
57         // WebMouseEvent
58         MouseDown,
59         MouseUp,
60         MouseMove,
61
62         // WebWheelEvent
63         Wheel,
64
65         // WebKeyboardEvent
66         KeyDown,
67         KeyUp,
68         RawKeyDown,
69         Char,
70
71 #if ENABLE(TOUCH_EVENTS)
72         // WebTouchEvent
73         TouchStart,
74         TouchMove,
75         TouchEnd,
76         TouchCancel,
77 #endif
78     };
79
80     enum Modifiers {
81         ShiftKey    = 1 << 0,
82         ControlKey  = 1 << 1,
83         AltKey      = 1 << 2,
84         MetaKey     = 1 << 3,
85         CapsLockKey = 1 << 4,
86     };
87
88     Type type() const { return static_cast<Type>(m_type); }
89
90     bool shiftKey() const { return m_modifiers & ShiftKey; }
91     bool controlKey() const { return m_modifiers & ControlKey; }
92     bool altKey() const { return m_modifiers & AltKey; }
93     bool metaKey() const { return m_modifiers & MetaKey; }
94     bool capsLockKey() const { return m_modifiers & CapsLockKey; }
95
96     Modifiers modifiers() const { return static_cast<Modifiers>(m_modifiers); }
97
98     double timestamp() const { return m_timestamp; }
99
100 protected:
101     WebEvent();
102
103     WebEvent(Type, Modifiers, double timestamp);
104
105     void encode(IPC::ArgumentEncoder&) const;
106     static bool decode(IPC::ArgumentDecoder&, WebEvent&);
107
108 private:
109     uint32_t m_type; // Type
110     uint32_t m_modifiers; // Modifiers
111     double m_timestamp;
112 };
113
114 // FIXME: Move this class to its own header file.
115 class WebMouseEvent : public WebEvent {
116 public:
117     enum Button {
118         NoButton = -1,
119         LeftButton,
120         MiddleButton,
121         RightButton
122     };
123
124     WebMouseEvent();
125
126 #if PLATFORM(MAC)
127     WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp, int eventNumber = -1);
128 #else
129     WebMouseEvent(Type, Button, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, float deltaX, float deltaY, float deltaZ, int clickCount, Modifiers, double timestamp);
130 #endif
131
132     Button button() const { return static_cast<Button>(m_button); }
133     const WebCore::IntPoint& position() const { return m_position; }
134     const WebCore::IntPoint& globalPosition() const { return m_globalPosition; }
135     float deltaX() const { return m_deltaX; }
136     float deltaY() const { return m_deltaY; }
137     float deltaZ() const { return m_deltaZ; }
138     int32_t clickCount() const { return m_clickCount; }
139 #if PLATFORM(MAC)
140     int32_t eventNumber() const { return m_eventNumber; }
141 #endif
142
143     void encode(IPC::ArgumentEncoder&) const;
144     static bool decode(IPC::ArgumentDecoder&, WebMouseEvent&);
145
146 private:
147     static bool isMouseEventType(Type);
148
149     uint32_t m_button;
150     WebCore::IntPoint m_position;
151     WebCore::IntPoint m_globalPosition;
152     float m_deltaX;
153     float m_deltaY;
154     float m_deltaZ;
155     int32_t m_clickCount;
156 #if PLATFORM(MAC)
157     int32_t m_eventNumber;
158 #endif
159 };
160
161 // FIXME: Move this class to its own header file.
162 class WebWheelEvent : public WebEvent {
163 public:
164     enum Granularity {
165         ScrollByPageWheelEvent,
166         ScrollByPixelWheelEvent
167     };
168
169 #if PLATFORM(COCOA)
170     enum Phase {
171         PhaseNone        = 0,
172         PhaseBegan       = 1 << 0,
173         PhaseStationary  = 1 << 1,
174         PhaseChanged     = 1 << 2,
175         PhaseEnded       = 1 << 3,
176         PhaseCancelled   = 1 << 4,
177         PhaseMayBegin    = 1 << 5,
178     };
179 #endif
180
181     WebWheelEvent() { }
182
183     WebWheelEvent(Type, const WebCore::IntPoint& position, const WebCore::IntPoint& globalPosition, const WebCore::FloatSize& delta, const WebCore::FloatSize& wheelTicks, Granularity, Modifiers, double timestamp);
184 #if PLATFORM(COCOA)
185     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);
186 #endif
187
188     const WebCore::IntPoint position() const { return m_position; }
189     const WebCore::IntPoint globalPosition() const { return m_globalPosition; }
190     const WebCore::FloatSize delta() const { return m_delta; }
191     const WebCore::FloatSize wheelTicks() const { return m_wheelTicks; }
192     Granularity granularity() const { return static_cast<Granularity>(m_granularity); }
193     bool directionInvertedFromDevice() const { return m_directionInvertedFromDevice; }
194 #if PLATFORM(COCOA)
195     Phase phase() const { return static_cast<Phase>(m_phase); }
196     Phase momentumPhase() const { return static_cast<Phase>(m_momentumPhase); }
197     bool hasPreciseScrollingDeltas() const { return m_hasPreciseScrollingDeltas; }
198     uint32_t scrollCount() const { return m_scrollCount; }
199     const WebCore::FloatSize& unacceleratedScrollingDelta() const { return m_unacceleratedScrollingDelta; }
200 #endif
201
202     void encode(IPC::ArgumentEncoder&) const;
203     static bool decode(IPC::ArgumentDecoder&, WebWheelEvent&);
204
205 private:
206     static bool isWheelEventType(Type);
207
208     WebCore::IntPoint m_position;
209     WebCore::IntPoint m_globalPosition;
210     WebCore::FloatSize m_delta;
211     WebCore::FloatSize m_wheelTicks;
212     uint32_t m_granularity; // Granularity
213     bool m_directionInvertedFromDevice;
214 #if PLATFORM(COCOA)
215     uint32_t m_phase; // Phase
216     uint32_t m_momentumPhase; // Phase
217     bool m_hasPreciseScrollingDeltas;
218     uint32_t m_scrollCount;
219     WebCore::FloatSize m_unacceleratedScrollingDelta;
220 #endif
221 };
222
223 // FIXME: Move this class to its own header file.
224 class WebKeyboardEvent : public WebEvent {
225 public:
226     WebKeyboardEvent();
227     ~WebKeyboardEvent();
228
229 #if USE(APPKIT)
230     WebKeyboardEvent(Type, const String& text, const String& unmodifiedText, const String& keyIdentifier, int windowsVirtualKeyCode, int nativeVirtualKeyCode, int macCharCode, bool handledByInputMethod, const Vector<WebCore::KeypressCommand>&, bool isAutoRepeat, bool isKeypad, bool isSystemKey, Modifiers, double timestamp);
231 #else
232     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);
233 #endif
234
235     const String& text() const { return m_text; }
236     const String& unmodifiedText() const { return m_unmodifiedText; }
237     const String& keyIdentifier() const { return m_keyIdentifier; }
238     int32_t windowsVirtualKeyCode() const { return m_windowsVirtualKeyCode; }
239     int32_t nativeVirtualKeyCode() const { return m_nativeVirtualKeyCode; }
240     int32_t macCharCode() const { return m_macCharCode; }
241 #if USE(APPKIT)
242     bool handledByInputMethod() const { return m_handledByInputMethod; }
243     const Vector<WebCore::KeypressCommand>& commands() const { return m_commands; }
244 #endif
245     bool isAutoRepeat() const { return m_isAutoRepeat; }
246     bool isKeypad() const { return m_isKeypad; }
247     bool isSystemKey() const { return m_isSystemKey; }
248
249     void encode(IPC::ArgumentEncoder&) const;
250     static bool decode(IPC::ArgumentDecoder&, WebKeyboardEvent&);
251
252     static bool isKeyboardEventType(Type);
253
254 private:
255     String m_text;
256     String m_unmodifiedText;
257     String m_keyIdentifier;
258     int32_t m_windowsVirtualKeyCode;
259     int32_t m_nativeVirtualKeyCode;
260     int32_t m_macCharCode;
261 #if USE(APPKIT)
262     bool m_handledByInputMethod;
263     Vector<WebCore::KeypressCommand> m_commands;
264 #endif
265     bool m_isAutoRepeat;
266     bool m_isKeypad;
267     bool m_isSystemKey;
268 };
269
270 #if ENABLE(TOUCH_EVENTS)
271 #if PLATFORM(IOS)
272 class WebPlatformTouchPoint {
273 public:
274     enum TouchPointState {
275         TouchReleased,
276         TouchPressed,
277         TouchMoved,
278         TouchStationary,
279         TouchCancelled
280     };
281
282     WebPlatformTouchPoint() { }
283     WebPlatformTouchPoint(unsigned identifier, WebCore::IntPoint location, TouchPointState phase)
284         : m_identifier(identifier)
285         , m_location(location)
286         , m_phase(phase)
287     {
288     }
289
290     unsigned identifier() const { return m_identifier; }
291     WebCore::IntPoint location() const { return m_location; }
292     TouchPointState phase() const { return static_cast<TouchPointState>(m_phase); }
293     TouchPointState state() const { return phase(); }
294
295     void encode(IPC::ArgumentEncoder&) const;
296     static bool decode(IPC::ArgumentDecoder&, WebPlatformTouchPoint&);
297
298 private:
299     unsigned m_identifier;
300     WebCore::IntPoint m_location;
301     uint32_t m_phase;
302 };
303
304 class WebTouchEvent : public WebEvent {
305 public:
306     WebTouchEvent() { }
307     WebTouchEvent(WebEvent::Type type, Modifiers modifiers, double timestamp, const Vector<WebPlatformTouchPoint>& touchPoints, WebCore::IntPoint position, bool isGesture, float gestureScale, float gestureRotation)
308         : WebEvent(type, modifiers, timestamp)
309         , m_touchPoints(touchPoints)
310         , m_position(position)
311         , m_canPreventNativeGestures(true)
312         , m_isGesture(isGesture)
313         , m_gestureScale(gestureScale)
314         , m_gestureRotation(gestureRotation)
315     {
316         ASSERT(type == TouchStart || type == TouchMove || type == TouchEnd || type == TouchCancel);
317     }
318
319     const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
320
321     WebCore::IntPoint position() const { return m_position; }
322
323     bool isGesture() const { return m_isGesture; }
324     float gestureScale() const { return m_gestureScale; }
325     float gestureRotation() const { return m_gestureRotation; }
326
327     bool canPreventNativeGestures() const { return m_canPreventNativeGestures; }
328     void setCanPreventNativeGestures(bool canPreventNativeGestures) { m_canPreventNativeGestures = canPreventNativeGestures; }
329
330     bool allTouchPointsAreReleased() const;
331
332     void encode(IPC::ArgumentEncoder&) const;
333     static bool decode(IPC::ArgumentDecoder&, WebTouchEvent&);
334     
335 private:
336     Vector<WebPlatformTouchPoint> m_touchPoints;
337     
338     WebCore::IntPoint m_position;
339     bool m_canPreventNativeGestures;
340     bool m_isGesture;
341     float m_gestureScale;
342     float m_gestureRotation;
343 };
344 #else
345 // FIXME: Move this class to its own header file.
346 // FIXME: Having "Platform" in the name makes it sound like this event is platform-specific or low-
347 // level in some way. That doesn't seem to be the case.
348 class WebPlatformTouchPoint {
349 public:
350     enum TouchPointState {
351         TouchReleased,
352         TouchPressed,
353         TouchMoved,
354         TouchStationary,
355         TouchCancelled
356     };
357
358     WebPlatformTouchPoint() : m_rotationAngle(0.0), m_force(0.0) { }
359
360     WebPlatformTouchPoint(uint32_t id, TouchPointState, const WebCore::IntPoint& screenPosition, const WebCore::IntPoint& position);
361
362     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);
363     
364     uint32_t id() const { return m_id; }
365     TouchPointState state() const { return static_cast<TouchPointState>(m_state); }
366
367     const WebCore::IntPoint& screenPosition() const { return m_screenPosition; }
368     const WebCore::IntPoint& position() const { return m_position; }
369     const WebCore::IntSize& radius() const { return m_radius; }
370     float rotationAngle() const { return m_rotationAngle; }
371     float force() const { return m_force; }
372
373     void setState(TouchPointState state) { m_state = state; }
374
375     void encode(IPC::ArgumentEncoder&) const;
376     static bool decode(IPC::ArgumentDecoder&, WebPlatformTouchPoint&);
377
378 private:
379     uint32_t m_id;
380     uint32_t m_state;
381     WebCore::IntPoint m_screenPosition;
382     WebCore::IntPoint m_position;
383     WebCore::IntSize m_radius;
384     float m_rotationAngle;
385     float m_force;
386 };
387
388 // FIXME: Move this class to its own header file.
389 class WebTouchEvent : public WebEvent {
390 public:
391     WebTouchEvent() { }
392     WebTouchEvent(Type, Vector<WebPlatformTouchPoint>&&, Modifiers, double timestamp);
393
394     const Vector<WebPlatformTouchPoint>& touchPoints() const { return m_touchPoints; }
395
396     bool allTouchPointsAreReleased() const;
397
398     void encode(IPC::ArgumentEncoder&) const;
399     static bool decode(IPC::ArgumentDecoder&, WebTouchEvent&);
400   
401 private:
402     static bool isTouchEventType(Type);
403
404     Vector<WebPlatformTouchPoint> m_touchPoints;
405 };
406
407 #endif // PLATFORM(IOS)
408 #endif // ENABLE(TOUCH_EVENTS)
409
410 } // namespace WebKit
411
412 #endif // WebEvent_h