Index: Source/web/LinkHighlight.cpp |
diff --git a/Source/web/LinkHighlight.cpp b/Source/web/LinkHighlight.cpp |
index af9159eb53af11155372f29c48bd10af79751304..7026255d9f6e30d2e41c55035bfce55fe66c405b 100644 |
--- a/Source/web/LinkHighlight.cpp |
+++ b/Source/web/LinkHighlight.cpp |
@@ -106,16 +106,11 @@ void LinkHighlight::releaseResources() |
m_node.clear(); |
} |
-RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() |
+void LinkHighlight::attachLinkHighlightToCompositingLayer(const RenderLayerModelObject* paintInvalidationContainer) |
{ |
- if (!m_node || !m_node->renderer()) |
- return 0; |
- |
- RenderLayer* renderLayer = m_node->renderer()->enclosingLayer()->enclosingLayerForPaintInvalidationCrossingFrameBoundaries(); |
- |
- ASSERT(renderLayer->compositingState() != NotComposited); |
- |
- GraphicsLayer* newGraphicsLayer = renderLayer->graphicsLayerBackingForScrolling(); |
+ GraphicsLayer* newGraphicsLayer = paintInvalidationContainer->layer()->graphicsLayerBackingForScrolling(); |
+ if (!newGraphicsLayer) |
+ return; |
m_clipLayer->setTransform(SkMatrix44(SkMatrix44::kIdentity_Constructor)); |
@@ -126,15 +121,12 @@ RenderLayer* LinkHighlight::computeEnclosingCompositingLayer() |
m_currentGraphicsLayer = newGraphicsLayer; |
m_currentGraphicsLayer->addLinkHighlight(this); |
} |
- |
- return renderLayer; |
} |
-static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, RenderObject* compositedRenderer, FloatQuad& compositedSpaceQuad) |
+static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpaceQuad, RenderObject* targetRenderer, const RenderLayerModelObject* paintInvalidationContainer, FloatQuad& compositedSpaceQuad) |
{ |
ASSERT(targetRenderer); |
- ASSERT(compositedRenderer); |
- |
+ ASSERT(paintInvalidationContainer); |
for (unsigned i = 0; i < 4; ++i) { |
IntPoint point; |
switch (i) { |
@@ -144,9 +136,11 @@ static void convertTargetSpaceQuadToCompositedLayer(const FloatQuad& targetSpace |
case 3: point = roundedIntPoint(targetSpaceQuad.p4()); break; |
} |
+ // FIXME: this does not need to be absolute, just in the paint invalidation container's space. |
point = targetRenderer->frame()->view()->contentsToWindow(point); |
- point = compositedRenderer->frame()->view()->windowToContents(point); |
- FloatPoint floatPoint = compositedRenderer->absoluteToLocal(point, UseTransforms); |
+ point = paintInvalidationContainer->frame()->view()->windowToContents(point); |
+ FloatPoint floatPoint = paintInvalidationContainer->absoluteToLocal(point, UseTransforms); |
+ RenderLayer::mapPointToPaintBackingCoordinates(paintInvalidationContainer, floatPoint); |
switch (i) { |
case 0: compositedSpaceQuad.setP1(floatPoint); break; |
@@ -183,33 +177,36 @@ void LinkHighlight::computeQuads(const Node& node, Vector<FloatQuad>& outQuads) |
for (Node* child = NodeRenderingTraversal::firstChild(&node); child; child = NodeRenderingTraversal::nextSibling(child)) |
computeQuads(*child, outQuads); |
} else { |
+ // FIXME: this does not need to be absolute, just in the paint invalidation container's space. |
renderer->absoluteQuads(outQuads); |
} |
} |
-bool LinkHighlight::computeHighlightLayerPathAndPosition(RenderLayer* compositingLayer) |
+bool LinkHighlight::computeHighlightLayerPathAndPosition(const RenderLayerModelObject* paintInvalidationContainer) |
{ |
if (!m_node || !m_node->renderer() || !m_currentGraphicsLayer) |
return false; |
- |
- ASSERT(compositingLayer); |
+ ASSERT(paintInvalidationContainer); |
// Get quads for node in absolute coordinates. |
Vector<FloatQuad> quads; |
computeQuads(*m_node, quads); |
ASSERT(quads.size()); |
+ Path newPath; |
- // Adjust for offset between target graphics layer and the node's renderer. |
- FloatPoint positionAdjust = IntPoint(m_currentGraphicsLayer->offsetFromRenderer()); |
+ FloatPoint positionAdjustForCompositedScrolling = IntPoint(m_currentGraphicsLayer->offsetFromRenderer()); |
- Path newPath; |
for (size_t quadIndex = 0; quadIndex < quads.size(); ++quadIndex) { |
FloatQuad absoluteQuad = quads[quadIndex]; |
- absoluteQuad.move(-positionAdjust.x(), -positionAdjust.y()); |
+ |
+ // FIXME: this hack should not be necessary. It's a consequence of the fact that composited layers for scrolling are represented |
+ // differently in Blink than other composited layers. |
+ if (paintInvalidationContainer->layer()->needsCompositedScrolling() && m_node->renderer() != paintInvalidationContainer) |
+ absoluteQuad.move(-positionAdjustForCompositedScrolling.x(), -positionAdjustForCompositedScrolling.y()); |
// Transform node quads in target absolute coords to local coordinates in the compositor layer. |
FloatQuad transformedQuad; |
- convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer(), compositingLayer->renderer(), transformedQuad); |
+ convertTargetSpaceQuadToCompositedLayer(absoluteQuad, m_node->renderer(), paintInvalidationContainer, transformedQuad); |
// FIXME: for now, we'll only use rounded paths if we have a single node quad. The reason for this is that |
// we may sometimes get a chain of adjacent boxes (e.g. for text nodes) which end up looking like sausage |
@@ -319,15 +316,18 @@ void LinkHighlight::updateGeometry() |
m_geometryNeedsUpdate = false; |
- RenderLayer* compositingLayer = computeEnclosingCompositingLayer(); |
- if (compositingLayer && computeHighlightLayerPathAndPosition(compositingLayer)) { |
+ bool hasRenderer = m_node && m_node->renderer(); |
+ const RenderLayerModelObject* paintInvalidationContainer = hasRenderer ? m_node->renderer()->containerForPaintInvalidation() : 0; |
+ if (paintInvalidationContainer) |
+ attachLinkHighlightToCompositingLayer(paintInvalidationContainer); |
+ if (paintInvalidationContainer && computeHighlightLayerPathAndPosition(paintInvalidationContainer)) { |
// We only need to invalidate the layer if the highlight size has changed, otherwise |
// we can just re-position the layer without needing to repaint. |
m_contentLayer->layer()->invalidate(); |
if (m_currentGraphicsLayer) |
m_currentGraphicsLayer->addRepaintRect(FloatRect(layer()->position().x, layer()->position().y, layer()->bounds().width, layer()->bounds().height)); |
- } else if (!m_node || !m_node->renderer()) { |
+ } else if (!hasRenderer) { |
clearGraphicsLayerLinkHighlightPointer(); |
releaseResources(); |
} |