| 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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 246 } | 246 } |
| 247 | 247 |
| 248 DEFINE_TRACE(EventHandler) | 248 DEFINE_TRACE(EventHandler) |
| 249 { | 249 { |
| 250 #if ENABLE(OILPAN) | 250 #if ENABLE(OILPAN) |
| 251 visitor->trace(m_frame); | 251 visitor->trace(m_frame); |
| 252 visitor->trace(m_mousePressNode); | 252 visitor->trace(m_mousePressNode); |
| 253 visitor->trace(m_resizeScrollableArea); | 253 visitor->trace(m_resizeScrollableArea); |
| 254 visitor->trace(m_capturingMouseEventsNode); | 254 visitor->trace(m_capturingMouseEventsNode); |
| 255 visitor->trace(m_nodeUnderMouse); | 255 visitor->trace(m_nodeUnderMouse); |
| 256 visitor->trace(m_lastNodeUnderMouse); | |
| 257 visitor->trace(m_lastMouseMoveEventSubframe); | 256 visitor->trace(m_lastMouseMoveEventSubframe); |
| 258 visitor->trace(m_lastScrollbarUnderMouse); | 257 visitor->trace(m_lastScrollbarUnderMouse); |
| 259 visitor->trace(m_clickNode); | 258 visitor->trace(m_clickNode); |
| 260 visitor->trace(m_dragTarget); | 259 visitor->trace(m_dragTarget); |
| 261 visitor->trace(m_frameSetBeingResized); | 260 visitor->trace(m_frameSetBeingResized); |
| 262 visitor->trace(m_previousWheelScrolledNode); | 261 visitor->trace(m_previousWheelScrolledNode); |
| 263 visitor->trace(m_scrollbarHandlingScrollGesture); | 262 visitor->trace(m_scrollbarHandlingScrollGesture); |
| 264 visitor->trace(m_targetForTouchID); | 263 visitor->trace(m_targetForTouchID); |
| 265 visitor->trace(m_touchSequenceDocument); | 264 visitor->trace(m_touchSequenceDocument); |
| 266 visitor->trace(m_scrollGestureHandlingNode); | 265 visitor->trace(m_scrollGestureHandlingNode); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 278 } | 277 } |
| 279 | 278 |
| 280 void EventHandler::clear() | 279 void EventHandler::clear() |
| 281 { | 280 { |
| 282 m_hoverTimer.stop(); | 281 m_hoverTimer.stop(); |
| 283 m_cursorUpdateTimer.stop(); | 282 m_cursorUpdateTimer.stop(); |
| 284 m_fakeMouseMoveEventTimer.stop(); | 283 m_fakeMouseMoveEventTimer.stop(); |
| 285 m_activeIntervalTimer.stop(); | 284 m_activeIntervalTimer.stop(); |
| 286 m_resizeScrollableArea = nullptr; | 285 m_resizeScrollableArea = nullptr; |
| 287 m_nodeUnderMouse = nullptr; | 286 m_nodeUnderMouse = nullptr; |
| 288 m_lastNodeUnderMouse = nullptr; | |
| 289 m_lastMouseMoveEventSubframe = nullptr; | 287 m_lastMouseMoveEventSubframe = nullptr; |
| 290 m_lastScrollbarUnderMouse = nullptr; | 288 m_lastScrollbarUnderMouse = nullptr; |
| 291 m_clickCount = 0; | 289 m_clickCount = 0; |
| 292 m_clickNode = nullptr; | 290 m_clickNode = nullptr; |
| 293 m_frameSetBeingResized = nullptr; | 291 m_frameSetBeingResized = nullptr; |
| 294 m_dragTarget = nullptr; | 292 m_dragTarget = nullptr; |
| 295 m_shouldOnlyFireDragOverEvent = false; | 293 m_shouldOnlyFireDragOverEvent = false; |
| 296 m_mousePositionIsUnknown = true; | 294 m_mousePositionIsUnknown = true; |
| 297 m_lastKnownMousePosition = IntPoint(); | 295 m_lastKnownMousePosition = IntPoint(); |
| 298 m_lastKnownMouseGlobalPosition = IntPoint(); | 296 m_lastKnownMouseGlobalPosition = IntPoint(); |
| (...skipping 659 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 958 m_resizeScrollableArea = layer->scrollableArea(); | 956 m_resizeScrollableArea = layer->scrollableArea(); |
| 959 m_resizeScrollableArea->setInResizeMode(true); | 957 m_resizeScrollableArea->setInResizeMode(true); |
| 960 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); | 958 m_offsetFromResizeCorner = LayoutSize(m_resizeScrollableArea->offset
FromResizeCorner(p)); |
| 961 invalidateClick(); | 959 invalidateClick(); |
| 962 return true; | 960 return true; |
| 963 } | 961 } |
| 964 } | 962 } |
| 965 | 963 |
| 966 m_frame->selection().setCaretBlinkingSuspended(true); | 964 m_frame->selection().setCaretBlinkingSuspended(true); |
| 967 | 965 |
| 968 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.inner
Node(), m_clickCount, mouseEvent, true); | 966 bool swallowEvent = !dispatchMouseEvent(EventTypeNames::mousedown, mev.inner
Node(), m_clickCount, mouseEvent); |
| 969 // m_selectionInitiationState is initialized after dispatching mousedown | 967 // m_selectionInitiationState is initialized after dispatching mousedown |
| 970 // event in order not to keep the selection by DOM APIs Because we can't | 968 // event in order not to keep the selection by DOM APIs Because we can't |
| 971 // give the user the chance to handle the selection by user action like | 969 // give the user the chance to handle the selection by user action like |
| 972 // dragging if we keep the selection in case of mousedown. FireFox also has | 970 // dragging if we keep the selection in case of mousedown. FireFox also has |
| 973 // the same behavior and it's more compatible with other browsers. | 971 // the same behavior and it's more compatible with other browsers. |
| 974 selectionController().initializeSelectionState(); | 972 selectionController().initializeSelectionState(); |
| 975 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, mouseEvent.posit
ion(), HitTestRequest::ReadOnly); | 973 HitTestResult hitTestResult = hitTestResultInFrame(m_frame, mouseEvent.posit
ion(), HitTestRequest::ReadOnly); |
| 976 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType(
) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo
urceCapabilities() : | 974 InputDeviceCapabilities* sourceCapabilities = mouseEvent.syntheticEventType(
) == PlatformMouseEvent::FromTouch ? InputDeviceCapabilities::firesTouchEventsSo
urceCapabilities() : |
| 977 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); | 975 InputDeviceCapabilities::doesntFireTouchEventsSourceCapabilities(); |
| 978 swallowEvent = swallowEvent || handleMouseFocus(MouseEventWithHitTestResults
(mouseEvent, hitTestResult), sourceCapabilities); | 976 swallowEvent = swallowEvent || handleMouseFocus(MouseEventWithHitTestResults
(mouseEvent, hitTestResult), sourceCapabilities); |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1087 m_cursorUpdateTimer.stop(); | 1085 m_cursorUpdateTimer.stop(); |
| 1088 | 1086 |
| 1089 cancelFakeMouseMoveEvent(); | 1087 cancelFakeMouseMoveEvent(); |
| 1090 | 1088 |
| 1091 if (m_svgPan) { | 1089 if (m_svgPan) { |
| 1092 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro
otFrameToContents(m_lastKnownMousePosition)); | 1090 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro
otFrameToContents(m_lastKnownMousePosition)); |
| 1093 return true; | 1091 return true; |
| 1094 } | 1092 } |
| 1095 | 1093 |
| 1096 if (m_frameSetBeingResized) | 1094 if (m_frameSetBeingResized) |
| 1097 return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingRes
ized.get(), 0, mouseEvent, false); | 1095 return !dispatchMouseEvent(EventTypeNames::mousemove, m_frameSetBeingRes
ized.get(), 0, mouseEvent); |
| 1098 | 1096 |
| 1099 // Send events right to a scrollbar if the mouse is pressed. | 1097 // Send events right to a scrollbar if the mouse is pressed. |
| 1100 if (m_lastScrollbarUnderMouse && m_mousePressed) { | 1098 if (m_lastScrollbarUnderMouse && m_mousePressed) { |
| 1101 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); | 1099 m_lastScrollbarUnderMouse->mouseMoved(mouseEvent); |
| 1102 return true; | 1100 return true; |
| 1103 } | 1101 } |
| 1104 | 1102 |
| 1105 // Mouse events simulated from touch should not hit-test again. | 1103 // Mouse events simulated from touch should not hit-test again. |
| 1106 ASSERT(!mouseEvent.fromTouch()); | 1104 ASSERT(!mouseEvent.fromTouch()); |
| 1107 | 1105 |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 | 1145 |
| 1148 bool swallowEvent = false; | 1146 bool swallowEvent = false; |
| 1149 RefPtrWillBeRawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get(
) ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTest
Result(mev); | 1147 RefPtrWillBeRawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get(
) ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTest
Result(mev); |
| 1150 | 1148 |
| 1151 // We want mouseouts to happen first, from the inside out. First send a mov
e event to the last subframe so that it will fire mouseouts. | 1149 // We want mouseouts to happen first, from the inside out. First send a mov
e event to the last subframe so that it will fire mouseouts. |
| 1152 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD
escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) | 1150 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD
escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) |
| 1153 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mouse
Event); | 1151 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mouse
Event); |
| 1154 | 1152 |
| 1155 if (newSubframe) { | 1153 if (newSubframe) { |
| 1156 // Update over/out state before passing the event to the subframe. | 1154 // Update over/out state before passing the event to the subframe. |
| 1157 updateMouseEventTargetNode(mev.innerNode(), mouseEvent, true); | 1155 updateMouseEventTargetNode(mev.innerNode(), mouseEvent); |
| 1158 | 1156 |
| 1159 // Event dispatch in updateMouseEventTargetNode may have caused the subf
rame of the target | 1157 // Event dispatch in updateMouseEventTargetNode may have caused the subf
rame of the target |
| 1160 // node to be detached from its FrameView, in which case the event shoul
d not be passed. | 1158 // node to be detached from its FrameView, in which case the event shoul
d not be passed. |
| 1161 if (newSubframe->view()) | 1159 if (newSubframe->view()) |
| 1162 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(),
hoveredNode); | 1160 swallowEvent |= passMouseMoveEventToSubframe(mev, newSubframe.get(),
hoveredNode); |
| 1163 } else { | 1161 } else { |
| 1164 if (scrollbar && !m_mousePressed) | 1162 if (scrollbar && !m_mousePressed) |
| 1165 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo
rms that support visual feedback on scrollbar hovering. | 1163 scrollbar->mouseMoved(mouseEvent); // Handle hover effects on platfo
rms that support visual feedback on scrollbar hovering. |
| 1166 if (FrameView* view = m_frame->view()) { | 1164 if (FrameView* view = m_frame->view()) { |
| 1167 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); | 1165 OptionalCursor optionalCursor = selectCursor(mev.hitTestResult()); |
| 1168 if (optionalCursor.isCursorChange()) { | 1166 if (optionalCursor.isCursorChange()) { |
| 1169 view->setCursor(optionalCursor.cursor()); | 1167 view->setCursor(optionalCursor.cursor()); |
| 1170 } | 1168 } |
| 1171 } | 1169 } |
| 1172 } | 1170 } |
| 1173 | 1171 |
| 1174 m_lastMouseMoveEventSubframe = newSubframe; | 1172 m_lastMouseMoveEventSubframe = newSubframe; |
| 1175 | 1173 |
| 1176 if (swallowEvent) | 1174 if (swallowEvent) |
| 1177 return true; | 1175 return true; |
| 1178 | 1176 |
| 1179 swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode(
), 0, mouseEvent, true); | 1177 swallowEvent = !dispatchMouseEvent(EventTypeNames::mousemove, mev.innerNode(
), 0, mouseEvent); |
| 1180 if (!swallowEvent) | 1178 if (!swallowEvent) |
| 1181 swallowEvent = handleMouseDraggedEvent(mev); | 1179 swallowEvent = handleMouseDraggedEvent(mev); |
| 1182 | 1180 |
| 1183 return swallowEvent; | 1181 return swallowEvent; |
| 1184 } | 1182 } |
| 1185 | 1183 |
| 1186 void EventHandler::invalidateClick() | 1184 void EventHandler::invalidateClick() |
| 1187 { | 1185 { |
| 1188 m_clickCount = 0; | 1186 m_clickCount = 0; |
| 1189 m_clickNode = nullptr; | 1187 m_clickNode = nullptr; |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1222 m_mousePressed = false; | 1220 m_mousePressed = false; |
| 1223 setLastKnownMousePosition(mouseEvent); | 1221 setLastKnownMousePosition(mouseEvent); |
| 1224 | 1222 |
| 1225 if (m_svgPan) { | 1223 if (m_svgPan) { |
| 1226 m_svgPan = false; | 1224 m_svgPan = false; |
| 1227 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro
otFrameToContents(m_lastKnownMousePosition)); | 1225 m_frame->document()->accessSVGExtensions().updatePan(m_frame->view()->ro
otFrameToContents(m_lastKnownMousePosition)); |
| 1228 return true; | 1226 return true; |
| 1229 } | 1227 } |
| 1230 | 1228 |
| 1231 if (m_frameSetBeingResized) | 1229 if (m_frameSetBeingResized) |
| 1232 return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResiz
ed.get(), m_clickCount, mouseEvent, false); | 1230 return !dispatchMouseEvent(EventTypeNames::mouseup, m_frameSetBeingResiz
ed.get(), m_clickCount, mouseEvent); |
| 1233 | 1231 |
| 1234 if (m_lastScrollbarUnderMouse) { | 1232 if (m_lastScrollbarUnderMouse) { |
| 1235 invalidateClick(); | 1233 invalidateClick(); |
| 1236 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); | 1234 m_lastScrollbarUnderMouse->mouseUp(mouseEvent); |
| 1237 bool setUnder = false; | 1235 return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get
(), m_clickCount, mouseEvent); |
| 1238 return !dispatchMouseEvent(EventTypeNames::mouseup, m_nodeUnderMouse.get
(), m_clickCount, mouseEvent, setUnder); | |
| 1239 } | 1236 } |
| 1240 | 1237 |
| 1241 // Mouse events simulated from touch should not hit-test again. | 1238 // Mouse events simulated from touch should not hit-test again. |
| 1242 ASSERT(!mouseEvent.fromTouch()); | 1239 ASSERT(!mouseEvent.fromTouch()); |
| 1243 | 1240 |
| 1244 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; | 1241 HitTestRequest::HitTestRequestType hitType = HitTestRequest::Release; |
| 1245 HitTestRequest request(hitType); | 1242 HitTestRequest request(hitType); |
| 1246 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); | 1243 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseEvent); |
| 1247 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN
ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); | 1244 LocalFrame* subframe = m_capturingMouseEventsNode.get() ? subframeForTargetN
ode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); |
| 1248 if (m_eventHandlerWillResetCapturingMouseEventsNode) | 1245 if (m_eventHandlerWillResetCapturingMouseEventsNode) |
| 1249 m_capturingMouseEventsNode = nullptr; | 1246 m_capturingMouseEventsNode = nullptr; |
| 1250 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) | 1247 if (subframe && passMouseReleaseEventToSubframe(mev, subframe)) |
| 1251 return true; | 1248 return true; |
| 1252 | 1249 |
| 1253 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.
innerNode(), m_clickCount, mouseEvent, false); | 1250 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, mev.
innerNode(), m_clickCount, mouseEvent); |
| 1254 | 1251 |
| 1255 bool contextMenuEvent = mouseEvent.button() == RightButton; | 1252 bool contextMenuEvent = mouseEvent.button() == RightButton; |
| 1256 #if OS(MACOSX) | 1253 #if OS(MACOSX) |
| 1257 // 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. | 1254 // 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. |
| 1258 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv
ent::CtrlKey) | 1255 if (mouseEvent.button() == LeftButton && mouseEvent.modifiers() & PlatformEv
ent::CtrlKey) |
| 1259 contextMenuEvent = true; | 1256 contextMenuEvent = true; |
| 1260 #endif | 1257 #endif |
| 1261 | 1258 |
| 1262 bool swallowClickEvent = false; | 1259 bool swallowClickEvent = false; |
| 1263 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode
&& mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat
eInComposedTree()) { | 1260 if (m_clickCount > 0 && !contextMenuEvent && mev.innerNode() && m_clickNode
&& mev.innerNode()->canParticipateInComposedTree() && m_clickNode->canParticipat
eInComposedTree()) { |
| 1264 // Updates distribution because a 'mouseup' event listener can make the | 1261 // Updates distribution because a 'mouseup' event listener can make the |
| 1265 // tree dirty at dispatchMouseEvent() invocation above. | 1262 // tree dirty at dispatchMouseEvent() invocation above. |
| 1266 // Unless distribution is updated, commonAncestor would hit ASSERT. | 1263 // Unless distribution is updated, commonAncestor would hit ASSERT. |
| 1267 // Both m_clickNode and mev.innerNode() don't need to be updated | 1264 // Both m_clickNode and mev.innerNode() don't need to be updated |
| 1268 // because commonAncestor() will exit early if their documents are diffe
rent. | 1265 // because commonAncestor() will exit early if their documents are diffe
rent. |
| 1269 m_clickNode->updateDistribution(); | 1266 m_clickNode->updateDistribution(); |
| 1270 if (Node* clickTargetNode = mev.innerNode()->commonAncestor(*m_clickNode
, parentForClickEvent)) | 1267 if (Node* clickTargetNode = mev.innerNode()->commonAncestor(*m_clickNode
, parentForClickEvent)) |
| 1271 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, m_clickCount, mouseEvent, true); | 1268 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, m_clickCount, mouseEvent); |
| 1272 } | 1269 } |
| 1273 | 1270 |
| 1274 if (m_resizeScrollableArea) { | 1271 if (m_resizeScrollableArea) { |
| 1275 m_resizeScrollableArea->setInResizeMode(false); | 1272 m_resizeScrollableArea->setInResizeMode(false); |
| 1276 m_resizeScrollableArea = nullptr; | 1273 m_resizeScrollableArea = nullptr; |
| 1277 } | 1274 } |
| 1278 | 1275 |
| 1279 bool swallowMouseReleaseEvent = false; | 1276 bool swallowMouseReleaseEvent = false; |
| 1280 if (!swallowMouseUpEvent) | 1277 if (!swallowMouseUpEvent) |
| 1281 swallowMouseReleaseEvent = handleMouseReleaseEvent(mev); | 1278 swallowMouseReleaseEvent = handleMouseReleaseEvent(mev); |
| (...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1472 } | 1469 } |
| 1473 | 1470 |
| 1474 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
t& request, const PlatformMouseEvent& mev) | 1471 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
t& request, const PlatformMouseEvent& mev) |
| 1475 { | 1472 { |
| 1476 ASSERT(m_frame); | 1473 ASSERT(m_frame); |
| 1477 ASSERT(m_frame->document()); | 1474 ASSERT(m_frame->document()); |
| 1478 | 1475 |
| 1479 return m_frame->document()->prepareMouseEvent(request, contentPointFromRootF
rame(m_frame, mev.position()), mev); | 1476 return m_frame->document()->prepareMouseEvent(request, contentPointFromRootF
rame(m_frame, mev.position()), mev); |
| 1480 } | 1477 } |
| 1481 | 1478 |
| 1482 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
useEvent& mouseEvent, bool fireMouseEvents) | 1479 void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
useEvent& mouseEvent) |
| 1483 { | 1480 { |
| 1484 Node* result = targetNode; | 1481 Node* result = targetNode; |
| 1485 | 1482 |
| 1486 // If we're capturing, we always go right to that node. | 1483 // If we're capturing, we always go right to that node. |
| 1487 if (m_capturingMouseEventsNode) { | 1484 if (m_capturingMouseEventsNode) { |
| 1488 result = m_capturingMouseEventsNode.get(); | 1485 result = m_capturingMouseEventsNode.get(); |
| 1489 } else { | 1486 } else { |
| 1490 // If the target node is a text node, dispatch on the parent node - rdar
://4196646 | 1487 // If the target node is a text node, dispatch on the parent node - rdar
://4196646 |
| 1491 if (result && result->isTextNode()) | 1488 if (result && result->isTextNode()) |
| 1492 result = ComposedTreeTraversal::parent(*result); | 1489 result = ComposedTreeTraversal::parent(*result); |
| 1493 } | 1490 } |
| 1491 RefPtrWillBeMember<Node> lastNodeUnderMouse = m_nodeUnderMouse; |
| 1494 m_nodeUnderMouse = result; | 1492 m_nodeUnderMouse = result; |
| 1495 | 1493 |
| 1496 if (fireMouseEvents) { | 1494 DeprecatedPaintLayer* layerForLastNode = layerForNode(lastNodeUnderMouse.get
()); |
| 1497 DeprecatedPaintLayer* layerForLastNode = layerForNode(m_lastNodeUnderMou
se.get()); | 1495 DeprecatedPaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse
.get()); |
| 1498 DeprecatedPaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderM
ouse.get()); | 1496 Page* page = m_frame->page(); |
| 1499 Page* page = m_frame->page(); | |
| 1500 | 1497 |
| 1501 if (m_lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->docu
ment() != m_frame->document())) { | 1498 if (lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document()
!= m_frame->document())) { |
| 1502 // The mouse has moved between frames. | 1499 // The mouse has moved between frames. |
| 1503 if (LocalFrame* frame = m_lastNodeUnderMouse->document().frame()) { | 1500 if (LocalFrame* frame = lastNodeUnderMouse->document().frame()) { |
| 1504 if (FrameView* frameView = frame->view()) | 1501 if (FrameView* frameView = frame->view()) |
| 1505 frameView->mouseExitedContentArea(); | 1502 frameView->mouseExitedContentArea(); |
| 1506 } | |
| 1507 } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || laye
rForNodeUnderMouse != layerForLastNode))) { | |
| 1508 // The mouse has moved between layers. | |
| 1509 if (ScrollableArea* scrollableAreaForLastNode = associatedScrollable
Area(layerForLastNode)) | |
| 1510 scrollableAreaForLastNode->mouseExitedContentArea(); | |
| 1511 } | 1503 } |
| 1504 } else if (page && (layerForLastNode && (!layerForNodeUnderMouse || layerFor
NodeUnderMouse != layerForLastNode))) { |
| 1505 // The mouse has moved between layers. |
| 1506 if (ScrollableArea* scrollableAreaForLastNode = associatedScrollableArea
(layerForLastNode)) |
| 1507 scrollableAreaForLastNode->mouseExitedContentArea(); |
| 1508 } |
| 1512 | 1509 |
| 1513 if (m_nodeUnderMouse && (!m_lastNodeUnderMouse || m_lastNodeUnderMouse->
document() != m_frame->document())) { | 1510 if (m_nodeUnderMouse && (!lastNodeUnderMouse || lastNodeUnderMouse->document
() != m_frame->document())) { |
| 1514 // The mouse has moved between frames. | 1511 // The mouse has moved between frames. |
| 1515 if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) { | 1512 if (LocalFrame* frame = m_nodeUnderMouse->document().frame()) { |
| 1516 if (FrameView* frameView = frame->view()) | 1513 if (FrameView* frameView = frame->view()) |
| 1517 frameView->mouseEnteredContentArea(); | 1514 frameView->mouseEnteredContentArea(); |
| 1518 } | |
| 1519 } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || laye
rForNodeUnderMouse != layerForLastNode))) { | |
| 1520 // The mouse has moved between layers. | |
| 1521 if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScro
llableArea(layerForNodeUnderMouse)) | |
| 1522 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea(); | |
| 1523 } | 1515 } |
| 1516 } else if (page && (layerForNodeUnderMouse && (!layerForLastNode || layerFor
NodeUnderMouse != layerForLastNode))) { |
| 1517 // The mouse has moved between layers. |
| 1518 if (ScrollableArea* scrollableAreaForNodeUnderMouse = associatedScrollab
leArea(layerForNodeUnderMouse)) |
| 1519 scrollableAreaForNodeUnderMouse->mouseEnteredContentArea(); |
| 1520 } |
| 1524 | 1521 |
| 1525 if (m_lastNodeUnderMouse && m_lastNodeUnderMouse->document() != m_frame-
>document()) { | 1522 if (lastNodeUnderMouse && lastNodeUnderMouse->document() != m_frame->documen
t()) { |
| 1526 m_lastNodeUnderMouse = nullptr; | 1523 lastNodeUnderMouse = nullptr; |
| 1527 m_lastScrollbarUnderMouse = nullptr; | 1524 m_lastScrollbarUnderMouse = nullptr; |
| 1528 } | 1525 } |
| 1529 | 1526 |
| 1530 if (m_lastNodeUnderMouse != m_nodeUnderMouse) | 1527 if (lastNodeUnderMouse != m_nodeUnderMouse) |
| 1531 sendMouseEventsForNodeTransition(m_lastNodeUnderMouse.get(), m_nodeU
nderMouse.get(), mouseEvent); | 1528 sendMouseEventsForNodeTransition(lastNodeUnderMouse.get(), m_nodeUnderMo
use.get(), mouseEvent); |
| 1532 | |
| 1533 m_lastNodeUnderMouse = m_nodeUnderMouse; | |
| 1534 } | |
| 1535 } | 1529 } |
| 1536 | 1530 |
| 1537 void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente
redNode, const PlatformMouseEvent& mouseEvent) | 1531 void EventHandler::sendMouseEventsForNodeTransition(Node* exitedNode, Node* ente
redNode, const PlatformMouseEvent& mouseEvent) |
| 1538 { | 1532 { |
| 1539 ASSERT(exitedNode != enteredNode); | 1533 ASSERT(exitedNode != enteredNode); |
| 1540 | 1534 |
| 1541 // First, dispatch mouseout event (which bubbles to ancestors) | 1535 // First, dispatch mouseout event (which bubbles to ancestors) |
| 1542 if (isNodeInDocument(exitedNode)) | 1536 if (isNodeInDocument(exitedNode)) |
| 1543 exitedNode->dispatchMouseEvent(mouseEvent, EventTypeNames::mouseout, 0,
enteredNode); | 1537 exitedNode->dispatchMouseEvent(mouseEvent, EventTypeNames::mouseout, 0,
enteredNode); |
| 1544 | 1538 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1616 } | 1610 } |
| 1617 | 1611 |
| 1618 // Send mouseenter events to appropriate entered ancestors, in parent-to-chi
ld order. | 1612 // Send mouseenter events to appropriate entered ancestors, in parent-to-chi
ld order. |
| 1619 for (size_t i = enteredAncestorIndex; i > 0; i--) { | 1613 for (size_t i = enteredAncestorIndex; i > 0; i--) { |
| 1620 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi
steners(EventTypeNames::mouseenter)) | 1614 if (enteredNodeHasCapturingAncestor || enteredAncestors[i-1]->hasEventLi
steners(EventTypeNames::mouseenter)) |
| 1621 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames
::mouseenter, 0, exitedNode); | 1615 enteredAncestors[i-1]->dispatchMouseEvent(mouseEvent, EventTypeNames
::mouseenter, 0, exitedNode); |
| 1622 } | 1616 } |
| 1623 } | 1617 } |
| 1624 | 1618 |
| 1625 // The return value means 'continue default handling.' | 1619 // The return value means 'continue default handling.' |
| 1626 // TODO(mustaq): setUnder needs a more informative name. | 1620 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe
tNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
| 1627 bool EventHandler::dispatchMouseEvent(const AtomicString& eventType, Node* targe
tNode, int clickCount, const PlatformMouseEvent& mouseEvent, bool setUnder) | |
| 1628 { | 1621 { |
| 1629 updateMouseEventTargetNode(targetNode, mouseEvent, setUnder); | 1622 updateMouseEventTargetNode(targetNode, mouseEvent); |
| 1630 return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent,
eventType, clickCount); | 1623 return !m_nodeUnderMouse || m_nodeUnderMouse->dispatchMouseEvent(mouseEvent,
eventType, clickCount); |
| 1631 } | 1624 } |
| 1632 | 1625 |
| 1633 // The return value means 'swallow event' (was handled), as for other handle* fu
nctions. | 1626 // The return value means 'swallow event' (was handled), as for other handle* fu
nctions. |
| 1634 bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted
Event, InputDeviceCapabilities* sourceCapabilities) | 1627 bool EventHandler::handleMouseFocus(const MouseEventWithHitTestResults& targeted
Event, InputDeviceCapabilities* sourceCapabilities) |
| 1635 { | 1628 { |
| 1636 const PlatformMouseEvent& mouseEvent = targetedEvent.event(); | 1629 const PlatformMouseEvent& mouseEvent = targetedEvent.event(); |
| 1637 | 1630 |
| 1638 // If clicking on a frame scrollbar, do not mess up with content focus. | 1631 // If clicking on a frame scrollbar, do not mess up with content focus. |
| 1639 if (FrameView* view = m_frame->view()) { | 1632 if (FrameView* view = m_frame->view()) { |
| (...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1998 | 1991 |
| 1999 // We use the adjusted position so the application isn't surprised to see a
event with | 1992 // We use the adjusted position so the application isn't surprised to see a
event with |
| 2000 // co-ordinates outside the target's bounds. | 1993 // co-ordinates outside the target's bounds. |
| 2001 IntPoint adjustedPoint = frameView->rootFrameToContents(gestureEvent.positio
n()); | 1994 IntPoint adjustedPoint = frameView->rootFrameToContents(gestureEvent.positio
n()); |
| 2002 | 1995 |
| 2003 unsigned modifiers = gestureEvent.modifiers(); | 1996 unsigned modifiers = gestureEvent.modifiers(); |
| 2004 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), | 1997 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), |
| 2005 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, | 1998 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| 2006 static_cast<PlatformEvent::Modifiers>(modifiers), | 1999 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2007 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2000 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2008 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0,
fakeMouseMove, true); | 2001 dispatchMouseEvent(EventTypeNames::mousemove, currentHitTest.innerNode(), 0,
fakeMouseMove); |
| 2009 | 2002 |
| 2010 // Do a new hit-test in case the mousemove event changed the DOM. | 2003 // Do a new hit-test in case the mousemove event changed the DOM. |
| 2011 // Note that if the original hit test wasn't over an element (eg. was over a
scrollbar) we | 2004 // Note that if the original hit test wasn't over an element (eg. was over a
scrollbar) we |
| 2012 // don't want to re-hit-test because it may be in the wrong frame (and there
's no way the page | 2005 // don't want to re-hit-test because it may be in the wrong frame (and there
's no way the page |
| 2013 // could have seen the event anyway). | 2006 // could have seen the event anyway). |
| 2014 // Also note that the position of the frame may have changed, so we need to
recompute the content | 2007 // Also note that the position of the frame may have changed, so we need to
recompute the content |
| 2015 // co-ordinates (updating layout/style as hitTestResultAtPoint normally woul
d). | 2008 // co-ordinates (updating layout/style as hitTestResultAtPoint normally woul
d). |
| 2016 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 | 2009 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 |
| 2017 if (currentHitTest.innerNode()) { | 2010 if (currentHitTest.innerNode()) { |
| 2018 LocalFrame* mainFrame = m_frame->localFrameRoot(); | 2011 LocalFrame* mainFrame = m_frame->localFrameRoot(); |
| 2019 if (mainFrame && mainFrame->view()) | 2012 if (mainFrame && mainFrame->view()) |
| 2020 mainFrame->view()->updateAllLifecyclePhases(); | 2013 mainFrame->view()->updateAllLifecyclePhases(); |
| 2021 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); | 2014 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| 2022 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2015 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
| 2023 } | 2016 } |
| 2024 m_clickNode = currentHitTest.innerNode(); | 2017 m_clickNode = currentHitTest.innerNode(); |
| 2025 | 2018 |
| 2026 // Capture data for showUnhandledTapUIIfNeeded. | 2019 // Capture data for showUnhandledTapUIIfNeeded. |
| 2027 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; | 2020 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; |
| 2028 IntPoint tappedPosition = gestureEvent.position(); | 2021 IntPoint tappedPosition = gestureEvent.position(); |
| 2029 | 2022 |
| 2030 if (m_clickNode && m_clickNode->isTextNode()) | 2023 if (m_clickNode && m_clickNode->isTextNode()) |
| 2031 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode); | 2024 m_clickNode = ComposedTreeTraversal::parent(*m_clickNode); |
| 2032 | 2025 |
| 2033 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2026 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), |
| 2034 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), | 2027 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| 2035 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut
tonDown), | 2028 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut
tonDown), |
| 2036 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2029 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2037 bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown,
currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown, true); | 2030 bool swallowMouseDownEvent = !dispatchMouseEvent(EventTypeNames::mousedown,
currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown); |
| 2038 selectionController().initializeSelectionState(); | 2031 selectionController().initializeSelectionState(); |
| 2039 if (!swallowMouseDownEvent) | 2032 if (!swallowMouseDownEvent) |
| 2040 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa
keMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCap
abilities()); | 2033 swallowMouseDownEvent = handleMouseFocus(MouseEventWithHitTestResults(fa
keMouseDown, currentHitTest), InputDeviceCapabilities::firesTouchEventsSourceCap
abilities()); |
| 2041 if (!swallowMouseDownEvent) | 2034 if (!swallowMouseDownEvent) |
| 2042 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul
ts(fakeMouseDown, currentHitTest)); | 2035 swallowMouseDownEvent = handleMousePressEvent(MouseEventWithHitTestResul
ts(fakeMouseDown, currentHitTest)); |
| 2043 | 2036 |
| 2044 if (currentHitTest.innerNode()) { | 2037 if (currentHitTest.innerNode()) { |
| 2045 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); | 2038 ASSERT(gestureEvent.type() == PlatformEvent::GestureTap); |
| 2046 HitTestResult result = currentHitTest; | 2039 HitTestResult result = currentHitTest; |
| 2047 result.setToShadowHostIfInUserAgentShadowRoot(); | 2040 result.setToShadowHostIfInUserAgentShadowRoot(); |
| 2048 m_frame->chromeClient().onMouseDown(result.innerNode()); | 2041 m_frame->chromeClient().onMouseDown(result.innerNode()); |
| 2049 } | 2042 } |
| 2050 | 2043 |
| 2051 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 | 2044 // FIXME: Use a hit-test cache to avoid unnecessary hit tests. http://crbug.
com/398920 |
| 2052 if (currentHitTest.innerNode()) { | 2045 if (currentHitTest.innerNode()) { |
| 2053 LocalFrame* mainFrame = m_frame->localFrameRoot(); | 2046 LocalFrame* mainFrame = m_frame->localFrameRoot(); |
| 2054 if (mainFrame && mainFrame->view()) | 2047 if (mainFrame && mainFrame->view()) |
| 2055 mainFrame->view()->updateAllLifecyclePhases(); | 2048 mainFrame->view()->updateAllLifecyclePhases(); |
| 2056 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); | 2049 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| 2057 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2050 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
| 2058 } | 2051 } |
| 2059 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP
osition(), | 2052 PlatformMouseEvent fakeMouseUp(gestureEvent.position(), gestureEvent.globalP
osition(), |
| 2060 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), | 2053 LeftButton, PlatformEvent::MouseReleased, gestureEvent.tapCount(), |
| 2061 static_cast<PlatformEvent::Modifiers>(modifiers), | 2054 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2062 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2055 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2063 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, curr
entHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp, false); | 2056 bool swallowMouseUpEvent = !dispatchMouseEvent(EventTypeNames::mouseup, curr
entHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseUp); |
| 2064 | 2057 |
| 2065 bool swallowClickEvent = false; | 2058 bool swallowClickEvent = false; |
| 2066 if (m_clickNode) { | 2059 if (m_clickNode) { |
| 2067 if (currentHitTest.innerNode()) { | 2060 if (currentHitTest.innerNode()) { |
| 2068 // Updates distribution because a mouseup (or mousedown) event liste
ner can make the | 2061 // Updates distribution because a mouseup (or mousedown) event liste
ner can make the |
| 2069 // tree dirty at dispatchMouseEvent() invocation above. | 2062 // tree dirty at dispatchMouseEvent() invocation above. |
| 2070 // Unless distribution is updated, commonAncestor would hit ASSERT. | 2063 // Unless distribution is updated, commonAncestor would hit ASSERT. |
| 2071 // Both m_clickNode and currentHitTest.innerNode()) don't need to be
updated | 2064 // Both m_clickNode and currentHitTest.innerNode()) don't need to be
updated |
| 2072 // because commonAncestor() will exit early if their documents are d
ifferent. | 2065 // because commonAncestor() will exit early if their documents are d
ifferent. |
| 2073 m_clickNode->updateDistribution(); | 2066 m_clickNode->updateDistribution(); |
| 2074 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(*
m_clickNode, parentForClickEvent); | 2067 Node* clickTargetNode = currentHitTest.innerNode()->commonAncestor(*
m_clickNode, parentForClickEvent); |
| 2075 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, gestureEvent.tapCount(), fakeMouseUp, true); | 2068 swallowClickEvent = !dispatchMouseEvent(EventTypeNames::click, click
TargetNode, gestureEvent.tapCount(), fakeMouseUp); |
| 2076 } | 2069 } |
| 2077 m_clickNode = nullptr; | 2070 m_clickNode = nullptr; |
| 2078 } | 2071 } |
| 2079 | 2072 |
| 2080 if (!swallowMouseUpEvent) | 2073 if (!swallowMouseUpEvent) |
| 2081 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul
ts(fakeMouseUp, currentHitTest)); | 2074 swallowMouseUpEvent = handleMouseReleaseEvent(MouseEventWithHitTestResul
ts(fakeMouseUp, currentHitTest)); |
| 2082 | 2075 |
| 2083 bool swallowed = swallowMouseDownEvent | swallowMouseUpEvent | swallowClickE
vent; | 2076 bool swallowed = swallowMouseDownEvent | swallowMouseUpEvent | swallowClickE
vent; |
| 2084 if (!swallowed && tappedNode && m_frame->page()) { | 2077 if (!swallowed && tappedNode && m_frame->page()) { |
| 2085 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()->
domTreeVersion(); | 2078 bool domTreeChanged = preDispatchDomTreeVersion != m_frame->document()->
domTreeVersion(); |
| (...skipping 431 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2517 enteredFrameChain.append(enteredFrameInDocument); | 2510 enteredFrameChain.append(enteredFrameInDocument); |
| 2518 Frame* parentFrame = enteredFrameInDocument->tree().parent(); | 2511 Frame* parentFrame = enteredFrameInDocument->tree().parent(); |
| 2519 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to
LocalFrame(parentFrame) : nullptr; | 2512 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to
LocalFrame(parentFrame) : nullptr; |
| 2520 } | 2513 } |
| 2521 | 2514 |
| 2522 size_t indexEnteredFrameChain = enteredFrameChain.size(); | 2515 size_t indexEnteredFrameChain = enteredFrameChain.size(); |
| 2523 LocalFrame* exitedFrameInDocument = m_frame; | 2516 LocalFrame* exitedFrameInDocument = m_frame; |
| 2524 WillBeHeapVector<LocalFrame*> exitedFrameChain; | 2517 WillBeHeapVector<LocalFrame*> exitedFrameChain; |
| 2525 // Insert the frame from the disagreement between last frames and entered fr
ames | 2518 // Insert the frame from the disagreement between last frames and entered fr
ames |
| 2526 while (exitedFrameInDocument) { | 2519 while (exitedFrameInDocument) { |
| 2527 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_lastNod
eUnderMouse.get(); | 2520 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_nodeUnd
erMouse.get(); |
| 2528 if (!lastNodeUnderTap) | 2521 if (!lastNodeUnderTap) |
| 2529 break; | 2522 break; |
| 2530 | 2523 |
| 2531 LocalFrame* nextExitedFrameInDocument = nullptr; | 2524 LocalFrame* nextExitedFrameInDocument = nullptr; |
| 2532 if (lastNodeUnderTap->isFrameOwnerElement()) { | 2525 if (lastNodeUnderTap->isFrameOwnerElement()) { |
| 2533 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder
Tap); | 2526 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder
Tap); |
| 2534 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) | 2527 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) |
| 2535 nextExitedFrameInDocument = toLocalFrame(owner->contentFrame()); | 2528 nextExitedFrameInDocument = toLocalFrame(owner->contentFrame()); |
| 2536 } | 2529 } |
| 2537 | 2530 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 2551 unsigned modifiers = gestureEvent.modifiers(); | 2544 unsigned modifiers = gestureEvent.modifiers(); |
| 2552 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2545 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), |
| 2553 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, | 2546 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| 2554 static_cast<PlatformEvent::Modifiers>(modifiers), | 2547 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2555 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2548 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2556 | 2549 |
| 2557 // Update the mouseout/mouseleave event | 2550 // Update the mouseout/mouseleave event |
| 2558 size_t indexExitedFrameChain = exitedFrameChain.size(); | 2551 size_t indexExitedFrameChain = exitedFrameChain.size(); |
| 2559 while (indexExitedFrameChain) { | 2552 while (indexExitedFrameChain) { |
| 2560 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; | 2553 LocalFrame* leaveFrame = exitedFrameChain[--indexExitedFrameChain]; |
| 2561 leaveFrame->eventHandler().updateMouseEventTargetNode(nullptr, fakeMouse
Move, true); | 2554 leaveFrame->eventHandler().updateMouseEventTargetNode(nullptr, fakeMouse
Move); |
| 2562 } | 2555 } |
| 2563 | 2556 |
| 2564 // update the mouseover/mouseenter event | 2557 // update the mouseover/mouseenter event |
| 2565 while (indexEnteredFrameChain) { | 2558 while (indexEnteredFrameChain) { |
| 2566 Frame* parentFrame = enteredFrameChain[--indexEnteredFrameChain]->tree()
.parent(); | 2559 Frame* parentFrame = enteredFrameChain[--indexEnteredFrameChain]->tree()
.parent(); |
| 2567 if (parentFrame && parentFrame->isLocalFrame()) | 2560 if (parentFrame && parentFrame->isLocalFrame()) |
| 2568 toLocalFrame(parentFrame)->eventHandler().updateMouseEventTargetNode
(toHTMLFrameOwnerElement(enteredFrameChain[indexEnteredFrameChain]->owner()), fa
keMouseMove, true); | 2561 toLocalFrame(parentFrame)->eventHandler().updateMouseEventTargetNode
(toHTMLFrameOwnerElement(enteredFrameChain[indexEnteredFrameChain]->owner()), fa
keMouseMove); |
| 2569 } | 2562 } |
| 2570 } | 2563 } |
| 2571 | 2564 |
| 2572 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe
stureEvent& gestureEvent, bool readOnly) | 2565 GestureEventWithHitTestResults EventHandler::targetGestureEvent(const PlatformGe
stureEvent& gestureEvent, bool readOnly) |
| 2573 { | 2566 { |
| 2574 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); | 2567 TRACE_EVENT0("input", "EventHandler::targetGestureEvent"); |
| 2575 | 2568 |
| 2576 ASSERT(m_frame == m_frame->localFrameRoot()); | 2569 ASSERT(m_frame == m_frame->localFrameRoot()); |
| 2577 // Scrolling events get hit tested per frame (like wheel events do). | 2570 // Scrolling events get hit tested per frame (like wheel events do). |
| 2578 ASSERT(!gestureEvent.isScrollEvent()); | 2571 ASSERT(!gestureEvent.isScrollEvent()); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2711 | 2704 |
| 2712 // Clear mouse press state to avoid initiating a drag while context menu is
up. | 2705 // Clear mouse press state to avoid initiating a drag while context menu is
up. |
| 2713 m_mousePressed = false; | 2706 m_mousePressed = false; |
| 2714 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); | 2707 LayoutPoint positionInContents = v->rootFrameToContents(event.position()); |
| 2715 HitTestRequest request(HitTestRequest::Active); | 2708 HitTestRequest request(HitTestRequest::Active); |
| 2716 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re
quest, positionInContents, event); | 2709 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re
quest, positionInContents, event); |
| 2717 | 2710 |
| 2718 selectionController().sendContextMenuEvent(mev, positionInContents); | 2711 selectionController().sendContextMenuEvent(mev, positionInContents); |
| 2719 | 2712 |
| 2720 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode()
; | 2713 Node* targetNode = overrideTargetNode ? overrideTargetNode : mev.innerNode()
; |
| 2721 return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event
, false); | 2714 return !dispatchMouseEvent(EventTypeNames::contextmenu, targetNode, 0, event
); |
| 2722 } | 2715 } |
| 2723 | 2716 |
| 2724 bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) | 2717 bool EventHandler::sendContextMenuEventForKey(Element* overrideTargetElement) |
| 2725 { | 2718 { |
| 2726 FrameView* view = m_frame->view(); | 2719 FrameView* view = m_frame->view(); |
| 2727 if (!view) | 2720 if (!view) |
| 2728 return false; | 2721 return false; |
| 2729 | 2722 |
| 2730 Document* doc = m_frame->document(); | 2723 Document* doc = m_frame->document(); |
| 2731 if (!doc) | 2724 if (!doc) |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2797 bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR
esults& targetedEvent) | 2790 bool EventHandler::sendContextMenuEventForGesture(const GestureEventWithHitTestR
esults& targetedEvent) |
| 2798 { | 2791 { |
| 2799 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); | 2792 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
| 2800 unsigned modifiers = gestureEvent.modifiers(); | 2793 unsigned modifiers = gestureEvent.modifiers(); |
| 2801 | 2794 |
| 2802 // Send MouseMoved event prior to handling (https://crbug.com/485290). | 2795 // Send MouseMoved event prior to handling (https://crbug.com/485290). |
| 2803 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2796 PlatformMouseEvent fakeMouseMove(gestureEvent.position(), gestureEvent.globa
lPosition(), |
| 2804 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, | 2797 NoButton, PlatformEvent::MouseMoved, /* clickCount */ 0, |
| 2805 static_cast<PlatformEvent::Modifiers>(modifiers), | 2798 static_cast<PlatformEvent::Modifiers>(modifiers), |
| 2806 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); | 2799 PlatformMouseEvent::FromTouch, gestureEvent.timestamp()); |
| 2807 dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult().
innerNode(), 0, fakeMouseMove, true); | 2800 dispatchMouseEvent(EventTypeNames::mousemove, targetedEvent.hitTestResult().
innerNode(), 0, fakeMouseMove); |
| 2808 | 2801 |
| 2809 PlatformEvent::Type eventType = PlatformEvent::MousePressed; | 2802 PlatformEvent::Type eventType = PlatformEvent::MousePressed; |
| 2810 | 2803 |
| 2811 if (m_frame->settings()->showContextMenuOnMouseUp()) | 2804 if (m_frame->settings()->showContextMenuOnMouseUp()) |
| 2812 eventType = PlatformEvent::MouseReleased; | 2805 eventType = PlatformEvent::MouseReleased; |
| 2813 else | 2806 else |
| 2814 modifiers |= PlatformEvent::RightButtonDown; | 2807 modifiers |= PlatformEvent::RightButtonDown; |
| 2815 | 2808 |
| 2816 PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEven
t.event().globalPosition(), RightButton, eventType, 1, | 2809 PlatformMouseEvent mouseEvent(targetedEvent.event().position(), targetedEven
t.event().globalPosition(), RightButton, eventType, 1, |
| 2817 static_cast<PlatformEvent::Modifiers>(modifiers), | 2810 static_cast<PlatformEvent::Modifiers>(modifiers), |
| (...skipping 1178 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3996 unsigned EventHandler::accessKeyModifiers() | 3989 unsigned EventHandler::accessKeyModifiers() |
| 3997 { | 3990 { |
| 3998 #if OS(MACOSX) | 3991 #if OS(MACOSX) |
| 3999 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; | 3992 return PlatformEvent::CtrlKey | PlatformEvent::AltKey; |
| 4000 #else | 3993 #else |
| 4001 return PlatformEvent::AltKey; | 3994 return PlatformEvent::AltKey; |
| 4002 #endif | 3995 #endif |
| 4003 } | 3996 } |
| 4004 | 3997 |
| 4005 } // namespace blink | 3998 } // namespace blink |
| OLD | NEW |