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