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 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++; if (!m_frameView->visibleContentRect().contains(location.roundedPoint())) return false; // 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(); // RenderView should make sure to update layout before entering hit testing ASSERT(!frame()->view()->layoutPending()); ASSERT(!document().renderView()->needsLayout()); // TODO(ojan): Does any of this intersection stuff make sense for Sky? LayoutRect hitTestArea = view()->documentRect(); if (!request.ignoreClipping()) hitTestArea.intersect(frame()->view()->visibleContentRect()); bool insideLayer = hitTestLayer(layer(), 0, request, result, hitTestArea, location); if (!insideLayer) { // TODO(ojan): Is this code needed for Sky? // We didn't hit any layer. If we are the root layer and the mouse is -- or just was -- down, // return ourselves. We do this so mouse events continue getting delivered after a drag has // exited the WebView, and so hit testing over a scrollbar hits the content document. if (request.active() || request.release()) { updateHitTestResult(result, location.point()); insideLayer = true; } } return insideLayer; }
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; }