1 | /* |
2 | * Copyright (C) 2006-2018 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 | #pragma once |
27 | |
28 | #include "Cursor.h" |
29 | #include "DragActions.h" |
30 | #include "FocusDirection.h" |
31 | #include "HitTestRequest.h" |
32 | #include "LayoutPoint.h" |
33 | #include "PlatformMouseEvent.h" |
34 | #include "RenderObject.h" |
35 | #include "ScrollTypes.h" |
36 | #include "TextEventInputType.h" |
37 | #include "TextGranularity.h" |
38 | #include "Timer.h" |
39 | #include <memory> |
40 | #include <wtf/Forward.h> |
41 | #include <wtf/HashMap.h> |
42 | #include <wtf/HashSet.h> |
43 | #include <wtf/RefPtr.h> |
44 | #include <wtf/WeakPtr.h> |
45 | |
46 | #if PLATFORM(COCOA) |
47 | OBJC_CLASS NSView; |
48 | #endif |
49 | |
50 | #if PLATFORM(IOS_FAMILY) |
51 | OBJC_CLASS WebEvent; |
52 | #endif |
53 | |
54 | #if PLATFORM(MAC) |
55 | OBJC_CLASS NSEvent; |
56 | #endif |
57 | |
58 | #if PLATFORM(IOS_FAMILY) && defined(__OBJC__) |
59 | #include "WAKAppKitStubs.h" |
60 | #endif |
61 | |
62 | namespace WebCore { |
63 | |
64 | class AutoscrollController; |
65 | class ContainerNode; |
66 | class DataTransfer; |
67 | class Document; |
68 | class Element; |
69 | class Event; |
70 | class EventTarget; |
71 | class FloatQuad; |
72 | class Frame; |
73 | class FrameView; |
74 | class HTMLFrameSetElement; |
75 | class HitTestResult; |
76 | class KeyboardEvent; |
77 | class MouseEventWithHitTestResults; |
78 | class Node; |
79 | class Pasteboard; |
80 | class PlatformGestureEvent; |
81 | class PlatformKeyboardEvent; |
82 | class PlatformTouchEvent; |
83 | class PlatformWheelEvent; |
84 | class RenderBox; |
85 | class RenderElement; |
86 | class RenderLayer; |
87 | class RenderWidget; |
88 | class ScrollableArea; |
89 | class Scrollbar; |
90 | class TextEvent; |
91 | class Touch; |
92 | class TouchEvent; |
93 | class VisibleSelection; |
94 | class WheelEvent; |
95 | class Widget; |
96 | |
97 | struct DragState; |
98 | |
99 | #if ENABLE(DRAG_SUPPORT) |
100 | extern const int LinkDragHysteresis; |
101 | extern const int ImageDragHysteresis; |
102 | extern const int TextDragHysteresis; |
103 | extern const int ColorDragHystersis; |
104 | extern const int GeneralDragHysteresis; |
105 | #endif |
106 | |
107 | #if ENABLE(IOS_GESTURE_EVENTS) || ENABLE(MAC_GESTURE_EVENTS) |
108 | extern const float GestureUnknown; |
109 | extern const unsigned InvalidTouchIdentifier; |
110 | #endif |
111 | |
112 | enum AppendTrailingWhitespace { ShouldAppendTrailingWhitespace, DontAppendTrailingWhitespace }; |
113 | enum CheckDragHysteresis { ShouldCheckDragHysteresis, DontCheckDragHysteresis }; |
114 | |
115 | enum class ImmediateActionStage { |
116 | None, |
117 | PerformedHitTest, |
118 | ActionUpdated, |
119 | ActionCancelledWithoutUpdate, |
120 | ActionCancelledAfterUpdate, |
121 | ActionCompleted |
122 | }; |
123 | |
124 | class EventHandler { |
125 | WTF_MAKE_FAST_ALLOCATED; |
126 | public: |
127 | explicit EventHandler(Frame&); |
128 | ~EventHandler(); |
129 | |
130 | void clear(); |
131 | void nodeWillBeRemoved(Node&); |
132 | |
133 | WEBCORE_EXPORT VisiblePosition selectionExtentRespectingEditingBoundary(const VisibleSelection&, const LayoutPoint&, Node*); |
134 | |
135 | #if ENABLE(DRAG_SUPPORT) |
136 | void updateSelectionForMouseDrag(); |
137 | #endif |
138 | |
139 | #if ENABLE(PAN_SCROLLING) |
140 | void didPanScrollStart(); |
141 | void didPanScrollStop(); |
142 | void startPanScrolling(RenderElement&); |
143 | #endif |
144 | |
145 | void stopAutoscrollTimer(bool rendererIsBeingDestroyed = false); |
146 | RenderBox* autoscrollRenderer() const; |
147 | void updateAutoscrollRenderer(); |
148 | bool autoscrollInProgress() const; |
149 | bool mouseDownWasInSubframe() const { return m_mouseDownWasInSubframe; } |
150 | bool panScrollInProgress() const; |
151 | |
152 | WEBCORE_EXPORT void dispatchFakeMouseMoveEventSoon(); |
153 | void dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad&); |
154 | |
155 | WEBCORE_EXPORT HitTestResult hitTestResultAtPoint(const LayoutPoint&, HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowUserAgentShadowContent, const LayoutSize& padding = LayoutSize()) const; |
156 | |
157 | bool mousePressed() const { return m_mousePressed; } |
158 | Node* mousePressNode() const { return m_mousePressNode.get(); } |
159 | |
160 | WEBCORE_EXPORT void setCapturingMouseEventsElement(Element*); |
161 | |
162 | #if ENABLE(DRAG_SUPPORT) |
163 | struct DragTargetResponse { |
164 | bool accept { false }; |
165 | Optional<DragOperation> operation; |
166 | }; |
167 | DragTargetResponse updateDragAndDrop(const PlatformMouseEvent&, const std::function<std::unique_ptr<Pasteboard>()>&, DragOperation sourceOperation, bool draggingFiles); |
168 | void cancelDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles); |
169 | bool performDragAndDrop(const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&&, DragOperation, bool draggingFiles); |
170 | void updateDragStateAfterEditDragIfNeeded(Element& rootEditableElement); |
171 | RefPtr<Element> draggedElement() const; |
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 | IntPoint targetPositionInWindowForSelectionAutoscroll() const; |
188 | bool shouldUpdateAutoscroll(); |
189 | |
190 | static Frame* subframeForTargetNode(Node*); |
191 | static Frame* subframeForHitTestResult(const MouseEventWithHitTestResults&); |
192 | |
193 | WEBCORE_EXPORT bool scrollOverflow(ScrollDirection, ScrollGranularity, Node* startingNode = nullptr); |
194 | WEBCORE_EXPORT bool scrollRecursively(ScrollDirection, ScrollGranularity, Node* startingNode = nullptr); |
195 | WEBCORE_EXPORT bool logicalScrollRecursively(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = nullptr); |
196 | |
197 | bool tabsToLinks(KeyboardEvent*) const; |
198 | bool tabsToAllFormControls(KeyboardEvent*) const; |
199 | |
200 | WEBCORE_EXPORT bool mouseMoved(const PlatformMouseEvent&); |
201 | WEBCORE_EXPORT bool passMouseMovedEventToScrollbars(const PlatformMouseEvent&); |
202 | |
203 | void lostMouseCapture(); |
204 | |
205 | WEBCORE_EXPORT bool handleMousePressEvent(const PlatformMouseEvent&); |
206 | bool handleMouseMoveEvent(const PlatformMouseEvent&, HitTestResult* hoveredNode = nullptr, bool onlyUpdateScrollbars = false); |
207 | WEBCORE_EXPORT bool handleMouseReleaseEvent(const PlatformMouseEvent&); |
208 | bool handleMouseForceEvent(const PlatformMouseEvent&); |
209 | WEBCORE_EXPORT bool handleWheelEvent(const PlatformWheelEvent&); |
210 | void defaultWheelEventHandler(Node*, WheelEvent&); |
211 | bool handlePasteGlobalSelection(const PlatformMouseEvent&); |
212 | |
213 | void platformPrepareForWheelEvents(const PlatformWheelEvent&, const HitTestResult&, RefPtr<Element>& eventTarget, RefPtr<ContainerNode>& scrollableContainer, WeakPtr<ScrollableArea>&, bool& isOverWidget); |
214 | void platformRecordWheelEvent(const PlatformWheelEvent&); |
215 | bool platformCompleteWheelEvent(const PlatformWheelEvent&, ContainerNode* scrollableContainer, const WeakPtr<ScrollableArea>&); |
216 | bool platformCompletePlatformWidgetWheelEvent(const PlatformWheelEvent&, const Widget&, ContainerNode* scrollableContainer); |
217 | void platformNotifyIfEndGesture(const PlatformWheelEvent&, const WeakPtr<ScrollableArea>&); |
218 | |
219 | #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS) |
220 | using TouchArray = Vector<RefPtr<Touch>>; |
221 | using EventTargetTouchMap = HashMap<EventTarget*, TouchArray*>; |
222 | #endif |
223 | |
224 | #if ENABLE(IOS_TOUCH_EVENTS) || ENABLE(IOS_GESTURE_EVENTS) || ENABLE(MAC_GESTURE_EVENTS) |
225 | using EventTargetSet = HashSet<RefPtr<EventTarget>>; |
226 | #endif |
227 | |
228 | #if ENABLE(IOS_TOUCH_EVENTS) |
229 | bool dispatchTouchEvent(const PlatformTouchEvent&, const AtomicString&, const EventTargetTouchMap&, float, float); |
230 | bool dispatchSimulatedTouchEvent(IntPoint location); |
231 | Frame* touchEventTargetSubframe() const { return m_touchEventTargetSubframe.get(); } |
232 | const TouchArray& touches() const { return m_touches; } |
233 | #endif |
234 | |
235 | #if ENABLE(IOS_GESTURE_EVENTS) |
236 | bool dispatchGestureEvent(const PlatformTouchEvent&, const AtomicString&, const EventTargetSet&, float, float); |
237 | #elif ENABLE(MAC_GESTURE_EVENTS) |
238 | bool dispatchGestureEvent(const PlatformGestureEvent&, const AtomicString&, const EventTargetSet&, float, float); |
239 | WEBCORE_EXPORT bool handleGestureEvent(const PlatformGestureEvent&); |
240 | #endif |
241 | |
242 | #if PLATFORM(IOS_FAMILY) |
243 | void defaultTouchEventHandler(Node&, TouchEvent&); |
244 | WEBCORE_EXPORT void dispatchSyntheticMouseOut(const PlatformMouseEvent&); |
245 | WEBCORE_EXPORT void dispatchSyntheticMouseMove(const PlatformMouseEvent&); |
246 | #endif |
247 | |
248 | #if ENABLE(CONTEXT_MENUS) |
249 | WEBCORE_EXPORT bool sendContextMenuEvent(const PlatformMouseEvent&); |
250 | WEBCORE_EXPORT bool sendContextMenuEventForKey(); |
251 | #endif |
252 | |
253 | void setMouseDownMayStartAutoscroll() { m_mouseDownMayStartAutoscroll = true; } |
254 | |
255 | bool needsKeyboardEventDisambiguationQuirks() const; |
256 | |
257 | WEBCORE_EXPORT static OptionSet<PlatformEvent::Modifier> accessKeyModifiers(); |
258 | WEBCORE_EXPORT bool handleAccessKey(const PlatformKeyboardEvent&); |
259 | WEBCORE_EXPORT bool keyEvent(const PlatformKeyboardEvent&); |
260 | void defaultKeyboardEventHandler(KeyboardEvent&); |
261 | WEBCORE_EXPORT void capsLockStateMayHaveChanged() const; |
262 | |
263 | bool accessibilityPreventsEventPropagation(KeyboardEvent&); |
264 | WEBCORE_EXPORT void handleKeyboardSelectionMovementForAccessibility(KeyboardEvent&); |
265 | |
266 | bool handleTextInputEvent(const String& text, Event* underlyingEvent = nullptr, TextEventInputType = TextEventInputKeyboard); |
267 | void defaultTextInputEventHandler(TextEvent&); |
268 | |
269 | #if ENABLE(DRAG_SUPPORT) |
270 | WEBCORE_EXPORT bool eventMayStartDrag(const PlatformMouseEvent&) const; |
271 | |
272 | WEBCORE_EXPORT void didStartDrag(); |
273 | WEBCORE_EXPORT void dragCancelled(); |
274 | WEBCORE_EXPORT void dragSourceEndedAt(const PlatformMouseEvent&, DragOperation, MayExtendDragSession = MayExtendDragSession::No); |
275 | #endif |
276 | |
277 | void focusDocumentView(); |
278 | |
279 | WEBCORE_EXPORT void sendScrollEvent(); |
280 | |
281 | #if PLATFORM(MAC) |
282 | WEBCORE_EXPORT void mouseDown(NSEvent *, NSEvent *correspondingPressureEvent); |
283 | WEBCORE_EXPORT void mouseDragged(NSEvent *, NSEvent *correspondingPressureEvent); |
284 | WEBCORE_EXPORT void mouseUp(NSEvent *, NSEvent *correspondingPressureEvent); |
285 | WEBCORE_EXPORT void mouseMoved(NSEvent *, NSEvent *correspondingPressureEvent); |
286 | WEBCORE_EXPORT void pressureChange(NSEvent *, NSEvent* correspondingPressureEvent); |
287 | WEBCORE_EXPORT bool keyEvent(NSEvent *); |
288 | WEBCORE_EXPORT bool wheelEvent(NSEvent *); |
289 | #endif |
290 | |
291 | #if PLATFORM(IOS_FAMILY) |
292 | WEBCORE_EXPORT void mouseDown(WebEvent *); |
293 | WEBCORE_EXPORT void mouseUp(WebEvent *); |
294 | WEBCORE_EXPORT void mouseMoved(WebEvent *); |
295 | WEBCORE_EXPORT bool keyEvent(WebEvent *); |
296 | WEBCORE_EXPORT bool wheelEvent(WebEvent *); |
297 | #endif |
298 | |
299 | #if ENABLE(IOS_TOUCH_EVENTS) |
300 | WEBCORE_EXPORT void touchEvent(WebEvent *); |
301 | #endif |
302 | |
303 | #if PLATFORM(MAC) |
304 | WEBCORE_EXPORT void passMouseMovedEventToScrollbars(NSEvent *, NSEvent* correspondingPressureEvent); |
305 | |
306 | WEBCORE_EXPORT void sendFakeEventsAfterWidgetTracking(NSEvent *initiatingEvent); |
307 | |
308 | void setActivationEventNumber(int num) { m_activationEventNumber = num; } |
309 | |
310 | WEBCORE_EXPORT static NSEvent *currentNSEvent(); |
311 | static NSEvent *correspondingPressureEvent(); |
312 | #endif |
313 | |
314 | #if PLATFORM(IOS_FAMILY) |
315 | static WebEvent *currentEvent(); |
316 | |
317 | void invalidateClick(); |
318 | #endif |
319 | |
320 | #if ENABLE(TOUCH_EVENTS) |
321 | WEBCORE_EXPORT bool handleTouchEvent(const PlatformTouchEvent&); |
322 | #endif |
323 | |
324 | bool useHandCursor(Node*, bool isOverLink, bool shiftKey); |
325 | void updateCursor(); |
326 | |
327 | bool isHandlingWheelEvent() const { return m_isHandlingWheelEvent; } |
328 | |
329 | WEBCORE_EXPORT void setImmediateActionStage(ImmediateActionStage stage); |
330 | ImmediateActionStage immediateActionStage() const { return m_immediateActionStage; } |
331 | |
332 | static Widget* widgetForEventTarget(Element* eventTarget); |
333 | |
334 | #if PLATFORM(IOS_FAMILY) && ENABLE(DRAG_SUPPORT) |
335 | WEBCORE_EXPORT bool tryToBeginDragAtPoint(const IntPoint& clientPosition, const IntPoint& globalPosition); |
336 | #endif |
337 | |
338 | #if PLATFORM(IOS_FAMILY) |
339 | WEBCORE_EXPORT void startSelectionAutoscroll(RenderObject* renderer, const FloatPoint& positionInWindow); |
340 | WEBCORE_EXPORT void cancelSelectionAutoscroll(); |
341 | IntPoint m_targetAutoscrollPositionInWindow; |
342 | bool m_isAutoscrolling { false }; |
343 | #endif |
344 | |
345 | private: |
346 | #if ENABLE(DRAG_SUPPORT) |
347 | static DragState& dragState(); |
348 | static const Seconds TextDragDelay; |
349 | #endif |
350 | |
351 | bool eventActivatedView(const PlatformMouseEvent&) const; |
352 | bool updateSelectionForMouseDownDispatchingSelectStart(Node*, const VisibleSelection&, TextGranularity); |
353 | void selectClosestWordFromHitTestResult(const HitTestResult&, AppendTrailingWhitespace); |
354 | VisibleSelection selectClosestWordFromHitTestResultBasedOnLookup(const HitTestResult&); |
355 | void selectClosestWordFromMouseEvent(const MouseEventWithHitTestResults&); |
356 | void selectClosestContextualWordFromMouseEvent(const MouseEventWithHitTestResults&); |
357 | void selectClosestContextualWordOrLinkFromMouseEvent(const MouseEventWithHitTestResults&); |
358 | |
359 | bool handleMouseDoubleClickEvent(const PlatformMouseEvent&); |
360 | |
361 | WEBCORE_EXPORT bool handleMousePressEvent(const MouseEventWithHitTestResults&); |
362 | bool handleMousePressEventSingleClick(const MouseEventWithHitTestResults&); |
363 | bool handleMousePressEventDoubleClick(const MouseEventWithHitTestResults&); |
364 | bool handleMousePressEventTripleClick(const MouseEventWithHitTestResults&); |
365 | |
366 | #if ENABLE(DRAG_SUPPORT) |
367 | bool handleMouseDraggedEvent(const MouseEventWithHitTestResults&, CheckDragHysteresis = ShouldCheckDragHysteresis); |
368 | bool shouldAllowMouseDownToStartDrag() const; |
369 | #endif |
370 | |
371 | WEBCORE_EXPORT bool handleMouseReleaseEvent(const MouseEventWithHitTestResults&); |
372 | |
373 | bool internalKeyEvent(const PlatformKeyboardEvent&); |
374 | |
375 | Optional<Cursor> selectCursor(const HitTestResult&, bool shiftKey); |
376 | void updateCursor(FrameView&, const HitTestResult&, bool shiftKey); |
377 | |
378 | void hoverTimerFired(); |
379 | |
380 | #if ENABLE(CURSOR_SUPPORT) |
381 | void cursorUpdateTimerFired(); |
382 | #endif |
383 | |
384 | bool logicalScrollOverflow(ScrollLogicalDirection, ScrollGranularity, Node* startingNode = nullptr); |
385 | |
386 | bool shouldSwapScrollDirection(const HitTestResult&, const PlatformWheelEvent&) const; |
387 | |
388 | bool mouseDownMayStartSelect() const { return m_mouseDownMayStartSelect; } |
389 | |
390 | static bool isKeyboardOptionTab(KeyboardEvent&); |
391 | static bool eventInvertsTabsToLinksClientCallResult(KeyboardEvent&); |
392 | |
393 | #if !ENABLE(IOS_TOUCH_EVENTS) |
394 | void fakeMouseMoveEventTimerFired(); |
395 | void cancelFakeMouseMoveEvent(); |
396 | #endif |
397 | |
398 | bool isInsideScrollbar(const IntPoint&) const; |
399 | |
400 | #if ENABLE(TOUCH_EVENTS) |
401 | bool dispatchSyntheticTouchEventIfEnabled(const PlatformMouseEvent&); |
402 | #endif |
403 | |
404 | #if !PLATFORM(IOS_FAMILY) |
405 | void invalidateClick(); |
406 | #endif |
407 | |
408 | Node* nodeUnderMouse() const; |
409 | |
410 | enum class FireMouseOverOut { No, Yes }; |
411 | void updateMouseEventTargetNode(Node*, const PlatformMouseEvent&, FireMouseOverOut); |
412 | |
413 | MouseEventWithHitTestResults prepareMouseEvent(const HitTestRequest&, const PlatformMouseEvent&); |
414 | |
415 | bool dispatchMouseEvent(const AtomicString& eventType, Node* target, bool cancelable, int clickCount, const PlatformMouseEvent&, bool setUnder); |
416 | |
417 | #if ENABLE(DRAG_SUPPORT) |
418 | bool dispatchDragEvent(const AtomicString& eventType, Element& target, const PlatformMouseEvent&, DataTransfer&); |
419 | DragTargetResponse dispatchDragEnterOrDragOverEvent(const AtomicString& eventType, Element& target, const PlatformMouseEvent&, std::unique_ptr<Pasteboard>&& , DragOperation, bool draggingFiles); |
420 | void invalidateDataTransfer(); |
421 | |
422 | bool handleDrag(const MouseEventWithHitTestResults&, CheckDragHysteresis); |
423 | #endif |
424 | |
425 | bool handleMouseUp(const MouseEventWithHitTestResults&); |
426 | |
427 | #if ENABLE(DRAG_SUPPORT) |
428 | void clearDragState(); |
429 | |
430 | void dispatchDragSrcEvent(const AtomicString& eventType, const PlatformMouseEvent&); |
431 | bool dispatchDragStartEventOnSourceElement(DataTransfer&); |
432 | |
433 | bool dragHysteresisExceeded(const FloatPoint&) const; |
434 | bool dragHysteresisExceeded(const IntPoint&) const; |
435 | #endif |
436 | |
437 | bool mouseMovementExceedsThreshold(const FloatPoint&, int pointsThreshold) const; |
438 | |
439 | bool passMousePressEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe); |
440 | bool passMouseMoveEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = nullptr); |
441 | bool passMouseReleaseEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe); |
442 | |
443 | bool passSubframeEventToSubframe(MouseEventWithHitTestResults&, Frame* subframe, HitTestResult* hoveredNode = nullptr); |
444 | |
445 | bool passMousePressEventToScrollbar(MouseEventWithHitTestResults&, Scrollbar*); |
446 | |
447 | bool passWidgetMouseDownEventToWidget(const MouseEventWithHitTestResults&); |
448 | bool passWidgetMouseDownEventToWidget(RenderWidget*); |
449 | |
450 | bool passMouseDownEventToWidget(Widget*); |
451 | bool widgetDidHandleWheelEvent(const PlatformWheelEvent&, Widget&); |
452 | bool completeWidgetWheelEvent(const PlatformWheelEvent&, const WeakPtr<Widget>&, const WeakPtr<ScrollableArea>&, ContainerNode*); |
453 | |
454 | void defaultSpaceEventHandler(KeyboardEvent&); |
455 | void defaultBackspaceEventHandler(KeyboardEvent&); |
456 | void defaultTabEventHandler(KeyboardEvent&); |
457 | void defaultArrowEventHandler(FocusDirection, KeyboardEvent&); |
458 | |
459 | #if ENABLE(DRAG_SUPPORT) |
460 | DragSourceAction updateDragSourceActionsAllowed() const; |
461 | bool supportsSelectionUpdatesOnMouseDrag() const; |
462 | #endif |
463 | |
464 | // The following are called at the beginning of handleMouseUp and handleDrag. |
465 | // If they return true it indicates that they have consumed the event. |
466 | bool eventLoopHandleMouseUp(const MouseEventWithHitTestResults&); |
467 | |
468 | #if ENABLE(DRAG_SUPPORT) |
469 | bool eventLoopHandleMouseDragged(const MouseEventWithHitTestResults&); |
470 | void updateSelectionForMouseDrag(const HitTestResult&); |
471 | #endif |
472 | |
473 | enum class SetOrClearLastScrollbar { Clear, Set }; |
474 | void updateLastScrollbarUnderMouse(Scrollbar*, SetOrClearLastScrollbar); |
475 | |
476 | void setFrameWasScrolledByUser(); |
477 | |
478 | bool capturesDragging() const { return m_capturesDragging; } |
479 | |
480 | #if PLATFORM(COCOA) && defined(__OBJC__) |
481 | NSView *mouseDownViewIfStillGood(); |
482 | |
483 | PlatformMouseEvent currentPlatformMouseEvent() const; |
484 | #endif |
485 | |
486 | #if ENABLE(FULLSCREEN_API) |
487 | bool isKeyEventAllowedInFullScreen(const PlatformKeyboardEvent&) const; |
488 | #endif |
489 | |
490 | void setLastKnownMousePosition(const PlatformMouseEvent&); |
491 | |
492 | #if ENABLE(CURSOR_VISIBILITY) |
493 | void startAutoHideCursorTimer(); |
494 | void cancelAutoHideCursorTimer(); |
495 | void autoHideCursorTimerFired(); |
496 | #endif |
497 | |
498 | void clearOrScheduleClearingLatchedStateIfNeeded(const PlatformWheelEvent&); |
499 | void clearLatchedState(); |
500 | |
501 | bool shouldSendMouseEventsToInactiveWindows() const; |
502 | |
503 | Frame& m_frame; |
504 | |
505 | bool m_mousePressed { false }; |
506 | bool m_capturesDragging { false }; |
507 | RefPtr<Node> m_mousePressNode; |
508 | |
509 | bool m_mouseDownMayStartSelect { false }; |
510 | |
511 | #if ENABLE(DRAG_SUPPORT) |
512 | bool m_mouseDownMayStartDrag { false }; |
513 | bool m_dragMayStartSelectionInstead { false }; |
514 | #endif |
515 | |
516 | bool m_mouseDownWasSingleClickInSelection { false }; |
517 | enum SelectionInitiationState { HaveNotStartedSelection, PlacedCaret, ExtendedSelection }; |
518 | SelectionInitiationState m_selectionInitiationState { HaveNotStartedSelection }; |
519 | |
520 | #if ENABLE(DRAG_SUPPORT) |
521 | LayoutPoint m_dragStartPosition; |
522 | #endif |
523 | |
524 | Timer m_hoverTimer; |
525 | |
526 | #if ENABLE(CURSOR_SUPPORT) |
527 | Timer m_cursorUpdateTimer; |
528 | #endif |
529 | |
530 | #if PLATFORM(MAC) |
531 | Timer m_pendingMomentumWheelEventsTimer; |
532 | #endif |
533 | |
534 | std::unique_ptr<AutoscrollController> m_autoscrollController; |
535 | bool m_mouseDownMayStartAutoscroll { false }; |
536 | bool m_mouseDownWasInSubframe { false }; |
537 | |
538 | #if !ENABLE(IOS_TOUCH_EVENTS) |
539 | Timer m_fakeMouseMoveEventTimer; |
540 | #endif |
541 | |
542 | bool m_svgPan { false }; |
543 | |
544 | RenderLayer* m_resizeLayer { nullptr }; |
545 | |
546 | RefPtr<Element> m_capturingMouseEventsElement; |
547 | bool m_eventHandlerWillResetCapturingMouseEventsElement { false }; |
548 | |
549 | RefPtr<Element> m_elementUnderMouse; |
550 | RefPtr<Element> m_lastElementUnderMouse; |
551 | RefPtr<Frame> m_lastMouseMoveEventSubframe; |
552 | WeakPtr<Scrollbar> m_lastScrollbarUnderMouse; |
553 | Cursor m_currentMouseCursor; |
554 | |
555 | int m_clickCount { 0 }; |
556 | RefPtr<Node> m_clickNode; |
557 | |
558 | #if ENABLE(IOS_GESTURE_EVENTS) |
559 | float m_gestureInitialDiameter { GestureUnknown }; |
560 | float m_gestureInitialRotation { GestureUnknown }; |
561 | #endif |
562 | |
563 | #if ENABLE(IOS_GESTURE_EVENTS) || ENABLE(MAC_GESTURE_EVENTS) |
564 | float m_gestureLastDiameter { GestureUnknown }; |
565 | float m_gestureLastRotation { GestureUnknown }; |
566 | EventTargetSet m_gestureTargets; |
567 | #endif |
568 | |
569 | #if ENABLE(MAC_GESTURE_EVENTS) |
570 | bool m_hasActiveGesture { false }; |
571 | #endif |
572 | |
573 | #if ENABLE(IOS_TOUCH_EVENTS) |
574 | unsigned m_firstTouchID { InvalidTouchIdentifier }; |
575 | |
576 | TouchArray m_touches; |
577 | RefPtr<Frame> m_touchEventTargetSubframe; |
578 | #endif |
579 | |
580 | #if ENABLE(DRAG_SUPPORT) |
581 | RefPtr<Element> m_dragTarget; |
582 | bool m_shouldOnlyFireDragOverEvent { false }; |
583 | #endif |
584 | |
585 | RefPtr<HTMLFrameSetElement> m_frameSetBeingResized; |
586 | |
587 | LayoutSize m_offsetFromResizeCorner; // In the coords of m_resizeLayer. |
588 | |
589 | bool m_mousePositionIsUnknown { true }; |
590 | IntPoint m_lastKnownMousePosition; |
591 | IntPoint m_lastKnownMouseGlobalPosition; |
592 | IntPoint m_mouseDownPos; // In our view's coords. |
593 | WallTime m_mouseDownTimestamp; |
594 | PlatformMouseEvent m_mouseDown; |
595 | |
596 | #if PLATFORM(COCOA) |
597 | NSView *m_mouseDownView { nullptr }; |
598 | bool m_sendingEventToSubview { false }; |
599 | #endif |
600 | |
601 | #if PLATFORM(MAC) |
602 | int m_activationEventNumber { -1 }; |
603 | #endif |
604 | |
605 | #if ENABLE(TOUCH_EVENTS) && !ENABLE(IOS_TOUCH_EVENTS) |
606 | using TouchTargetMap = HashMap<int, RefPtr<EventTarget>>; |
607 | TouchTargetMap m_originatingTouchPointTargets; |
608 | RefPtr<Document> m_originatingTouchPointDocument; |
609 | unsigned m_originatingTouchPointTargetKey { 0 }; |
610 | bool m_touchPressed { false }; |
611 | #endif |
612 | |
613 | #if ENABLE(IOS_TOUCH_EVENTS) |
614 | unsigned touchIdentifierForMouseEvents { 0 }; |
615 | #endif |
616 | |
617 | double m_maxMouseMovedDuration { 0 }; |
618 | bool m_didStartDrag { false }; |
619 | bool m_isHandlingWheelEvent { false }; |
620 | |
621 | #if PLATFORM(IOS_FAMILY) |
622 | bool m_shouldAllowMouseDownToStartDrag { false }; |
623 | #endif |
624 | |
625 | #if ENABLE(CURSOR_VISIBILITY) |
626 | Timer m_autoHideCursorTimer; |
627 | #endif |
628 | |
629 | ImmediateActionStage m_immediateActionStage { ImmediateActionStage::None }; |
630 | }; |
631 | |
632 | } // namespace WebCore |
633 | |