6db1533efd2b549ceadbd54e5b27c95272c5c0a8
[WebKit-https.git] / Source / WebCore / page / EventHandler.h
1 /*
2  * Copyright (C) 2006-2015 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. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #ifndef EventHandler_h
27 #define EventHandler_h
28
29 #include "Cursor.h"
30 #include "DragActions.h"
31 #include "FocusDirection.h"
32 #include "HitTestRequest.h"
33 #include "LayoutPoint.h"
34 #include "PlatformMouseEvent.h"
35 #include "PlatformWheelEvent.h"
36 #include "ScrollTypes.h"
37 #include "TextEventInputType.h"
38 #include "TextGranularity.h"
39 #include "Timer.h"
40 #include "WheelEventDeltaFilter.h"
41 #include <memory>
42 #include <wtf/Forward.h>
43 #include <wtf/RefPtr.h>
44 #include <wtf/WeakPtr.h>
45
46 #if PLATFORM(IOS)
47 OBJC_CLASS WebEvent;
48 OBJC_CLASS WAKView;
49 #ifdef __OBJC__
50 #include "WAKAppKitStubs.h"
51 #endif
52 #endif // PLATFORM(IOS)
53
54 #if PLATFORM(COCOA)
55 OBJC_CLASS NSView;
56 #endif
57
58 #if ENABLE(TOUCH_EVENTS)
59 #include <wtf/HashMap.h>
60 #endif
61
62 #if ENABLE(IOS_TOUCH_EVENTS)
63 #include <wtf/HashSet.h>
64 #include <wtf/Vector.h>
65 #endif
66
67 namespace WebCore {
68
69 class AutoscrollController;
70 class ContainerNode;
71 class DataTransfer;
72 class Document;
73 class Element;
74 class Event;
75 class EventTarget;
76 class FloatPoint;
77 class FloatQuad;
78 class Frame;
79 class HTMLFrameSetElement;
80 class HitTestRequest;
81 class HitTestResult;
82 class KeyboardEvent;
83 class MouseEventWithHitTestResults;
84 class Node;
85 class OptionalCursor;
86 class PlatformKeyboardEvent;
87 class PlatformTouchEvent;
88 class PlatformWheelEvent;
89 class RenderBox;
90 class RenderElement;
91 class RenderLayer;
92 class RenderWidget;
93 class ScrollableArea;
94 class Scrollbar;
95 class TextEvent;
96 class Touch;
97 class TouchEvent;
98 class VisibleSelection;
99 class WheelEvent;
100 class Widget;
101
102 struct DragState;
103
104 #if ENABLE(DRAG_SUPPORT)
105 extern const int LinkDragHysteresis;
106 extern const int ImageDragHysteresis;
107 extern const int TextDragHysteresis;
108 extern const int GeneralDragHysteresis;
109 #endif // ENABLE(DRAG_SUPPORT)
110
111 #if ENABLE(IOS_GESTURE_EVENTS)
112 extern const float GestureUnknown;
113 extern const unsigned InvalidTouchIdentifier;
114 #endif
115
116 enum AppendTrailingWhitespace { ShouldAppendTrailingWhitespace, DontAppendTrailingWhitespace };
117 enum CheckDragHysteresis { ShouldCheckDragHysteresis, DontCheckDragHysteresis };
118
119 enum class ImmediateActionStage {
120     None,
121     PerformedHitTest,
122     ActionUpdated,
123     ActionCancelledWithoutUpdate,
124     ActionCancelledAfterUpdate,
125     ActionCompleted
126 };
127
128 class EventHandler {
129     WTF_MAKE_NONCOPYABLE(EventHandler);
130     WTF_MAKE_FAST_ALLOCATED;
131 public:
132     explicit EventHandler(Frame&);
133     ~EventHandler();
134
135     void clear();
136     void nodeWillBeRemoved(Node&);
137
138 #if ENABLE(DRAG_SUPPORT)
139     void updateSelectionForMouseDrag();
140 #endif
141
142 #if ENABLE(PAN_SCROLLING)
143     void didPanScrollStart();
144     void didPanScrollStop();
145     void startPanScrolling(RenderElement*);
146 #endif
147
148     void stopAutoscrollTimer(bool rendererIsBeingDestroyed = false);
149     RenderBox* autoscrollRenderer() const;
150     void updateAutoscrollRenderer();
151     bool autoscrollInProgress() const;
152     bool mouseDownWasInSubframe() const { return m_mouseDownWasInSubframe; }
153     bool panScrollInProgress() const;
154
155     WEBCORE_EXPORT void dispatchFakeMouseMoveEventSoon();
156     void dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad&);
157
158     WEBCORE_EXPORT HitTestResult hitTestResultAtPoint(const LayoutPoint&,
159         HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent,
160         const LayoutSize& padding = LayoutSize());
161
162     bool mousePressed() const { return m_mousePressed; }
163     Node* mousePressNode() const { return m_mousePressNode.get(); }
164
165     WEBCORE_EXPORT void setCapturingMouseEventsElement(PassRefPtr<Element>); // A caller is responsible for resetting capturing element to 0.
166
167 #if ENABLE(DRAG_SUPPORT)
168     bool updateDragAndDrop(const PlatformMouseEvent&, DataTransfer*);
169     void cancelDragAndDrop(const PlatformMouseEvent&, DataTransfer*);
170     bool performDragAndDrop(const PlatformMouseEvent&, DataTransfer*);
171     void updateDragStateAfterEditDragIfNeeded(Element* rootEditableElement);
172 #endif
173
174     void scheduleHoverStateUpdate();
175 #if ENABLE(CURSOR_SUPPORT)
176     void scheduleCursorUpdate();
177 #endif
178
179     void setResizingFrameSet(HTMLFrameSetElement*);
180
181     void resizeLayerDestroyed();
182
183     IntPoint lastKnownMousePosition() const;
184     IntPoint lastKnownMouseGlobalPosition() const { return m_lastKnownMouseGlobalPosition; }
185     Cursor currentMouseCursor() const { return m_currentMouseCursor; }
186
187     static Frame* subframeForTargetNode(Node*);
188     static Frame* subframeForHitTestResult(const MouseEventWithHitTestResults&);
189
190     WEBCORE_EXPORT bool scrollOverflow(ScrollDirection, ScrollGranularity, Node* startingNode = nullptr);
191     WEBCORE_EXPORT bool scrollRecursively(ScrollDirection, ScrollGranularity, Node* startingNode = nullptr);
192     WEBCORE_EXPORT bool logicalScrollRecursively(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = nullptr);
193
194     bool tabsToLinks(KeyboardEvent*) const;
195     bool tabsToAllFormControls(KeyboardEvent*) const;
196
197     WEBCORE_EXPORT bool mouseMoved(const PlatformMouseEvent&);
198     WEBCORE_EXPORT bool passMouseMovedEventToScrollbars(const PlatformMouseEvent&);
199
200     void lostMouseCapture();
201
202     WEBCORE_EXPORT bool handleMousePressEvent(const PlatformMouseEvent&);
203     bool handleMouseMoveEvent(const PlatformMouseEvent&, HitTestResult* hoveredNode = nullptr, bool onlyUpdateScrollbars = false);
204     WEBCORE_EXPORT bool handleMouseReleaseEvent(const PlatformMouseEvent&);
205     bool handleMouseForceEvent(const PlatformMouseEvent&);
206     WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&);
207     void defaultWheelEventHandler(Node*, WheelEvent*);
208     bool handlePasteGlobalSelection(const PlatformMouseEvent&);
209
210     void platformPrepareForWheelEvents(const PlatformWheelEvent&, const HitTestResult&, RefPtr<Element>& eventTarget, RefPtr<ContainerNode>& scrollableContainer, ScrollableArea*&, bool& isOverWidget);
211     void platformRecordWheelEvent(const PlatformWheelEvent&);
212     bool platformCompleteWheelEvent(const PlatformWheelEvent&, ContainerNode* scrollableContainer, ScrollableArea*);
213     bool platformCompletePlatformWidgetWheelEvent(const PlatformWheelEvent&, const Widget&, ContainerNode* scrollableContainer);
214     void platformNotifyIfEndGesture(const PlatformWheelEvent&, ScrollableArea*);
215
216 #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS)
217     typedef Vector<RefPtr<Touch>> TouchArray;
218     typedef HashMap<EventTarget*, TouchArray*> EventTargetTouchMap;
219     typedef HashSet<RefPtr<EventTarget>> EventTargetSet;
220 #endif
221
222 #if ENABLE(IOS_TOUCH_EVENTS)
223     bool dispatchTouchEvent(const PlatformTouchEvent&, const AtomicString&, const EventTargetTouchMap&, float, float);
224     bool dispatchSimulatedTouchEvent(IntPoint location);
225 #endif
226
227 #if ENABLE(IOS_GESTURE_EVENTS)
228     bool dispatchGestureEvent(const PlatformTouchEvent&, const AtomicString&, const EventTargetSet&, float, float);
229 #endif
230
231 #if PLATFORM(IOS)
232     void defaultTouchEventHandler(Node*, TouchEvent*);
233 #endif
234
235 #if ENABLE(CONTEXT_MENUS)
236     WEBCORE_EXPORT bool sendContextMenuEvent(const PlatformMouseEvent&);
237     bool sendContextMenuEventForKey();
238 #endif
239
240     void setMouseDownMayStartAutoscroll() { m_mouseDownMayStartAutoscroll = true; }
241
242     bool needsKeyboardEventDisambiguationQuirks() const;
243
244     static unsigned accessKeyModifiers();
245     WEBCORE_EXPORT bool handleAccessKey(const PlatformKeyboardEvent&);
246     WEBCORE_EXPORT bool keyEvent(const PlatformKeyboardEvent&);
247     void defaultKeyboardEventHandler(KeyboardEvent*);
248
249     bool accessibilityPreventsEventPropogation(KeyboardEvent*);
250     WEBCORE_EXPORT void handleKeyboardSelectionMovementForAccessibility(KeyboardEvent*);
251
252     bool handleTextInputEvent(const String& text, Event* underlyingEvent = nullptr, TextEventInputType = TextEventInputKeyboard);
253     void defaultTextInputEventHandler(TextEvent*);
254
255 #if ENABLE(DRAG_SUPPORT)
256     WEBCORE_EXPORT bool eventMayStartDrag(const PlatformMouseEvent&) const;
257     
258     WEBCORE_EXPORT void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation);
259 #endif
260
261     void focusDocumentView();
262     
263     WEBCORE_EXPORT void sendScrollEvent();
264
265 #if PLATFORM(COCOA) && defined(__OBJC__)
266 #if !PLATFORM(IOS)
267     WEBCORE_EXPORT void mouseDown(NSEvent *, NSEvent *correspondingPressureEvent);
268     WEBCORE_EXPORT void mouseDragged(NSEvent *, NSEvent *correspondingPressureEvent);
269     WEBCORE_EXPORT void mouseUp(NSEvent *, NSEvent *correspondingPressureEvent);
270     WEBCORE_EXPORT void mouseMoved(NSEvent *, NSEvent *correspondingPressureEvent);
271     WEBCORE_EXPORT void pressureChange(NSEvent *, NSEvent* correspondingPressureEvent);
272     WEBCORE_EXPORT bool keyEvent(NSEvent *);
273     WEBCORE_EXPORT bool wheelEvent(NSEvent *);
274 #else
275     WEBCORE_EXPORT void mouseDown(WebEvent *);
276     WEBCORE_EXPORT void mouseUp(WebEvent *);
277     WEBCORE_EXPORT void mouseMoved(WebEvent *);
278     WEBCORE_EXPORT bool keyEvent(WebEvent *);
279     WEBCORE_EXPORT bool wheelEvent(WebEvent *);
280 #endif
281
282 #if ENABLE(IOS_TOUCH_EVENTS)
283     WEBCORE_EXPORT void touchEvent(WebEvent *);
284 #endif
285
286 #if !PLATFORM(IOS)
287     WEBCORE_EXPORT void passMouseMovedEventToScrollbars(NSEvent *, NSEvent* correspondingPressureEvent);
288
289     WEBCORE_EXPORT void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent);
290 #endif
291
292 #if !PLATFORM(IOS)
293     void setActivationEventNumber(int num) { m_activationEventNumber = num; }
294
295     WEBCORE_EXPORT static NSEvent *currentNSEvent();
296     static NSEvent *correspondingPressureEvent();
297 #else
298     static WebEvent *currentEvent();
299 #endif // !PLATFORM(IOS)
300 #endif // PLATFORM(COCOA) && defined(__OBJC__)
301
302 #if PLATFORM(IOS)
303     void invalidateClick();
304 #endif
305
306 #if ENABLE(TOUCH_EVENTS)
307     WEBCORE_EXPORT bool handleTouchEvent(const PlatformTouchEvent&);
308 #endif
309
310     bool useHandCursor(Node*, bool isOverLink, bool shiftKey);
311     void updateCursor();
312
313     bool isHandlingWheelEvent() const { return m_isHandlingWheelEvent; }
314
315     WEBCORE_EXPORT void setImmediateActionStage(ImmediateActionStage stage);
316     ImmediateActionStage immediateActionStage() const { return m_immediateActionStage; }
317
318 private:
319 #if ENABLE(DRAG_SUPPORT)
320     static DragState& dragState();
321     static const double TextDragDelay;
322     
323     PassRefPtr<DataTransfer> createDraggingDataTransfer() const;
324 #endif // ENABLE(DRAG_SUPPORT)
325
326     bool eventActivatedView(const PlatformMouseEvent&) const;
327     bool updateSelectionForMouseDownDispatchingSelectStart(Node*, const VisibleSelection&, TextGranularity);
328     void selectClosestWordFromHitTestResult(const HitTestResult&, AppendTrailingWhitespace);
329     VisibleSelection selectClosestWordFromHitTestResultBasedOnLookup(const HitTestResult&);
330     void selectClosestWordFromMouseEvent(const MouseEventWithHitTestResults&);
331     void selectClosestContextualWordFromMouseEvent(const MouseEventWithHitTestResults&);
332     void selectClosestContextualWordOrLinkFromMouseEvent(const MouseEventWithHitTestResults&);
333
334     bool handleMouseDoubleClickEvent(const PlatformMouseEvent&);
335
336     WEBCORE_EXPORT bool handleMousePressEvent(const MouseEventWithHitTestResults&);
337     bool handleMousePressEventSingleClick(const MouseEventWithHitTestResults&);
338     bool handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&);
339     bool handleMousePressEventTripleClick(const MouseEventWithHitTestResults&);
340 #if ENABLE(DRAG_SUPPORT)
341     bool handleMouseDraggedEvent(const MouseEventWithHitTestResults&);
342 #endif
343     WEBCORE_EXPORT bool handleMouseReleaseEvent(const MouseEventWithHitTestResults&);
344
345     OptionalCursor selectCursor(const HitTestResult&, bool shiftKey);
346
347     void hoverTimerFired();
348 #if ENABLE(CURSOR_SUPPORT)
349     void cursorUpdateTimerFired();
350 #endif
351
352     bool logicalScrollOverflow(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = nullptr);
353     
354     bool shouldTurnVerticalTicksIntoHorizontal(const HitTestResult&, const PlatformWheelEvent&) const;
355     
356     bool mouseDownMayStartSelect() const { return m_mouseDownMayStartSelect; }
357
358     static bool isKeyboardOptionTab(KeyboardEvent*);
359     static bool eventInvertsTabsToLinksClientCallResult(KeyboardEvent*);
360
361 #if !ENABLE(IOS_TOUCH_EVENTS)
362     void fakeMouseMoveEventTimerFired();
363     void cancelFakeMouseMoveEvent();
364 #endif
365
366     bool isInsideScrollbar(const IntPoint&) const;
367
368 #if ENABLE(TOUCH_EVENTS)
369     bool dispatchSyntheticTouchEventIfEnabled(const PlatformMouseEvent&);
370 #endif
371
372 #if !PLATFORM(IOS)
373     void invalidateClick();
374 #endif
375
376     Node* nodeUnderMouse() const;
377     
378     void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, bool fireMouseOverOut);
379     void fireMouseOverOut(bool fireMouseOver = true, bool fireMouseOut = true, bool updateLastNodeUnderMouse = true);
380     
381     MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const PlatformMouseEvent&);
382
383     bool dispatchMouseEvent(const AtomicString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder);
384 #if ENABLE(DRAG_SUPPORT)
385     bool dispatchDragEvent(const AtomicString& eventType, Element& target, const PlatformMouseEvent&, DataTransfer*);
386
387     void freeDataTransfer();
388
389     bool handleDrag(const MouseEventWithHitTestResults&, CheckDragHysteresis);
390 #endif
391     bool handleMouseUp(const MouseEventWithHitTestResults&);
392 #if ENABLE(DRAG_SUPPORT)
393     void clearDragState();
394
395     bool dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent&);
396
397     bool dragHysteresisExceeded(const FloatPoint&) const;
398     bool dragHysteresisExceeded(const IntPoint&) const;
399 #endif // ENABLE(DRAG_SUPPORT)
400     
401     bool mouseMovementExceedsThreshold(const FloatPoint&, int pointsThreshold) const;
402
403     bool passMousePressEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe);
404     bool passMouseMoveEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = nullptr);
405     bool passMouseReleaseEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe);
406
407     bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = nullptr);
408
409     bool passMousePressEventToScrollbar(MouseEventWithHitTestResults&, Scrollbar*);
410
411     bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&);
412     bool passWidgetMouseDownEventToWidget(RenderWidget*);
413
414     bool passMouseDownEventToWidget(Widget*);
415     bool passWheelEventToWidget(const PlatformWheelEvent&, Widget&);
416
417     void defaultSpaceEventHandler(KeyboardEvent*);
418     void defaultBackspaceEventHandler(KeyboardEvent*);
419     void defaultTabEventHandler(KeyboardEvent*);
420     void defaultArrowEventHandler(FocusDirection, KeyboardEvent*);
421
422 #if ENABLE(DRAG_SUPPORT)
423     DragSourceAction updateDragSourceActionsAllowed() const;
424 #endif
425
426     // The following are called at the beginning of handleMouseUp and handleDrag.  
427     // If they return true it indicates that they have consumed the event.
428     bool eventLoopHandleMouseUp(const MouseEventWithHitTestResults&);
429 #if ENABLE(DRAG_SUPPORT)
430     bool eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&);
431 #endif
432
433 #if ENABLE(DRAG_SUPPORT)
434     void updateSelectionForMouseDrag(const HitTestResult&);
435 #endif
436
437     void updateLastScrollbarUnderMouse(Scrollbar*, bool);
438     
439     void setFrameWasScrolledByUser();
440
441     bool capturesDragging() const { return m_capturesDragging; }
442
443 #if PLATFORM(COCOA) && defined(__OBJC__)
444     NSView *mouseDownViewIfStillGood();
445
446     PlatformMouseEvent currentPlatformMouseEvent() const;
447 #endif
448
449 #if ENABLE(FULLSCREEN_API)
450     bool isKeyEventAllowedInFullScreen(const PlatformKeyboardEvent&) const;
451 #endif
452
453     void setLastKnownMousePosition(const PlatformMouseEvent&);
454
455 #if ENABLE(CURSOR_VISIBILITY)
456     void startAutoHideCursorTimer();
457     void cancelAutoHideCursorTimer();
458     void autoHideCursorTimerFired();
459 #endif
460
461     void beginTrackingPotentialLongMousePress(const HitTestResult&);
462     void recognizeLongMousePress();
463     void cancelTrackingPotentialLongMousePress();
464     bool longMousePressHysteresisExceeded();
465     void clearLongMousePressState();
466     bool handleLongMousePressMouseMovedEvent(const PlatformMouseEvent&);
467
468     void clearLatchedState();
469
470     Frame& m_frame;
471
472     bool m_mousePressed { false };
473     bool m_capturesDragging { false };
474     RefPtr<Node> m_mousePressNode;
475
476     bool m_mouseDownMayStartSelect { false };
477 #if ENABLE(DRAG_SUPPORT)
478     bool m_mouseDownMayStartDrag { false };
479     bool m_dragMayStartSelectionInstead { false };
480 #endif
481     bool m_mouseDownWasSingleClickInSelection { false };
482     enum SelectionInitiationState { HaveNotStartedSelection, PlacedCaret, ExtendedSelection };
483     SelectionInitiationState m_selectionInitiationState { HaveNotStartedSelection };
484
485 #if ENABLE(DRAG_SUPPORT)
486     LayoutPoint m_dragStartPos;
487 #endif
488
489     bool m_panScrollButtonPressed { false };
490
491     Timer m_hoverTimer;
492 #if ENABLE(CURSOR_SUPPORT)
493     Timer m_cursorUpdateTimer;
494 #endif
495
496     Timer m_longMousePressTimer;
497     bool m_didRecognizeLongMousePress { false };
498
499     std::unique_ptr<AutoscrollController> m_autoscrollController;
500     bool m_mouseDownMayStartAutoscroll { false };
501     bool m_mouseDownWasInSubframe { false };
502
503 #if !ENABLE(IOS_TOUCH_EVENTS)
504     Timer m_fakeMouseMoveEventTimer;
505 #endif
506
507     bool m_svgPan { false };
508
509     RenderLayer* m_resizeLayer { nullptr };
510
511     RefPtr<Element> m_capturingMouseEventsElement;
512     bool m_eventHandlerWillResetCapturingMouseEventsElement { false };
513     
514     RefPtr<Element> m_elementUnderMouse;
515     RefPtr<Element> m_lastElementUnderMouse;
516     RefPtr<Frame> m_lastMouseMoveEventSubframe;
517     WeakPtr<Scrollbar> m_lastScrollbarUnderMouse;
518     Cursor m_currentMouseCursor;
519
520     int m_clickCount { 0 };
521     RefPtr<Node> m_clickNode;
522
523 #if ENABLE(IOS_GESTURE_EVENTS)
524     float m_gestureInitialDiameter { GestureUnknown };
525     float m_gestureInitialRotation { GestureUnknown };
526     float m_gestureLastDiameter { GestureUnknown };
527     float m_gestureLastRotation { GestureUnknown };
528     EventTargetSet m_gestureTargets;
529 #endif
530
531 #if ENABLE(IOS_TOUCH_EVENTS)
532     unsigned m_firstTouchID { InvalidTouchIdentifier };
533
534     TouchArray m_touches;
535     RefPtr<Frame> m_touchEventTargetSubframe;
536 #endif
537
538 #if ENABLE(DRAG_SUPPORT)
539     RefPtr<Element> m_dragTarget;
540     bool m_shouldOnlyFireDragOverEvent { false };
541 #endif
542     
543     RefPtr<HTMLFrameSetElement> m_frameSetBeingResized;
544
545     LayoutSize m_offsetFromResizeCorner; // In the coords of m_resizeLayer.
546     
547     bool m_mousePositionIsUnknown { true };
548     IntPoint m_lastKnownMousePosition;
549     IntPoint m_lastKnownMouseGlobalPosition;
550     IntPoint m_mouseDownPos; // In our view's coords.
551     double m_mouseDownTimestamp { 0 };
552     PlatformMouseEvent m_mouseDown;
553
554 #if PLATFORM(COCOA)
555     NSView *m_mouseDownView { nullptr };
556     bool m_sendingEventToSubview { false };
557 #if !PLATFORM(IOS)
558     int m_activationEventNumber { -1 };
559 #endif
560 #endif
561 #if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS)
562     typedef HashMap<int, RefPtr<EventTarget>> TouchTargetMap;
563     TouchTargetMap m_originatingTouchPointTargets;
564     RefPtr<Document> m_originatingTouchPointDocument;
565     unsigned m_originatingTouchPointTargetKey { 0 };
566     bool m_touchPressed { false };
567 #endif
568
569     double m_maxMouseMovedDuration { 0 };
570     PlatformEvent::Type m_baseEventType { PlatformEvent::NoType };
571     bool m_didStartDrag { false };
572     bool m_didLongPressInvokeContextMenu { false };
573     bool m_isHandlingWheelEvent { false };
574
575 #if ENABLE(CURSOR_VISIBILITY)
576     Timer m_autoHideCursorTimer;
577 #endif
578
579     ImmediateActionStage m_immediateActionStage { ImmediateActionStage::None };
580 };
581
582 } // namespace WebCore
583
584 #endif // EventHandler_h