OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "core/input/MouseEventManager.h" | 5 #include "core/input/MouseEventManager.h" |
6 | 6 |
7 #include "core/clipboard/DataObject.h" | 7 #include "core/clipboard/DataObject.h" |
8 #include "core/clipboard/DataTransfer.h" | 8 #include "core/clipboard/DataTransfer.h" |
9 #include "core/dom/Element.h" | 9 #include "core/dom/Element.h" |
10 #include "core/dom/ElementTraversal.h" | 10 #include "core/dom/ElementTraversal.h" |
(...skipping 538 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
549 if (!quad.containsPoint(view->rootFrameToContents(m_lastKnownMousePosition))) | 549 if (!quad.containsPoint(view->rootFrameToContents(m_lastKnownMousePosition))) |
550 return; | 550 return; |
551 | 551 |
552 dispatchFakeMouseMoveEventSoon(); | 552 dispatchFakeMouseMoveEventSoon(); |
553 } | 553 } |
554 | 554 |
555 WebInputEventResult MouseEventManager::handleMousePressEvent( | 555 WebInputEventResult MouseEventManager::handleMousePressEvent( |
556 const MouseEventWithHitTestResults& event) { | 556 const MouseEventWithHitTestResults& event) { |
557 TRACE_EVENT0("blink", "MouseEventManager::handleMousePressEvent"); | 557 TRACE_EVENT0("blink", "MouseEventManager::handleMousePressEvent"); |
558 | 558 |
559 // Reset drag state. | 559 resetDragState(); |
560 dragState().m_dragSrc = nullptr; | |
561 | |
562 cancelFakeMouseMoveEvent(); | 560 cancelFakeMouseMoveEvent(); |
563 | 561 |
564 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); | 562 m_frame->document()->updateStyleAndLayoutIgnorePendingStylesheets(); |
565 | 563 |
566 if (FrameView* frameView = m_frame->view()) { | 564 if (FrameView* frameView = m_frame->view()) { |
567 if (frameView->isPointInScrollbarCorner( | 565 if (frameView->isPointInScrollbarCorner( |
568 flooredIntPoint(event.event().positionInRootFrame()))) | 566 flooredIntPoint(event.event().positionInRootFrame()))) |
569 return WebInputEventResult::NotHandled; | 567 return WebInputEventResult::NotHandled; |
570 } | 568 } |
571 | 569 |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
665 WebInputEvent::MouseMove, gestureEvent, | 663 WebInputEvent::MouseMove, gestureEvent, |
666 WebPointerProperties::Button::Left, 1, | 664 WebPointerProperties::Button::Left, 1, |
667 modifiers | WebInputEvent::Modifiers::LeftButtonDown | | 665 modifiers | WebInputEvent::Modifiers::LeftButtonDown | |
668 WebInputEvent::Modifiers::IsCompatibilityEventForTouch, | 666 WebInputEvent::Modifiers::IsCompatibilityEventForTouch, |
669 TimeTicks::Now().InSeconds()); | 667 TimeTicks::Now().InSeconds()); |
670 HitTestRequest request(HitTestRequest::ReadOnly); | 668 HitTestRequest request(HitTestRequest::ReadOnly); |
671 MouseEventWithHitTestResults mev = | 669 MouseEventWithHitTestResults mev = |
672 EventHandlingUtil::performMouseEventHitTest(m_frame, request, | 670 EventHandlingUtil::performMouseEventHitTest(m_frame, request, |
673 mouseDragEvent); | 671 mouseDragEvent); |
674 m_mouseDownMayStartDrag = true; | 672 m_mouseDownMayStartDrag = true; |
675 dragState().m_dragSrc = nullptr; | 673 resetDragState(); |
676 m_mouseDownPos = m_frame->view()->rootFrameToContents( | 674 m_mouseDownPos = m_frame->view()->rootFrameToContents( |
677 flooredIntPoint(mouseDragEvent.positionInRootFrame())); | 675 flooredIntPoint(mouseDragEvent.positionInRootFrame())); |
678 return handleDrag(mev, DragInitiator::Touch); | 676 return handleDrag(mev, DragInitiator::Touch); |
679 } | 677 } |
680 return false; | 678 return false; |
681 } | 679 } |
682 | 680 |
683 void MouseEventManager::focusDocumentView() { | 681 void MouseEventManager::focusDocumentView() { |
684 Page* page = m_frame->page(); | 682 Page* page = m_frame->page(); |
685 if (!page) | 683 if (!page) |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
771 DragController::SelectionDragPolicy selectionDragPolicy = | 769 DragController::SelectionDragPolicy selectionDragPolicy = |
772 TimeTicks::FromSeconds(event.event().timeStampSeconds()) - | 770 TimeTicks::FromSeconds(event.event().timeStampSeconds()) - |
773 m_mouseDownTimestamp < | 771 m_mouseDownTimestamp < |
774 kTextDragDelay | 772 kTextDragDelay |
775 ? DragController::DelayedSelectionDragResolution | 773 ? DragController::DelayedSelectionDragResolution |
776 : DragController::ImmediateSelectionDragResolution; | 774 : DragController::ImmediateSelectionDragResolution; |
777 dragState().m_dragSrc = m_frame->page()->dragController().draggableNode( | 775 dragState().m_dragSrc = m_frame->page()->dragController().draggableNode( |
778 m_frame, node, m_mouseDownPos, selectionDragPolicy, | 776 m_frame, node, m_mouseDownPos, selectionDragPolicy, |
779 dragState().m_dragType); | 777 dragState().m_dragType); |
780 } else { | 778 } else { |
781 dragState().m_dragSrc = nullptr; | 779 resetDragState(); |
782 } | 780 } |
783 | 781 |
784 if (!dragState().m_dragSrc) | 782 if (!dragState().m_dragSrc) |
785 m_mouseDownMayStartDrag = false; // no element is draggable | 783 m_mouseDownMayStartDrag = false; // no element is draggable |
786 } | 784 } |
787 | 785 |
788 if (!m_mouseDownMayStartDrag) { | 786 if (!m_mouseDownMayStartDrag) { |
789 return initiator == DragInitiator::Mouse && | 787 return initiator == DragInitiator::Mouse && |
790 !m_frame->eventHandler() | 788 !m_frame->eventHandler() |
791 .selectionController() | 789 .selectionController() |
792 .mouseDownMayStartSelect() && | 790 .mouseDownMayStartSelect() && |
793 !m_mouseDownMayStartAutoscroll; | 791 !m_mouseDownMayStartAutoscroll; |
794 } | 792 } |
795 | 793 |
796 // We are starting a text/image/url drag, so the cursor should be an arrow | 794 // We are starting a text/image/url drag, so the cursor should be an arrow |
797 // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and | 795 // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and |
798 // drop (default to pointer). | 796 // drop (default to pointer). |
799 m_frame->view()->setCursor(pointerCursor()); | 797 m_frame->view()->setCursor(pointerCursor()); |
800 | 798 |
801 if (initiator == DragInitiator::Mouse && | 799 if (initiator == DragInitiator::Mouse && |
802 !dragThresholdExceeded( | 800 !dragThresholdExceeded( |
803 flooredIntPoint(event.event().positionInRootFrame()))) { | 801 flooredIntPoint(event.event().positionInRootFrame()))) { |
804 dragState().m_dragSrc = nullptr; | 802 resetDragState(); |
805 return true; | 803 return true; |
806 } | 804 } |
807 | 805 |
808 // Once we're past the drag threshold, we don't want to treat this gesture as | 806 // Once we're past the drag threshold, we don't want to treat this gesture as |
809 // a click. | 807 // a click. |
810 invalidateClick(); | 808 invalidateClick(); |
811 | 809 |
812 if (!tryStartDrag(event)) { | 810 if (!tryStartDrag(event)) { |
813 // Something failed to start the drag, clean up. | 811 // Something failed to start the drag, clean up. |
814 clearDragDataTransfer(); | 812 clearDragDataTransfer(); |
815 dragState().m_dragSrc = nullptr; | 813 resetDragState(); |
816 } | 814 } |
817 | 815 |
818 m_mouseDownMayStartDrag = false; | 816 m_mouseDownMayStartDrag = false; |
819 // Whether or not the drag actually started, no more default handling (like | 817 // Whether or not the drag actually started, no more default handling (like |
820 // selection). | 818 // selection). |
821 return true; | 819 return true; |
822 } | 820 } |
823 | 821 |
824 DataTransfer* MouseEventManager::createDraggingDataTransfer() const { | 822 DataTransfer* MouseEventManager::createDraggingDataTransfer() const { |
825 return DataTransfer::create(DataTransfer::DragAndDrop, DataTransferWritable, | 823 return DataTransfer::create(DataTransfer::DragAndDrop, DataTransferWritable, |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
915 } | 913 } |
916 | 914 |
917 void MouseEventManager::dragSourceEndedAt(const WebMouseEvent& event, | 915 void MouseEventManager::dragSourceEndedAt(const WebMouseEvent& event, |
918 DragOperation operation) { | 916 DragOperation operation) { |
919 if (dragState().m_dragSrc) { | 917 if (dragState().m_dragSrc) { |
920 dragState().m_dragDataTransfer->setDestinationOperation(operation); | 918 dragState().m_dragDataTransfer->setDestinationOperation(operation); |
921 // The return value is ignored because dragend is not cancelable. | 919 // The return value is ignored because dragend is not cancelable. |
922 dispatchDragSrcEvent(EventTypeNames::dragend, event); | 920 dispatchDragSrcEvent(EventTypeNames::dragend, event); |
923 } | 921 } |
924 clearDragDataTransfer(); | 922 clearDragDataTransfer(); |
925 dragState().m_dragSrc = nullptr; | 923 resetDragState(); |
926 // In case the drag was ended due to an escape key press we need to ensure | 924 // In case the drag was ended due to an escape key press we need to ensure |
927 // that consecutive mousemove events don't reinitiate the drag and drop. | 925 // that consecutive mousemove events don't reinitiate the drag and drop. |
928 m_mouseDownMayStartDrag = false; | 926 m_mouseDownMayStartDrag = false; |
929 } | 927 } |
930 | 928 |
931 DragState& MouseEventManager::dragState() { | 929 DragState& MouseEventManager::dragState() { |
932 DEFINE_STATIC_LOCAL(DragState, state, (new DragState)); | 930 DCHECK(m_frame->page()); |
933 return state; | 931 return m_frame->page()->dragController().dragState(); |
| 932 } |
| 933 |
| 934 void MouseEventManager::resetDragState() { |
| 935 if (!m_frame->page()) |
| 936 return; |
| 937 dragState().m_dragSrc = nullptr; |
934 } | 938 } |
935 | 939 |
936 bool MouseEventManager::dragThresholdExceeded( | 940 bool MouseEventManager::dragThresholdExceeded( |
937 const IntPoint& dragLocationInRootFrame) const { | 941 const IntPoint& dragLocationInRootFrame) const { |
938 FrameView* view = m_frame->view(); | 942 FrameView* view = m_frame->view(); |
939 if (!view) | 943 if (!view) |
940 return false; | 944 return false; |
941 IntPoint dragLocation = view->rootFrameToContents(dragLocationInRootFrame); | 945 IntPoint dragLocation = view->rootFrameToContents(dragLocationInRootFrame); |
942 IntSize delta = dragLocation - m_mouseDownPos; | 946 IntSize delta = dragLocation - m_mouseDownPos; |
943 | 947 |
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1003 | 1007 |
1004 void MouseEventManager::setClickCount(int clickCount) { | 1008 void MouseEventManager::setClickCount(int clickCount) { |
1005 m_clickCount = clickCount; | 1009 m_clickCount = clickCount; |
1006 } | 1010 } |
1007 | 1011 |
1008 bool MouseEventManager::mouseDownMayStartDrag() { | 1012 bool MouseEventManager::mouseDownMayStartDrag() { |
1009 return m_mouseDownMayStartDrag; | 1013 return m_mouseDownMayStartDrag; |
1010 } | 1014 } |
1011 | 1015 |
1012 } // namespace blink | 1016 } // namespace blink |
OLD | NEW |