DispatchEventResult MouseEventDispatchMediator::dispatchEvent( EventDispatcher& dispatcher) const { MouseEvent& mouseEvent = event(); mouseEvent.eventPath().adjustForRelatedTarget(dispatcher.node(), mouseEvent.relatedTarget()); if (!mouseEvent.isTrusted()) return dispatcher.dispatch(); if (isDisabledFormControl(&dispatcher.node())) return DispatchEventResult::CanceledBeforeDispatch; if (mouseEvent.type().isEmpty()) return DispatchEventResult::NotCanceled; // Shouldn't happen. DCHECK(!mouseEvent.target() || mouseEvent.target() != mouseEvent.relatedTarget()); EventTarget* relatedTarget = mouseEvent.relatedTarget(); DispatchEventResult dispatchResult = dispatcher.dispatch(); if (mouseEvent.type() != EventTypeNames::click || mouseEvent.detail() != 2) return dispatchResult; // Special case: If it's a double click event, we also send the dblclick // event. This is not part of the DOM specs, but is used for compatibility // with the ondblclick="" attribute. This is treated as a separate event in // other DOM-compliant browsers like Firefox, and so we do the same. MouseEvent* doubleClickEvent = MouseEvent::create(); doubleClickEvent->initMouseEventInternal( EventTypeNames::dblclick, mouseEvent.bubbles(), mouseEvent.cancelable(), mouseEvent.view(), mouseEvent.detail(), mouseEvent.screenX(), mouseEvent.screenY(), mouseEvent.clientX(), mouseEvent.clientY(), mouseEvent.modifiers(), mouseEvent.button(), relatedTarget, mouseEvent.sourceCapabilities(), mouseEvent.buttons()); doubleClickEvent->setComposed(mouseEvent.composed()); // Inherit the trusted status from the original event. doubleClickEvent->setTrusted(mouseEvent.isTrusted()); if (mouseEvent.defaultHandled()) doubleClickEvent->setDefaultHandled(); DispatchEventResult doubleClickDispatchResult = EventDispatcher::dispatchEvent( dispatcher.node(), MouseEventDispatchMediator::create(doubleClickEvent)); if (doubleClickDispatchResult != DispatchEventResult::NotCanceled) return doubleClickDispatchResult; return dispatchResult; }
DispatchEventResult PointerEventDispatchMediator::dispatchEvent( EventDispatcher& dispatcher) const { if (isDisabledFormControl(&dispatcher.node())) return DispatchEventResult::CanceledBeforeDispatch; if (event().type().isEmpty()) return DispatchEventResult::NotCanceled; // Shouldn't happen. DCHECK(!event().target() || event().target() != event().relatedTarget()); event().eventPath().adjustForRelatedTarget(dispatcher.node(), event().relatedTarget()); return dispatcher.dispatch(); }
bool MouseEventDispatchMediator::dispatchEvent(EventDispatcher& dispatcher) const { MouseEvent& mouseEvent = event(); if (!mouseEvent.isTrusted()) { mouseEvent.eventPath().adjustForRelatedTarget(dispatcher.node(), mouseEvent.relatedTarget()); return dispatcher.dispatch(); } if (isDisabledFormControl(&dispatcher.node())) return false; if (mouseEvent.type().isEmpty()) return true; // Shouldn't happen. ASSERT(!mouseEvent.target() || mouseEvent.target() != mouseEvent.relatedTarget()); EventTarget* relatedTarget = mouseEvent.relatedTarget(); mouseEvent.eventPath().adjustForRelatedTarget(dispatcher.node(), relatedTarget); dispatcher.dispatch(); bool swallowEvent = mouseEvent.defaultHandled() || mouseEvent.defaultPrevented(); if (mouseEvent.type() != EventTypeNames::click || mouseEvent.detail() != 2) return !swallowEvent; // Special case: If it's a double click event, we also send the dblclick event. This is not part // of the DOM specs, but is used for compatibility with the ondblclick="" attribute. This is treated // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same. RefPtrWillBeRawPtr<MouseEvent> doubleClickEvent = MouseEvent::create(); doubleClickEvent->initMouseEventInternal(EventTypeNames::dblclick, mouseEvent.bubbles(), mouseEvent.cancelable(), mouseEvent.view(), mouseEvent.detail(), mouseEvent.screenX(), mouseEvent.screenY(), mouseEvent.clientX(), mouseEvent.clientY(), mouseEvent.modifiers(), mouseEvent.button(), relatedTarget, mouseEvent.sourceCapabilities(), mouseEvent.buttons()); // Inherit the trusted status from the original event. doubleClickEvent->setTrusted(mouseEvent.isTrusted()); if (mouseEvent.defaultHandled()) doubleClickEvent->setDefaultHandled(); EventDispatcher::dispatchEvent(dispatcher.node(), MouseEventDispatchMediator::create(doubleClickEvent)); if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented()) return false; return !swallowEvent; }
bool MouseEventDispatchMediator::dispatchEvent(EventDispatcher& dispatcher) const { if (isSyntheticMouseEvent()) { event().eventPath().adjustForRelatedTarget(dispatcher.node(), event().relatedTarget()); return dispatcher.dispatch(); } if (isDisabledFormControl(&dispatcher.node())) return false; if (event().type().isEmpty()) return true; // Shouldn't happen. ASSERT(!event().target() || event().target() != event().relatedTarget()); EventTarget* relatedTarget = event().relatedTarget(); event().eventPath().adjustForRelatedTarget(dispatcher.node(), relatedTarget); dispatcher.dispatch(); bool swallowEvent = event().defaultHandled() || event().defaultPrevented(); if (event().type() != EventTypeNames::click || event().detail() != 2) return !swallowEvent; // Special case: If it's a double click event, we also send the dblclick event. This is not part // of the DOM specs, but is used for compatibility with the ondblclick="" attribute. This is treated // as a separate event in other DOM-compliant browsers like Firefox, and so we do the same. RefPtrWillBeRawPtr<MouseEvent> doubleClickEvent = MouseEvent::create(); doubleClickEvent->initMouseEvent(nullptr, EventTypeNames::dblclick, event().bubbles(), event().cancelable(), event().view(), event().detail(), event().screenX(), event().screenY(), event().clientX(), event().clientY(), event().ctrlKey(), event().altKey(), event().shiftKey(), event().metaKey(), event().button(), relatedTarget, event().buttons()); if (event().defaultHandled()) doubleClickEvent->setDefaultHandled(); EventDispatcher::dispatchEvent(dispatcher.node(), MouseEventDispatchMediator::create(doubleClickEvent)); if (doubleClickEvent->defaultHandled() || doubleClickEvent->defaultPrevented()) return false; return !swallowEvent; }
bool DragEventDispatchMediator::dispatchEvent(EventDispatcher& dispatcher) const { event().eventPath().adjustForRelatedTarget(dispatcher.node(), event().relatedTarget()); return EventDispatchMediator::dispatchEvent(dispatcher); }
DispatchEventResult FocusEventDispatchMediator::dispatchEvent(EventDispatcher& dispatcher) const { if (event().relatedTargetScoped()) event().eventPath().adjustForRelatedTarget(dispatcher.node(), event().relatedTarget()); return EventDispatchMediator::dispatchEvent(dispatcher); }