Node* nodeFromPoint(Document* document, int x, int y, LayoutPoint* localPoint) { Frame* frame = document->frame(); if (!frame) return nullptr; FrameView* frameView = frame->view(); if (!frameView) return nullptr; float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor(); #if !PLATFORM(IOS) IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->scrollX(), y * scaleFactor + frameView->scrollY())); if (!frameView->visibleContentRect().contains(point)) return nullptr; #else IntPoint point = roundedIntPoint(FloatPoint(x * scaleFactor + frameView->actualScrollX(), y * scaleFactor + frameView->actualScrollY())); if (!frameView->actualVisibleContentRect().contains(point)) return nullptr; #endif HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::DisallowShadowContent); HitTestResult result(point); document->renderView()->hitTest(request, result); if (localPoint) *localPoint = result.localPoint(); return result.innerNode(); }
static LayoutSize contentsScrollOffset(AbstractView* abstractView) { if (!abstractView) return LayoutSize(); Frame* frame = abstractView->frame(); if (!frame) return LayoutSize(); FrameView* frameView = frame->view(); if (!frameView) return LayoutSize(); #if !PLATFORM(IOS) float scaleFactor = frame->pageZoomFactor() * frame->frameScaleFactor(); return LayoutSize(frameView->scrollX() / scaleFactor, frameView->scrollY() / scaleFactor); #else return LayoutSize(frameView->actualScrollX(), frameView->actualScrollY()); #endif }