Index: Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
diff --git a/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp b/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
index e0f1c43ab14874ec6f0a7120ab36d574b9f68fd6..f0fed078b69bab674db2d0ab8394fea1afb18a2e 100644 |
--- a/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
+++ b/Source/core/layout/compositing/CompositedDeprecatedPaintLayerMapping.cpp |
@@ -452,7 +452,7 @@ bool CompositedDeprecatedPaintLayerMapping::updateGraphicsLayerConfiguration() |
// FIXME: Can |style| be really null that late in the DocumentCycle? |
if (const ComputedStyle* style = renderer->style()) |
hasPerspective = style->hasPerspective(); |
- bool needsChildTransformLayer = hasPerspective && (layerForChildrenTransform() == m_childTransformLayer.get()) && renderer->isBox(); |
+ bool needsChildTransformLayer = hasPerspective && renderer->isBox(); |
if (updateChildTransformLayer(needsChildTransformLayer)) |
layerConfigChanged = true; |
@@ -1060,34 +1060,23 @@ void CompositedDeprecatedPaintLayerMapping::updateInternalHierarchy() |
if (m_ancestorClippingLayer) |
m_ancestorClippingLayer->addChild(m_graphicsLayer.get()); |
- if (m_childContainmentLayer) |
- m_graphicsLayer->addChild(m_childContainmentLayer.get()); |
- else if (m_childTransformLayer) |
- m_graphicsLayer->addChild(m_childTransformLayer.get()); |
- |
- if (m_scrollingLayer) { |
- GraphicsLayer* superLayer = m_graphicsLayer.get(); |
- |
- if (m_childContainmentLayer) |
- superLayer = m_childContainmentLayer.get(); |
- |
- if (m_childTransformLayer) |
- superLayer = m_childTransformLayer.get(); |
- |
- superLayer->addChild(m_scrollingLayer.get()); |
- } |
+ // Layer to which children should be attached as we build the hierarchy. |
+ GraphicsLayer* bottomLayer = m_graphicsLayer.get(); |
+ auto updateBottomLayer = [&bottomLayer](GraphicsLayer* layer) { |
+ if (layer) { |
+ bottomLayer->addChild(layer); |
+ bottomLayer = layer; |
+ } |
+ }; |
- // The clip for child layers does not include space for overflow controls, so they exist as |
- // siblings of the clipping layer if we have one. Normal children of this layer are set as |
- // children of the clipping layer. |
- if (m_overflowControlsClippingLayer) { |
- ASSERT(m_overflowControlsHostLayer); |
- m_graphicsLayer->addChild(m_overflowControlsClippingLayer.get()); |
- m_overflowControlsClippingLayer->addChild(m_overflowControlsHostLayer.get()); |
- } else if (m_overflowControlsHostLayer) { |
- m_graphicsLayer->addChild(m_overflowControlsHostLayer.get()); |
- } |
+ updateBottomLayer(m_childTransformLayer.get()); |
+ updateBottomLayer(m_childContainmentLayer.get()); |
+ updateBottomLayer(m_scrollingLayer.get()); |
+ // Now constructing the subtree for the overflow controls. |
+ bottomLayer = m_graphicsLayer.get(); |
+ updateBottomLayer(m_overflowControlsClippingLayer.get()); |
+ updateBottomLayer(m_overflowControlsHostLayer.get()); |
if (m_layerForHorizontalScrollbar) |
m_overflowControlsHostLayer->addChild(m_layerForHorizontalScrollbar.get()); |
if (m_layerForVerticalScrollbar) |
@@ -1233,9 +1222,9 @@ void CompositedDeprecatedPaintLayerMapping::updateDrawsContent() |
void CompositedDeprecatedPaintLayerMapping::updateChildrenTransform() |
{ |
- if (GraphicsLayer* childTransformLayer = layerForChildrenTransform()) { |
+ if (GraphicsLayer* childTransformLayer = this->childTransformLayer()) { |
childTransformLayer->setTransform(owningLayer().perspectiveTransform()); |
- childTransformLayer->setTransformOrigin(FloatPoint3D(childTransformLayer->size().width() * 0.5f, childTransformLayer->size().height() * 0.5f, 0.f)); |
+ childTransformLayer->setTransformOrigin(owningLayer().perspectiveOrigin()); |
} |
updateShouldFlattenTransform(); |
@@ -1390,6 +1379,7 @@ enum ApplyToGraphicsLayersModeFlags { |
ApplyToBackgroundLayer = (1 << 3), |
ApplyToMaskLayers = (1 << 4), |
ApplyToContentLayers = (1 << 5), |
+ ApplyToChildContainingLayers = (1 << 6), // layers between m_graphicsLayer and children |
ApplyToAllGraphicsLayers = (ApplyToSquashingLayer | ApplyToScrollbarLayers | ApplyToBackgroundLayer | ApplyToMaskLayers | ApplyToLayersAffectedByPreserve3D | ApplyToContentLayers) |
}; |
typedef unsigned ApplyToGraphicsLayersMode; |
@@ -1403,17 +1393,20 @@ static void ApplyToGraphicsLayers(const CompositedDeprecatedPaintLayerMapping* m |
f(mapping->childTransformLayer()); |
if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToContentLayers)) && mapping->mainGraphicsLayer()) |
f(mapping->mainGraphicsLayer()); |
- if ((mode & ApplyToLayersAffectedByPreserve3D) && mapping->clippingLayer()) |
+ if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToChildContainingLayers)) && mapping->clippingLayer()) |
f(mapping->clippingLayer()); |
- if ((mode & ApplyToLayersAffectedByPreserve3D) && mapping->scrollingLayer()) |
+ if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToChildContainingLayers)) && mapping->scrollingLayer()) |
f(mapping->scrollingLayer()); |
- if ((mode & ApplyToLayersAffectedByPreserve3D) && mapping->scrollingBlockSelectionLayer()) |
+ if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToChildContainingLayers)) && mapping->scrollingBlockSelectionLayer()) |
f(mapping->scrollingBlockSelectionLayer()); |
- if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToContentLayers)) && mapping->scrollingContentsLayer()) |
+ if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToContentLayers) || (mode & ApplyToChildContainingLayers)) && mapping->scrollingContentsLayer()) |
f(mapping->scrollingContentsLayer()); |
if (((mode & ApplyToLayersAffectedByPreserve3D) || (mode & ApplyToContentLayers)) && mapping->foregroundLayer()) |
f(mapping->foregroundLayer()); |
+ if ((mode & ApplyToChildContainingLayers) && mapping->childTransformLayer()) |
+ f(mapping->childTransformLayer()); |
+ |
if ((mode & ApplyToSquashingLayer) && mapping->squashingLayer()) |
f(mapping->squashingLayer()); |
@@ -1477,23 +1470,10 @@ void CompositedDeprecatedPaintLayerMapping::updateShouldFlattenTransform() |
// Note, if we apply perspective, we have to set should flatten differently |
// so that the transform propagates to child layers correctly. |
- if (GraphicsLayer* childTransformLayer = layerForChildrenTransform()) { |
- bool hasPerspective = false; |
- // FIXME: Can |style| be really null here? |
- if (const ComputedStyle* style = m_owningLayer.layoutObject()->style()) |
- hasPerspective = style->hasPerspective(); |
- if (hasPerspective) |
- childTransformLayer->setShouldFlattenTransform(false); |
- |
- // Note, if the target is the scrolling layer, we need to ensure that the |
- // scrolling content layer doesn't flatten the transform. (It would be nice |
- // if we could apply transform to the scrolling content layer, but that's |
- // too late, we need the children transform to be applied _before_ the |
- // scrolling offset.) |
- if (childTransformLayer == m_scrollingLayer.get()) { |
- m_scrollingContentsLayer->setShouldFlattenTransform(false); |
- m_scrollingBlockSelectionLayer->setShouldFlattenTransform(false); |
- } |
+ if (hasChildTransformLayer()) { |
+ ApplyToGraphicsLayers(this, [](GraphicsLayer* layer) { |
+ layer->setShouldFlattenTransform(false); |
+ }, ApplyToChildContainingLayers); |
} |
} |
@@ -1992,15 +1972,6 @@ GraphicsLayer* CompositedDeprecatedPaintLayerMapping::childForSuperlayers() cons |
return m_graphicsLayer.get(); |
} |
-GraphicsLayer* CompositedDeprecatedPaintLayerMapping::layerForChildrenTransform() const |
-{ |
- if (GraphicsLayer* clipLayer = clippingLayer()) |
- return clipLayer; |
- if (m_scrollingLayer) |
- return m_scrollingLayer.get(); |
- return m_childTransformLayer.get(); |
-} |
- |
void CompositedDeprecatedPaintLayerMapping::setBlendMode(WebBlendMode blendMode) |
{ |
if (m_ancestorClippingLayer) { |