HitTestCanvasResult* CanvasRenderingContext2D::getControlAndIdIfHitRegionExists( const LayoutPoint& location) { if (hitRegionsCount() <= 0) return HitTestCanvasResult::create(String(), nullptr); LayoutBox* box = canvas()->layoutBox(); FloatPoint localPos = box->absoluteToLocal(FloatPoint(location), UseTransforms); if (box->hasBorderOrPadding()) localPos.move(-box->contentBoxOffset()); localPos.scale(canvas()->width() / box->contentWidth(), canvas()->height() / box->contentHeight()); HitRegion* hitRegion = hitRegionAtPoint(localPos); if (hitRegion) { Element* control = hitRegion->control(); if (control && canvas()->isSupportedInteractiveCanvasFallback(*control)) return HitTestCanvasResult::create(hitRegion->id(), hitRegion->control()); return HitTestCanvasResult::create(hitRegion->id(), nullptr); } return HitTestCanvasResult::create(String(), nullptr); }
void SpinButtonElement::defaultEventHandler(Event* event) { if (!event->isMouseEvent()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } LayoutBox* box = layoutBox(); if (!box) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } if (!shouldRespondToMouseEvents()) { if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); return; } MouseEvent* mouseEvent = toMouseEvent(event); IntPoint local = roundedIntPoint(box->absoluteToLocal(FloatPoint(mouseEvent->absoluteLocation()), UseTransforms)); if (mouseEvent->type() == EventTypeNames::mousedown && mouseEvent->button() == LeftButton) { if (box->pixelSnappedBorderBoxRect().contains(local)) { // The following functions of HTMLInputElement may run JavaScript // code which detaches this shadow node. We need to take a reference // and check layoutObject() after such function calls. RefPtrWillBeRawPtr<Node> protector(this); if (m_spinButtonOwner) m_spinButtonOwner->focusAndSelectSpinButtonOwner(); if (layoutObject()) { if (m_upDownState != Indeterminate) { // A JavaScript event handler called in doStepAction() below // might change the element state and we might need to // cancel the repeating timer by the state change. If we // started the timer after doStepAction(), we would have no // chance to cancel the timer. startRepeatingTimer(); doStepAction(m_upDownState == Up ? 1 : -1); } } event->setDefaultHandled(); } } else if (mouseEvent->type() == EventTypeNames::mouseup && mouseEvent->button() == LeftButton) { releaseCapture(); } else if (event->type() == EventTypeNames::mousemove) { if (box->pixelSnappedBorderBoxRect().contains(local)) { if (!m_capturing) { if (LocalFrame* frame = document().frame()) { frame->eventHandler().setCapturingMouseEventsNode(this); m_capturing = true; if (Page* page = document().page()) page->chromeClient().registerPopupOpeningObserver(this); } } UpDownState oldUpDownState = m_upDownState; m_upDownState = (local.y() < box->size().height() / 2) ? Up : Down; if (m_upDownState != oldUpDownState) layoutObject()->setShouldDoFullPaintInvalidation(); } else { releaseCapture(); m_upDownState = Indeterminate; } } if (!event->defaultHandled()) HTMLDivElement::defaultEventHandler(event); }