| 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 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 String region = canvas->getIdFromControl(element); | 52 String region = canvas->getIdFromControl(element); |
| 53 PlatformMouseEvent newMouseEvent = mouseEvent; | 53 PlatformMouseEvent newMouseEvent = mouseEvent; |
| 54 newMouseEvent.setRegion(region); | 54 newMouseEvent.setRegion(region); |
| 55 return newMouseEvent; | 55 return newMouseEvent; |
| 56 } | 56 } |
| 57 | 57 |
| 58 // The amount of time to wait before sending a fake mouse event triggered | 58 // The amount of time to wait before sending a fake mouse event triggered |
| 59 // during a scroll. | 59 // during a scroll. |
| 60 const double kFakeMouseMoveInterval = 0.1; | 60 const double kFakeMouseMoveInterval = 0.1; |
| 61 | 61 |
| 62 // TODO(crbug.com/653490): Read these values from the OS. |
| 62 #if OS(MACOSX) | 63 #if OS(MACOSX) |
| 64 const int kDragThresholdX = 3; |
| 65 const int kDragThresholdY = 3; |
| 63 const double kTextDragDelay = 0.15; | 66 const double kTextDragDelay = 0.15; |
| 64 #else | 67 #else |
| 68 const int kDragThresholdX = 4; |
| 69 const int kDragThresholdY = 4; |
| 65 const double kTextDragDelay = 0.0; | 70 const double kTextDragDelay = 0.0; |
| 66 #endif | 71 #endif |
| 67 | 72 |
| 68 // The link drag hysteresis is much larger than the others because there | |
| 69 // needs to be enough space to cancel the link press without starting a link | |
| 70 // drag, and because dragging links is rare. | |
| 71 const int kLinkDragHysteresis = 40; | |
| 72 const int kImageDragHysteresis = 5; | |
| 73 const int kTextDragHysteresis = 3; | |
| 74 const int kGeneralDragHysteresis = 3; | |
| 75 | |
| 76 } // namespace | 73 } // namespace |
| 77 | 74 |
| 78 enum class DragInitiator { Mouse, Touch }; | 75 enum class DragInitiator { Mouse, Touch }; |
| 79 | 76 |
| 80 MouseEventManager::MouseEventManager(LocalFrame* frame, | 77 MouseEventManager::MouseEventManager(LocalFrame* frame, |
| 81 ScrollManager* scrollManager) | 78 ScrollManager* scrollManager) |
| 82 : m_frame(frame), | 79 : m_frame(frame), |
| 83 m_scrollManager(scrollManager), | 80 m_scrollManager(scrollManager), |
| 84 m_fakeMouseMoveEventTimer( | 81 m_fakeMouseMoveEventTimer( |
| 85 this, | 82 this, |
| (...skipping 689 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 775 .mouseDownMayStartSelect() && | 772 .mouseDownMayStartSelect() && |
| 776 !m_mouseDownMayStartAutoscroll; | 773 !m_mouseDownMayStartAutoscroll; |
| 777 } | 774 } |
| 778 | 775 |
| 779 // We are starting a text/image/url drag, so the cursor should be an arrow | 776 // We are starting a text/image/url drag, so the cursor should be an arrow |
| 780 // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and | 777 // FIXME <rdar://7577595>: Custom cursors aren't supported during drag and |
| 781 // drop (default to pointer). | 778 // drop (default to pointer). |
| 782 m_frame->view()->setCursor(pointerCursor()); | 779 m_frame->view()->setCursor(pointerCursor()); |
| 783 | 780 |
| 784 if (initiator == DragInitiator::Mouse && | 781 if (initiator == DragInitiator::Mouse && |
| 785 !dragHysteresisExceeded(event.event().position())) | 782 !dragThresholdExceeded(event.event().position())) |
| 786 return true; | 783 return true; |
| 787 | 784 |
| 788 // Once we're past the hysteresis point, we don't want to treat this gesture | 785 // Once we're past the drag threshold, we don't want to treat this gesture as |
| 789 // as a click | 786 // a click. |
| 790 invalidateClick(); | 787 invalidateClick(); |
| 791 | 788 |
| 792 if (!tryStartDrag(event)) { | 789 if (!tryStartDrag(event)) { |
| 793 // Something failed to start the drag, clean up. | 790 // Something failed to start the drag, clean up. |
| 794 clearDragDataTransfer(); | 791 clearDragDataTransfer(); |
| 795 dragState().m_dragSrc = nullptr; | 792 dragState().m_dragSrc = nullptr; |
| 796 } | 793 } |
| 797 | 794 |
| 798 m_mouseDownMayStartDrag = false; | 795 m_mouseDownMayStartDrag = false; |
| 799 // Whether or not the drag actually started, no more default handling (like | 796 // Whether or not the drag actually started, no more default handling (like |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 923 // In case the drag was ended due to an escape key press we need to ensure | 920 // In case the drag was ended due to an escape key press we need to ensure |
| 924 // that consecutive mousemove events don't reinitiate the drag and drop. | 921 // that consecutive mousemove events don't reinitiate the drag and drop. |
| 925 m_mouseDownMayStartDrag = false; | 922 m_mouseDownMayStartDrag = false; |
| 926 } | 923 } |
| 927 | 924 |
| 928 DragState& MouseEventManager::dragState() { | 925 DragState& MouseEventManager::dragState() { |
| 929 DEFINE_STATIC_LOCAL(DragState, state, (new DragState)); | 926 DEFINE_STATIC_LOCAL(DragState, state, (new DragState)); |
| 930 return state; | 927 return state; |
| 931 } | 928 } |
| 932 | 929 |
| 933 bool MouseEventManager::dragHysteresisExceeded( | 930 bool MouseEventManager::dragThresholdExceeded( |
| 934 const IntPoint& dragLocationInRootFrame) const { | 931 const IntPoint& dragLocationInRootFrame) const { |
| 935 FrameView* view = m_frame->view(); | 932 FrameView* view = m_frame->view(); |
| 936 if (!view) | 933 if (!view) |
| 937 return false; | 934 return false; |
| 938 IntPoint dragLocation = view->rootFrameToContents(dragLocationInRootFrame); | 935 IntPoint dragLocation = view->rootFrameToContents(dragLocationInRootFrame); |
| 939 IntSize delta = dragLocation - m_mouseDownPos; | 936 IntSize delta = dragLocation - m_mouseDownPos; |
| 940 | 937 |
| 941 int threshold = kGeneralDragHysteresis; | 938 int thresholdX = kDragThresholdX; |
| 942 switch (dragState().m_dragType) { | 939 int thresholdY = kDragThresholdY; |
| 943 case DragSourceActionSelection: | |
| 944 threshold = kTextDragHysteresis; | |
| 945 break; | |
| 946 case DragSourceActionImage: | |
| 947 threshold = kImageDragHysteresis; | |
| 948 break; | |
| 949 case DragSourceActionLink: | |
| 950 threshold = kLinkDragHysteresis; | |
| 951 break; | |
| 952 case DragSourceActionDHTML: | |
| 953 break; | |
| 954 case DragSourceActionNone: | |
| 955 NOTREACHED(); | |
| 956 } | |
| 957 | 940 |
| 958 return abs(delta.width()) >= threshold || abs(delta.height()) >= threshold; | 941 // WebKit's drag thresholds depend on the type of object being dragged. If we |
| 942 // want to revive that behavior, we can multiply the thresholds above with a |
| 943 // constant based on dragState().m_dragType. |
| 944 |
| 945 return abs(delta.width()) >= thresholdX || abs(delta.height()) >= thresholdY; |
| 959 } | 946 } |
| 960 | 947 |
| 961 void MouseEventManager::clearDragHeuristicState() { | 948 void MouseEventManager::clearDragHeuristicState() { |
| 962 // Used to prevent mouseMoveEvent from initiating a drag before | 949 // Used to prevent mouseMoveEvent from initiating a drag before |
| 963 // the mouse is pressed again. | 950 // the mouse is pressed again. |
| 964 m_mousePressed = false; | 951 m_mousePressed = false; |
| 965 m_capturesDragging = false; | 952 m_capturesDragging = false; |
| 966 m_mouseDownMayStartDrag = false; | 953 m_mouseDownMayStartDrag = false; |
| 967 m_mouseDownMayStartAutoscroll = false; | 954 m_mouseDownMayStartAutoscroll = false; |
| 968 } | 955 } |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1011 | 998 |
| 1012 void MouseEventManager::setClickCount(int clickCount) { | 999 void MouseEventManager::setClickCount(int clickCount) { |
| 1013 m_clickCount = clickCount; | 1000 m_clickCount = clickCount; |
| 1014 } | 1001 } |
| 1015 | 1002 |
| 1016 bool MouseEventManager::mouseDownMayStartDrag() { | 1003 bool MouseEventManager::mouseDownMayStartDrag() { |
| 1017 return m_mouseDownMayStartDrag; | 1004 return m_mouseDownMayStartDrag; |
| 1018 } | 1005 } |
| 1019 | 1006 |
| 1020 } // namespace blink | 1007 } // namespace blink |
| OLD | NEW |