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 |