haikuwebkit/LayoutTests/transforms/transform-is-containing-blo...

29 lines
510 B
HTML
Raw Permalink Normal View History

Transform-style should not kill position:fixed https://bugs.webkit.org/show_bug.cgi?id=138122 Reviewed by Dean Jackson. Source/WebCore: Various bits of rendering code checked RenderObject::hasTransform() for various reasons. Confusingly, this meant "has transform, or preserve-3d, or perspective". This patch teases those behaviors apart to produce the following behavior: 1. "transform" acts as containing block for fixed position (no behavior change). 2. "transform" acts as containing block for absolute/relative position (no behavior change). 3. "perspective" does not act as containing block for fixed position (no behavior change). 4. "perspective" acts as containing block for absolute/relative position (no behavior change). 5. "preserve-3d" does not act as containing block for fixed position (behavior change). 6. "preserve-3d" acts as containing block for absolute/relative position. This is not a behavior change, but seems like incorrect behavior (https://www.w3.org/Bugs/Public/show_bug.cgi?id=27566). However, we may be forced to keep it for compatibility. The gist of the change is to rename RenderObject::hasTransform() to RenderObject::hasTransformRelatedProperty(), and add hasTransform() with the more restrictive meaning. All call sites of hasTransform() were examined and fixed to produce the desired behaviors. Tests: transforms/2d/perspective-not-fixed-container.html transforms/2d/preserve3d-not-fixed-container.html transforms/perspective-is-containing-block-for-absolute.html transforms/preserve3d-is-containing-block-for-absolute.html transforms/transform-is-containing-block-for-absolute.html * css/CSSComputedStyleDeclaration.cpp: (WebCore::computedTransform): Now we can just test hasTransform(). * rendering/LogicalSelectionOffsetCaches.h: (WebCore::isContainingBlockCandidateForAbsolutelyPositionedObject): For now, this can just use hasTransformRelatedProperty(), but if we change [6] above this will have to change (as documented in the comment). Also FIXME comments about sharing code. * rendering/RenderBox.cpp: (WebCore::RenderBox::updateFromStyle): (WebCore::RenderBox::mapLocalToContainer): Can just use hasTransform() now. (WebCore::RenderBox::pushMappingToContainer): Ditto. (WebCore::RenderBox::mapAbsoluteToLocalPoint): Ditto. (WebCore::RenderBox::layoutOverflowRectForPropagation): Ditto. * rendering/RenderBox.h: All transform-related properties create RenderLayers. * rendering/RenderBoxModelObject.h: Ditto. * rendering/RenderElement.cpp: (WebCore::RenderElement::styleWillChange): * rendering/RenderGeometryMap.cpp: (WebCore::canMapBetweenRenderersViaLayers): Rename to clarify. We need to not map via layers if we have a perspective (since we need to generate a perspective matrix). It's OK with preserve-3d though. (WebCore::RenderGeometryMap::pushMappingsToAncestor): (WebCore::canMapBetweenRenderers): Deleted. * rendering/RenderInline.cpp: (WebCore::RenderInline::updateFromStyle): * rendering/RenderLayer.cpp: (WebCore::RenderLayer::updateTransform): Can just check hasTransform(). (WebCore::RenderLayer::updateLayerPosition): Avoid calling parent() and enclosingPositionedAncestor() twice. (WebCore::RenderLayer::perspectiveTransform): Do the fast bit check hasTransformRelatedProperty() first. (WebCore::RenderLayer::perspectiveOrigin): Ditto. (WebCore::isContainerForPositioned): This code has to now have different behavior for absolute and fixed position. Changed it to call existing functions, rather than having a 3rd place that has to know about containing block rules. (WebCore::RenderLayer::enclosingAncestorForPosition): Call isContainerForPositioned() now. (WebCore::accumulateOffsetTowardsAncestor): Call enclosingAncestorForPosition(). (WebCore::RenderLayer::createLocalTransformState): (WebCore::RenderLayer::calculateClipRects): (WebCore::isPositionedContainer): Deleted. (WebCore::isFixedPositionedContainer): Deleted. (WebCore::RenderLayer::enclosingPositionedAncestor): Deleted. * rendering/RenderLayer.h: * rendering/RenderLayerBacking.cpp: (WebCore::RenderLayerBacking::updateGeometry): * rendering/RenderLayerModelObject.cpp: (WebCore::RenderLayerModelObject::styleDidChange): * rendering/RenderObject.cpp: (WebCore::RenderObject::shouldUseTransformFromContainer): Can just check hasTransform() now. (WebCore::RenderObject::container): * rendering/RenderObject.h: (WebCore::RenderObject::hasTransformRelatedProperty): (WebCore::RenderObject::hasTransform): (WebCore::RenderObject::setHasTransformRelatedProperty): (WebCore::RenderObject::RenderObjectBitfields::RenderObjectBitfields): (WebCore::RenderObject::setHasTransform): Deleted. * rendering/RenderTableRow.h: * rendering/RenderView.cpp: (WebCore::RenderView::mapLocalToContainer): nullptr goodness. (WebCore::RenderView::pushMappingToContainer): Ditto. (WebCore::RenderView::mapAbsoluteToLocalPoint): Ditto. LayoutTests: New tests and updated results: * platform/mac/compositing/tiling/rotated-tiled-preserve3d-clamped-expected.txt: Progression, caused by RenderLayerBacking::updateCompositedBounds() now allowing shouldClipCompositedBounds on preserve-3d layers, since they are no longer considered to have a transform. * platform/mac/compositing/visible-rect/3d-transform-style-expected.txt: Ditto. * transforms/2d/perspective-not-fixed-container-expected.html: Added. * transforms/2d/perspective-not-fixed-container.html: Added. Tests that perspective does not act as containing block for fixed position (not a behavior change). * transforms/2d/preserve3d-not-fixed-container-expected.html: Added. * transforms/2d/preserve3d-not-fixed-container.html: Added. Tests that preserve3d does not act as containing block for fixed position. This is a behavior change. * transforms/perspective-is-containing-block-for-absolute-expected.html: Added. * transforms/perspective-is-containing-block-for-absolute.html: Added. Tests that perspective is a as containing block for absolute/relative position. This is not a behavior change. * transforms/preserve3d-is-containing-block-for-absolute-expected.html: Added. * transforms/preserve3d-is-containing-block-for-absolute.html: Added. Tests that preserve3d is a as containing block for absolute/relative position. This is not a behavior change, but seems like incorrect behavior for now. * transforms/transform-is-containing-block-for-absolute-expected.html: Added. * transforms/transform-is-containing-block-for-absolute.html: Added. Tests that transform is a as containing block for absolute/relative position. This is not a behavior change. Canonical link: https://commits.webkit.org/157447@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@177200 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2014-12-12 01:59:37 +00:00
<!DOCTYPE html>
<html>
<head>
<style>
.container {
position: relative;
margin: 50px;
height: 100px;
width: 100px;
border: 1px solid black;
}
.box {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
background-color: gray;
}
</style>
</head>
<body>
<div class="container">
<div class="box"></div>
</div>
</body>
</html>