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