Chromium Code Reviews| 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 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 101 | 101 |
| 102 namespace blink { | 102 namespace blink { |
| 103 | 103 |
| 104 namespace { | 104 namespace { |
| 105 | 105 |
| 106 bool isNodeInDocument(Node* n) | 106 bool isNodeInDocument(Node* n) |
| 107 { | 107 { |
| 108 return n && n->inDocument(); | 108 return n && n->inDocument(); |
| 109 } | 109 } |
| 110 | 110 |
| 111 const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint::State s tate) | |
| 112 { | |
| 113 switch (state) { | |
| 114 case PlatformTouchPoint::TouchReleased: | |
| 115 return EventTypeNames::touchend; | |
| 116 case PlatformTouchPoint::TouchCancelled: | |
| 117 return EventTypeNames::touchcancel; | |
| 118 case PlatformTouchPoint::TouchPressed: | |
| 119 return EventTypeNames::touchstart; | |
| 120 case PlatformTouchPoint::TouchMoved: | |
| 121 return EventTypeNames::touchmove; | |
| 122 case PlatformTouchPoint::TouchStationary: | |
| 123 // Fall through to default | |
| 124 default: | |
| 125 ASSERT_NOT_REACHED(); | |
| 126 return emptyAtom; | |
| 127 } | |
| 111 } | 128 } |
| 112 | 129 |
| 130 const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint::State state) | |
| 131 { | |
| 132 switch (state) { | |
| 133 case PlatformTouchPoint::TouchReleased: | |
| 134 return EventTypeNames::pointerup; | |
| 135 case PlatformTouchPoint::TouchCancelled: | |
| 136 return EventTypeNames::pointercancel; | |
| 137 case PlatformTouchPoint::TouchPressed: | |
| 138 return EventTypeNames::pointerdown; | |
| 139 case PlatformTouchPoint::TouchMoved: | |
| 140 return EventTypeNames::pointermove; | |
| 141 case PlatformTouchPoint::TouchStationary: | |
| 142 // Fall through to default | |
| 143 default: | |
| 144 ASSERT_NOT_REACHED(); | |
| 145 return emptyAtom; | |
| 146 } | |
| 147 } | |
| 148 | |
| 149 const AtomicString& pointerEventNameForMouseEventName(const AtomicString& mouseE ventName) | |
| 150 { | |
| 151 #define RETURN_CORRESPONDING_PE_NAME(eventSuffix) \ | |
| 152 if (mouseEventName == EventTypeNames::mouse##eventSuffix) {\ | |
| 153 return EventTypeNames::pointer##eventSuffix;\ | |
| 154 } | |
| 155 | |
| 156 RETURN_CORRESPONDING_PE_NAME(down); | |
| 157 RETURN_CORRESPONDING_PE_NAME(enter); | |
| 158 RETURN_CORRESPONDING_PE_NAME(leave); | |
| 159 RETURN_CORRESPONDING_PE_NAME(move); | |
| 160 RETURN_CORRESPONDING_PE_NAME(out); | |
| 161 RETURN_CORRESPONDING_PE_NAME(over); | |
| 162 RETURN_CORRESPONDING_PE_NAME(up); | |
| 163 | |
| 164 #undef RETURN_CORRESPONDING_PE_NAME | |
| 165 | |
| 166 ASSERT_NOT_REACHED(); | |
| 167 return emptyAtom; | |
| 168 } | |
| 169 | |
| 170 } // namespace | |
| 171 | |
| 113 using namespace HTMLNames; | 172 using namespace HTMLNames; |
| 114 | 173 |
| 115 // The link drag hysteresis is much larger than the others because there | 174 // The link drag hysteresis is much larger than the others because there |
| 116 // needs to be enough space to cancel the link press without starting a link dra g, | 175 // needs to be enough space to cancel the link press without starting a link dra g, |
| 117 // and because dragging links is rare. | 176 // and because dragging links is rare. |
| 118 static const int LinkDragHysteresis = 40; | 177 static const int LinkDragHysteresis = 40; |
| 119 static const int ImageDragHysteresis = 5; | 178 static const int ImageDragHysteresis = 5; |
| 120 static const int TextDragHysteresis = 3; | 179 static const int TextDragHysteresis = 3; |
| 121 static const int GeneralDragHysteresis = 3; | 180 static const int GeneralDragHysteresis = 3; |
| 122 | 181 |
| (...skipping 841 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 964 m_resizeScrollableArea = layer->scrollableArea(); | 1023 m_resizeScrollableArea = layer->scrollableArea(); |
| 965 m_resizeScrollableArea->setInResizeMode(true); | 1024 m_resizeScrollableArea->setInResizeMode(true); |
| 966 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p)); | 1025 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset FromResizeCorner(p)); |
| 967 invalidateClick(); | 1026 invalidateClick(); |
| 968 return true; | 1027 return true; |
| 969 } | 1028 } |
| 970 } | 1029 } |
| 971 | 1030 |
| 972 m_frame->selection().setCaretBlinkingSuspended(true); | 1031 m_frame->selection().setCaretBlinkingSuspended(true); |
| 973 | 1032 |
| 974 bool swallowEvent = dispatchPointerEventForMouseEvent(mev.innerNode(), Event TypeNames::pointerdown, mouseEvent); | 1033 bool swallowEvent = dispatchPointerAndMouseEvent(EventTypeNames::mousedown, mev.innerNode(), m_clickCount, mouseEvent); |
| 975 | |
| 976 if (swallowEvent) { | |
| 977 m_preventMouseEventForPointerTypeMouse = true; | |
| 978 } | |
| 979 if (!m_preventMouseEventForPointerTypeMouse) | |
| 980 swallowEvent = swallowEvent || !dispatchMouseEvent(EventTypeNames::mouse down, mev.innerNode(), m_clickCount, mouseEvent); | |
| 981 | 1034 |
| 982 // m_selectionInitiationState is initialized after dispatching mousedown | 1035 // m_selectionInitiationState is initialized after dispatching mousedown |
| 983 // event in order not to keep the selection by DOM APIs Because we can't | 1036 // event in order not to keep the selection by DOM APIs Because we can't |
| 984 // give the user the chance to handle the selection by user action like | 1037 // give the user the chance to handle the selection by user action like |
| 985 // dragging if we keep the selection in case of mousedown. FireFox also has | 1038 // dragging if we keep the selection in case of mousedown. FireFox also has |
| 986 // the same behavior and it's more compatible with other browsers. | 1039 // the same behavior and it's more compatible with other browsers. |
| 987 selectionController().initializeSelectionState(); | 1040 selectionController().initializeSelectionState(); |
| 988 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, documentPoint, H itTestRequest::ReadOnly); | 1041 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, documentPoint, H itTestRequest::ReadOnly); |
| 989 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType( ) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo urceCapabilities() : | 1042 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType( ) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo urceCapabilities() : |
| 990 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); | 1043 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1104 m_cursorUpdateTimer.stop(); | 1157 m_cursorUpdateTimer.stop(); |
| 1105 | 1158 |
| 1106 cancelFakeMouseMoveEvent(); | 1159 cancelFakeMouseMoveEvent(); |
| 1107 | 1160 |
| 1108 if (m_svgPan) { | 1161 if (m_svgPan) { |
| 1109 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); | 1162 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); |
| 1110 return true; | 1163 return true; |
| 1111 } | 1164 } |
| 1112 | 1165 |
| 1113 if (m_frameSetBeingResized) | 1166 if (m_frameSetBeingResized) |
| 1114 return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingRes ized.get(), 0, mouseEvent); | 1167 return dispatchPointerAndMouseEvent(EventTypeNames::mousemove, m_frameSe tBeingResized.get(), 0, mouseEvent); |
| 1115 | 1168 |
| 1116 // Send events right to a scrollbar if the mouse is pressed. | 1169 // Send events right to a scrollbar if the mouse is pressed. |
| 1117 if (m_lastScrollbarUnderMouse && m_mousePressed) { | 1170 if (m_lastScrollbarUnderMouse && m_mousePressed) { |
| 1118 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); | 1171 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); |
| 1119 return true; | 1172 return true; |
| 1120 } | 1173 } |
| 1121 | 1174 |
| 1122 // Mouse events simulated from touch should not hit-test again. | 1175 // Mouse events simulated from touch should not hit-test again. |
| 1123 ASSERT(!mouseEvent.fromTouch()); | 1176 ASSERT(!mouseEvent.fromTouch()); |
| 1124 | 1177 |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1186 view->setCursor(optionalCursor.cursor()); | 1239 view->setCursor(optionalCursor.cursor()); |
| 1187 } | 1240 } |
| 1188 } | 1241 } |
| 1189 } | 1242 } |
| 1190 | 1243 |
| 1191 m_lastMouseMoveEventSubframe = newSubframe; | 1244 m_lastMouseMoveEventSubframe = newSubframe; |
| 1192 | 1245 |
| 1193 if (swallowEvent) | 1246 if (swallowEvent) |
| 1194 return true; | 1247 return true; |
| 1195 | 1248 |
| 1196 swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode( ), 0, mouseEvent); | 1249 swallowEvent = dispatchPointerAndMouseEvent(EventTypeNames::mousemove, mev.i nnerNode(), 0, mouseEvent); |
| 1250 | |
| 1197 if (!swallowEvent) | 1251 if (!swallowEvent) |
| 1198 swallowEvent = handleMouseDraggedEvent(mev); | 1252 swallowEvent = handleMouseDraggedEvent(mev); |
| 1199 | 1253 |
| 1200 return swallowEvent; | 1254 return swallowEvent; |
| 1201 } | 1255 } |
| 1202 | 1256 |
| 1203 void EventHandler::invalidateClick() | 1257 void EventHandler::invalidateClick() |
| 1204 { | 1258 { |
| 1205 m_clickCount = 0; | 1259 m_clickCount = 0; |
| 1206 m_clickNode = nullptr; | 1260 m_clickNode = nullptr; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1239 m_mousePressed = false; | 1293 m_mousePressed = false; |
| 1240 setLastKnownMousePosition(mouseEvent); | 1294 setLastKnownMousePosition(mouseEvent); |
| 1241 | 1295 |
| 1242 if (m_svgPan) { | 1296 if (m_svgPan) { |
| 1243 m_svgPan = false; | 1297 m_svgPan = false; |
| 1244 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); | 1298 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro otFrameToContents(m_lastKnownMousePosition)); |
| 1245 return true; | 1299 return true; |
| 1246 } | 1300 } |
| 1247 | 1301 |
| 1248 if (m_frameSetBeingResized) | 1302 if (m_frameSetBeingResized) |
| 1249 return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResiz ed.get(), m_clickCount, mouseEvent); | 1303 return dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResize d.get(), m_clickCount, mouseEvent); |
| 1250 | 1304 |
| 1251 if (m_lastScrollbarUnderMouse) { | 1305 if (m_lastScrollbarUnderMouse) { |
| 1252 invalidateClick(); | 1306 invalidateClick(); |
| 1253 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); | 1307 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); |
| 1254 return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get (), m_clickCount, mouseEvent); | 1308 return dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get( ), m_clickCount, mouseEvent); |
| 1255 } | 1309 } |
| 1256 | 1310 |
| 1257 // Mouse events simulated from touch should not hit-test again. | 1311 // Mouse events simulated from touch should not hit-test again. |
| 1258 ASSERT(!mouseEvent.fromTouch()); | 1312 ASSERT(!mouseEvent.fromTouch()); |
| 1259 | 1313 |
| 1260 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; | 1314 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; |
| 1261 HitTestRequest request(hitType); | 1315 HitTestRequest request(hitType); |
| 1262 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); | 1316 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); |
| 1263 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); | 1317 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); |
| 1264 if (m_eventHandlerWillResetCapturingMouseEventsNode) | 1318 if (m_eventHandlerWillResetCapturingMouseEventsNode) |
| 1265 m_capturingMouseEventsNode = nullptr; | 1319 m_capturingMouseEventsNode = nullptr; |
| 1266 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) | 1320 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) |
| 1267 return true; | 1321 return true; |
| 1268 | 1322 |
| 1269 bool swallowPointerUpEvent = dispatchPointerEventForMouseEvent(mev.innerNode (), EventTypeNames::pointerup, mouseEvent); | 1323 bool swallowUpEvent = dispatchPointerAndMouseEvent(EventTypeNames::mouseup, mev.innerNode(), m_clickCount, mouseEvent); |
| 1270 bool swallowMouseUpEvent = false; | 1324 |
| 1271 if (!m_preventMouseEventForPointerTypeMouse) { | 1325 // TODO(crbug/545647): This state should reset with pointercancel too. |
| 1272 swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.i nnerNode(), m_clickCount, mouseEvent); | 1326 m_preventMouseEventForPointerTypeMouse = false; |
| 1273 } else { | |
| 1274 // TODO(crbug/545647): This state should reset with pointercancel too. | |
| 1275 m_preventMouseEventForPointerTypeMouse = false; | |
| 1276 } | |
| 1277 | 1327 |
| 1278 bool contextMenuEvent = mouseEvent.button() == RightButton; | 1328 bool contextMenuEvent = mouseEvent.button() == RightButton; |
| 1279 #if OS(MACOSX) | 1329 #if OS(MACOSX) |
| 1280 // FIXME: The Mac port achieves the same behavior by checking whether the co ntext menu is currently open in WebPage::mouseEvent(). Consider merging the impl ementations. | 1330 // FIXME: The Mac port achieves the same behavior by checking whether the co ntext menu is currently open in WebPage::mouseEvent(). Consider merging the impl ementations. |
| 1281 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv ent::CtrlKey) | 1331 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv ent::CtrlKey) |
| 1282 contextMenuEvent = true; | 1332 contextMenuEvent = true; |
| 1283 #endif | 1333 #endif |
| 1284 | 1334 |
| 1285 bool swallowClickEvent = false; | 1335 bool swallowClickEvent = false; |
| 1286 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode && mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat eInComposedTree()) { | 1336 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode && mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat eInComposedTree()) { |
| (...skipping 14 matching lines...) Expand all Loading... | |
| 1301 EventTypeNames::click, m_clickCount); | 1351 EventTypeNames::click, m_clickCount); |
| 1302 } | 1352 } |
| 1303 } | 1353 } |
| 1304 | 1354 |
| 1305 if (m_resizeScrollableArea) { | 1355 if (m_resizeScrollableArea) { |
| 1306 m_resizeScrollableArea->setInResizeMode(false); | 1356 m_resizeScrollableArea->setInResizeMode(false); |
| 1307 m_resizeScrollableArea = nullptr; | 1357 m_resizeScrollableArea = nullptr; |
| 1308 } | 1358 } |
| 1309 | 1359 |
| 1310 bool swallowMouseReleaseEvent = false; | 1360 bool swallowMouseReleaseEvent = false; |
| 1311 if (!swallowPointerUpEvent && !swallowMouseUpEvent) | 1361 if (!swallowUpEvent) |
| 1312 swallowMouseReleaseEvent = handleMouseReleaseEvent(mev); | 1362 swallowMouseReleaseEvent = handleMouseReleaseEvent(mev); |
| 1313 | 1363 |
| 1314 invalidateClick(); | 1364 invalidateClick(); |
| 1315 | 1365 |
| 1316 return swallowPointerUpEvent || swallowMouseUpEvent || swallowClickEvent || swallowMouseReleaseEvent; | 1366 return swallowUpEvent || swallowClickEvent || swallowMouseReleaseEvent; |
| 1317 } | 1367 } |
| 1318 | 1368 |
| 1319 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa rget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) | 1369 bool EventHandler::dispatchDragEvent(const AtomicString& eventType, Node* dragTa rget, const PlatformMouseEvent& event, DataTransfer* dataTransfer) |
| 1320 { | 1370 { |
| 1321 FrameView* view = m_frame->view(); | 1371 FrameView* view = m_frame->view(); |
| 1322 | 1372 |
| 1323 // FIXME: We might want to dispatch a dragleave even if the view is gone. | 1373 // FIXME: We might want to dispatch a dragleave even if the view is gone. |
| 1324 if (!view) | 1374 if (!view) |
| 1325 return false; | 1375 return false; |
| 1326 | 1376 |
| (...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1670 for (size_t i = enteredAncestorIndex; i > 0; i--) { | 1720 for (size_t i = enteredAncestorIndex; i > 0; i--) { |
| 1671 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::pointerenter)) { | 1721 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::pointerenter)) { |
| 1672 dispatchPointerEventForMouseEvent(enteredAncestors[i-1].get(), Event TypeNames::pointerenter, mouseEvent, | 1722 dispatchPointerEventForMouseEvent(enteredAncestors[i-1].get(), Event TypeNames::pointerenter, mouseEvent, |
| 1673 exitedNode); | 1723 exitedNode); |
| 1674 } | 1724 } |
| 1675 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::mouseenter)) | 1725 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi steners(EventTypeNames::mouseenter)) |
| 1676 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames ::mouseenter, 0, exitedNode); | 1726 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames ::mouseenter, 0, exitedNode); |
| 1677 } | 1727 } |
| 1678 } | 1728 } |
| 1679 | 1729 |
| 1680 // The return value means 'continue default handling.' | |
| 1681 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe tNode, int clickCount, const PlatformMouseEvent& mouseEvent) | 1730 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe tNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
|
Rick Byers
2015/10/30 17:21:29
So the pattern you're going for is that all EventH
mustaq
2015/11/03 20:44:30
Done. You are right: dispatchDragSrcEvent is the o
| |
| 1682 { | 1731 { |
| 1683 updateMouseEventTargetNode(targetNode, mouseEvent); | 1732 updateMouseEventTargetNode(targetNode, mouseEvent); |
| 1684 return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); | 1733 return m_nodeUnderMouse && !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, eventType, clickCount); |
| 1685 } | 1734 } |
| 1686 | 1735 |
| 1687 // The return value means 'swallow event' (was handled), as for other handle* fu nctions. | 1736 bool EventHandler::dispatchPointerAndMouseEvent(const AtomicString& mouseEventTy pe, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
|
Rick Byers
2015/10/30 17:21:29
In the spirit of working towards pulling all mouse
mustaq
2015/11/03 20:44:30
I think the confusion is caused by the similar loo
Rick Byers
2015/11/03 20:59:56
I'd still like to untangle the mouse event support
mustaq
2015/11/03 21:37:34
Yes, your PE-driving-ME-dispatch suggestion made p
| |
| 1737 { | |
| 1738 ASSERT(mouseEventType == EventTypeNames::mousedown | |
| 1739 || mouseEventType == EventTypeNames::mousemove | |
| 1740 || mouseEventType == EventTypeNames::mouseup); | |
| 1741 | |
| 1742 updateMouseEventTargetNode(targetNode, mouseEvent); | |
| 1743 if (!m_nodeUnderMouse) | |
| 1744 return false; | |
| 1745 | |
| 1746 bool swallowEvent = dispatchPointerEventForMouseEvent(m_nodeUnderMouse.get() , | |
| 1747 pointerEventNameForMouseEventName(mouseEventType), | |
| 1748 mouseEvent); | |
| 1749 | |
| 1750 if (swallowEvent && mouseEventType == EventTypeNames::mousedown) { | |
| 1751 m_preventMouseEventForPointerTypeMouse = true; | |
| 1752 } | |
| 1753 | |
| 1754 if (!m_preventMouseEventForPointerTypeMouse) { | |
| 1755 swallowEvent |= !m_nodeUnderMouse->dispatchMouseEvent(mouseEvent, mouseE ventType, clickCount); | |
| 1756 } | |
| 1757 | |
| 1758 return swallowEvent; | |
| 1759 } | |
| 1760 | |
| 1688 bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted Event, InputDeviceCapabilities* sourceCapabilities) | 1761 bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted Event, InputDeviceCapabilities* sourceCapabilities) |
| 1689 { | 1762 { |
| 1690 // If clicking on a frame scrollbar, do not mess up with content focus. | 1763 // If clicking on a frame scrollbar, do not mess up with content focus. |
| 1691 if (targetedEvent.hitTestResult().scrollbar() && m_frame->contentLayoutObjec t()) { | 1764 if (targetedEvent.hitTestResult().scrollbar() && m_frame->contentLayoutObjec t()) { |
| 1692 if (targetedEvent.hitTestResult().scrollbar()->scrollableArea() == m_fra me->contentLayoutObject()->scrollableArea()) | 1765 if (targetedEvent.hitTestResult().scrollbar()->scrollableArea() == m_fra me->contentLayoutObject()->scrollableArea()) |
| 1693 return false; | 1766 return false; |
| 1694 } | 1767 } |
| 1695 | 1768 |
| 1696 // The layout needs to be up to date to determine if an element is focusable . | 1769 // The layout needs to be up to date to determine if an element is focusable . |
| 1697 m_frame->document()->updateLayoutIgnorePendingStylesheets(); | 1770 m_frame->document()->updateLayoutIgnorePendingStylesheets(); |
| (...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2119 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; | 2192 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; |
| 2120 IntPoint tappedPosition = gestureEvent.position(); | 2193 IntPoint tappedPosition = gestureEvent.position(); |
| 2121 | 2194 |
| 2122 if (m_clickNode && m_clickNode->isTextNode()) | 2195 if (m_clickNode && m_clickNode->isTextNode()) |
| 2123 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode); | 2196 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode); |
| 2124 | 2197 |
| 2125 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa lPosition(), | 2198 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa lPosition(), |
| 2126 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), | 2199 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| 2127 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut tonDown), | 2200 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut tonDown), |
| 2128 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2201 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2129 bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); | 2202 bool swallowMouseDownEvent = dispatchMouseEvent(EventTypeNames::mousedown, c urrentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| 2130 selectionController().initializeSelectionState(); | 2203 selectionController().initializeSelectionState(); |
| 2131 if (!swallowMouseDownEvent) | 2204 if (!swallowMouseDownEvent) |
| 2132 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa keMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCap abilities()); | 2205 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa keMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCap abilities()); |
| 2133 if (!swallowMouseDownEvent) | 2206 if (!swallowMouseDownEvent) |
| 2134 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul ts(fakeMouseDown, currentHitTest)); | 2207 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul ts(fakeMouseDown, currentHitTest)); |
| 2135 | 2208 |
| 2136 if (currentHitTest.innerNode()) { | 2209 if (currentHitTest.innerNode()) { |
| 2137 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); | 2210 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); |
| 2138 HitTestResult result = currentHitTest; | 2211 HitTestResult result = currentHitTest; |
| 2139 result.setToShadowHostIfInUserAgentShadowRoot(); | 2212 result.setToShadowHostIfInUserAgentShadowRoot(); |
| 2140 m_frame->chromeClient().onMouseDown(result.innerNode()); | 2213 m_frame->chromeClient().onMouseDown(result.innerNode()); |
| 2141 } | 2214 } |
| 2142 | 2215 |
| 2143 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug. com/398920 | 2216 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug. com/398920 |
| 2144 if (currentHitTest.innerNode()) { | 2217 if (currentHitTest.innerNode()) { |
| 2145 LocalFrame* mainFrame = m_frame->localFrameRoot(); | 2218 LocalFrame* mainFrame = m_frame->localFrameRoot(); |
| 2146 if (mainFrame && mainFrame->view()) | 2219 if (mainFrame && mainFrame->view()) |
| 2147 mainFrame->view()->updateAllLifecyclePhases(); | 2220 mainFrame->view()->updateAllLifecyclePhases(); |
| 2148 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); | 2221 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| 2149 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2222 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
| 2150 } | 2223 } |
| 2151 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP osition(), | 2224 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP osition(), |
| 2152 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), | 2225 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
| 2153 static_cast<PlatformEvent::Modifiers>(modifiers), | 2226 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2154 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2227 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2155 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, curr entHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); | 2228 bool swallowMouseUpEvent = dispatchMouseEvent(EventTypeNames::mouseup, curre ntHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| 2156 | 2229 |
| 2157 bool swallowClickEvent = false; | 2230 bool swallowClickEvent = false; |
| 2158 if (m_clickNode) { | 2231 if (m_clickNode) { |
| 2159 if (currentHitTest.innerNode()) { | 2232 if (currentHitTest.innerNode()) { |
| 2160 // Updates distribution because a mouseup (or mousedown) event liste ner can make the | 2233 // Updates distribution because a mouseup (or mousedown) event liste ner can make the |
| 2161 // tree dirty at dispatchMouseEvent() invocation above. | 2234 // tree dirty at dispatchMouseEvent() invocation above. |
| 2162 // Unless distribution is updated, commonAncestor would hit ASSERT. | 2235 // Unless distribution is updated, commonAncestor would hit ASSERT. |
| 2163 // Both m_clickNode and currentHitTest.innerNode()) don't need to be updated | 2236 // Both m_clickNode and currentHitTest.innerNode()) don't need to be updated |
| 2164 // because commonAncestor() will exit early if their documents are d ifferent. | 2237 // because commonAncestor() will exit early if their documents are d ifferent. |
| 2165 m_clickNode->updateDistribution(); | 2238 m_clickNode->updateDistribution(); |
| 2166 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(* m_clickNode, parentForClickEvent); | 2239 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(* m_clickNode, parentForClickEvent); |
| 2167 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click TargetNode, gestureEvent.tapCount(), fakeMouseUp); | 2240 swallowClickEvent = dispatchMouseEvent(EventTypeNames::click, clickT argetNode, gestureEvent.tapCount(), fakeMouseUp); |
| 2168 } | 2241 } |
| 2169 m_clickNode = nullptr; | 2242 m_clickNode = nullptr; |
| 2170 } | 2243 } |
| 2171 | 2244 |
| 2172 if (!swallowMouseUpEvent) | 2245 if (!swallowMouseUpEvent) |
| 2173 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul ts(fakeMouseUp, currentHitTest)); | 2246 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul ts(fakeMouseUp, currentHitTest)); |
| 2174 | 2247 |
| 2175 bool swallowed = swallowMouseDownEvent | swallowMouseUpEvent | swallowClickE vent; | 2248 bool swallowed = swallowMouseDownEvent | swallowMouseUpEvent | swallowClickE vent; |
| 2176 if (!swallowed && tappedNode && m_frame->page()) { | 2249 if (!swallowed && tappedNode && m_frame->page()) { |
| 2177 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()-> domTreeVersion(); | 2250 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()-> domTreeVersion(); |
| (...skipping 626 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2804 | 2877 |
| 2805 // Clear mouse press state to avoid initiating a drag while context menu is up. | 2878 // Clear mouse press state to avoid initiating a drag while context menu is up. |
| 2806 m_mousePressed = false; | 2879 m_mousePressed = false; |
| 2807 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); | 2880 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); |
| 2808 HitTestRequest request(HitTestRequest::Active); | 2881 HitTestRequest request(HitTestRequest::Active); |
| 2809 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, positionInContents, event); | 2882 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re quest, positionInContents, event); |
| 2810 | 2883 |
| 2811 selectionController().sendContextMenuEvent(mev, positionInContents); | 2884 selectionController().sendContextMenuEvent(mev, positionInContents); |
| 2812 | 2885 |
| 2813 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ; | 2886 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode() ; |
| 2814 return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event ); | 2887 return dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event) ; |
| 2815 } | 2888 } |
| 2816 | 2889 |
| 2817 bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) | 2890 bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) |
| 2818 { | 2891 { |
| 2819 FrameView* view = m_frame->view(); | 2892 FrameView* view = m_frame->view(); |
| 2820 if (!view) | 2893 if (!view) |
| 2821 return false; | 2894 return false; |
| 2822 | 2895 |
| 2823 Document* doc = m_frame->document(); | 2896 Document* doc = m_frame->document(); |
| 2824 if (!doc) | 2897 if (!doc) |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3547 m_lastScrollbarUnderMouse->mouseExited(); | 3620 m_lastScrollbarUnderMouse->mouseExited(); |
| 3548 | 3621 |
| 3549 // Send mouse entered if we're setting a new scrollbar. | 3622 // Send mouse entered if we're setting a new scrollbar. |
| 3550 if (scrollbar && setLast) | 3623 if (scrollbar && setLast) |
| 3551 scrollbar->mouseEntered(); | 3624 scrollbar->mouseEntered(); |
| 3552 | 3625 |
| 3553 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr; | 3626 m_lastScrollbarUnderMouse = setLast ? scrollbar : nullptr; |
| 3554 } | 3627 } |
| 3555 } | 3628 } |
| 3556 | 3629 |
| 3557 static const AtomicString& touchEventNameForTouchPointState(PlatformTouchPoint:: State state) | |
| 3558 { | |
| 3559 switch (state) { | |
| 3560 case PlatformTouchPoint::TouchReleased: | |
| 3561 return EventTypeNames::touchend; | |
| 3562 case PlatformTouchPoint::TouchCancelled: | |
| 3563 return EventTypeNames::touchcancel; | |
| 3564 case PlatformTouchPoint::TouchPressed: | |
| 3565 return EventTypeNames::touchstart; | |
| 3566 case PlatformTouchPoint::TouchMoved: | |
| 3567 return EventTypeNames::touchmove; | |
| 3568 case PlatformTouchPoint::TouchStationary: | |
| 3569 // Fall through to default | |
| 3570 default: | |
| 3571 ASSERT_NOT_REACHED(); | |
| 3572 return emptyAtom; | |
| 3573 } | |
| 3574 } | |
| 3575 | |
| 3576 static const AtomicString& pointerEventNameForTouchPointState(PlatformTouchPoint ::State state) | |
| 3577 { | |
| 3578 switch (state) { | |
| 3579 case PlatformTouchPoint::TouchReleased: | |
| 3580 return EventTypeNames::pointerup; | |
| 3581 case PlatformTouchPoint::TouchCancelled: | |
| 3582 return EventTypeNames::pointercancel; | |
| 3583 case PlatformTouchPoint::TouchPressed: | |
| 3584 return EventTypeNames::pointerdown; | |
| 3585 case PlatformTouchPoint::TouchMoved: | |
| 3586 return EventTypeNames::pointermove; | |
| 3587 case PlatformTouchPoint::TouchStationary: | |
| 3588 // Fall through to default | |
| 3589 default: | |
| 3590 ASSERT_NOT_REACHED(); | |
| 3591 return emptyAtom; | |
| 3592 } | |
| 3593 } | |
| 3594 | |
| 3595 HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const Layout Point& point, HitTestRequest::HitTestRequestType hitType) | 3630 HitTestResult EventHandler::hitTestResultInFrame(LocalFrame* frame, const Layout Point& point, HitTestRequest::HitTestRequestType hitType) |
| 3596 { | 3631 { |
| 3597 HitTestResult result(HitTestRequest(hitType), point); | 3632 HitTestResult result(HitTestRequest(hitType), point); |
| 3598 | 3633 |
| 3599 if (!frame || !frame->contentLayoutObject()) | 3634 if (!frame || !frame->contentLayoutObject()) |
| 3600 return result; | 3635 return result; |
| 3601 if (frame->view()) { | 3636 if (frame->view()) { |
| 3602 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); | 3637 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); |
| 3603 if (!rect.contains(roundedIntPoint(point))) | 3638 if (!rect.contains(roundedIntPoint(point))) |
| 3604 return result; | 3639 return result; |
| (...skipping 429 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4034 PlatformEvent::Modifiers EventHandler::accessKeyModifiers() | 4069 PlatformEvent::Modifiers EventHandler::accessKeyModifiers() |
| 4035 { | 4070 { |
| 4036 #if OS(MACOSX) | 4071 #if OS(MACOSX) |
| 4037 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo rmEvent::AltKey); | 4072 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo rmEvent::AltKey); |
| 4038 #else | 4073 #else |
| 4039 return PlatformEvent::AltKey; | 4074 return PlatformEvent::AltKey; |
| 4040 #endif | 4075 #endif |
| 4041 } | 4076 } |
| 4042 | 4077 |
| 4043 } // namespace blink | 4078 } // namespace blink |
| OLD | NEW |