| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. | 2 * Copyright (C) 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserv
ed. |
| 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 3 * Copyright (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) | 4 * Copyright (C) 2012 Digia Plc. and/or its subsidiary(-ies) |
| 5 * | 5 * |
| 6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
| 7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
| 8 * are met: | 8 * are met: |
| 9 * 1. Redistributions of source code must retain the above copyright | 9 * 1. Redistributions of source code must retain the above copyright |
| 10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 100 using namespace HTMLNames; | 100 using namespace HTMLNames; |
| 101 | 101 |
| 102 // The link drag hysteresis is much larger than the others because there | 102 // The link drag hysteresis is much larger than the others because there |
| 103 // needs to be enough space to cancel the link press without starting a link dra
g, | 103 // needs to be enough space to cancel the link press without starting a link dra
g, |
| 104 // and because dragging links is rare. | 104 // and because dragging links is rare. |
| 105 static const int LinkDragHysteresis = 40; | 105 static const int LinkDragHysteresis = 40; |
| 106 static const int ImageDragHysteresis = 5; | 106 static const int ImageDragHysteresis = 5; |
| 107 static const int TextDragHysteresis = 3; | 107 static const int TextDragHysteresis = 3; |
| 108 static const int GeneralDragHysteresis = 3; | 108 static const int GeneralDragHysteresis = 3; |
| 109 | 109 |
| 110 // The amount of time to wait before sending a fake mouse event, triggered | 110 // The amount of time to wait before sending a fake mouse event triggered |
| 111 // during a scroll. The short interval is used if the content responds to the mo
use events quickly enough, | 111 // during a scroll. |
| 112 // otherwise the long interval is used. | 112 static const double fakeMouseMoveInterval = 0.1; |
| 113 static const double fakeMouseMoveShortInterval = 0.1; | |
| 114 static const double fakeMouseMoveLongInterval = 0.250; | |
| 115 | 113 |
| 116 // The amount of time to wait for a cursor update on style and layout changes | 114 // The amount of time to wait for a cursor update on style and layout changes |
| 117 // Set to 50Hz, no need to be faster than common screen refresh rate | 115 // Set to 50Hz, no need to be faster than common screen refresh rate |
| 118 static const double cursorUpdateInterval = 0.02; | 116 static const double cursorUpdateInterval = 0.02; |
| 119 | 117 |
| 120 static const int maximumCursorSize = 128; | 118 static const int maximumCursorSize = 128; |
| 121 | 119 |
| 122 // It's pretty unlikely that a scale of less than one would ever be used. But al
l we really | 120 // It's pretty unlikely that a scale of less than one would ever be used. But al
l we really |
| 123 // need to ensure here is that the scale isn't so small that integer overflow ca
n occur when | 121 // need to ensure here is that the scale isn't so small that integer overflow ca
n occur when |
| 124 // dividing cursor sizes (limited above) by the scale. | 122 // dividing cursor sizes (limited above) by the scale. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 144 OptionalCursor(const Cursor& cursor) : m_isCursorChange(true), m_cursor(curs
or) { } | 142 OptionalCursor(const Cursor& cursor) : m_isCursorChange(true), m_cursor(curs
or) { } |
| 145 | 143 |
| 146 bool isCursorChange() const { return m_isCursorChange; } | 144 bool isCursorChange() const { return m_isCursorChange; } |
| 147 const Cursor& cursor() const { ASSERT(m_isCursorChange); return m_cursor; } | 145 const Cursor& cursor() const { ASSERT(m_isCursorChange); return m_cursor; } |
| 148 | 146 |
| 149 private: | 147 private: |
| 150 bool m_isCursorChange; | 148 bool m_isCursorChange; |
| 151 Cursor m_cursor; | 149 Cursor m_cursor; |
| 152 }; | 150 }; |
| 153 | 151 |
| 154 class MaximumDurationTracker { | |
| 155 public: | |
| 156 explicit MaximumDurationTracker(double *maxDuration) | |
| 157 : m_maxDuration(maxDuration) | |
| 158 , m_start(monotonicallyIncreasingTime()) | |
| 159 { | |
| 160 } | |
| 161 | |
| 162 ~MaximumDurationTracker() | |
| 163 { | |
| 164 *m_maxDuration = max(*m_maxDuration, monotonicallyIncreasingTime() - m_s
tart); | |
| 165 } | |
| 166 | |
| 167 private: | |
| 168 double* m_maxDuration; | |
| 169 double m_start; | |
| 170 }; | |
| 171 | |
| 172 static inline ScrollGranularity wheelGranularityToScrollGranularity(WheelEvent*
event) | 152 static inline ScrollGranularity wheelGranularityToScrollGranularity(WheelEvent*
event) |
| 173 { | 153 { |
| 174 unsigned deltaMode = event->deltaMode(); | 154 unsigned deltaMode = event->deltaMode(); |
| 175 if (deltaMode == WheelEvent::DOM_DELTA_PAGE) | 155 if (deltaMode == WheelEvent::DOM_DELTA_PAGE) |
| 176 return ScrollByPage; | 156 return ScrollByPage; |
| 177 if (deltaMode == WheelEvent::DOM_DELTA_LINE) | 157 if (deltaMode == WheelEvent::DOM_DELTA_LINE) |
| 178 return ScrollByLine; | 158 return ScrollByLine; |
| 179 ASSERT(deltaMode == WheelEvent::DOM_DELTA_PIXEL); | 159 ASSERT(deltaMode == WheelEvent::DOM_DELTA_PIXEL); |
| 180 return event->hasPreciseScrollingDeltas() ? ScrollByPrecisePixel : ScrollByP
ixel; | 160 return event->hasPreciseScrollingDeltas() ? ScrollByPrecisePixel : ScrollByP
ixel; |
| 181 } | 161 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 229 , m_eventHandlerWillResetCapturingMouseEventsNode(0) | 209 , m_eventHandlerWillResetCapturingMouseEventsNode(0) |
| 230 , m_clickCount(0) | 210 , m_clickCount(0) |
| 231 , m_shouldOnlyFireDragOverEvent(false) | 211 , m_shouldOnlyFireDragOverEvent(false) |
| 232 , m_accumulatedRootOverscroll(FloatSize()) | 212 , m_accumulatedRootOverscroll(FloatSize()) |
| 233 , m_mousePositionIsUnknown(true) | 213 , m_mousePositionIsUnknown(true) |
| 234 , m_mouseDownTimestamp(0) | 214 , m_mouseDownTimestamp(0) |
| 235 , m_widgetIsLatched(false) | 215 , m_widgetIsLatched(false) |
| 236 , m_touchPressed(false) | 216 , m_touchPressed(false) |
| 237 , m_scrollGestureHandlingNode(nullptr) | 217 , m_scrollGestureHandlingNode(nullptr) |
| 238 , m_lastGestureScrollOverWidget(false) | 218 , m_lastGestureScrollOverWidget(false) |
| 239 , m_maxMouseMovedDuration(0) | |
| 240 , m_longTapShouldInvokeContextMenu(false) | 219 , m_longTapShouldInvokeContextMenu(false) |
| 241 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) | 220 , m_activeIntervalTimer(this, &EventHandler::activeIntervalTimerFired) |
| 242 , m_lastShowPressTimestamp(0) | 221 , m_lastShowPressTimestamp(0) |
| 243 , m_deltaConsumedForScrollSequence(false) | 222 , m_deltaConsumedForScrollSequence(false) |
| 244 { | 223 { |
| 245 } | 224 } |
| 246 | 225 |
| 247 EventHandler::~EventHandler() | 226 EventHandler::~EventHandler() |
| 248 { | 227 { |
| 249 ASSERT(!m_fakeMouseMoveEventTimer.isActive()); | 228 ASSERT(!m_fakeMouseMoveEventTimer.isActive()); |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 306 m_capturingMouseEventsNode = nullptr; | 285 m_capturingMouseEventsNode = nullptr; |
| 307 m_latchedWheelEventNode = nullptr; | 286 m_latchedWheelEventNode = nullptr; |
| 308 m_previousWheelScrolledNode = nullptr; | 287 m_previousWheelScrolledNode = nullptr; |
| 309 m_targetForTouchID.clear(); | 288 m_targetForTouchID.clear(); |
| 310 m_touchSequenceDocument.clear(); | 289 m_touchSequenceDocument.clear(); |
| 311 m_touchSequenceUserGestureToken.clear(); | 290 m_touchSequenceUserGestureToken.clear(); |
| 312 m_scrollGestureHandlingNode = nullptr; | 291 m_scrollGestureHandlingNode = nullptr; |
| 313 m_lastGestureScrollOverWidget = false; | 292 m_lastGestureScrollOverWidget = false; |
| 314 m_previousGestureScrolledNode = nullptr; | 293 m_previousGestureScrolledNode = nullptr; |
| 315 m_scrollbarHandlingScrollGesture = nullptr; | 294 m_scrollbarHandlingScrollGesture = nullptr; |
| 316 m_maxMouseMovedDuration = 0; | |
| 317 m_touchPressed = false; | 295 m_touchPressed = false; |
| 318 m_pointerIdManager.clear(); | 296 m_pointerIdManager.clear(); |
| 319 m_mouseDownMayStartDrag = false; | 297 m_mouseDownMayStartDrag = false; |
| 320 m_lastShowPressTimestamp = 0; | 298 m_lastShowPressTimestamp = 0; |
| 321 m_lastDeferredTapElement = nullptr; | 299 m_lastDeferredTapElement = nullptr; |
| 322 m_eventHandlerWillResetCapturingMouseEventsNode = false; | 300 m_eventHandlerWillResetCapturingMouseEventsNode = false; |
| 323 m_mouseDownMayStartAutoscroll = false; | 301 m_mouseDownMayStartAutoscroll = false; |
| 324 m_svgPan = false; | 302 m_svgPan = false; |
| 325 m_mouseDownPos = IntPoint(); | 303 m_mouseDownPos = IntPoint(); |
| 326 m_mouseDownTimestamp = 0; | 304 m_mouseDownTimestamp = 0; |
| (...skipping 707 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1034 } | 1012 } |
| 1035 | 1013 |
| 1036 return nullptr; | 1014 return nullptr; |
| 1037 } | 1015 } |
| 1038 | 1016 |
| 1039 bool EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event) | 1017 bool EventHandler::handleMouseMoveEvent(const PlatformMouseEvent& event) |
| 1040 { | 1018 { |
| 1041 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); | 1019 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); |
| 1042 | 1020 |
| 1043 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 1021 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); |
| 1044 MaximumDurationTracker maxDurationTracker(&m_maxMouseMovedDuration); | |
| 1045 | 1022 |
| 1046 HitTestResult hoveredNode = HitTestResult(); | 1023 HitTestResult hoveredNode = HitTestResult(); |
| 1047 bool result = handleMouseMoveOrLeaveEvent(event, &hoveredNode); | 1024 bool result = handleMouseMoveOrLeaveEvent(event, &hoveredNode); |
| 1048 | 1025 |
| 1049 Page* page = m_frame->page(); | 1026 Page* page = m_frame->page(); |
| 1050 if (!page) | 1027 if (!page) |
| 1051 return result; | 1028 return result; |
| 1052 | 1029 |
| 1053 if (DeprecatedPaintLayer* layer = layerForNode(hoveredNode.innerNode())) { | 1030 if (DeprecatedPaintLayer* layer = layerForNode(hoveredNode.innerNode())) { |
| 1054 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer
)) | 1031 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer
)) |
| (...skipping 1720 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2775 if (m_mousePressed) | 2752 if (m_mousePressed) |
| 2776 return; | 2753 return; |
| 2777 | 2754 |
| 2778 if (m_mousePositionIsUnknown) | 2755 if (m_mousePositionIsUnknown) |
| 2779 return; | 2756 return; |
| 2780 | 2757 |
| 2781 Settings* settings = m_frame->settings(); | 2758 Settings* settings = m_frame->settings(); |
| 2782 if (settings && !settings->deviceSupportsMouse()) | 2759 if (settings && !settings->deviceSupportsMouse()) |
| 2783 return; | 2760 return; |
| 2784 | 2761 |
| 2785 // If the content has ever taken longer than fakeMouseMoveShortInterval we | 2762 // Reschedule the timer, to prevent dispatching mouse move events |
| 2786 // reschedule the timer and use a longer time. This will cause the content | 2763 // during a scroll. This avoids a potential source of scroll jank. |
| 2787 // to receive these moves only after the user is done scrolling, reducing | 2764 if (m_fakeMouseMoveEventTimer.isActive()) |
| 2788 // pauses during the scroll. | 2765 m_fakeMouseMoveEventTimer.stop(); |
| 2789 if (m_maxMouseMovedDuration > fakeMouseMoveShortInterval) { | 2766 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveInterval, FROM_HERE); |
| 2790 if (m_fakeMouseMoveEventTimer.isActive()) | |
| 2791 m_fakeMouseMoveEventTimer.stop(); | |
| 2792 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveLongInterval, FROM_H
ERE); | |
| 2793 } else { | |
| 2794 if (!m_fakeMouseMoveEventTimer.isActive()) | |
| 2795 m_fakeMouseMoveEventTimer.startOneShot(fakeMouseMoveShortInterval, F
ROM_HERE); | |
| 2796 } | |
| 2797 } | 2767 } |
| 2798 | 2768 |
| 2799 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad) | 2769 void EventHandler::dispatchFakeMouseMoveEventSoonInQuad(const FloatQuad& quad) |
| 2800 { | 2770 { |
| 2801 FrameView* view = m_frame->view(); | 2771 FrameView* view = m_frame->view(); |
| 2802 if (!view) | 2772 if (!view) |
| 2803 return; | 2773 return; |
| 2804 | 2774 |
| 2805 if (!quad.containsPoint(view->rootFrameToContents(m_lastKnownMousePosition))
) | 2775 if (!quad.containsPoint(view->rootFrameToContents(m_lastKnownMousePosition))
) |
| 2806 return; | 2776 return; |
| (...skipping 1082 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3889 unsigned EventHandler::accessKeyModifiers() | 3859 unsigned EventHandler::accessKeyModifiers() |
| 3890 { | 3860 { |
| 3891 #if OS(MACOSX) | 3861 #if OS(MACOSX) |
| 3892 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 3862 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
| 3893 #else | 3863 #else |
| 3894 return PlatformEvent::AltKey; | 3864 return PlatformEvent::AltKey; |
| 3895 #endif | 3865 #endif |
| 3896 } | 3866 } |
| 3897 | 3867 |
| 3898 } // namespace blink | 3868 } // namespace blink |
| OLD | NEW |