bool RenderWidget::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, HitTestAction action) { if (request.allowsChildFrameContent() && widget() && widget()->isFrameView() && toFrameView(widget())->renderView()) { FrameView* childFrameView = toFrameView(widget()); RenderView* childRoot = childFrameView->renderView(); 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; } bool hadResult = result.innerNode(); bool inside = RenderReplaced::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, action); // Check to see if we are really over the widget itself (and not just in the border/padding area). if ((inside || result.isRectBasedTest()) && !hadResult && result.innerNode() == &frameOwnerElement()) result.setIsOverWidget(contentBoxRect().contains(result.localPoint())); return inside; }
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; } return RenderWidget::nodeAtPoint(request, result, locationInContainer, accumulatedOffset, action); }
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); }
bool RenderEmbeddedObject::isReplacementObscured() const { // Return whether or not the replacement content for blocked plugins is accessible to the user. // Check the opacity of each layer containing the element or its ancestors. float opacity = 1.0; for (RenderLayer* layer = enclosingLayer(); layer; layer = layer->parent()) { RenderLayerModelObject* renderer = layer->renderer(); RenderStyle* style = renderer->style(); opacity *= style->opacity(); if (opacity < 0.1) return true; } // Calculate the absolute rect for the blocked plugin replacement text. IntRect absoluteBoundingBox = absoluteBoundingBoxRect(); LayoutPoint absoluteLocation(absoluteBoundingBox.location()); LayoutRect rect = replacementTextRect(absoluteLocation); if (rect.isEmpty()) return true; RenderView* docRenderer = document()->renderView(); ASSERT(docRenderer); if (!docRenderer) return true; HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowShadowContent); HitTestResult result; HitTestLocation location; LayoutUnit x = rect.x(); LayoutUnit y = rect.y(); LayoutUnit width = rect.width(); LayoutUnit height = rect.height(); // Hit test the center and near the corners of the replacement text to ensure // it is visible and is not masked by other elements. bool hit = false; location = LayoutPoint(x + width / 2, y + height / 2); hit = docRenderer->hitTest(request, location, result); if (!hit || result.innerNode() != node()) return true; location = LayoutPoint(x, y); hit = docRenderer->hitTest(request, location, result); if (!hit || result.innerNode() != node()) return true; location = LayoutPoint(x + width, y); hit = docRenderer->hitTest(request, location, result); if (!hit || result.innerNode() != node()) return true; location = LayoutPoint(x + width, y + height); hit = docRenderer->hitTest(request, location, result); if (!hit || result.innerNode() != node()) return true; location = LayoutPoint(x, y + height); hit = docRenderer->hitTest(request, location, result); if (!hit || result.innerNode() != node()) return true; return false; }
bool RenderEmbeddedObject::isReplacementObscured() const { // Return whether or not the replacement content for blocked plugins is accessible to the user. // Check the opacity of each layer containing the element or its ancestors. float opacity = 1.0; for (RenderLayer* layer = enclosingLayer(); layer; layer = layer->parent()) { opacity *= layer->renderer().style().opacity(); if (opacity < 0.1) return true; } // Calculate the absolute rect for the blocked plugin replacement text. IntRect absoluteBoundingBox = absoluteBoundingBoxRect(); LayoutPoint absoluteLocation(absoluteBoundingBox.location()); LayoutRect rect = unavailablePluginIndicatorBounds(absoluteLocation); if (rect.isEmpty()) return true; RenderView* rootRenderView = document().topDocument().renderView(); ASSERT(rootRenderView); if (!rootRenderView) return true; IntRect rootViewRect = view().frameView().convertToRootView(snappedIntRect(rect)); HitTestRequest request(HitTestRequest::ReadOnly | HitTestRequest::Active | HitTestRequest::IgnoreClipping | HitTestRequest::DisallowUserAgentShadowContent | HitTestRequest::AllowChildFrameContent); HitTestResult result; HitTestLocation location; LayoutUnit x = rootViewRect.x(); LayoutUnit y = rootViewRect.y(); LayoutUnit width = rootViewRect.width(); LayoutUnit height = rootViewRect.height(); // Hit test the center and near the corners of the replacement text to ensure // it is visible and is not masked by other elements. bool hit = false; location = LayoutPoint(x + width / 2, y + height / 2); hit = rootRenderView->hitTest(request, location, result); if (!hit || result.innerNode() != &frameOwnerElement()) return true; location = LayoutPoint(x, y); hit = rootRenderView->hitTest(request, location, result); if (!hit || result.innerNode() != &frameOwnerElement()) return true; location = LayoutPoint(x + width, y); hit = rootRenderView->hitTest(request, location, result); if (!hit || result.innerNode() != &frameOwnerElement()) return true; location = LayoutPoint(x + width, y + height); hit = rootRenderView->hitTest(request, location, result); if (!hit || result.innerNode() != &frameOwnerElement()) return true; location = LayoutPoint(x, y + height); hit = rootRenderView->hitTest(request, location, result); if (!hit || result.innerNode() != &frameOwnerElement()) return true; return false; }