bool RenderEmbeddedObject::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction) { if (!RenderPart::nodeAtPoint(request, result, pointInContainer, accumulatedOffset, hitTestAction)) return false; if (!widget() || !widget()->isPluginViewBase()) return true; PluginViewBase* view = static_cast<PluginViewBase*>(widget()); if (Scrollbar* horizontalScrollbar = view->horizontalScrollbar()) { if (horizontalScrollbar->frameRect().contains(pointInContainer)) { result.setScrollbar(horizontalScrollbar); return true; } } if (Scrollbar* verticalScrollbar = view->verticalScrollbar()) { if (verticalScrollbar->frameRect().contains(pointInContainer)) { result.setScrollbar(verticalScrollbar); return true; } } return true; }
bool RenderEmbeddedObject::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction) { if (!RenderPart::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, hitTestAction)) return false; if (!widget() || !widget()->isPluginViewBase()) return true; PluginViewBase* view = toPluginViewBase(widget()); IntPoint roundedPoint = locationInContainer.roundedPoint(); if (Scrollbar* horizontalScrollbar = view->horizontalScrollbar()) { if (horizontalScrollbar->shouldParticipateInHitTesting() && horizontalScrollbar->frameRect().contains(roundedPoint)) { result.setScrollbar(horizontalScrollbar); return true; } } if (Scrollbar* verticalScrollbar = view->verticalScrollbar()) { if (verticalScrollbar->shouldParticipateInHitTesting() && verticalScrollbar->frameRect().contains(roundedPoint)) { result.setScrollbar(verticalScrollbar); return true; } } return true; }
bool RenderListBox::isPointInOverflowControl(HitTestResult& result, int _x, int _y, int _tx, int _ty) { if (!m_vBar) return false; IntRect vertRect(_tx + width() - borderRight() - m_vBar->width(), _ty + borderTop(), m_vBar->width(), height() - borderTop() - borderBottom()); if (vertRect.contains(_x, _y)) { result.setScrollbar(m_vBar.get()); return true; } return false; }
bool RenderListBox::isPointInOverflowControl(HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset) { if (!m_vBar || !m_vBar->shouldParticipateInHitTesting()) return false; LayoutRect vertRect(accumulatedOffset.x() + width() - borderRight() - m_vBar->width(), accumulatedOffset.y() + borderTop(), m_vBar->width(), height() - borderTop() - borderBottom()); if (vertRect.contains(pointInContainer)) { result.setScrollbar(m_vBar.get()); return true; } return false; }
bool RenderListBox::isPointInScrollbar(HitTestResult& result, int _x, int _y, int _tx, int _ty) { if (!m_vBar) return false; IntRect vertRect(_tx + width() - borderRight() - m_vBar->width(), _ty + borderTop() - borderTopExtra(), m_vBar->width(), height() + borderTopExtra() + borderBottomExtra() - borderTop() - borderBottom()); if (vertRect.contains(_x, _y)) { result.setScrollbar(m_vBar->isWidget() ? static_cast<PlatformScrollbar*>(m_vBar.get()) : 0); return true; } return false; }
bool RenderView::hitTest(const HitTestRequest& request, const HitTestLocation& location, HitTestResult& result) { if (layer()->hitTest(request, location, result)) return true; // FIXME: Consider if this test should be done unconditionally. if (request.allowsFrameScrollbars()) { // ScrollView scrollbars are not the same as RenderLayer scrollbars tested by RenderLayer::hitTestOverflowControls, // so we need to test ScrollView scrollbars separately here. Scrollbar* frameScrollbar = frameView().scrollbarAtPoint(location.roundedPoint()); if (frameScrollbar) { result.setScrollbar(frameScrollbar); return true; } } return false; }
bool RenderView::hitTest(const HitTestRequest& request, const HitTestLocation& location, HitTestResult& result) { TRACE_EVENT0("blink", "RenderView::hitTest"); m_hitTestCount++; // We have to recursively update layout/style here because otherwise, when the hit test recurses // into a child document, it could trigger a layout on the parent document, which can destroy RenderLayers // that are higher up in the call stack, leading to crashes. // Note that Document::updateLayout calls its parent's updateLayout. // FIXME: It should be the caller's responsibility to ensure an up-to-date layout. frameView()->updateLayoutAndStyleIfNeededRecursive(); bool hitLayer = layer()->hitTest(request, location, result); // FrameView scrollbars are not the same as RenderLayer scrollbars tested by RenderLayer::hitTestOverflowControls, // so we need to test FrameView scrollbars separately here. Note that it's important we do this after // the hit test above, because that may overwrite the entire HitTestResult when it finds a hit. IntPoint viewPoint = location.roundedPoint() - frameView()->scrollOffset(); if (Scrollbar* frameScrollbar = frameView()->scrollbarAtViewPoint(viewPoint)) result.setScrollbar(frameScrollbar); return hitLayer; }
bool RenderPart::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) { if (!widget() || !widget()->isFrameView() || !request.allowsChildFrameContent()) return RenderWidget::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, action); FrameView* childFrameView = toFrameView(widget()); RenderView* childRoot = childFrameView->renderView(); if (childRoot) { LayoutPoint adjustedLocation = accumulatedOffset + location(); LayoutPoint contentOffset = LayoutPoint(borderLeft() + paddingLeft(), borderTop() + paddingTop()) - childFrameView->scrollOffset(); HitTestLocation newHitTestLocation(locationInContainer, -adjustedLocation - contentOffset); HitTestRequest newHitTestRequest(request.type() | HitTestRequest::ChildFrameHitTest); HitTestResult childFrameResult(newHitTestLocation); bool isInsideChildFrame = childRoot->hitTest(newHitTestRequest, newHitTestLocation, childFrameResult); if (newHitTestLocation.isRectBasedTest()) result.append(childFrameResult); else if (isInsideChildFrame) result = childFrameResult; if (isInsideChildFrame) return true; if (request.allowsFrameScrollbars()) { // ScrollView scrollbars are not the same as RenderLayer scrollbars tested by RenderLayer::hitTestOverflowControls, // so we need to test ScrollView scrollbars separately here. // FIXME: Consider if this test could be done unconditionally. Scrollbar* frameScrollbar = childFrameView->scrollbarAtPoint(newHitTestLocation.roundedPoint()); if (frameScrollbar) result.setScrollbar(frameScrollbar); } } return RenderWidget::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, action); }