Index: Source/core/page/EventHandler.cpp |
diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp |
index 3d1279c3b704166d04a0ca9dd72322472a2267e8..0d2af190fdadcaf713ea859b70be696606655e3a 100644 |
--- a/Source/core/page/EventHandler.cpp |
+++ b/Source/core/page/EventHandler.cpp |
@@ -140,6 +140,8 @@ static const double TextDragDelay = 0.0; |
enum NoCursorChangeType { NoCursorChange }; |
+enum class DragInitiator { Mouse, Touch }; |
+ |
class OptionalCursor { |
public: |
OptionalCursor(NoCursorChangeType) : m_isCursorChange(false) { } |
@@ -221,7 +223,6 @@ EventHandler::EventHandler(LocalFrame* frame) |
, m_scrollGestureHandlingNode(nullptr) |
, m_lastGestureScrollOverWidget(false) |
, m_maxMouseMovedDuration(0) |
- , m_didStartDrag(false) |
, m_longTapShouldInvokeContextMenu(false) |
, m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) |
, m_lastShowPressTimestamp(0) |
@@ -296,7 +297,6 @@ void EventHandler::clear() |
m_previousGestureScrolledNode = nullptr; |
m_scrollbarHandlingScrollGesture = nullptr; |
m_maxMouseMovedDuration = 0; |
- m_didStartDrag = false; |
m_touchPressed = false; |
m_mouseDownMayStartSelect = false; |
m_mouseDownMayStartDrag = false; |
@@ -653,7 +653,7 @@ bool EventHandler::handleMouseDraggedEvent(const MouseEventWithHitTestResults& e |
if (!m_mousePressed) |
return false; |
- if (handleDrag(event, ShouldCheckDragHysteresis)) |
+ if (handleDrag(event, DragInitiator::Mouse)) |
return true; |
Node* targetNode = event.innerNode(); |
@@ -2314,13 +2314,11 @@ bool EventHandler::handleGestureLongPress(const GestureEventWithHitTestResults& |
gestureEvent.shiftKey(), gestureEvent.ctrlKey(), gestureEvent.altKey(), gestureEvent.metaKey(), PlatformMouseEvent::FromTouch, WTF::currentTime()); |
HitTestRequest request(HitTestRequest::ReadOnly); |
MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragEvent); |
- m_didStartDrag = false; |
m_mouseDownMayStartDrag = true; |
dragState().m_dragSrc = nullptr; |
m_mouseDownPos = m_frame->view()->windowToContents(mouseDragEvent.position()); |
RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
- handleDrag(mev, DontCheckDragHysteresis); |
- if (m_didStartDrag) { |
+ if (handleDrag(mev, DragInitiator::Touch)) { |
m_longTapShouldInvokeContextMenu = true; |
return true; |
} |
@@ -3201,7 +3199,7 @@ bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const Pla |
return !dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, dragState().m_dragDataTransfer.get()); |
} |
-bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDragHysteresis checkDragHysteresis) |
+bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, DragInitiator initiator) |
{ |
ASSERT(event.event().type() == PlatformEvent::MouseMoved); |
// Callers must protect the reference to FrameView, since this function may dispatch DOM |
@@ -3211,6 +3209,7 @@ bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDr |
if (!m_frame->page()) |
return false; |
+ // FIXME: Does this ever get hit?? |
if (event.event().button() != LeftButton || event.event().type() != PlatformEvent::MouseMoved) { |
// If we allowed the other side of the bridge to handle a drag |
// last time, then m_mousePressed might still be set. So we |
@@ -3239,13 +3238,13 @@ bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDr |
} |
if (!m_mouseDownMayStartDrag) |
- return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll; |
+ return initiator == DragInitiator::Mouse && !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll; |
// We are starting a text/image/url drag, so the cursor should be an arrow |
// FIXME <rdar://7577595>: Custom cursors aren't supported during drag and drop (default to pointer). |
m_frame->view()->setCursor(pointerCursor()); |
- if (checkDragHysteresis == ShouldCheckDragHysteresis && !dragHysteresisExceeded(event.event().position())) |
+ if (initiator == DragInitiator::Mouse && !dragHysteresisExceeded(event.event().position())) |
return true; |
// Once we're past the hysteresis point, we don't want to treat this gesture as a click |
@@ -3303,11 +3302,7 @@ bool EventHandler::tryStartDrag(const MouseEventWithHitTestResults& event) |
if (m_mouseDownMayStartDrag) { |
// Dispatching the event could cause Page to go away. Make sure it's still valid before trying to use DragController. |
- m_didStartDrag = m_frame->page() && dragController.startDrag(m_frame, dragState(), event.event(), m_mouseDownPos); |
- // FIXME: This seems pretty useless now. The gesture code uses this as a signal for |
- // whether or not the drag started, but perhaps it can simply use the return value from |
- // handleDrag(), even though it doesn't mean exactly the same thing. |
- if (m_didStartDrag) |
+ if (m_frame->page() && dragController.startDrag(m_frame, dragState(), event.event(), m_mouseDownPos)) |
return true; |
// Drag was canned at the last minute - we owe m_dragSrc a DRAGEND event |
dispatchDragSrcEvent(EventTypeNames::dragend, event.event()); |