| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "core/input/PointerEventManager.h" | 5 #include "core/input/PointerEventManager.h" |
| 6 | 6 |
| 7 #include "core/dom/ElementTraversal.h" | 7 #include "core/dom/ElementTraversal.h" |
| 8 #include "core/dom/shadow/FlatTreeTraversal.h" | 8 #include "core/dom/shadow/FlatTreeTraversal.h" |
| 9 #include "core/events/MouseEvent.h" | 9 #include "core/events/MouseEvent.h" |
| 10 #include "core/frame/FrameView.h" | 10 #include "core/frame/FrameView.h" |
| (...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 207 enteredTarget = nullptr; | 207 enteredTarget = nullptr; |
| 208 else if (capturingTarget == enteredTarget) | 208 else if (capturingTarget == enteredTarget) |
| 209 exitedTarget = nullptr; | 209 exitedTarget = nullptr; |
| 210 else | 210 else |
| 211 return; | 211 return; |
| 212 } | 212 } |
| 213 | 213 |
| 214 // Dispatch pointerout/mouseout events | 214 // Dispatch pointerout/mouseout events |
| 215 if (isInDocument(exitedTarget)) { | 215 if (isInDocument(exitedTarget)) { |
| 216 if (!sendMouseEvent) { | 216 if (!sendMouseEvent) { |
| 217 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erTransitionEvent( | 217 dispatchPointerEvent(exitedTarget, m_pointerEventFactory.createPoint
erBoundaryEvent( |
| 218 pointerEvent, EventTypeNames::pointerout, enteredTarget)); | 218 pointerEvent, EventTypeNames::pointerout, enteredTarget)); |
| 219 } else { | 219 } else { |
| 220 dispatchMouseEvent(exitedTarget, | 220 dispatchMouseEvent(exitedTarget, |
| 221 EventTypeNames::mouseout, | 221 EventTypeNames::mouseout, |
| 222 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), | 222 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 223 enteredTarget); | 223 enteredTarget); |
| 224 } | 224 } |
| 225 } | 225 } |
| 226 | 226 |
| 227 // Create lists of all exited/entered ancestors, locate the common ancestor | 227 // Create lists of all exited/entered ancestors, locate the common ancestor |
| (...skipping 28 matching lines...) Expand all Loading... |
| 256 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse
leave) | 256 if (exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::mouse
leave) |
| 257 || (RuntimeEnabledFeatures::pointerEventEnabled() | 257 || (RuntimeEnabledFeatures::pointerEventEnabled() |
| 258 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po
interleave))) | 258 && exitedAncestors[j]->hasCapturingEventListeners(EventTypeNames::po
interleave))) |
| 259 exitedNodeHasCapturingAncestor = true; | 259 exitedNodeHasCapturingAncestor = true; |
| 260 } | 260 } |
| 261 | 261 |
| 262 // Dispatch pointerleave/mouseleave events, in child-to-parent order. | 262 // Dispatch pointerleave/mouseleave events, in child-to-parent order. |
| 263 for (size_t j = 0; j < exitedAncestorsCommonParentIndex; j++) { | 263 for (size_t j = 0; j < exitedAncestorsCommonParentIndex; j++) { |
| 264 if (!sendMouseEvent) { | 264 if (!sendMouseEvent) { |
| 265 dispatchPointerEvent(exitedAncestors[j].get(), | 265 dispatchPointerEvent(exitedAncestors[j].get(), |
| 266 m_pointerEventFactory.createPointerTransitionEvent( | 266 m_pointerEventFactory.createPointerBoundaryEvent( |
| 267 pointerEvent, EventTypeNames::pointerleave, enteredTarget), | 267 pointerEvent, EventTypeNames::pointerleave, enteredTarget), |
| 268 !exitedNodeHasCapturingAncestor); | 268 !exitedNodeHasCapturingAncestor); |
| 269 } else { | 269 } else { |
| 270 dispatchMouseEvent(exitedAncestors[j].get(), | 270 dispatchMouseEvent(exitedAncestors[j].get(), |
| 271 EventTypeNames::mouseleave, | 271 EventTypeNames::mouseleave, |
| 272 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), | 272 mouseEventWithRegion(exitedTarget->toNode(), mouseEvent), |
| 273 enteredTarget, 0, !exitedNodeHasCapturingAncestor); | 273 enteredTarget, 0, !exitedNodeHasCapturingAncestor); |
| 274 } | 274 } |
| 275 } | 275 } |
| 276 | 276 |
| 277 // Dispatch pointerover/mouseover. | 277 // Dispatch pointerover/mouseover. |
| 278 if (isInDocument(enteredTarget)) { | 278 if (isInDocument(enteredTarget)) { |
| 279 if (!sendMouseEvent) { | 279 if (!sendMouseEvent) { |
| 280 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin
terTransitionEvent( | 280 dispatchPointerEvent(enteredTarget, m_pointerEventFactory.createPoin
terBoundaryEvent( |
| 281 pointerEvent, EventTypeNames::pointerover, exitedTarget)); | 281 pointerEvent, EventTypeNames::pointerover, exitedTarget)); |
| 282 } else { | 282 } else { |
| 283 dispatchMouseEvent(enteredTarget, | 283 dispatchMouseEvent(enteredTarget, |
| 284 EventTypeNames::mouseover, mouseEvent, exitedTarget); | 284 EventTypeNames::mouseover, mouseEvent, exitedTarget); |
| 285 } | 285 } |
| 286 } | 286 } |
| 287 | 287 |
| 288 // Defer locating capturing pointeenter/mouseenter listener until /after/ di
spatching the leave events because | 288 // Defer locating capturing pointeenter/mouseenter listener until /after/ di
spatching the leave events because |
| 289 // the leave handlers might set a capturing enter handler. | 289 // the leave handlers might set a capturing enter handler. |
| 290 bool enteredNodeHasCapturingAncestor = false; | 290 bool enteredNodeHasCapturingAncestor = false; |
| 291 for (size_t i = 0; i < enteredAncestors.size(); i++) { | 291 for (size_t i = 0; i < enteredAncestors.size(); i++) { |
| 292 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous
eenter) | 292 if (enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::mous
eenter) |
| 293 || (RuntimeEnabledFeatures::pointerEventEnabled() | 293 || (RuntimeEnabledFeatures::pointerEventEnabled() |
| 294 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p
ointerenter))) | 294 && enteredAncestors[i]->hasCapturingEventListeners(EventTypeNames::p
ointerenter))) |
| 295 enteredNodeHasCapturingAncestor = true; | 295 enteredNodeHasCapturingAncestor = true; |
| 296 } | 296 } |
| 297 | 297 |
| 298 // Dispatch pointerenter/mouseenter events, in parent-to-child order. | 298 // Dispatch pointerenter/mouseenter events, in parent-to-child order. |
| 299 for (size_t i = enteredAncestorsCommonParentIndex; i > 0; i--) { | 299 for (size_t i = enteredAncestorsCommonParentIndex; i > 0; i--) { |
| 300 if (!sendMouseEvent) { | 300 if (!sendMouseEvent) { |
| 301 dispatchPointerEvent(enteredAncestors[i-1].get(), | 301 dispatchPointerEvent(enteredAncestors[i-1].get(), |
| 302 m_pointerEventFactory.createPointerTransitionEvent( | 302 m_pointerEventFactory.createPointerBoundaryEvent( |
| 303 pointerEvent, EventTypeNames::pointerenter, exitedTarget), | 303 pointerEvent, EventTypeNames::pointerenter, exitedTarget), |
| 304 !enteredNodeHasCapturingAncestor); | 304 !enteredNodeHasCapturingAncestor); |
| 305 } else { | 305 } else { |
| 306 dispatchMouseEvent(enteredAncestors[i-1].get(), | 306 dispatchMouseEvent(enteredAncestors[i-1].get(), |
| 307 EventTypeNames::mouseenter, mouseEvent, exitedTarget, | 307 EventTypeNames::mouseenter, mouseEvent, exitedTarget, |
| 308 0, !enteredNodeHasCapturingAncestor); | 308 0, !enteredNodeHasCapturingAncestor); |
| 309 } | 309 } |
| 310 } | 310 } |
| 311 } | 311 } |
| 312 | 312 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 424 // Do not send pointer events for stationary touches. | 424 // Do not send pointer events for stationary touches. |
| 425 if (touchPoint.state() != PlatformTouchPoint::TouchStationary) { | 425 if (touchPoint.state() != PlatformTouchPoint::TouchStationary) { |
| 426 float scaleFactor = 1.0f / touchInfo.targetFrame->pageZoomFactor(); | 426 float scaleFactor = 1.0f / touchInfo.targetFrame->pageZoomFactor(); |
| 427 FloatPoint scrollPosition = touchInfo.targetFrame->view()->scrollPos
ition(); | 427 FloatPoint scrollPosition = touchInfo.targetFrame->view()->scrollPos
ition(); |
| 428 FloatPoint framePoint = touchInfo.contentPoint; | 428 FloatPoint framePoint = touchInfo.contentPoint; |
| 429 framePoint.moveBy(scrollPosition.scaledBy(-scaleFactor)); | 429 framePoint.moveBy(scrollPosition.scaledBy(-scaleFactor)); |
| 430 PointerEvent* pointerEvent = m_pointerEventFactory.create( | 430 PointerEvent* pointerEvent = m_pointerEventFactory.create( |
| 431 pointerEventNameForTouchPointState(touchPoint.state()), | 431 pointerEventNameForTouchPointState(touchPoint.state()), |
| 432 touchPoint, event.getModifiers(), | 432 touchPoint, event.getModifiers(), |
| 433 touchInfo.adjustedRadius, | 433 touchInfo.adjustedRadius, |
| 434 framePoint); | 434 framePoint, |
| 435 touchInfo.touchNode ? |
| 436 touchInfo.touchNode->document().domWindow() : nullptr); |
| 435 | 437 |
| 436 // Consume the touch point if its pointer event is anything but NotH
andled | 438 // Consume the touch point if its pointer event is anything but NotH
andled |
| 437 // (e.g. preventDefault is called in the listener for the pointer ev
ent). | 439 // (e.g. preventDefault is called in the listener for the pointer ev
ent). |
| 438 result = sendTouchPointerEvent(touchInfo.touchNode, pointerEvent); | 440 result = sendTouchPointerEvent(touchInfo.touchNode, pointerEvent); |
| 439 touchInfo.consumed = result != WebInputEventResult::NotHandled; | 441 touchInfo.consumed = result != WebInputEventResult::NotHandled; |
| 440 } | 442 } |
| 441 } | 443 } |
| 442 } | 444 } |
| 443 | 445 |
| 444 WebInputEventResult PointerEventManager::sendTouchPointerEvent( | 446 WebInputEventResult PointerEventManager::sendTouchPointerEvent( |
| (...skipping 287 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 732 { | 734 { |
| 733 visitor->trace(m_frame); | 735 visitor->trace(m_frame); |
| 734 visitor->trace(m_nodeUnderPointer); | 736 visitor->trace(m_nodeUnderPointer); |
| 735 visitor->trace(m_pointerCaptureTarget); | 737 visitor->trace(m_pointerCaptureTarget); |
| 736 visitor->trace(m_pendingPointerCaptureTarget); | 738 visitor->trace(m_pendingPointerCaptureTarget); |
| 737 visitor->trace(m_touchEventManager); | 739 visitor->trace(m_touchEventManager); |
| 738 } | 740 } |
| 739 | 741 |
| 740 | 742 |
| 741 } // namespace blink | 743 } // namespace blink |
| OLD | NEW |