| 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 966 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 977 WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent
& mouseEvent) | 977 WebInputEventResult EventHandler::handleMousePressEvent(const PlatformMouseEvent
& mouseEvent) |
| 978 { | 978 { |
| 979 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); | 979 TRACE_EVENT0("blink", "EventHandler::handleMousePressEvent"); |
| 980 | 980 |
| 981 // For 4th/5th button in the mouse since Chrome does not yet send | 981 // For 4th/5th button in the mouse since Chrome does not yet send |
| 982 // button value to Blink but in some cases it does send the event. | 982 // button value to Blink but in some cases it does send the event. |
| 983 // This check is needed to suppress such an event (crbug.com/574959) | 983 // This check is needed to suppress such an event (crbug.com/574959) |
| 984 if (mouseEvent.button() == NoButton) | 984 if (mouseEvent.button() == NoButton) |
| 985 return WebInputEventResult::HandledSuppressed; | 985 return WebInputEventResult::HandledSuppressed; |
| 986 | 986 |
| 987 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 987 RawPtr<FrameView> protector(m_frame->view()); |
| 988 | 988 |
| 989 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); | 989 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); |
| 990 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken =
gestureIndicator.currentToken(); | 990 m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToken =
gestureIndicator.currentToken(); |
| 991 | 991 |
| 992 cancelFakeMouseMoveEvent(); | 992 cancelFakeMouseMoveEvent(); |
| 993 if (m_eventHandlerWillResetCapturingMouseEventsNode) | 993 if (m_eventHandlerWillResetCapturingMouseEventsNode) |
| 994 m_capturingMouseEventsNode = nullptr; | 994 m_capturingMouseEventsNode = nullptr; |
| 995 m_mousePressed = true; | 995 m_mousePressed = true; |
| 996 m_capturesDragging = true; | 996 m_capturesDragging = true; |
| 997 setLastKnownMousePosition(mouseEvent); | 997 setLastKnownMousePosition(mouseEvent); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 1013 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re
quest, documentPoint, mouseEvent); | 1013 MouseEventWithHitTestResults mev = m_frame->document()->prepareMouseEvent(re
quest, documentPoint, mouseEvent); |
| 1014 | 1014 |
| 1015 if (!mev.innerNode()) { | 1015 if (!mev.innerNode()) { |
| 1016 invalidateClick(); | 1016 invalidateClick(); |
| 1017 return WebInputEventResult::NotHandled; | 1017 return WebInputEventResult::NotHandled; |
| 1018 } | 1018 } |
| 1019 | 1019 |
| 1020 m_mousePressNode = mev.innerNode(); | 1020 m_mousePressNode = mev.innerNode(); |
| 1021 m_frame->document()->setSequentialFocusNavigationStartingPoint(mev.innerNode
()); | 1021 m_frame->document()->setSequentialFocusNavigationStartingPoint(mev.innerNode
()); |
| 1022 | 1022 |
| 1023 RefPtrWillBeRawPtr<LocalFrame> subframe = subframeForHitTestResult(mev); | 1023 RawPtr<LocalFrame> subframe = subframeForHitTestResult(mev); |
| 1024 if (subframe) { | 1024 if (subframe) { |
| 1025 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe
.get()); | 1025 WebInputEventResult result = passMousePressEventToSubframe(mev, subframe
.get()); |
| 1026 // Start capturing future events for this frame. We only do this if we
didn't clear | 1026 // Start capturing future events for this frame. We only do this if we
didn't clear |
| 1027 // the m_mousePressed flag, which may happen if an AppKit widget entered
a modal event loop. | 1027 // the m_mousePressed flag, which may happen if an AppKit widget entered
a modal event loop. |
| 1028 // The capturing should be done only when the result indicates it | 1028 // The capturing should be done only when the result indicates it |
| 1029 // has been handled. See crbug.com/269917 | 1029 // has been handled. See crbug.com/269917 |
| 1030 m_capturesDragging = subframe->eventHandler().capturesDragging(); | 1030 m_capturesDragging = subframe->eventHandler().capturesDragging(); |
| 1031 if (m_mousePressed && m_capturesDragging) { | 1031 if (m_mousePressed && m_capturesDragging) { |
| 1032 m_capturingMouseEventsNode = mev.innerNode(); | 1032 m_capturingMouseEventsNode = mev.innerNode(); |
| 1033 m_eventHandlerWillResetCapturingMouseEventsNode = true; | 1033 m_eventHandlerWillResetCapturingMouseEventsNode = true; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1139 return scrollableArea; | 1139 return scrollableArea; |
| 1140 } | 1140 } |
| 1141 | 1141 |
| 1142 return nullptr; | 1142 return nullptr; |
| 1143 } | 1143 } |
| 1144 | 1144 |
| 1145 WebInputEventResult EventHandler::handleMouseMoveEvent(const PlatformMouseEvent&
event) | 1145 WebInputEventResult EventHandler::handleMouseMoveEvent(const PlatformMouseEvent&
event) |
| 1146 { | 1146 { |
| 1147 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); | 1147 TRACE_EVENT0("blink", "EventHandler::handleMouseMoveEvent"); |
| 1148 | 1148 |
| 1149 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 1149 RawPtr<FrameView> protector(m_frame->view()); |
| 1150 | 1150 |
| 1151 HitTestResult hoveredNode = HitTestResult(); | 1151 HitTestResult hoveredNode = HitTestResult(); |
| 1152 WebInputEventResult result = handleMouseMoveOrLeaveEvent(event, &hoveredNode
); | 1152 WebInputEventResult result = handleMouseMoveOrLeaveEvent(event, &hoveredNode
); |
| 1153 | 1153 |
| 1154 Page* page = m_frame->page(); | 1154 Page* page = m_frame->page(); |
| 1155 if (!page) | 1155 if (!page) |
| 1156 return result; | 1156 return result; |
| 1157 | 1157 |
| 1158 if (PaintLayer* layer = layerForNode(hoveredNode.innerNode())) { | 1158 if (PaintLayer* layer = layerForNode(hoveredNode.innerNode())) { |
| 1159 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer
)) | 1159 if (ScrollableArea* layerScrollableArea = associatedScrollableArea(layer
)) |
| 1160 layerScrollableArea->mouseMovedInContentArea(); | 1160 layerScrollableArea->mouseMovedInContentArea(); |
| 1161 } | 1161 } |
| 1162 | 1162 |
| 1163 if (FrameView* frameView = m_frame->view()) | 1163 if (FrameView* frameView = m_frame->view()) |
| 1164 frameView->mouseMovedInContentArea(); | 1164 frameView->mouseMovedInContentArea(); |
| 1165 | 1165 |
| 1166 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); | 1166 hoveredNode.setToShadowHostIfInUserAgentShadowRoot(); |
| 1167 page->chromeClient().mouseDidMoveOverElement(hoveredNode); | 1167 page->chromeClient().mouseDidMoveOverElement(hoveredNode); |
| 1168 | 1168 |
| 1169 return result; | 1169 return result; |
| 1170 } | 1170 } |
| 1171 | 1171 |
| 1172 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) | 1172 void EventHandler::handleMouseLeaveEvent(const PlatformMouseEvent& event) |
| 1173 { | 1173 { |
| 1174 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); | 1174 TRACE_EVENT0("blink", "EventHandler::handleMouseLeaveEvent"); |
| 1175 | 1175 |
| 1176 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 1176 RawPtr<FrameView> protector(m_frame->view()); |
| 1177 handleMouseMoveOrLeaveEvent(event, 0, false, true); | 1177 handleMouseMoveOrLeaveEvent(event, 0, false, true); |
| 1178 } | 1178 } |
| 1179 | 1179 |
| 1180 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous
eEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool
forceLeave) | 1180 WebInputEventResult EventHandler::handleMouseMoveOrLeaveEvent(const PlatformMous
eEvent& mouseEvent, HitTestResult* hoveredNode, bool onlyUpdateScrollbars, bool
forceLeave) |
| 1181 { | 1181 { |
| 1182 ASSERT(m_frame); | 1182 ASSERT(m_frame); |
| 1183 ASSERT(m_frame->view()); | 1183 ASSERT(m_frame->view()); |
| 1184 | 1184 |
| 1185 setLastKnownMousePosition(mouseEvent); | 1185 setLastKnownMousePosition(mouseEvent); |
| 1186 | 1186 |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1242 } else { | 1242 } else { |
| 1243 if (!scrollbar) | 1243 if (!scrollbar) |
| 1244 scrollbar = mev.scrollbar(); | 1244 scrollbar = mev.scrollbar(); |
| 1245 | 1245 |
| 1246 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); | 1246 updateLastScrollbarUnderMouse(scrollbar, !m_mousePressed); |
| 1247 if (onlyUpdateScrollbars) | 1247 if (onlyUpdateScrollbars) |
| 1248 return WebInputEventResult::HandledSuppressed; | 1248 return WebInputEventResult::HandledSuppressed; |
| 1249 } | 1249 } |
| 1250 | 1250 |
| 1251 WebInputEventResult eventResult = WebInputEventResult::NotHandled; | 1251 WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
| 1252 RefPtrWillBeRawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get(
) ? subframeForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTest
Result(mev); | 1252 RawPtr<LocalFrame> newSubframe = m_capturingMouseEventsNode.get() ? subframe
ForTargetNode(m_capturingMouseEventsNode.get()) : subframeForHitTestResult(mev); |
| 1253 | 1253 |
| 1254 // 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. | 1254 // 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. |
| 1255 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD
escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) | 1255 if (m_lastMouseMoveEventSubframe && m_lastMouseMoveEventSubframe->tree().isD
escendantOf(m_frame) && m_lastMouseMoveEventSubframe != newSubframe) |
| 1256 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mev.e
vent()); | 1256 m_lastMouseMoveEventSubframe->eventHandler().handleMouseLeaveEvent(mev.e
vent()); |
| 1257 | 1257 |
| 1258 if (newSubframe) { | 1258 if (newSubframe) { |
| 1259 // Update over/out state before passing the event to the subframe. | 1259 // Update over/out state before passing the event to the subframe. |
| 1260 updateMouseEventTargetNodeAndSendEvents(mev.innerNode(), mev.event(), tr
ue); | 1260 updateMouseEventTargetNodeAndSendEvents(mev.innerNode(), mev.event(), tr
ue); |
| 1261 | 1261 |
| 1262 // Event dispatch in updateMouseEventTargetNodeAndSendEvents may have ca
used the subframe of the target | 1262 // Event dispatch in updateMouseEventTargetNodeAndSendEvents may have ca
used the subframe of the target |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1305 WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve
nt& mouseEvent) | 1305 WebInputEventResult EventHandler::handleMouseReleaseEvent(const PlatformMouseEve
nt& mouseEvent) |
| 1306 { | 1306 { |
| 1307 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); | 1307 TRACE_EVENT0("blink", "EventHandler::handleMouseReleaseEvent"); |
| 1308 | 1308 |
| 1309 // For 4th/5th button in the mouse since Chrome does not yet send | 1309 // For 4th/5th button in the mouse since Chrome does not yet send |
| 1310 // button value to Blink but in some cases it does send the event. | 1310 // button value to Blink but in some cases it does send the event. |
| 1311 // This check is needed to suppress such an event (crbug.com/574959) | 1311 // This check is needed to suppress such an event (crbug.com/574959) |
| 1312 if (mouseEvent.button() == NoButton) | 1312 if (mouseEvent.button() == NoButton) |
| 1313 return WebInputEventResult::HandledSuppressed; | 1313 return WebInputEventResult::HandledSuppressed; |
| 1314 | 1314 |
| 1315 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 1315 RawPtr<FrameView> protector(m_frame->view()); |
| 1316 | 1316 |
| 1317 m_frame->selection().setCaretBlinkingSuspended(false); | 1317 m_frame->selection().setCaretBlinkingSuspended(false); |
| 1318 | 1318 |
| 1319 OwnPtr<UserGestureIndicator> gestureIndicator; | 1319 OwnPtr<UserGestureIndicator> gestureIndicator; |
| 1320 | 1320 |
| 1321 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke
n) | 1321 if (m_frame->localFrameRoot()->eventHandler().m_lastMouseDownUserGestureToke
n) |
| 1322 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->localFrame
Root()->eventHandler().m_lastMouseDownUserGestureToken.release())); | 1322 gestureIndicator = adoptPtr(new UserGestureIndicator(m_frame->localFrame
Root()->eventHandler().m_lastMouseDownUserGestureToken.release())); |
| 1323 else | 1323 else |
| 1324 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin
gUserGesture)); | 1324 gestureIndicator = adoptPtr(new UserGestureIndicator(DefinitelyProcessin
gUserGesture)); |
| 1325 | 1325 |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1406 } | 1406 } |
| 1407 | 1407 |
| 1408 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp
e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer
) | 1408 WebInputEventResult EventHandler::dispatchDragEvent(const AtomicString& eventTyp
e, Node* dragTarget, const PlatformMouseEvent& event, DataTransfer* dataTransfer
) |
| 1409 { | 1409 { |
| 1410 FrameView* view = m_frame->view(); | 1410 FrameView* view = m_frame->view(); |
| 1411 | 1411 |
| 1412 // FIXME: We might want to dispatch a dragleave even if the view is gone. | 1412 // FIXME: We might want to dispatch a dragleave even if the view is gone. |
| 1413 if (!view) | 1413 if (!view) |
| 1414 return WebInputEventResult::NotHandled; | 1414 return WebInputEventResult::NotHandled; |
| 1415 | 1415 |
| 1416 RefPtrWillBeRawPtr<DragEvent> me = DragEvent::create(eventType, | 1416 RawPtr<DragEvent> me = DragEvent::create(eventType, |
| 1417 true, true, m_frame->document()->domWindow(), | 1417 true, true, m_frame->document()->domWindow(), |
| 1418 0, event.globalPosition().x(), event.globalPosition().y(), event.positio
n().x(), event.position().y(), | 1418 0, event.globalPosition().x(), event.globalPosition().y(), event.positio
n().x(), event.position().y(), |
| 1419 event.movementDelta().x(), event.movementDelta().y(), | 1419 event.movementDelta().x(), event.movementDelta().y(), |
| 1420 event.getModifiers(), | 1420 event.getModifiers(), |
| 1421 0, MouseEvent::platformModifiersToButtons(event.getModifiers()), nullptr
, event.timestamp(), dataTransfer, event.getSyntheticEventType()); | 1421 0, MouseEvent::platformModifiersToButtons(event.getModifiers()), nullptr
, event.timestamp(), dataTransfer, event.getSyntheticEventType()); |
| 1422 | 1422 |
| 1423 return toWebInputEventResult(dragTarget->dispatchEvent(me.get())); | 1423 return toWebInputEventResult(dragTarget->dispatchEvent(me.get())); |
| 1424 } | 1424 } |
| 1425 | 1425 |
| 1426 static bool targetIsFrame(Node* target, LocalFrame*& frame) | 1426 static bool targetIsFrame(Node* target, LocalFrame*& frame) |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1479 { | 1479 { |
| 1480 WebInputEventResult eventResult = WebInputEventResult::NotHandled; | 1480 WebInputEventResult eventResult = WebInputEventResult::NotHandled; |
| 1481 | 1481 |
| 1482 if (!m_frame->view()) | 1482 if (!m_frame->view()) |
| 1483 return eventResult; | 1483 return eventResult; |
| 1484 | 1484 |
| 1485 HitTestRequest request(HitTestRequest::ReadOnly); | 1485 HitTestRequest request(HitTestRequest::ReadOnly); |
| 1486 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); | 1486 MouseEventWithHitTestResults mev = prepareMouseEvent(request, event); |
| 1487 | 1487 |
| 1488 // Drag events should never go to text nodes (following IE, and proper mouse
over/out dispatch) | 1488 // Drag events should never go to text nodes (following IE, and proper mouse
over/out dispatch) |
| 1489 RefPtrWillBeRawPtr<Node> newTarget = mev.innerNode(); | 1489 RawPtr<Node> newTarget = mev.innerNode(); |
| 1490 if (newTarget && newTarget->isTextNode()) | 1490 if (newTarget && newTarget->isTextNode()) |
| 1491 newTarget = FlatTreeTraversal::parent(*newTarget); | 1491 newTarget = FlatTreeTraversal::parent(*newTarget); |
| 1492 | 1492 |
| 1493 if (AutoscrollController* controller = autoscrollController()) | 1493 if (AutoscrollController* controller = autoscrollController()) |
| 1494 controller->updateDragAndDrop(newTarget.get(), event.position(), event.t
imestamp()); | 1494 controller->updateDragAndDrop(newTarget.get(), event.position(), event.t
imestamp()); |
| 1495 | 1495 |
| 1496 if (m_dragTarget != newTarget) { | 1496 if (m_dragTarget != newTarget) { |
| 1497 // FIXME: this ordering was explicitly chosen to match WinIE. However, | 1497 // FIXME: this ordering was explicitly chosen to match WinIE. However, |
| 1498 // it is sometimes incorrect when dragging within subframes, as seen wit
h | 1498 // it is sometimes incorrect when dragging within subframes, as seen wit
h |
| 1499 // LayoutTests/fast/events/drag-in-frames.html. | 1499 // LayoutTests/fast/events/drag-in-frames.html. |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1577 } | 1577 } |
| 1578 | 1578 |
| 1579 void EventHandler::clearDragState() | 1579 void EventHandler::clearDragState() |
| 1580 { | 1580 { |
| 1581 stopAutoscroll(); | 1581 stopAutoscroll(); |
| 1582 m_dragTarget = nullptr; | 1582 m_dragTarget = nullptr; |
| 1583 m_capturingMouseEventsNode = nullptr; | 1583 m_capturingMouseEventsNode = nullptr; |
| 1584 m_shouldOnlyFireDragOverEvent = false; | 1584 m_shouldOnlyFireDragOverEvent = false; |
| 1585 } | 1585 } |
| 1586 | 1586 |
| 1587 void EventHandler::setCapturingMouseEventsNode(PassRefPtrWillBeRawPtr<Node> n) | 1587 void EventHandler::setCapturingMouseEventsNode(RawPtr<Node> n) |
| 1588 { | 1588 { |
| 1589 m_capturingMouseEventsNode = n; | 1589 m_capturingMouseEventsNode = n; |
| 1590 m_eventHandlerWillResetCapturingMouseEventsNode = false; | 1590 m_eventHandlerWillResetCapturingMouseEventsNode = false; |
| 1591 } | 1591 } |
| 1592 | 1592 |
| 1593 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
t& request, const PlatformMouseEvent& mev) | 1593 MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
t& request, const PlatformMouseEvent& mev) |
| 1594 { | 1594 { |
| 1595 ASSERT(m_frame); | 1595 ASSERT(m_frame); |
| 1596 ASSERT(m_frame->document()); | 1596 ASSERT(m_frame->document()); |
| 1597 | 1597 |
| 1598 return m_frame->document()->prepareMouseEvent(request, contentPointFromRootF
rame(m_frame, mev.position()), mev); | 1598 return m_frame->document()->prepareMouseEvent(request, contentPointFromRootF
rame(m_frame, mev.position()), mev); |
| 1599 } | 1599 } |
| 1600 | 1600 |
| 1601 PassRefPtrWillBeRawPtr<Node> EventHandler::updateMouseEventTargetNode(Node* targ
etNode, | 1601 RawPtr<Node> EventHandler::updateMouseEventTargetNode(Node* targetNode, |
| 1602 const PlatformMouseEvent& mouseEvent) | 1602 const PlatformMouseEvent& mouseEvent) |
| 1603 { | 1603 { |
| 1604 Node* result = targetNode; | 1604 Node* result = targetNode; |
| 1605 | 1605 |
| 1606 // If we're capturing, we always go right to that node. | 1606 // If we're capturing, we always go right to that node. |
| 1607 if (m_capturingMouseEventsNode) { | 1607 if (m_capturingMouseEventsNode) { |
| 1608 result = m_capturingMouseEventsNode.get(); | 1608 result = m_capturingMouseEventsNode.get(); |
| 1609 } else { | 1609 } else { |
| 1610 // If the target node is a text node, dispatch on the parent node - rdar
://4196646 | 1610 // If the target node is a text node, dispatch on the parent node - rdar
://4196646 |
| 1611 if (result && result->isTextNode()) | 1611 if (result && result->isTextNode()) |
| 1612 result = FlatTreeTraversal::parent(*result); | 1612 result = FlatTreeTraversal::parent(*result); |
| 1613 } | 1613 } |
| 1614 RefPtrWillBeMember<Node> lastNodeUnderMouse = m_nodeUnderMouse; | 1614 Member<Node> lastNodeUnderMouse = m_nodeUnderMouse; |
| 1615 m_nodeUnderMouse = result; | 1615 m_nodeUnderMouse = result; |
| 1616 | 1616 |
| 1617 PaintLayer* layerForLastNode = layerForNode(lastNodeUnderMouse.get()); | 1617 PaintLayer* layerForLastNode = layerForNode(lastNodeUnderMouse.get()); |
| 1618 PaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get()); | 1618 PaintLayer* layerForNodeUnderMouse = layerForNode(m_nodeUnderMouse.get()); |
| 1619 Page* page = m_frame->page(); | 1619 Page* page = m_frame->page(); |
| 1620 | 1620 |
| 1621 if (lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document()
!= m_frame->document())) { | 1621 if (lastNodeUnderMouse && (!m_nodeUnderMouse || m_nodeUnderMouse->document()
!= m_frame->document())) { |
| 1622 // The mouse has moved between frames. | 1622 // The mouse has moved between frames. |
| 1623 if (LocalFrame* frame = lastNodeUnderMouse->document().frame()) { | 1623 if (LocalFrame* frame = lastNodeUnderMouse->document().frame()) { |
| 1624 if (FrameView* frameView = frame->view()) | 1624 if (FrameView* frameView = frame->view()) |
| (...skipping 21 matching lines...) Expand all Loading... |
| 1646 lastNodeUnderMouse = nullptr; | 1646 lastNodeUnderMouse = nullptr; |
| 1647 m_lastScrollbarUnderMouse = nullptr; | 1647 m_lastScrollbarUnderMouse = nullptr; |
| 1648 } | 1648 } |
| 1649 | 1649 |
| 1650 return lastNodeUnderMouse; | 1650 return lastNodeUnderMouse; |
| 1651 } | 1651 } |
| 1652 | 1652 |
| 1653 void EventHandler::updateMouseEventTargetNodeAndSendEvents(Node* targetNode, | 1653 void EventHandler::updateMouseEventTargetNodeAndSendEvents(Node* targetNode, |
| 1654 const PlatformMouseEvent& mouseEvent, bool isFrameBoundaryTransition) | 1654 const PlatformMouseEvent& mouseEvent, bool isFrameBoundaryTransition) |
| 1655 { | 1655 { |
| 1656 RefPtrWillBeRawPtr<Node> lastNodeUnderMouse = updateMouseEventTargetNode(tar
getNode, mouseEvent); | 1656 RawPtr<Node> lastNodeUnderMouse = updateMouseEventTargetNode(targetNode, mou
seEvent); |
| 1657 m_pointerEventManager.sendMouseAndPossiblyPointerNodeTransitionEvents( | 1657 m_pointerEventManager.sendMouseAndPossiblyPointerNodeTransitionEvents( |
| 1658 lastNodeUnderMouse, m_nodeUnderMouse, mouseEvent, | 1658 lastNodeUnderMouse, m_nodeUnderMouse, mouseEvent, |
| 1659 m_frame->document()->domWindow(), isFrameBoundaryTransition); | 1659 m_frame->document()->domWindow(), isFrameBoundaryTransition); |
| 1660 } | 1660 } |
| 1661 | 1661 |
| 1662 WebInputEventResult EventHandler::dispatchMouseEvent(const AtomicString& eventTy
pe, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent) | 1662 WebInputEventResult EventHandler::dispatchMouseEvent(const AtomicString& eventTy
pe, Node* targetNode, int clickCount, const PlatformMouseEvent& mouseEvent) |
| 1663 { | 1663 { |
| 1664 updateMouseEventTargetNodeAndSendEvents(targetNode, mouseEvent); | 1664 updateMouseEventTargetNodeAndSendEvents(targetNode, mouseEvent); |
| 1665 if (!m_nodeUnderMouse) | 1665 if (!m_nodeUnderMouse) |
| 1666 return WebInputEventResult::NotHandled; | 1666 return WebInputEventResult::NotHandled; |
| 1667 | 1667 |
| 1668 RefPtrWillBeRawPtr<MouseEvent> event = MouseEvent::create(eventType, m_nodeU
nderMouse->document().domWindow(), mouseEvent, clickCount, nullptr); | 1668 RawPtr<MouseEvent> event = MouseEvent::create(eventType, m_nodeUnderMouse->d
ocument().domWindow(), mouseEvent, clickCount, nullptr); |
| 1669 return toWebInputEventResult(m_nodeUnderMouse->dispatchEvent(event)); | 1669 return toWebInputEventResult(m_nodeUnderMouse->dispatchEvent(event)); |
| 1670 } | 1670 } |
| 1671 | 1671 |
| 1672 bool EventHandler::isPointerEventActive(int pointerId) | 1672 bool EventHandler::isPointerEventActive(int pointerId) |
| 1673 { | 1673 { |
| 1674 return m_pointerEventManager.isActive(pointerId); | 1674 return m_pointerEventManager.isActive(pointerId); |
| 1675 } | 1675 } |
| 1676 | 1676 |
| 1677 void EventHandler::setPointerCapture(int pointerId, EventTarget* target) | 1677 void EventHandler::setPointerCapture(int pointerId, EventTarget* target) |
| 1678 { | 1678 { |
| (...skipping 11 matching lines...) Expand all Loading... |
| 1690 m_pointerEventManager.elementRemoved(target); | 1690 m_pointerEventManager.elementRemoved(target); |
| 1691 } | 1691 } |
| 1692 | 1692 |
| 1693 // TODO(mustaq): Make PE drive ME dispatch & bookkeeping in EventHandler. | 1693 // TODO(mustaq): Make PE drive ME dispatch & bookkeeping in EventHandler. |
| 1694 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato
micString& mouseEventType, Node* targetNode, int clickCount, const PlatformMouse
Event& mouseEvent) | 1694 WebInputEventResult EventHandler::updatePointerTargetAndDispatchEvents(const Ato
micString& mouseEventType, Node* targetNode, int clickCount, const PlatformMouse
Event& mouseEvent) |
| 1695 { | 1695 { |
| 1696 ASSERT(mouseEventType == EventTypeNames::mousedown | 1696 ASSERT(mouseEventType == EventTypeNames::mousedown |
| 1697 || mouseEventType == EventTypeNames::mousemove | 1697 || mouseEventType == EventTypeNames::mousemove |
| 1698 || mouseEventType == EventTypeNames::mouseup); | 1698 || mouseEventType == EventTypeNames::mouseup); |
| 1699 | 1699 |
| 1700 RefPtrWillBeRawPtr<Node> lastNodeUnderMouse = updateMouseEventTargetNode(tar
getNode, mouseEvent); | 1700 RawPtr<Node> lastNodeUnderMouse = updateMouseEventTargetNode(targetNode, mou
seEvent); |
| 1701 | 1701 |
| 1702 return m_pointerEventManager.sendMousePointerEvent( | 1702 return m_pointerEventManager.sendMousePointerEvent( |
| 1703 m_nodeUnderMouse, mouseEventType, clickCount, mouseEvent, nullptr, | 1703 m_nodeUnderMouse, mouseEventType, clickCount, mouseEvent, nullptr, |
| 1704 m_frame->document()->domWindow(), lastNodeUnderMouse); | 1704 m_frame->document()->domWindow(), lastNodeUnderMouse); |
| 1705 } | 1705 } |
| 1706 | 1706 |
| 1707 WebInputEventResult EventHandler::handleMouseFocus(const MouseEventWithHitTestRe
sults& targetedEvent, InputDeviceCapabilities* sourceCapabilities) | 1707 WebInputEventResult EventHandler::handleMouseFocus(const MouseEventWithHitTestRe
sults& targetedEvent, InputDeviceCapabilities* sourceCapabilities) |
| 1708 { | 1708 { |
| 1709 // If clicking on a frame scrollbar, do not mess up with content focus. | 1709 // If clicking on a frame scrollbar, do not mess up with content focus. |
| 1710 if (targetedEvent.hitTestResult().scrollbar() && !m_frame->contentLayoutItem
().isNull()) { | 1710 if (targetedEvent.hitTestResult().scrollbar() && !m_frame->contentLayoutItem
().isNull()) { |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1789 return false; | 1789 return false; |
| 1790 } | 1790 } |
| 1791 | 1791 |
| 1792 WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve
nt) | 1792 WebInputEventResult EventHandler::handleWheelEvent(const PlatformWheelEvent& eve
nt) |
| 1793 { | 1793 { |
| 1794 Document* doc = m_frame->document(); | 1794 Document* doc = m_frame->document(); |
| 1795 | 1795 |
| 1796 if (!doc->layoutView()) | 1796 if (!doc->layoutView()) |
| 1797 return WebInputEventResult::NotHandled; | 1797 return WebInputEventResult::NotHandled; |
| 1798 | 1798 |
| 1799 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 1799 RawPtr<FrameView> protector(m_frame->view()); |
| 1800 | 1800 |
| 1801 FrameView* view = m_frame->view(); | 1801 FrameView* view = m_frame->view(); |
| 1802 if (!view) | 1802 if (!view) |
| 1803 return WebInputEventResult::NotHandled; | 1803 return WebInputEventResult::NotHandled; |
| 1804 | 1804 |
| 1805 LayoutPoint vPoint = view->rootFrameToContents(event.position()); | 1805 LayoutPoint vPoint = view->rootFrameToContents(event.position()); |
| 1806 | 1806 |
| 1807 HitTestRequest request(HitTestRequest::ReadOnly); | 1807 HitTestRequest request(HitTestRequest::ReadOnly); |
| 1808 HitTestResult result(request, vPoint); | 1808 HitTestResult result(request, vPoint); |
| 1809 doc->layoutView()->hitTest(result); | 1809 doc->layoutView()->hitTest(result); |
| (...skipping 17 matching lines...) Expand all Loading... |
| 1827 } | 1827 } |
| 1828 // TODO(dtapuska): Remove this once wheel gesture scroll has | 1828 // TODO(dtapuska): Remove this once wheel gesture scroll has |
| 1829 // been enabled everywhere; as we can just return early. | 1829 // been enabled everywhere; as we can just return early. |
| 1830 // http://crbug.com/568183 | 1830 // http://crbug.com/568183 |
| 1831 // Don't propagate the DOM event into the parent iframe | 1831 // Don't propagate the DOM event into the parent iframe |
| 1832 // but do dispatch the scroll event. | 1832 // but do dispatch the scroll event. |
| 1833 sendDOMEvent = false; | 1833 sendDOMEvent = false; |
| 1834 } | 1834 } |
| 1835 | 1835 |
| 1836 if (node) { | 1836 if (node) { |
| 1837 RefPtrWillBeRawPtr<WheelEvent> domEvent = WheelEvent::create(event, node
->document().domWindow()); | 1837 RawPtr<WheelEvent> domEvent = WheelEvent::create(event, node->document()
.domWindow()); |
| 1838 if (sendDOMEvent) { | 1838 if (sendDOMEvent) { |
| 1839 DispatchEventResult domEventResult = node->dispatchEvent(domEvent); | 1839 DispatchEventResult domEventResult = node->dispatchEvent(domEvent); |
| 1840 if (domEventResult != DispatchEventResult::NotCanceled) | 1840 if (domEventResult != DispatchEventResult::NotCanceled) |
| 1841 return toWebInputEventResult(domEventResult); | 1841 return toWebInputEventResult(domEventResult); |
| 1842 } else { | 1842 } else { |
| 1843 defaultWheelEventHandler(node, domEvent.get()); | 1843 defaultWheelEventHandler(node, domEvent.get()); |
| 1844 if (domEvent->defaultHandled()) | 1844 if (domEvent->defaultHandled()) |
| 1845 return WebInputEventResult::HandledSystem; | 1845 return WebInputEventResult::HandledSystem; |
| 1846 } | 1846 } |
| 1847 } | 1847 } |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1953 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEven
t); | 1953 return innerFrame->eventHandler().handleGestureEventInFrame(targetedEven
t); |
| 1954 | 1954 |
| 1955 // No hit test result, handle in root instance. Perhaps we should just retur
n false instead? | 1955 // No hit test result, handle in root instance. Perhaps we should just retur
n false instead? |
| 1956 return handleGestureEventInFrame(targetedEvent); | 1956 return handleGestureEventInFrame(targetedEvent); |
| 1957 } | 1957 } |
| 1958 | 1958 |
| 1959 WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi
thHitTestResults& targetedEvent) | 1959 WebInputEventResult EventHandler::handleGestureEventInFrame(const GestureEventWi
thHitTestResults& targetedEvent) |
| 1960 { | 1960 { |
| 1961 ASSERT(!targetedEvent.event().isScrollEvent()); | 1961 ASSERT(!targetedEvent.event().isScrollEvent()); |
| 1962 | 1962 |
| 1963 RefPtrWillBeRawPtr<Node> eventTarget = targetedEvent.hitTestResult().innerNo
de(); | 1963 RawPtr<Node> eventTarget = targetedEvent.hitTestResult().innerNode(); |
| 1964 RefPtrWillBeRawPtr<Scrollbar> scrollbar = targetedEvent.hitTestResult().scro
llbar(); | 1964 RawPtr<Scrollbar> scrollbar = targetedEvent.hitTestResult().scrollbar(); |
| 1965 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); | 1965 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
| 1966 | 1966 |
| 1967 if (scrollbar) { | 1967 if (scrollbar) { |
| 1968 bool shouldUpdateCapture = false; | 1968 bool shouldUpdateCapture = false; |
| 1969 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) { | 1969 if (scrollbar->gestureEvent(gestureEvent, &shouldUpdateCapture)) { |
| 1970 if (shouldUpdateCapture) | 1970 if (shouldUpdateCapture) |
| 1971 m_scrollbarHandlingScrollGesture = scrollbar; | 1971 m_scrollbarHandlingScrollGesture = scrollbar; |
| 1972 return WebInputEventResult::HandledSuppressed; | 1972 return WebInputEventResult::HandledSuppressed; |
| 1973 } | 1973 } |
| 1974 } | 1974 } |
| 1975 | 1975 |
| 1976 if (eventTarget) { | 1976 if (eventTarget) { |
| 1977 RefPtrWillBeRawPtr<GestureEvent> gestureDomEvent = GestureEvent::create(
eventTarget->document().domWindow(), gestureEvent); | 1977 RawPtr<GestureEvent> gestureDomEvent = GestureEvent::create(eventTarget-
>document().domWindow(), gestureEvent); |
| 1978 if (gestureDomEvent.get()) { | 1978 if (gestureDomEvent.get()) { |
| 1979 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve
nt(gestureDomEvent); | 1979 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve
nt(gestureDomEvent); |
| 1980 if (gestureDomEventResult != DispatchEventResult::NotCanceled) { | 1980 if (gestureDomEventResult != DispatchEventResult::NotCanceled) { |
| 1981 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE
ventHandler); | 1981 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE
ventHandler); |
| 1982 return toWebInputEventResult(gestureDomEventResult); | 1982 return toWebInputEventResult(gestureDomEventResult); |
| 1983 } | 1983 } |
| 1984 } | 1984 } |
| 1985 } | 1985 } |
| 1986 | 1986 |
| 1987 switch (gestureEvent.type()) { | 1987 switch (gestureEvent.type()) { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2006 ASSERT_NOT_REACHED(); | 2006 ASSERT_NOT_REACHED(); |
| 2007 } | 2007 } |
| 2008 | 2008 |
| 2009 return WebInputEventResult::NotHandled; | 2009 return WebInputEventResult::NotHandled; |
| 2010 } | 2010 } |
| 2011 | 2011 |
| 2012 WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture
Event& gestureEvent) | 2012 WebInputEventResult EventHandler::handleGestureScrollEvent(const PlatformGesture
Event& gestureEvent) |
| 2013 { | 2013 { |
| 2014 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent"); | 2014 TRACE_EVENT0("input", "EventHandler::handleGestureScrollEvent"); |
| 2015 | 2015 |
| 2016 RefPtrWillBeRawPtr<Node> eventTarget = nullptr; | 2016 RawPtr<Node> eventTarget = nullptr; |
| 2017 RefPtrWillBeRawPtr<Scrollbar> scrollbar = nullptr; | 2017 RawPtr<Scrollbar> scrollbar = nullptr; |
| 2018 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) { | 2018 if (gestureEvent.type() != PlatformEvent::GestureScrollBegin) { |
| 2019 scrollbar = m_scrollbarHandlingScrollGesture.get(); | 2019 scrollbar = m_scrollbarHandlingScrollGesture.get(); |
| 2020 eventTarget = m_scrollGestureHandlingNode.get(); | 2020 eventTarget = m_scrollGestureHandlingNode.get(); |
| 2021 } | 2021 } |
| 2022 | 2022 |
| 2023 if (!eventTarget) { | 2023 if (!eventTarget) { |
| 2024 Document* document = m_frame->document(); | 2024 Document* document = m_frame->document(); |
| 2025 if (!document->layoutView()) | 2025 if (!document->layoutView()) |
| 2026 return WebInputEventResult::NotHandled; | 2026 return WebInputEventResult::NotHandled; |
| 2027 | 2027 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2048 m_scrollbarHandlingScrollGesture = scrollbar; | 2048 m_scrollbarHandlingScrollGesture = scrollbar; |
| 2049 return WebInputEventResult::HandledSuppressed; | 2049 return WebInputEventResult::HandledSuppressed; |
| 2050 } | 2050 } |
| 2051 m_scrollbarHandlingScrollGesture = nullptr; | 2051 m_scrollbarHandlingScrollGesture = nullptr; |
| 2052 } | 2052 } |
| 2053 | 2053 |
| 2054 if (eventTarget) { | 2054 if (eventTarget) { |
| 2055 if (handleScrollGestureOnResizer(eventTarget.get(), gestureEvent)) | 2055 if (handleScrollGestureOnResizer(eventTarget.get(), gestureEvent)) |
| 2056 return WebInputEventResult::HandledSuppressed; | 2056 return WebInputEventResult::HandledSuppressed; |
| 2057 | 2057 |
| 2058 RefPtrWillBeRawPtr<GestureEvent> gestureDomEvent = GestureEvent::create(
eventTarget->document().domWindow(), gestureEvent); | 2058 RawPtr<GestureEvent> gestureDomEvent = GestureEvent::create(eventTarget-
>document().domWindow(), gestureEvent); |
| 2059 if (gestureDomEvent.get()) { | 2059 if (gestureDomEvent.get()) { |
| 2060 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve
nt(gestureDomEvent); | 2060 DispatchEventResult gestureDomEventResult = eventTarget->dispatchEve
nt(gestureDomEvent); |
| 2061 if (gestureDomEventResult != DispatchEventResult::NotCanceled) { | 2061 if (gestureDomEventResult != DispatchEventResult::NotCanceled) { |
| 2062 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE
ventHandler); | 2062 ASSERT(gestureDomEventResult != DispatchEventResult::CanceledByE
ventHandler); |
| 2063 return toWebInputEventResult(gestureDomEventResult); | 2063 return toWebInputEventResult(gestureDomEventResult); |
| 2064 } | 2064 } |
| 2065 } | 2065 } |
| 2066 } | 2066 } |
| 2067 | 2067 |
| 2068 switch (gestureEvent.type()) { | 2068 switch (gestureEvent.type()) { |
| 2069 case PlatformEvent::GestureScrollBegin: | 2069 case PlatformEvent::GestureScrollBegin: |
| 2070 return handleGestureScrollBegin(gestureEvent); | 2070 return handleGestureScrollBegin(gestureEvent); |
| 2071 case PlatformEvent::GestureScrollUpdate: | 2071 case PlatformEvent::GestureScrollUpdate: |
| 2072 return handleGestureScrollUpdate(gestureEvent); | 2072 return handleGestureScrollUpdate(gestureEvent); |
| 2073 case PlatformEvent::GestureScrollEnd: | 2073 case PlatformEvent::GestureScrollEnd: |
| 2074 return handleGestureScrollEnd(gestureEvent); | 2074 return handleGestureScrollEnd(gestureEvent); |
| 2075 case PlatformEvent::GestureFlingStart: | 2075 case PlatformEvent::GestureFlingStart: |
| 2076 case PlatformEvent::GesturePinchBegin: | 2076 case PlatformEvent::GesturePinchBegin: |
| 2077 case PlatformEvent::GesturePinchEnd: | 2077 case PlatformEvent::GesturePinchEnd: |
| 2078 case PlatformEvent::GesturePinchUpdate: | 2078 case PlatformEvent::GesturePinchUpdate: |
| 2079 return WebInputEventResult::NotHandled; | 2079 return WebInputEventResult::NotHandled; |
| 2080 default: | 2080 default: |
| 2081 ASSERT_NOT_REACHED(); | 2081 ASSERT_NOT_REACHED(); |
| 2082 return WebInputEventResult::NotHandled; | 2082 return WebInputEventResult::NotHandled; |
| 2083 } | 2083 } |
| 2084 } | 2084 } |
| 2085 | 2085 |
| 2086 WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest
Results& targetedEvent) | 2086 WebInputEventResult EventHandler::handleGestureTap(const GestureEventWithHitTest
Results& targetedEvent) |
| 2087 { | 2087 { |
| 2088 RefPtrWillBeRawPtr<FrameView> frameView(m_frame->view()); | 2088 RawPtr<FrameView> frameView(m_frame->view()); |
| 2089 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); | 2089 const PlatformGestureEvent& gestureEvent = targetedEvent.event(); |
| 2090 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur
eEvent.type()); | 2090 HitTestRequest::HitTestRequestType hitType = getHitTypeForGestureType(gestur
eEvent.type()); |
| 2091 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion(); | 2091 uint64_t preDispatchDomTreeVersion = m_frame->document()->domTreeVersion(); |
| 2092 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion(); | 2092 uint64_t preDispatchStyleVersion = m_frame->document()->styleVersion(); |
| 2093 | 2093 |
| 2094 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); | 2094 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); |
| 2095 | 2095 |
| 2096 HitTestResult currentHitTest = targetedEvent.hitTestResult(); | 2096 HitTestResult currentHitTest = targetedEvent.hitTestResult(); |
| 2097 | 2097 |
| 2098 // We use the adjusted position so the application isn't surprised to see a
event with | 2098 // We use the adjusted position so the application isn't surprised to see a
event with |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2116 if (currentHitTest.innerNode()) { | 2116 if (currentHitTest.innerNode()) { |
| 2117 LocalFrame* mainFrame = m_frame->localFrameRoot(); | 2117 LocalFrame* mainFrame = m_frame->localFrameRoot(); |
| 2118 if (mainFrame && mainFrame->view()) | 2118 if (mainFrame && mainFrame->view()) |
| 2119 mainFrame->view()->updateAllLifecyclePhases(); | 2119 mainFrame->view()->updateAllLifecyclePhases(); |
| 2120 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); | 2120 adjustedPoint = frameView->rootFrameToContents(gestureEvent.position()); |
| 2121 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); | 2121 currentHitTest = hitTestResultInFrame(m_frame, adjustedPoint, hitType); |
| 2122 } | 2122 } |
| 2123 m_clickNode = currentHitTest.innerNode(); | 2123 m_clickNode = currentHitTest.innerNode(); |
| 2124 | 2124 |
| 2125 // Capture data for showUnhandledTapUIIfNeeded. | 2125 // Capture data for showUnhandledTapUIIfNeeded. |
| 2126 RefPtrWillBeRawPtr<Node> tappedNode = m_clickNode; | 2126 RawPtr<Node> tappedNode = m_clickNode; |
| 2127 IntPoint tappedPosition = gestureEvent.position(); | 2127 IntPoint tappedPosition = gestureEvent.position(); |
| 2128 | 2128 |
| 2129 if (m_clickNode && m_clickNode->isTextNode()) | 2129 if (m_clickNode && m_clickNode->isTextNode()) |
| 2130 m_clickNode = FlatTreeTraversal::parent(*m_clickNode); | 2130 m_clickNode = FlatTreeTraversal::parent(*m_clickNode); |
| 2131 | 2131 |
| 2132 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), | 2132 PlatformMouseEvent fakeMouseDown(gestureEvent.position(), gestureEvent.globa
lPosition(), |
| 2133 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), | 2133 LeftButton, PlatformEvent::MousePressed, gestureEvent.tapCount(), |
| 2134 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut
tonDown), | 2134 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::LeftBut
tonDown), |
| 2135 PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProp
erties::PointerType::Mouse); | 2135 PlatformMouseEvent::FromTouch, gestureEvent.timestamp(), WebPointerProp
erties::PointerType::Mouse); |
| 2136 WebInputEventResult mouseDownEventResult = dispatchMouseEvent(EventTypeNames
::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown)
; | 2136 WebInputEventResult mouseDownEventResult = dispatchMouseEvent(EventTypeNames
::mousedown, currentHitTest.innerNode(), gestureEvent.tapCount(), fakeMouseDown)
; |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2209 m_mouseDown = mouseDownEvent; | 2209 m_mouseDown = mouseDownEvent; |
| 2210 | 2210 |
| 2211 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MouseMoved, 1, | 2211 PlatformMouseEvent mouseDragEvent(adjustedPoint, gestureEvent.globalPosi
tion(), LeftButton, PlatformEvent::MouseMoved, 1, |
| 2212 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef
tButtonDown), | 2212 static_cast<PlatformEvent::Modifiers>(modifiers | PlatformEvent::Lef
tButtonDown), |
| 2213 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), W
ebPointerProperties::PointerType::Mouse); | 2213 PlatformMouseEvent::FromTouch, WTF::monotonicallyIncreasingTime(), W
ebPointerProperties::PointerType::Mouse); |
| 2214 HitTestRequest request(HitTestRequest::ReadOnly); | 2214 HitTestRequest request(HitTestRequest::ReadOnly); |
| 2215 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE
vent); | 2215 MouseEventWithHitTestResults mev = prepareMouseEvent(request, mouseDragE
vent); |
| 2216 m_mouseDownMayStartDrag = true; | 2216 m_mouseDownMayStartDrag = true; |
| 2217 dragState().m_dragSrc = nullptr; | 2217 dragState().m_dragSrc = nullptr; |
| 2218 m_mouseDownPos = m_frame->view()->rootFrameToContents(mouseDragEvent.pos
ition()); | 2218 m_mouseDownPos = m_frame->view()->rootFrameToContents(mouseDragEvent.pos
ition()); |
| 2219 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2219 RawPtr<FrameView> protector(m_frame->view()); |
| 2220 if (handleDrag(mev, DragInitiator::Touch)) { | 2220 if (handleDrag(mev, DragInitiator::Touch)) { |
| 2221 m_longTapShouldInvokeContextMenu = true; | 2221 m_longTapShouldInvokeContextMenu = true; |
| 2222 return WebInputEventResult::HandledSystem; | 2222 return WebInputEventResult::HandledSystem; |
| 2223 } | 2223 } |
| 2224 } | 2224 } |
| 2225 | 2225 |
| 2226 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.po
sition()); | 2226 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(gestureEvent.po
sition()); |
| 2227 HitTestResult result = hitTestResultAtPoint(hitTestPoint); | 2227 HitTestResult result = hitTestResultAtPoint(hitTestPoint); |
| 2228 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2228 RawPtr<FrameView> protector(m_frame->view()); |
| 2229 if (selectionController().handleGestureLongPress(gestureEvent, result)) { | 2229 if (selectionController().handleGestureLongPress(gestureEvent, result)) { |
| 2230 focusDocumentView(); | 2230 focusDocumentView(); |
| 2231 return WebInputEventResult::HandledSystem; | 2231 return WebInputEventResult::HandledSystem; |
| 2232 } | 2232 } |
| 2233 | 2233 |
| 2234 return sendContextMenuEventForGesture(targetedEvent); | 2234 return sendContextMenuEventForGesture(targetedEvent); |
| 2235 } | 2235 } |
| 2236 | 2236 |
| 2237 WebInputEventResult EventHandler::handleGestureLongTap(const GestureEventWithHit
TestResults& targetedEvent) | 2237 WebInputEventResult EventHandler::handleGestureLongTap(const GestureEventWithHit
TestResults& targetedEvent) |
| 2238 { | 2238 { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2282 Widget* widget = toLayoutPart(layoutObject)->widget(); | 2282 Widget* widget = toLayoutPart(layoutObject)->widget(); |
| 2283 | 2283 |
| 2284 if (!widget || !widget->isFrameView()) | 2284 if (!widget || !widget->isFrameView()) |
| 2285 return WebInputEventResult::NotHandled; | 2285 return WebInputEventResult::NotHandled; |
| 2286 | 2286 |
| 2287 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent(
gestureEvent); | 2287 return toFrameView(widget)->frame().eventHandler().handleGestureScrollEvent(
gestureEvent); |
| 2288 } | 2288 } |
| 2289 | 2289 |
| 2290 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv
ent& gestureEvent) | 2290 WebInputEventResult EventHandler::handleGestureScrollEnd(const PlatformGestureEv
ent& gestureEvent) |
| 2291 { | 2291 { |
| 2292 RefPtrWillBeRawPtr<Node> node = m_scrollGestureHandlingNode; | 2292 RawPtr<Node> node = m_scrollGestureHandlingNode; |
| 2293 | 2293 |
| 2294 if (node) { | 2294 if (node) { |
| 2295 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); | 2295 passScrollGestureEventToWidget(gestureEvent, node->layoutObject()); |
| 2296 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { | 2296 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { |
| 2297 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); | 2297 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); |
| 2298 scrollStateData->is_ending = true; | 2298 scrollStateData->is_ending = true; |
| 2299 scrollStateData->is_in_inertial_phase = gestureEvent.inertial(); | 2299 scrollStateData->is_in_inertial_phase = gestureEvent.inertial(); |
| 2300 scrollStateData->from_user_input = true; | 2300 scrollStateData->from_user_input = true; |
| 2301 scrollStateData->is_direct_manipulation = true; | 2301 scrollStateData->is_direct_manipulation = true; |
| 2302 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; | 2302 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; |
| 2303 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(sc
rollStateData.release()); | 2303 RawPtr<ScrollState> scrollState = ScrollState::create(scrollStateDat
a.release()); |
| 2304 customizedScroll(*node.get(), *scrollState); | 2304 customizedScroll(*node.get(), *scrollState); |
| 2305 } | 2305 } |
| 2306 } | 2306 } |
| 2307 | 2307 |
| 2308 clearGestureScrollState(); | 2308 clearGestureScrollState(); |
| 2309 return WebInputEventResult::NotHandled; | 2309 return WebInputEventResult::NotHandled; |
| 2310 } | 2310 } |
| 2311 | 2311 |
| 2312 WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGesture
Event& gestureEvent) | 2312 WebInputEventResult EventHandler::handleGestureScrollBegin(const PlatformGesture
Event& gestureEvent) |
| 2313 { | 2313 { |
| (...skipping 20 matching lines...) Expand all Loading... |
| 2334 | 2334 |
| 2335 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la
youtObject()); | 2335 passScrollGestureEventToWidget(gestureEvent, m_scrollGestureHandlingNode->la
youtObject()); |
| 2336 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { | 2336 if (RuntimeEnabledFeatures::scrollCustomizationEnabled()) { |
| 2337 m_currentScrollChain.clear(); | 2337 m_currentScrollChain.clear(); |
| 2338 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData()
); | 2338 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateData()
); |
| 2339 scrollStateData->start_position_x = gestureEvent.position().x(); | 2339 scrollStateData->start_position_x = gestureEvent.position().x(); |
| 2340 scrollStateData->start_position_y = gestureEvent.position().y(); | 2340 scrollStateData->start_position_y = gestureEvent.position().y(); |
| 2341 scrollStateData->is_beginning = true; | 2341 scrollStateData->is_beginning = true; |
| 2342 scrollStateData->from_user_input = true; | 2342 scrollStateData->from_user_input = true; |
| 2343 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor
ScrollSequence; | 2343 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsumedFor
ScrollSequence; |
| 2344 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(scroll
StateData.release()); | 2344 RawPtr<ScrollState> scrollState = ScrollState::create(scrollStateData.re
lease()); |
| 2345 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); | 2345 customizedScroll(*m_scrollGestureHandlingNode.get(), *scrollState); |
| 2346 } else { | 2346 } else { |
| 2347 if (m_frame->isMainFrame()) | 2347 if (m_frame->isMainFrame()) |
| 2348 m_frame->host()->topControls().scrollBegin(); | 2348 m_frame->host()->topControls().scrollBegin(); |
| 2349 } | 2349 } |
| 2350 return WebInputEventResult::HandledSystem; | 2350 return WebInputEventResult::HandledSystem; |
| 2351 } | 2351 } |
| 2352 | 2352 |
| 2353 void EventHandler::resetOverscroll(bool didScrollX, bool didScrollY) | 2353 void EventHandler::resetOverscroll(bool didScrollX, bool didScrollY) |
| 2354 { | 2354 { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2397 ScrollGranularity granularity = gestureEvent.deltaUnits(); | 2397 ScrollGranularity granularity = gestureEvent.deltaUnits(); |
| 2398 Node* node = m_scrollGestureHandlingNode.get(); | 2398 Node* node = m_scrollGestureHandlingNode.get(); |
| 2399 | 2399 |
| 2400 // Scroll customization is only available for touch. | 2400 // Scroll customization is only available for touch. |
| 2401 bool handleScrollCustomization = RuntimeEnabledFeatures::scrollCustomization
Enabled() && gestureEvent.source() == PlatformGestureSourceTouchscreen; | 2401 bool handleScrollCustomization = RuntimeEnabledFeatures::scrollCustomization
Enabled() && gestureEvent.source() == PlatformGestureSourceTouchscreen; |
| 2402 if (node) { | 2402 if (node) { |
| 2403 LayoutObject* layoutObject = node->layoutObject(); | 2403 LayoutObject* layoutObject = node->layoutObject(); |
| 2404 if (!layoutObject) | 2404 if (!layoutObject) |
| 2405 return WebInputEventResult::NotHandled; | 2405 return WebInputEventResult::NotHandled; |
| 2406 | 2406 |
| 2407 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 2407 RawPtr<FrameView> protector(m_frame->view()); |
| 2408 | 2408 |
| 2409 // Try to send the event to the correct view. | 2409 // Try to send the event to the correct view. |
| 2410 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent
, layoutObject); | 2410 WebInputEventResult result = passScrollGestureEventToWidget(gestureEvent
, layoutObject); |
| 2411 if (result != WebInputEventResult::NotHandled) { | 2411 if (result != WebInputEventResult::NotHandled) { |
| 2412 if (gestureEvent.preventPropagation() | 2412 if (gestureEvent.preventPropagation() |
| 2413 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) { | 2413 && !RuntimeEnabledFeatures::scrollCustomizationEnabled()) { |
| 2414 // This is an optimization which doesn't apply with | 2414 // This is an optimization which doesn't apply with |
| 2415 // scroll customization enabled. | 2415 // scroll customization enabled. |
| 2416 m_previousGestureScrolledNode = m_scrollGestureHandlingNode; | 2416 m_previousGestureScrolledNode = m_scrollGestureHandlingNode; |
| 2417 } | 2417 } |
| 2418 // FIXME: we should allow simultaneous scrolling of nested | 2418 // FIXME: we should allow simultaneous scrolling of nested |
| 2419 // iframes along perpendicular axes. See crbug.com/466991. | 2419 // iframes along perpendicular axes. See crbug.com/466991. |
| 2420 m_deltaConsumedForScrollSequence = true; | 2420 m_deltaConsumedForScrollSequence = true; |
| 2421 return result; | 2421 return result; |
| 2422 } | 2422 } |
| 2423 | 2423 |
| 2424 if (handleScrollCustomization) { | 2424 if (handleScrollCustomization) { |
| 2425 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); | 2425 OwnPtr<ScrollStateData> scrollStateData = adoptPtr(new ScrollStateDa
ta()); |
| 2426 scrollStateData->delta_x = delta.width(); | 2426 scrollStateData->delta_x = delta.width(); |
| 2427 scrollStateData->delta_y = delta.height(); | 2427 scrollStateData->delta_y = delta.height(); |
| 2428 scrollStateData->velocity_x = velocity.width(); | 2428 scrollStateData->velocity_x = velocity.width(); |
| 2429 scrollStateData->velocity_y = velocity.height(); | 2429 scrollStateData->velocity_y = velocity.height(); |
| 2430 scrollStateData->should_propagate = !gestureEvent.preventPropagation
(); | 2430 scrollStateData->should_propagate = !gestureEvent.preventPropagation
(); |
| 2431 scrollStateData->is_in_inertial_phase = gestureEvent.inertial(); | 2431 scrollStateData->is_in_inertial_phase = gestureEvent.inertial(); |
| 2432 scrollStateData->from_user_input = true; | 2432 scrollStateData->from_user_input = true; |
| 2433 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; | 2433 scrollStateData->delta_consumed_for_scroll_sequence = m_deltaConsume
dForScrollSequence; |
| 2434 RefPtrWillBeRawPtr<ScrollState> scrollState = ScrollState::create(sc
rollStateData.release()); | 2434 RawPtr<ScrollState> scrollState = ScrollState::create(scrollStateDat
a.release()); |
| 2435 if (m_previousGestureScrolledNode) { | 2435 if (m_previousGestureScrolledNode) { |
| 2436 // The ScrollState needs to know what the current | 2436 // The ScrollState needs to know what the current |
| 2437 // native scrolling element is, so that for an | 2437 // native scrolling element is, so that for an |
| 2438 // inertial scroll that shouldn't propagate, only the | 2438 // inertial scroll that shouldn't propagate, only the |
| 2439 // currently scrolling element responds. | 2439 // currently scrolling element responds. |
| 2440 ASSERT(m_previousGestureScrolledNode->isElementNode()); | 2440 ASSERT(m_previousGestureScrolledNode->isElementNode()); |
| 2441 scrollState->setCurrentNativeScrollingElement(toElement(m_previo
usGestureScrolledNode.get())); | 2441 scrollState->setCurrentNativeScrollingElement(toElement(m_previo
usGestureScrolledNode.get())); |
| 2442 } | 2442 } |
| 2443 customizedScroll(*node, *scrollState); | 2443 customizedScroll(*node, *scrollState); |
| 2444 m_previousGestureScrolledNode = scrollState->currentNativeScrollingE
lement(); | 2444 m_previousGestureScrolledNode = scrollState->currentNativeScrollingE
lement(); |
| (...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2506 // DOM nodes so a touch over a scrollbar will be adjusted towards nearby nod
es. This leads to things like textarea | 2506 // DOM nodes so a touch over a scrollbar will be adjusted towards nearby nod
es. This leads to things like textarea |
| 2507 // scrollbars being untouchable. | 2507 // scrollbars being untouchable. |
| 2508 if (result.scrollbar()) { | 2508 if (result.scrollbar()) { |
| 2509 targetNode = 0; | 2509 targetNode = 0; |
| 2510 return false; | 2510 return false; |
| 2511 } | 2511 } |
| 2512 | 2512 |
| 2513 IntPoint touchCenter = m_frame->view()->contentsToRootFrame(result.roundedPo
intInMainFrame()); | 2513 IntPoint touchCenter = m_frame->view()->contentsToRootFrame(result.roundedPo
intInMainFrame()); |
| 2514 IntRect touchRect = m_frame->view()->contentsToRootFrame(result.hitTestLocat
ion().boundingBox()); | 2514 IntRect touchRect = m_frame->view()->contentsToRootFrame(result.hitTestLocat
ion().boundingBox()); |
| 2515 | 2515 |
| 2516 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; | 2516 HeapVector<Member<Node>, 11> nodes; |
| 2517 copyToVector(result.listBasedTestResult(), nodes); | 2517 copyToVector(result.listBasedTestResult(), nodes); |
| 2518 | 2518 |
| 2519 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. | 2519 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. |
| 2520 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc
hRect, WillBeHeapVector<RefPtrWillBeMember<Node>> (nodes)); | 2520 return findBestClickableCandidate(targetNode, targetPoint, touchCenter, touc
hRect, HeapVector<Member<Node>> (nodes)); |
| 2521 } | 2521 } |
| 2522 | 2522 |
| 2523 bool EventHandler::bestContextMenuNodeForHitTestResult(const HitTestResult& resu
lt, IntPoint& targetPoint, Node*& targetNode) | 2523 bool EventHandler::bestContextMenuNodeForHitTestResult(const HitTestResult& resu
lt, IntPoint& targetPoint, Node*& targetNode) |
| 2524 { | 2524 { |
| 2525 ASSERT(result.isRectBasedTest()); | 2525 ASSERT(result.isRectBasedTest()); |
| 2526 IntPoint touchCenter = m_frame->view()->contentsToRootFrame(result.roundedPo
intInMainFrame()); | 2526 IntPoint touchCenter = m_frame->view()->contentsToRootFrame(result.roundedPo
intInMainFrame()); |
| 2527 IntRect touchRect = m_frame->view()->contentsToRootFrame(result.hitTestLocat
ion().boundingBox()); | 2527 IntRect touchRect = m_frame->view()->contentsToRootFrame(result.hitTestLocat
ion().boundingBox()); |
| 2528 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; | 2528 HeapVector<Member<Node>, 11> nodes; |
| 2529 copyToVector(result.listBasedTestResult(), nodes); | 2529 copyToVector(result.listBasedTestResult(), nodes); |
| 2530 | 2530 |
| 2531 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. | 2531 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. |
| 2532 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, to
uchRect, WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes)); | 2532 return findBestContextMenuCandidate(targetNode, targetPoint, touchCenter, to
uchRect, HeapVector<Member<Node>>(nodes)); |
| 2533 } | 2533 } |
| 2534 | 2534 |
| 2535 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co
nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode) | 2535 bool EventHandler::bestZoomableAreaForTouchPoint(const IntPoint& touchCenter, co
nst IntSize& touchRadius, IntRect& targetArea, Node*& targetNode) |
| 2536 { | 2536 { |
| 2537 if (touchRadius.isEmpty()) | 2537 if (touchRadius.isEmpty()) |
| 2538 return false; | 2538 return false; |
| 2539 | 2539 |
| 2540 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(touchCenter); | 2540 IntPoint hitTestPoint = m_frame->view()->rootFrameToContents(touchCenter); |
| 2541 | 2541 |
| 2542 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitT
estRequest::Active | HitTestRequest::ListBased; | 2542 HitTestRequest::HitTestRequestType hitType = HitTestRequest::ReadOnly | HitT
estRequest::Active | HitTestRequest::ListBased; |
| 2543 HitTestResult result = hitTestResultAtPoint(hitTestPoint, hitType, LayoutSiz
e(touchRadius)); | 2543 HitTestResult result = hitTestResultAtPoint(hitTestPoint, hitType, LayoutSiz
e(touchRadius)); |
| 2544 | 2544 |
| 2545 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius); | 2545 IntRect touchRect(touchCenter - touchRadius, touchRadius + touchRadius); |
| 2546 WillBeHeapVector<RefPtrWillBeMember<Node>, 11> nodes; | 2546 HeapVector<Member<Node>, 11> nodes; |
| 2547 copyToVector(result.listBasedTestResult(), nodes); | 2547 copyToVector(result.listBasedTestResult(), nodes); |
| 2548 | 2548 |
| 2549 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. | 2549 // FIXME: the explicit Vector conversion copies into a temporary and is wast
eful. |
| 2550 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect,
WillBeHeapVector<RefPtrWillBeMember<Node>>(nodes)); | 2550 return findBestZoomableArea(targetNode, targetArea, touchCenter, touchRect,
HeapVector<Member<Node>>(nodes)); |
| 2551 } | 2551 } |
| 2552 | 2552 |
| 2553 // Update the hover and active state across all frames for this gesture. | 2553 // Update the hover and active state across all frames for this gesture. |
| 2554 // This logic is different than the mouse case because mice send MouseLeave even
ts to frames as they're exited. | 2554 // This logic is different than the mouse case because mice send MouseLeave even
ts to frames as they're exited. |
| 2555 // With gestures, a single event conceptually both 'leaves' whatever frame curre
ntly had hover and enters a new frame | 2555 // With gestures, a single event conceptually both 'leaves' whatever frame curre
ntly had hover and enters a new frame |
| 2556 void EventHandler::updateGestureHoverActiveState(const HitTestRequest& request,
Element* innerElement) | 2556 void EventHandler::updateGestureHoverActiveState(const HitTestRequest& request,
Element* innerElement) |
| 2557 { | 2557 { |
| 2558 ASSERT(m_frame == m_frame->localFrameRoot()); | 2558 ASSERT(m_frame == m_frame->localFrameRoot()); |
| 2559 | 2559 |
| 2560 WillBeHeapVector<RawPtrWillBeMember<LocalFrame>> newHoverFrameChain; | 2560 HeapVector<Member<LocalFrame>> newHoverFrameChain; |
| 2561 LocalFrame* newHoverFrameInDocument = innerElement ? innerElement->document(
).frame() : nullptr; | 2561 LocalFrame* newHoverFrameInDocument = innerElement ? innerElement->document(
).frame() : nullptr; |
| 2562 // Insert the ancestors of the frame having the new hovered node to the fram
e chain | 2562 // Insert the ancestors of the frame having the new hovered node to the fram
e chain |
| 2563 // The frame chain doesn't include the main frame to avoid the redundant wor
k that cleans the hover state. | 2563 // The frame chain doesn't include the main frame to avoid the redundant wor
k that cleans the hover state. |
| 2564 // Because the hover state for the main frame is updated by calling Document
::updateHoverActiveState | 2564 // Because the hover state for the main frame is updated by calling Document
::updateHoverActiveState |
| 2565 while (newHoverFrameInDocument && newHoverFrameInDocument != m_frame) { | 2565 while (newHoverFrameInDocument && newHoverFrameInDocument != m_frame) { |
| 2566 newHoverFrameChain.append(newHoverFrameInDocument); | 2566 newHoverFrameChain.append(newHoverFrameInDocument); |
| 2567 Frame* parentFrame = newHoverFrameInDocument->tree().parent(); | 2567 Frame* parentFrame = newHoverFrameInDocument->tree().parent(); |
| 2568 newHoverFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? t
oLocalFrame(parentFrame) : nullptr; | 2568 newHoverFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? t
oLocalFrame(parentFrame) : nullptr; |
| 2569 } | 2569 } |
| 2570 | 2570 |
| 2571 RefPtrWillBeRawPtr<Node> oldHoverNodeInCurDoc = m_frame->document()->hoverNo
de(); | 2571 RawPtr<Node> oldHoverNodeInCurDoc = m_frame->document()->hoverNode(); |
| 2572 RefPtrWillBeRawPtr<Node> newInnermostHoverNode = innerElement; | 2572 RawPtr<Node> newInnermostHoverNode = innerElement; |
| 2573 | 2573 |
| 2574 if (newInnermostHoverNode != oldHoverNodeInCurDoc) { | 2574 if (newInnermostHoverNode != oldHoverNodeInCurDoc) { |
| 2575 size_t indexFrameChain = newHoverFrameChain.size(); | 2575 size_t indexFrameChain = newHoverFrameChain.size(); |
| 2576 | 2576 |
| 2577 // Clear the hover state on any frames which are no longer in the frame
chain of the hovered elemen | 2577 // Clear the hover state on any frames which are no longer in the frame
chain of the hovered elemen |
| 2578 while (oldHoverNodeInCurDoc && oldHoverNodeInCurDoc->isFrameOwnerElement
()) { | 2578 while (oldHoverNodeInCurDoc && oldHoverNodeInCurDoc->isFrameOwnerElement
()) { |
| 2579 LocalFrame* newHoverFrame = nullptr; | 2579 LocalFrame* newHoverFrame = nullptr; |
| 2580 // If we can't get the frame from the new hover frame chain, | 2580 // If we can't get the frame from the new hover frame chain, |
| 2581 // the newHoverFrame will be null and the old hover state will be cl
eared. | 2581 // the newHoverFrame will be null and the old hover state will be cl
eared. |
| 2582 if (indexFrameChain > 0) | 2582 if (indexFrameChain > 0) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 2610 ASSERT(m_frame == m_frame->localFrameRoot()); | 2610 ASSERT(m_frame == m_frame->localFrameRoot()); |
| 2611 | 2611 |
| 2612 // Behaviour of this function is as follows: | 2612 // Behaviour of this function is as follows: |
| 2613 // - Create the chain of all entered frames. | 2613 // - Create the chain of all entered frames. |
| 2614 // - Compare the last frame chain under the gesture to newly entered frame c
hain from the main frame one by one. | 2614 // - Compare the last frame chain under the gesture to newly entered frame c
hain from the main frame one by one. |
| 2615 // - If the last frame doesn't match with the entered frame, then create the
chain of exited frames from the last frame chain. | 2615 // - If the last frame doesn't match with the entered frame, then create the
chain of exited frames from the last frame chain. |
| 2616 // - Dispatch mouseout/mouseleave events of the exited frames from the insid
e out. | 2616 // - Dispatch mouseout/mouseleave events of the exited frames from the insid
e out. |
| 2617 // - Dispatch mouseover/mouseenter events of the entered frames into the ins
ide. | 2617 // - Dispatch mouseover/mouseenter events of the entered frames into the ins
ide. |
| 2618 | 2618 |
| 2619 // Insert the ancestors of the frame having the new target node to the enter
ed frame chain | 2619 // Insert the ancestors of the frame having the new target node to the enter
ed frame chain |
| 2620 WillBeHeapVector<RawPtrWillBeMember<LocalFrame>> enteredFrameChain; | 2620 HeapVector<Member<LocalFrame>> enteredFrameChain; |
| 2621 LocalFrame* enteredFrameInDocument = targetedEvent.hitTestResult().innerNode
Frame(); | 2621 LocalFrame* enteredFrameInDocument = targetedEvent.hitTestResult().innerNode
Frame(); |
| 2622 while (enteredFrameInDocument) { | 2622 while (enteredFrameInDocument) { |
| 2623 enteredFrameChain.append(enteredFrameInDocument); | 2623 enteredFrameChain.append(enteredFrameInDocument); |
| 2624 Frame* parentFrame = enteredFrameInDocument->tree().parent(); | 2624 Frame* parentFrame = enteredFrameInDocument->tree().parent(); |
| 2625 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to
LocalFrame(parentFrame) : nullptr; | 2625 enteredFrameInDocument = parentFrame && parentFrame->isLocalFrame() ? to
LocalFrame(parentFrame) : nullptr; |
| 2626 } | 2626 } |
| 2627 | 2627 |
| 2628 size_t indexEnteredFrameChain = enteredFrameChain.size(); | 2628 size_t indexEnteredFrameChain = enteredFrameChain.size(); |
| 2629 LocalFrame* exitedFrameInDocument = m_frame; | 2629 LocalFrame* exitedFrameInDocument = m_frame; |
| 2630 WillBeHeapVector<RawPtrWillBeMember<LocalFrame>> exitedFrameChain; | 2630 HeapVector<Member<LocalFrame>> exitedFrameChain; |
| 2631 // Insert the frame from the disagreement between last frames and entered fr
ames | 2631 // Insert the frame from the disagreement between last frames and entered fr
ames |
| 2632 while (exitedFrameInDocument) { | 2632 while (exitedFrameInDocument) { |
| 2633 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_nodeUnd
erMouse.get(); | 2633 Node* lastNodeUnderTap = exitedFrameInDocument->eventHandler().m_nodeUnd
erMouse.get(); |
| 2634 if (!lastNodeUnderTap) | 2634 if (!lastNodeUnderTap) |
| 2635 break; | 2635 break; |
| 2636 | 2636 |
| 2637 LocalFrame* nextExitedFrameInDocument = nullptr; | 2637 LocalFrame* nextExitedFrameInDocument = nullptr; |
| 2638 if (lastNodeUnderTap->isFrameOwnerElement()) { | 2638 if (lastNodeUnderTap->isFrameOwnerElement()) { |
| 2639 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder
Tap); | 2639 HTMLFrameOwnerElement* owner = toHTMLFrameOwnerElement(lastNodeUnder
Tap); |
| 2640 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) | 2640 if (owner->contentFrame() && owner->contentFrame()->isLocalFrame()) |
| (...skipping 441 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3082 String key = evt.unmodifiedText(); | 3082 String key = evt.unmodifiedText(); |
| 3083 Element* elem = m_frame->document()->getElementByAccessKey(key.lower()); | 3083 Element* elem = m_frame->document()->getElementByAccessKey(key.lower()); |
| 3084 if (!elem) | 3084 if (!elem) |
| 3085 return false; | 3085 return false; |
| 3086 elem->accessKeyAction(false); | 3086 elem->accessKeyAction(false); |
| 3087 return true; | 3087 return true; |
| 3088 } | 3088 } |
| 3089 | 3089 |
| 3090 WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK
eyEvent) | 3090 WebInputEventResult EventHandler::keyEvent(const PlatformKeyboardEvent& initialK
eyEvent) |
| 3091 { | 3091 { |
| 3092 RefPtrWillBeRawPtr<FrameView> protector(m_frame->view()); | 3092 RawPtr<FrameView> protector(m_frame->view()); |
| 3093 m_frame->chromeClient().clearToolTip(); | 3093 m_frame->chromeClient().clearToolTip(); |
| 3094 | 3094 |
| 3095 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) | 3095 if (initialKeyEvent.windowsVirtualKeyCode() == VK_CAPITAL) |
| 3096 capsLockStateMayHaveChanged(); | 3096 capsLockStateMayHaveChanged(); |
| 3097 | 3097 |
| 3098 #if OS(WIN) | 3098 #if OS(WIN) |
| 3099 if (panScrollInProgress()) { | 3099 if (panScrollInProgress()) { |
| 3100 // If a key is pressed while the panScroll is in progress then we want t
o stop | 3100 // If a key is pressed while the panScroll is in progress then we want t
o stop |
| 3101 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent.
type() == PlatformEvent::RawKeyDown) | 3101 if (initialKeyEvent.type() == PlatformEvent::KeyDown || initialKeyEvent.
type() == PlatformEvent::RawKeyDown) |
| 3102 stopAutoscroll(); | 3102 stopAutoscroll(); |
| 3103 | 3103 |
| 3104 // If we were in panscroll mode, we swallow the key event | 3104 // If we were in panscroll mode, we swallow the key event |
| 3105 return WebInputEventResult::HandledSuppressed; | 3105 return WebInputEventResult::HandledSuppressed; |
| 3106 } | 3106 } |
| 3107 #endif | 3107 #endif |
| 3108 | 3108 |
| 3109 // Check for cases where we are too early for events -- possible unmatched k
ey up | 3109 // Check for cases where we are too early for events -- possible unmatched k
ey up |
| 3110 // from pressing return in the location bar. | 3110 // from pressing return in the location bar. |
| 3111 RefPtrWillBeRawPtr<Node> node = eventTargetNodeForDocument(m_frame->document
()); | 3111 RawPtr<Node> node = eventTargetNodeForDocument(m_frame->document()); |
| 3112 if (!node) | 3112 if (!node) |
| 3113 return WebInputEventResult::NotHandled; | 3113 return WebInputEventResult::NotHandled; |
| 3114 | 3114 |
| 3115 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); | 3115 UserGestureIndicator gestureIndicator(DefinitelyProcessingUserGesture); |
| 3116 | 3116 |
| 3117 // In IE, access keys are special, they are handled after default keydown pr
ocessing, but cannot be canceled - this is hard to match. | 3117 // In IE, access keys are special, they are handled after default keydown pr
ocessing, but cannot be canceled - this is hard to match. |
| 3118 // On Mac OS X, we process them before dispatching keydown, as the default k
eydown handler implements Emacs key bindings, which may conflict | 3118 // On Mac OS X, we process them before dispatching keydown, as the default k
eydown handler implements Emacs key bindings, which may conflict |
| 3119 // with access keys. Then we dispatch keydown, but suppress its default hand
ling. | 3119 // with access keys. Then we dispatch keydown, but suppress its default hand
ling. |
| 3120 // On Windows, WebKit explicitly calls handleAccessKey() instead of dispatch
ing a keypress event for WM_SYSCHAR messages. | 3120 // On Windows, WebKit explicitly calls handleAccessKey() instead of dispatch
ing a keypress event for WM_SYSCHAR messages. |
| 3121 // Other platforms currently match either Mac or Windows behavior, depending
on whether they send combined KeyDown events. | 3121 // Other platforms currently match either Mac or Windows behavior, depending
on whether they send combined KeyDown events. |
| 3122 bool matchedAnAccessKey = false; | 3122 bool matchedAnAccessKey = false; |
| 3123 if (initialKeyEvent.type() == PlatformEvent::KeyDown) | 3123 if (initialKeyEvent.type() == PlatformEvent::KeyDown) |
| 3124 matchedAnAccessKey = handleAccessKey(initialKeyEvent); | 3124 matchedAnAccessKey = handleAccessKey(initialKeyEvent); |
| 3125 | 3125 |
| 3126 // FIXME: it would be fair to let an input method handle KeyUp events before
DOM dispatch. | 3126 // FIXME: it would be fair to let an input method handle KeyUp events before
DOM dispatch. |
| 3127 if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type()
== PlatformEvent::Char) { | 3127 if (initialKeyEvent.type() == PlatformEvent::KeyUp || initialKeyEvent.type()
== PlatformEvent::Char) { |
| 3128 RefPtrWillBeRawPtr<KeyboardEvent> domEvent = KeyboardEvent::create(initi
alKeyEvent, m_frame->document()->domWindow()); | 3128 RawPtr<KeyboardEvent> domEvent = KeyboardEvent::create(initialKeyEvent,
m_frame->document()->domWindow()); |
| 3129 | 3129 |
| 3130 return toWebInputEventResult(node->dispatchEvent(domEvent)); | 3130 return toWebInputEventResult(node->dispatchEvent(domEvent)); |
| 3131 } | 3131 } |
| 3132 | 3132 |
| 3133 PlatformKeyboardEvent keyDownEvent = initialKeyEvent; | 3133 PlatformKeyboardEvent keyDownEvent = initialKeyEvent; |
| 3134 if (keyDownEvent.type() != PlatformEvent::RawKeyDown) | 3134 if (keyDownEvent.type() != PlatformEvent::RawKeyDown) |
| 3135 keyDownEvent.disambiguateKeyDownEvent(PlatformEvent::RawKeyDown); | 3135 keyDownEvent.disambiguateKeyDownEvent(PlatformEvent::RawKeyDown); |
| 3136 RefPtrWillBeRawPtr<KeyboardEvent> keydown = KeyboardEvent::create(keyDownEve
nt, m_frame->document()->domWindow()); | 3136 RawPtr<KeyboardEvent> keydown = KeyboardEvent::create(keyDownEvent, m_frame-
>document()->domWindow()); |
| 3137 if (matchedAnAccessKey) | 3137 if (matchedAnAccessKey) |
| 3138 keydown->setDefaultPrevented(true); | 3138 keydown->setDefaultPrevented(true); |
| 3139 keydown->setTarget(node); | 3139 keydown->setTarget(node); |
| 3140 | 3140 |
| 3141 DispatchEventResult dispatchResult = node->dispatchEvent(keydown); | 3141 DispatchEventResult dispatchResult = node->dispatchEvent(keydown); |
| 3142 if (dispatchResult != DispatchEventResult::NotCanceled) | 3142 if (dispatchResult != DispatchEventResult::NotCanceled) |
| 3143 return toWebInputEventResult(dispatchResult); | 3143 return toWebInputEventResult(dispatchResult); |
| 3144 // If frame changed as a result of keydown dispatch, then return early to av
oid sending a subsequent keypress message to the new frame. | 3144 // If frame changed as a result of keydown dispatch, then return early to av
oid sending a subsequent keypress message to the new frame. |
| 3145 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->fo
cusController().focusedOrMainFrame(); | 3145 bool changedFocusedFrame = m_frame->page() && m_frame != m_frame->page()->fo
cusController().focusedOrMainFrame(); |
| 3146 if (changedFocusedFrame) | 3146 if (changedFocusedFrame) |
| 3147 return WebInputEventResult::HandledSystem; | 3147 return WebInputEventResult::HandledSystem; |
| 3148 | 3148 |
| 3149 if (initialKeyEvent.type() == PlatformEvent::RawKeyDown) | 3149 if (initialKeyEvent.type() == PlatformEvent::RawKeyDown) |
| 3150 return WebInputEventResult::NotHandled; | 3150 return WebInputEventResult::NotHandled; |
| 3151 | 3151 |
| 3152 // Focus may have changed during keydown handling, so refetch node. | 3152 // Focus may have changed during keydown handling, so refetch node. |
| 3153 // But if we are dispatching a fake backward compatibility keypress, then we
pretend that the keypress happened on the original node. | 3153 // But if we are dispatching a fake backward compatibility keypress, then we
pretend that the keypress happened on the original node. |
| 3154 node = eventTargetNodeForDocument(m_frame->document()); | 3154 node = eventTargetNodeForDocument(m_frame->document()); |
| 3155 if (!node) | 3155 if (!node) |
| 3156 return WebInputEventResult::NotHandled; | 3156 return WebInputEventResult::NotHandled; |
| 3157 | 3157 |
| 3158 PlatformKeyboardEvent keyPressEvent = initialKeyEvent; | 3158 PlatformKeyboardEvent keyPressEvent = initialKeyEvent; |
| 3159 keyPressEvent.disambiguateKeyDownEvent(PlatformEvent::Char); | 3159 keyPressEvent.disambiguateKeyDownEvent(PlatformEvent::Char); |
| 3160 if (keyPressEvent.text().isEmpty()) | 3160 if (keyPressEvent.text().isEmpty()) |
| 3161 return WebInputEventResult::NotHandled; | 3161 return WebInputEventResult::NotHandled; |
| 3162 RefPtrWillBeRawPtr<KeyboardEvent> keypress = KeyboardEvent::create(keyPressE
vent, m_frame->document()->domWindow()); | 3162 RawPtr<KeyboardEvent> keypress = KeyboardEvent::create(keyPressEvent, m_fram
e->document()->domWindow()); |
| 3163 keypress->setTarget(node); | 3163 keypress->setTarget(node); |
| 3164 return toWebInputEventResult(node->dispatchEvent(keypress)); | 3164 return toWebInputEventResult(node->dispatchEvent(keypress)); |
| 3165 } | 3165 } |
| 3166 | 3166 |
| 3167 static WebFocusType focusDirectionForKey(const AtomicString& keyIdentifier) | 3167 static WebFocusType focusDirectionForKey(const AtomicString& keyIdentifier) |
| 3168 { | 3168 { |
| 3169 DEFINE_STATIC_LOCAL(AtomicString, Down, ("Down")); | 3169 DEFINE_STATIC_LOCAL(AtomicString, Down, ("Down")); |
| 3170 DEFINE_STATIC_LOCAL(AtomicString, Up, ("Up")); | 3170 DEFINE_STATIC_LOCAL(AtomicString, Up, ("Up")); |
| 3171 DEFINE_STATIC_LOCAL(AtomicString, Left, ("Left")); | 3171 DEFINE_STATIC_LOCAL(AtomicString, Left, ("Left")); |
| 3172 DEFINE_STATIC_LOCAL(AtomicString, Right, ("Right")); | 3172 DEFINE_STATIC_LOCAL(AtomicString, Right, ("Right")); |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3396 return false; | 3396 return false; |
| 3397 | 3397 |
| 3398 EventTarget* target; | 3398 EventTarget* target; |
| 3399 if (underlyingEvent) | 3399 if (underlyingEvent) |
| 3400 target = underlyingEvent->target(); | 3400 target = underlyingEvent->target(); |
| 3401 else | 3401 else |
| 3402 target = eventTargetNodeForDocument(m_frame->document()); | 3402 target = eventTargetNodeForDocument(m_frame->document()); |
| 3403 if (!target) | 3403 if (!target) |
| 3404 return false; | 3404 return false; |
| 3405 | 3405 |
| 3406 RefPtrWillBeRawPtr<TextEvent> event = TextEvent::create(m_frame->domWindow()
, text, inputType); | 3406 RawPtr<TextEvent> event = TextEvent::create(m_frame->domWindow(), text, inpu
tType); |
| 3407 event->setUnderlyingEvent(underlyingEvent); | 3407 event->setUnderlyingEvent(underlyingEvent); |
| 3408 | 3408 |
| 3409 target->dispatchEvent(event); | 3409 target->dispatchEvent(event); |
| 3410 return event->defaultHandled() || event->defaultPrevented(); | 3410 return event->defaultHandled() || event->defaultPrevented(); |
| 3411 } | 3411 } |
| 3412 | 3412 |
| 3413 void EventHandler::defaultTextInputEventHandler(TextEvent* event) | 3413 void EventHandler::defaultTextInputEventHandler(TextEvent* event) |
| 3414 { | 3414 { |
| 3415 if (m_frame->editor().handleTextEvent(event)) | 3415 if (m_frame->editor().handleTextEvent(event)) |
| 3416 event->setDefaultHandled(); | 3416 event->setDefaultHandled(); |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3563 if (frame->view()) { | 3563 if (frame->view()) { |
| 3564 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); | 3564 IntRect rect = frame->view()->visibleContentRect(IncludeScrollbars); |
| 3565 if (!rect.contains(roundedIntPoint(point))) | 3565 if (!rect.contains(roundedIntPoint(point))) |
| 3566 return result; | 3566 return result; |
| 3567 } | 3567 } |
| 3568 frame->contentLayoutItem().hitTest(result); | 3568 frame->contentLayoutItem().hitTest(result); |
| 3569 return result; | 3569 return result; |
| 3570 } | 3570 } |
| 3571 | 3571 |
| 3572 void EventHandler::dispatchPointerEvents(const PlatformTouchEvent& event, | 3572 void EventHandler::dispatchPointerEvents(const PlatformTouchEvent& event, |
| 3573 WillBeHeapVector<TouchInfo>& touchInfos) | 3573 HeapVector<TouchInfo>& touchInfos) |
| 3574 { | 3574 { |
| 3575 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 3575 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
| 3576 return; | 3576 return; |
| 3577 | 3577 |
| 3578 // Iterate through the touch points, sending PointerEvents to the targets as
required. | 3578 // Iterate through the touch points, sending PointerEvents to the targets as
required. |
| 3579 for (unsigned i = 0; i < touchInfos.size(); ++i) { | 3579 for (unsigned i = 0; i < touchInfos.size(); ++i) { |
| 3580 TouchInfo& touchInfo = touchInfos[i]; | 3580 TouchInfo& touchInfo = touchInfos[i]; |
| 3581 const PlatformTouchPoint& touchPoint = touchInfo.point; | 3581 const PlatformTouchPoint& touchPoint = touchInfo.point; |
| 3582 | 3582 |
| 3583 | 3583 |
| 3584 if (touchPoint.state() == PlatformTouchPoint::TouchStationary | 3584 if (touchPoint.state() == PlatformTouchPoint::TouchStationary |
| 3585 || !touchInfo.knownTarget) | 3585 || !touchInfo.knownTarget) |
| 3586 continue; | 3586 continue; |
| 3587 | 3587 |
| 3588 WebInputEventResult result = | 3588 WebInputEventResult result = |
| 3589 m_pointerEventManager.sendTouchPointerEvent( | 3589 m_pointerEventManager.sendTouchPointerEvent( |
| 3590 touchInfo.touchTarget, touchPoint, event.getModifiers(), | 3590 touchInfo.touchTarget, touchPoint, event.getModifiers(), |
| 3591 touchInfo.adjustedRadius.width(), touchInfo.adjustedRadius.height(), | 3591 touchInfo.adjustedRadius.width(), touchInfo.adjustedRadius.height(), |
| 3592 touchInfo.adjustedPagePoint.x(), touchInfo.adjustedPagePoint.y()); | 3592 touchInfo.adjustedPagePoint.x(), touchInfo.adjustedPagePoint.y()); |
| 3593 touchInfo.consumed = result != WebInputEventResult::NotHandled; | 3593 touchInfo.consumed = result != WebInputEventResult::NotHandled; |
| 3594 } | 3594 } |
| 3595 } | 3595 } |
| 3596 | 3596 |
| 3597 void EventHandler::sendPointerCancels(WillBeHeapVector<TouchInfo>& touchInfos) | 3597 void EventHandler::sendPointerCancels(HeapVector<TouchInfo>& touchInfos) |
| 3598 { | 3598 { |
| 3599 if (!RuntimeEnabledFeatures::pointerEventEnabled()) | 3599 if (!RuntimeEnabledFeatures::pointerEventEnabled()) |
| 3600 return; | 3600 return; |
| 3601 | 3601 |
| 3602 for (unsigned i = 0; i < touchInfos.size(); ++i) { | 3602 for (unsigned i = 0; i < touchInfos.size(); ++i) { |
| 3603 TouchInfo& touchInfo = touchInfos[i]; | 3603 TouchInfo& touchInfo = touchInfos[i]; |
| 3604 const PlatformTouchPoint& point = touchInfo.point; | 3604 const PlatformTouchPoint& point = touchInfo.point; |
| 3605 const PlatformTouchPoint::TouchState pointState = point.state(); | 3605 const PlatformTouchPoint::TouchState pointState = point.state(); |
| 3606 | 3606 |
| 3607 if (pointState == PlatformTouchPoint::TouchReleased | 3607 if (pointState == PlatformTouchPoint::TouchReleased |
| (...skipping 13 matching lines...) Expand all Loading... |
| 3621 // that the local class doesn't provide a local definition for 'operator new'. | 3621 // that the local class doesn't provide a local definition for 'operator new'. |
| 3622 // Which it intentionally doesn't and shouldn't. | 3622 // Which it intentionally doesn't and shouldn't. |
| 3623 // | 3623 // |
| 3624 // Work around such toolchain bugginess by lifting out the type, thereby | 3624 // Work around such toolchain bugginess by lifting out the type, thereby |
| 3625 // taking it out of C4822's reach. | 3625 // taking it out of C4822's reach. |
| 3626 class ChangedTouches final { | 3626 class ChangedTouches final { |
| 3627 STACK_ALLOCATED(); | 3627 STACK_ALLOCATED(); |
| 3628 public: | 3628 public: |
| 3629 // The touches corresponding to the particular change state this struct | 3629 // The touches corresponding to the particular change state this struct |
| 3630 // instance represents. | 3630 // instance represents. |
| 3631 RefPtrWillBeMember<TouchList> m_touches; | 3631 Member<TouchList> m_touches; |
| 3632 | 3632 |
| 3633 using EventTargetSet = WillBeHeapHashSet<RefPtrWillBeMember<EventTarget>>; | 3633 using EventTargetSet = HeapHashSet<Member<EventTarget>>; |
| 3634 // Set of targets involved in m_touches. | 3634 // Set of targets involved in m_touches. |
| 3635 EventTargetSet m_targets; | 3635 EventTargetSet m_targets; |
| 3636 }; | 3636 }; |
| 3637 | 3637 |
| 3638 } // namespace | 3638 } // namespace |
| 3639 | 3639 |
| 3640 WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent&
event, | 3640 WebInputEventResult EventHandler::dispatchTouchEvents(const PlatformTouchEvent&
event, |
| 3641 WillBeHeapVector<TouchInfo>& touchInfos, bool freshTouchEvents, bool allTouc
hReleased) | 3641 HeapVector<TouchInfo>& touchInfos, bool freshTouchEvents, bool allTouchRelea
sed) |
| 3642 { | 3642 { |
| 3643 // Build up the lists to use for the 'touches', 'targetTouches' and | 3643 // Build up the lists to use for the 'touches', 'targetTouches' and |
| 3644 // 'changedTouches' attributes in the JS event. See | 3644 // 'changedTouches' attributes in the JS event. See |
| 3645 // http://www.w3.org/TR/touch-events/#touchevent-interface for how these | 3645 // http://www.w3.org/TR/touch-events/#touchevent-interface for how these |
| 3646 // lists fit together. | 3646 // lists fit together. |
| 3647 | 3647 |
| 3648 // Holds the complete set of touches on the screen. | 3648 // Holds the complete set of touches on the screen. |
| 3649 RefPtrWillBeRawPtr<TouchList> touches = TouchList::create(); | 3649 RawPtr<TouchList> touches = TouchList::create(); |
| 3650 | 3650 |
| 3651 // A different view on the 'touches' list above, filtered and grouped by | 3651 // A different view on the 'touches' list above, filtered and grouped by |
| 3652 // event target. Used for the 'targetTouches' list in the JS event. | 3652 // event target. Used for the 'targetTouches' list in the JS event. |
| 3653 using TargetTouchesHeapMap = WillBeHeapHashMap<EventTarget*, RefPtrWillBeMem
ber<TouchList>>; | 3653 using TargetTouchesHeapMap = HeapHashMap<EventTarget*, Member<TouchList>>; |
| 3654 TargetTouchesHeapMap touchesByTarget; | 3654 TargetTouchesHeapMap touchesByTarget; |
| 3655 | 3655 |
| 3656 // Array of touches per state, used to assemble the 'changedTouches' list. | 3656 // Array of touches per state, used to assemble the 'changedTouches' list. |
| 3657 ChangedTouches changedTouches[PlatformTouchPoint::TouchStateEnd]; | 3657 ChangedTouches changedTouches[PlatformTouchPoint::TouchStateEnd]; |
| 3658 | 3658 |
| 3659 for (unsigned i = 0; i < touchInfos.size(); ++i) { | 3659 for (unsigned i = 0; i < touchInfos.size(); ++i) { |
| 3660 const TouchInfo& touchInfo = touchInfos[i]; | 3660 const TouchInfo& touchInfo = touchInfos[i]; |
| 3661 const PlatformTouchPoint& point = touchInfo.point; | 3661 const PlatformTouchPoint& point = touchInfo.point; |
| 3662 PlatformTouchPoint::TouchState pointState = point.state(); | 3662 PlatformTouchPoint::TouchState pointState = point.state(); |
| 3663 | 3663 |
| 3664 if (touchInfo.consumed) | 3664 if (touchInfo.consumed) |
| 3665 continue; | 3665 continue; |
| 3666 | 3666 |
| 3667 RefPtrWillBeRawPtr<Touch> touch = Touch::create( | 3667 RawPtr<Touch> touch = Touch::create( |
| 3668 touchInfo.targetFrame.get(), | 3668 touchInfo.targetFrame.get(), |
| 3669 touchInfo.touchTarget.get(), | 3669 touchInfo.touchTarget.get(), |
| 3670 point.id(), | 3670 point.id(), |
| 3671 point.screenPos(), | 3671 point.screenPos(), |
| 3672 touchInfo.adjustedPagePoint, | 3672 touchInfo.adjustedPagePoint, |
| 3673 touchInfo.adjustedRadius, | 3673 touchInfo.adjustedRadius, |
| 3674 point.rotationAngle(), | 3674 point.rotationAngle(), |
| 3675 point.force(), | 3675 point.force(), |
| 3676 touchInfo.region); | 3676 touchInfo.region); |
| 3677 | 3677 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3714 | 3714 |
| 3715 // Now iterate through the changedTouches list and m_targets within it, send
ing | 3715 // Now iterate through the changedTouches list and m_targets within it, send
ing |
| 3716 // TouchEvents to the targets as required. | 3716 // TouchEvents to the targets as required. |
| 3717 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state
) { | 3717 for (unsigned state = 0; state != PlatformTouchPoint::TouchStateEnd; ++state
) { |
| 3718 if (!changedTouches[state].m_touches) | 3718 if (!changedTouches[state].m_touches) |
| 3719 continue; | 3719 continue; |
| 3720 | 3720 |
| 3721 const AtomicString& eventName(touchEventNameForTouchPointState(static_ca
st<PlatformTouchPoint::TouchState>(state))); | 3721 const AtomicString& eventName(touchEventNameForTouchPointState(static_ca
st<PlatformTouchPoint::TouchState>(state))); |
| 3722 for (const auto& eventTarget : changedTouches[state].m_targets) { | 3722 for (const auto& eventTarget : changedTouches[state].m_targets) { |
| 3723 EventTarget* touchEventTarget = eventTarget.get(); | 3723 EventTarget* touchEventTarget = eventTarget.get(); |
| 3724 RefPtrWillBeRawPtr<TouchEvent> touchEvent = TouchEvent::create( | 3724 RawPtr<TouchEvent> touchEvent = TouchEvent::create( |
| 3725 touches.get(), touchesByTarget.get(touchEventTarget), changedTou
ches[state].m_touches.get(), | 3725 touches.get(), touchesByTarget.get(touchEventTarget), changedTou
ches[state].m_touches.get(), |
| 3726 eventName, touchEventTarget->toNode()->document().domWindow(), | 3726 eventName, touchEventTarget->toNode()->document().domWindow(), |
| 3727 event.getModifiers(), event.cancelable(), event.causesScrollingI
fUncanceled(), event.timestamp()); | 3727 event.getModifiers(), event.cancelable(), event.causesScrollingI
fUncanceled(), event.timestamp()); |
| 3728 | 3728 |
| 3729 eventResult = mergeEventResult(eventResult, toWebInputEventResult(to
uchEventTarget->dispatchEvent(touchEvent.get()))); | 3729 eventResult = mergeEventResult(eventResult, toWebInputEventResult(to
uchEventTarget->dispatchEvent(touchEvent.get()))); |
| 3730 } | 3730 } |
| 3731 } | 3731 } |
| 3732 | 3732 |
| 3733 return eventResult; | 3733 return eventResult; |
| 3734 } | 3734 } |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3839 // this work. | 3839 // this work. |
| 3840 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !ha
sTouchHandlers(m_touchSequenceDocument->frameHost()->eventHandlerRegistry()) ||
!m_touchSequenceDocument->frame()) { | 3840 if (!m_touchSequenceDocument || !m_touchSequenceDocument->frameHost() || !ha
sTouchHandlers(m_touchSequenceDocument->frameHost()->eventHandlerRegistry()) ||
!m_touchSequenceDocument->frame()) { |
| 3841 if (allTouchReleased) { | 3841 if (allTouchReleased) { |
| 3842 m_touchSequenceDocument.clear(); | 3842 m_touchSequenceDocument.clear(); |
| 3843 m_touchSequenceUserGestureToken.clear(); | 3843 m_touchSequenceUserGestureToken.clear(); |
| 3844 } | 3844 } |
| 3845 return WebInputEventResult::NotHandled; | 3845 return WebInputEventResult::NotHandled; |
| 3846 } | 3846 } |
| 3847 | 3847 |
| 3848 // Compute and store the common info used by both PointerEvent and TouchEven
t. | 3848 // Compute and store the common info used by both PointerEvent and TouchEven
t. |
| 3849 WillBeHeapVector<TouchInfo> touchInfos(points.size()); | 3849 HeapVector<TouchInfo> touchInfos(points.size()); |
| 3850 | 3850 |
| 3851 for (unsigned i = 0; i < points.size(); ++i) { | 3851 for (unsigned i = 0; i < points.size(); ++i) { |
| 3852 const PlatformTouchPoint& point = points[i]; | 3852 const PlatformTouchPoint& point = points[i]; |
| 3853 PlatformTouchPoint::TouchState pointState = point.state(); | 3853 PlatformTouchPoint::TouchState pointState = point.state(); |
| 3854 RefPtrWillBeRawPtr<EventTarget> touchTarget = nullptr; | 3854 RawPtr<EventTarget> touchTarget = nullptr; |
| 3855 String regionID; | 3855 String regionID; |
| 3856 | 3856 |
| 3857 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla
tformTouchPoint::TouchCancelled) { | 3857 if (pointState == PlatformTouchPoint::TouchReleased || pointState == Pla
tformTouchPoint::TouchCancelled) { |
| 3858 // The target should be the original target for this touch, so get | 3858 // The target should be the original target for this touch, so get |
| 3859 // it from the hashmap. As it's a release or cancel we also remove | 3859 // it from the hashmap. As it's a release or cancel we also remove |
| 3860 // it from the map. | 3860 // it from the map. |
| 3861 touchTarget = m_targetForTouchID.take(point.id()); | 3861 touchTarget = m_targetForTouchID.take(point.id()); |
| 3862 regionID = m_regionForTouchID.take(point.id()); | 3862 regionID = m_regionForTouchID.take(point.id()); |
| 3863 } else { | 3863 } else { |
| 3864 // No hittest is performed on move or stationary, since the target | 3864 // No hittest is performed on move or stationary, since the target |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3992 PlatformEvent::Modifiers EventHandler::accessKeyModifiers() | 3992 PlatformEvent::Modifiers EventHandler::accessKeyModifiers() |
| 3993 { | 3993 { |
| 3994 #if OS(MACOSX) | 3994 #if OS(MACOSX) |
| 3995 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo
rmEvent::AltKey); | 3995 return static_cast<PlatformEvent::Modifiers>(PlatformEvent::CtrlKey | Platfo
rmEvent::AltKey); |
| 3996 #else | 3996 #else |
| 3997 return PlatformEvent::AltKey; | 3997 return PlatformEvent::AltKey; |
| 3998 #endif | 3998 #endif |
| 3999 } | 3999 } |
| 4000 | 4000 |
| 4001 } // namespace blink | 4001 } // namespace blink |
| OLD | NEW |