|
Lines 2467-2476
MouseEventWithHitTestResults EventHandler::prepareMouseEvent(const HitTestReques
a/Source/WebCore/page/EventHandler.cpp_sec1
|
| 2467 |
return m_frame.document()->prepareMouseEvent(request, documentPointForWindowPoint(m_frame, mouseEvent.position()), mouseEvent); |
2467 |
return m_frame.document()->prepareMouseEvent(request, documentPointForWindowPoint(m_frame, mouseEvent.position()), mouseEvent); |
| 2468 |
} |
2468 |
} |
| 2469 |
|
2469 |
|
| 2470 |
static bool hierarchyHasCapturingEventListeners(Element* element, const AtomicString& eventName) |
2470 |
static bool hierarchyHasCapturingEventListeners(Element* element, const AtomicString& pointerEventName, const AtomicString& compatibilityMouseEventName) |
| 2471 |
{ |
2471 |
{ |
| 2472 |
for (ContainerNode* curr = element; curr; curr = curr->parentInComposedTree()) { |
2472 |
for (ContainerNode* curr = element; curr; curr = curr->parentInComposedTree()) { |
| 2473 |
if (curr->hasCapturingEventListeners(eventName)) |
2473 |
if (curr->hasCapturingEventListeners(pointerEventName) || curr->hasCapturingEventListeners(compatibilityMouseEventName)) |
| 2474 |
return true; |
2474 |
return true; |
| 2475 |
} |
2475 |
} |
| 2476 |
return false; |
2476 |
return false; |
|
Lines 2540-2547
void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
a/Source/WebCore/page/EventHandler.cpp_sec2
|
| 2540 |
// mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor |
2540 |
// mouseenter and mouseleave events are only dispatched if there is a capturing eventhandler on an ancestor |
| 2541 |
// or a normal eventhandler on the element itself (they don't bubble). |
2541 |
// or a normal eventhandler on the element itself (they don't bubble). |
| 2542 |
// This optimization is necessary since these events can cause O(n^2) capturing event-handler checks. |
2542 |
// This optimization is necessary since these events can cause O(n^2) capturing event-handler checks. |
| 2543 |
bool hasCapturingMouseEnterListener = hierarchyHasCapturingEventListeners(m_elementUnderMouse.get(), eventNames().mouseenterEvent); |
2543 |
bool hasCapturingMouseEnterListener = hierarchyHasCapturingEventListeners(m_elementUnderMouse.get(), eventNames().pointerenterEvent, eventNames().mouseenterEvent); |
| 2544 |
bool hasCapturingMouseLeaveListener = hierarchyHasCapturingEventListeners(m_lastElementUnderMouse.get(), eventNames().mouseleaveEvent); |
2544 |
bool hasCapturingMouseLeaveListener = hierarchyHasCapturingEventListeners(m_lastElementUnderMouse.get(), eventNames().pointerleaveEvent, eventNames().mouseleaveEvent); |
| 2545 |
|
2545 |
|
| 2546 |
Vector<Ref<Element>, 32> leftElementsChain; |
2546 |
Vector<Ref<Element>, 32> leftElementsChain; |
| 2547 |
for (Element* element = m_lastElementUnderMouse.get(); element; element = element->parentElementInComposedTree()) |
2547 |
for (Element* element = m_lastElementUnderMouse.get(); element; element = element->parentElementInComposedTree()) |
|
Lines 2565-2571
void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
a/Source/WebCore/page/EventHandler.cpp_sec3
|
| 2565 |
m_lastElementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoutEvent, 0, m_elementUnderMouse.get()); |
2565 |
m_lastElementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoutEvent, 0, m_elementUnderMouse.get()); |
| 2566 |
|
2566 |
|
| 2567 |
for (auto& chain : leftElementsChain) { |
2567 |
for (auto& chain : leftElementsChain) { |
| 2568 |
if (hasCapturingMouseLeaveListener || chain->hasEventListeners(eventNames().mouseleaveEvent)) |
2568 |
if (hasCapturingMouseLeaveListener || chain->hasEventListeners(eventNames().pointerleaveEvent) || chain->hasEventListeners(eventNames().mouseleaveEvent)) |
| 2569 |
chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseleaveEvent, 0, m_elementUnderMouse.get()); |
2569 |
chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseleaveEvent, 0, m_elementUnderMouse.get()); |
| 2570 |
} |
2570 |
} |
| 2571 |
|
2571 |
|
|
Lines 2573-2579
void EventHandler::updateMouseEventTargetNode(Node* targetNode, const PlatformMo
a/Source/WebCore/page/EventHandler.cpp_sec4
|
| 2573 |
m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get()); |
2573 |
m_elementUnderMouse->dispatchMouseEvent(platformMouseEvent, eventNames().mouseoverEvent, 0, m_lastElementUnderMouse.get()); |
| 2574 |
|
2574 |
|
| 2575 |
for (auto& chain : enteredElementsChain) { |
2575 |
for (auto& chain : enteredElementsChain) { |
| 2576 |
if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().mouseenterEvent)) |
2576 |
if (hasCapturingMouseEnterListener || chain->hasEventListeners(eventNames().pointerenterEvent) || chain->hasEventListeners(eventNames().mouseenterEvent)) |
| 2577 |
chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get()); |
2577 |
chain->dispatchMouseEvent(platformMouseEvent, eventNames().mouseenterEvent, 0, m_lastElementUnderMouse.get()); |
| 2578 |
} |
2578 |
} |
| 2579 |
} |
2579 |
} |