diff options
Diffstat (limited to 'WebCore/rendering/RenderLayerBacking.cpp')
-rw-r--r-- | WebCore/rendering/RenderLayerBacking.cpp | 65 |
1 files changed, 23 insertions, 42 deletions
diff --git a/WebCore/rendering/RenderLayerBacking.cpp b/WebCore/rendering/RenderLayerBacking.cpp index 2bc6a88..d66dfc2 100644 --- a/WebCore/rendering/RenderLayerBacking.cpp +++ b/WebCore/rendering/RenderLayerBacking.cpp @@ -144,19 +144,14 @@ static bool hasNonZeroTransformOrigin(const RenderObject* renderer) || (style->transformOriginY().type() == Fixed && style->transformOriginY().value()); } -static RenderLayer* enclosingOverflowClipAncestor(RenderLayer* layer, bool& crossesTransform) +static bool layerOrAncestorIsTransformed(RenderLayer* layer) { - crossesTransform = false; - - for (RenderLayer* curr = layer->parent(); curr; curr = curr->parent()) { - if (curr->renderer()->hasOverflowClip()) - return curr; - + for (RenderLayer* curr = layer; curr; curr = curr->parent()) { if (curr->hasTransform()) - crossesTransform = true; + return true; } - return 0; + return false; } void RenderLayerBacking::updateCompositedBounds() @@ -164,38 +159,24 @@ void RenderLayerBacking::updateCompositedBounds() IntRect layerBounds = compositor()->calculateCompositedBounds(m_owningLayer, m_owningLayer); // Clip to the size of the document or enclosing overflow-scroll layer. - if (compositor()->compositingConsultsOverlap() && !m_owningLayer->hasTransform()) { - bool crossesTransform; - RenderLayer* overflowAncestor = enclosingOverflowClipAncestor(m_owningLayer, crossesTransform); - // If an ancestor is transformed, we can't currently compute the correct rect to intersect with. - // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist. - if (!crossesTransform) { - IntRect clippingBounds; - RenderLayer* boundsRelativeLayer; - - if (overflowAncestor) { - RenderBox* overflowBox = toRenderBox(overflowAncestor->renderer()); - // If scrollbars are visible, then constrain the layer to the scrollable area, so we can avoid redraws - // on scrolling. Otherwise just clip to the visible area (it can still be scrolled via JS, but we'll come - // back through this code when the scroll offset changes). - if (overflowBox->scrollsOverflow()) - clippingBounds = IntRect(-overflowAncestor->scrollXOffset(), -overflowAncestor->scrollYOffset(), overflowBox->scrollWidth(), overflowBox->scrollHeight()); - else - clippingBounds = clipBox(overflowBox); - - boundsRelativeLayer = overflowAncestor; - } else { - RenderView* view = m_owningLayer->renderer()->view(); - clippingBounds = view->layoutOverflowRect(); - boundsRelativeLayer = view->layer(); - } - - int deltaX = 0; - int deltaY = 0; - m_owningLayer->convertToLayerCoords(boundsRelativeLayer, deltaX, deltaY); - clippingBounds.move(-deltaX, -deltaY); - layerBounds.intersect(clippingBounds); - } + // If this or an ancestor is transformed, we can't currently compute the correct rect to intersect with. + // We'd need RenderObject::convertContainerToLocalQuad(), which doesn't yet exist. + if (compositor()->compositingConsultsOverlap() && !layerOrAncestorIsTransformed(m_owningLayer)) { + RenderView* view = m_owningLayer->renderer()->view(); + RenderLayer* rootLayer = view->layer(); + + // Start by clipping to the view's bounds. + IntRect clippingBounds = view->layoutOverflowRect(); + + if (m_owningLayer != rootLayer) + clippingBounds.intersect(m_owningLayer->backgroundClipRect(rootLayer, true)); + + int deltaX = 0; + int deltaY = 0; + m_owningLayer->convertToLayerCoords(rootLayer, deltaX, deltaY); + clippingBounds.move(-deltaX, -deltaY); + + layerBounds.intersect(clippingBounds); } // If the element has a transform-origin that has fixed lengths, and the renderer has zero size, @@ -215,7 +196,7 @@ void RenderLayerBacking::updateAfterWidgetResize() { if (renderer()->isRenderIFrame()) { if (RenderLayerCompositor* innerCompositor = RenderLayerCompositor::iframeContentsCompositor(toRenderIFrame(renderer()))) - innerCompositor->updateContentLayerOffset(contentsBox().location()); + innerCompositor->frameViewDidChangeSize(contentsBox().location()); } } |