| Index: Source/core/page/EventHandler.cpp
|
| diff --git a/Source/core/page/EventHandler.cpp b/Source/core/page/EventHandler.cpp
|
| index 80061aaf046844733de894cbaf7e074fa4e5697c..ef1ac46ebbd3033c881868a6be7ae2c1f42cda99 100644
|
| --- a/Source/core/page/EventHandler.cpp
|
| +++ b/Source/core/page/EventHandler.cpp
|
| @@ -134,7 +134,6 @@ static const double TextDragDelay = 0.15;
|
| static const double TextDragDelay = 0.0;
|
| #endif
|
|
|
| -
|
| enum NoCursorChangeType { NoCursorChange };
|
|
|
| class OptionalCursor {
|
| @@ -284,7 +283,6 @@ EventHandler::EventHandler(Frame* frame)
|
| , m_capturesDragging(false)
|
| , m_mouseDownMayStartSelect(false)
|
| , m_mouseDownMayStartDrag(false)
|
| - , m_dragMayStartSelectionInstead(false)
|
| , m_mouseDownWasSingleClickInSelection(false)
|
| , m_selectionInitiationState(HaveNotStartedSelection)
|
| , m_panScrollButtonPressed(false)
|
| @@ -3214,13 +3212,9 @@ bool EventHandler::dispatchDragSrcEvent(const AtomicString& eventType, const Pla
|
| return !dispatchDragEvent(eventType, dragState().m_dragSrc.get(), event, dragState().m_dragClipboard.get());
|
| }
|
|
|
| -static bool exactlyOneBitSet(DragSourceAction n)
|
| -{
|
| - return n && !(n & (n - 1));
|
| -}
|
| -
|
| bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDragHysteresis checkDragHysteresis)
|
| {
|
| + ASSERT(event.event().type() == PlatformEvent::MouseMoved);
|
| // Callers must protect the reference to FrameView, since this function may dispatch DOM
|
| // events, causing page/FrameView to go away.
|
| ASSERT(m_frame);
|
| @@ -3237,58 +3231,27 @@ bool EventHandler::handleDrag(const MouseEventWithHitTestResults& event, CheckDr
|
| return false;
|
| }
|
|
|
| - if (m_mouseDownMayStartDrag && !dragState().m_dragSrc) {
|
| - // try to find an element that wants to be dragged
|
| - HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::ConfusingAndOftenMisusedDisallowShadowContent);
|
| + if (m_mouseDownMayStartDrag) {
|
| + HitTestRequest request(HitTestRequest::ReadOnly);
|
| HitTestResult result(m_mouseDownPos);
|
| m_frame->contentRenderer()->hitTest(request, result);
|
| Node* node = result.innerNode();
|
| - if (node)
|
| - dragState().m_dragSrc = m_frame->page()->dragController().draggableNode(m_frame, node, m_mouseDownPos, dragState());
|
| - else
|
| + if (node) {
|
| + DragController::SelectionDragPolicy selectionDragPolicy = event.event().timestamp() - m_mouseDownTimestamp < TextDragDelay
|
| + ? DragController::DelayedSelectionDragResolution
|
| + : DragController::ImmediateSelectionDragResolution;
|
| + dragState().m_dragSrc = m_frame->page()->dragController().draggableNode(m_frame, node, m_mouseDownPos, selectionDragPolicy, dragState().m_dragType);
|
| + } else {
|
| dragState().m_dragSrc = 0;
|
| + }
|
|
|
| if (!dragState().m_dragSrc)
|
| m_mouseDownMayStartDrag = false; // no element is draggable
|
| - else
|
| - m_dragMayStartSelectionInstead = (dragState().m_dragType & DragSourceActionSelection);
|
| - }
|
| -
|
| - // For drags starting in the selection, the user must wait between the mousedown and mousedrag,
|
| - // or else we bail on the dragging stuff and allow selection to occur
|
| - if (m_mouseDownMayStartDrag && m_dragMayStartSelectionInstead && (dragState().m_dragType & DragSourceActionSelection) && event.event().timestamp() - m_mouseDownTimestamp < TextDragDelay) {
|
| - ASSERT(event.event().type() == PlatformEvent::MouseMoved);
|
| - if ((dragState().m_dragType & DragSourceActionImage)) {
|
| - // ... unless the mouse is over an image, then we start dragging just the image
|
| - dragState().m_dragType = DragSourceActionImage;
|
| - } else if (!(dragState().m_dragType & (DragSourceActionDHTML | DragSourceActionLink))) {
|
| - // ... but only bail if we're not over an unselectable element.
|
| - m_mouseDownMayStartDrag = false;
|
| - dragState().m_dragSrc = 0;
|
| - } else {
|
| - // Prevent the following case from occuring:
|
| - // 1. User starts a drag immediately after mouse down over an unselectable element.
|
| - // 2. We enter this block and decided that since we're over an unselectable element,
|
| - // don't cancel the drag.
|
| - // 3. The drag gets resolved as a potential selection drag below /but/ we haven't
|
| - // exceeded the drag hysteresis yet.
|
| - // 4. We enter this block again, and since it's now marked as a selection drag, we
|
| - // cancel the drag.
|
| - m_dragMayStartSelectionInstead = false;
|
| - }
|
| }
|
|
|
| if (!m_mouseDownMayStartDrag)
|
| return !mouseDownMayStartSelect() && !m_mouseDownMayStartAutoscroll;
|
|
|
| - if (!exactlyOneBitSet(dragState().m_dragType)) {
|
| - ASSERT((dragState().m_dragType & DragSourceActionSelection));
|
| - ASSERT((dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionDHTML
|
| - || (dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionImage
|
| - || (dragState().m_dragType & ~DragSourceActionSelection) == DragSourceActionLink);
|
| - dragState().m_dragType = DragSourceActionSelection;
|
| - }
|
| -
|
| // 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());
|
|
|