Title: [287742] trunk
Revision
287742
Author
[email protected]
Date
2022-01-07 00:45:30 -0800 (Fri, 07 Jan 2022)

Log Message

When transform-style: preserve-3d is used with a grouping property it should still create a containing block
https://bugs.webkit.org/show_bug.cgi?id=234145
<rdar://problem/86630387>

Reviewed by Simon Fraser.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-transforms/preserve-3d-flat-grouping-properties-containing-block-expected.txt:

Source/WebCore:

No new tests. This is covered by an existing WPT test.

Previously, when a grouping property (and the few extra properties specific to WebKit) forced
transform-style: flat, this change was made in the StyleAdjuster and affected computed style.
The specification says that these properties should actually adjust the used value of
the property.

The specification also says:
> The use of this property with any value other than none establishes a
> stacking context. It also establishes a containing block for all
> descendants, just like the transform property does.

Together, this means that no matter what the used value is of transform-style, it should
establish a containing block and create a stacking context.

This change adds a usedTransformStyle RenderStyle method and a StyleRareNonInheritedData member
to adjust the return value appropriately. RenderStyle::preserves3D reads the used value
and hasTransformRelatedProperty, which is used for establishing containing blocks
and stacking contexts, uses the calculated value.

* rendering/RenderLayer.h:
(WebCore::RenderLayer::preserves3D const): Use usedTransformStyle.
* rendering/RenderLayerBacking.cpp:
(WebCore::RenderLayerBacking::updateGeometry): This now calls preserve3D() and usedTransformStyle3D().
* rendering/RenderLayerCompositor.cpp:
(WebCore::recompositeChangeRequiresGeometryUpdate): Ditto.
(WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility const): Ditto.
(WebCore::RenderLayerCompositor::computeIndirectCompositingReason const): Ditto.
(WebCore::RenderLayerCompositor::styleChangeMayAffectIndirectCompositingReasons): Ditto.
(WebCore::RenderLayerCompositor::layerHas3DContent const): Ditto.
* rendering/style/RenderStyle.cpp:
(WebCore::RenderStyle::changeRequiresRecompositeLayer const): Ditto.
* rendering/style/RenderStyle.h:
(WebCore::RenderStyle::hasTransformRelatedProperty const): Modified to look at the calculated value explicitly.
(WebCore::RenderStyle::usedTransformStyle3D const): Return 'flat' when the property is forced to flat.
(WebCore::RenderStyle::preserves3D const): Look at the used value.
(WebCore::RenderStyle::setTransformStyleForcedToFlat): Added.
* rendering/style/StyleRareNonInheritedData.cpp: Added a new transformStyleForcedToFlat member.
(WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData): Ditto.
(WebCore::StyleRareNonInheritedData::operator== const): Ditto.
* rendering/style/StyleRareNonInheritedData.h:
* style/StyleAdjuster.cpp:
(WebCore::Style::Adjuster::adjust const): Call setTransformStyleForcedToFlat with the
appropriate value when an element has 'preserve-3d' set.

LayoutTests:

* compositing/overflow-trumps-transform-style-expected.txt:
* compositing/overflow-trumps-transform-style.html: Update to test used value and reflect that computed value doesn't change.
* css3/blending/blend-mode-transform-style-expected.txt:
* css3/blending/blend-mode-transform-style.html: Ditto.

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (287741 => 287742)


--- trunk/LayoutTests/ChangeLog	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/ChangeLog	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,3 +1,16 @@
+2022-01-07  Martin Robinson  <[email protected]>
+
+        When transform-style: preserve-3d is used with a grouping property it should still create a containing block
+        https://bugs.webkit.org/show_bug.cgi?id=234145
+        <rdar://problem/86630387>
+
+        Reviewed by Simon Fraser.
+
+        * compositing/overflow-trumps-transform-style-expected.txt:
+        * compositing/overflow-trumps-transform-style.html: Update to test used value and reflect that computed value doesn't change.
+        * css3/blending/blend-mode-transform-style-expected.txt:
+        * css3/blending/blend-mode-transform-style.html: Ditto.
+
 2022-01-06  Diego Pino Garcia  <[email protected]>
 
         [GLIB] Unreviewed test gardening, emit baseline for accessibility/accessibility-node-memory-management.html

Modified: trunk/LayoutTests/compositing/overflow-trumps-transform-style-expected.txt (287741 => 287742)


--- trunk/LayoutTests/compositing/overflow-trumps-transform-style-expected.txt	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/compositing/overflow-trumps-transform-style-expected.txt	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,29 +1,13 @@
-preserve-3d
-flat
-(GraphicsLayer
-  (anchor 0.00 0.00)
-  (bounds 800.00 600.00)
-  (children 1
-    (GraphicsLayer
-      (bounds 800.00 600.00)
-      (contentsOpaque 1)
-      (children 2
-        (GraphicsLayer
-          (position 18.00 10.00)
-          (bounds 100.00 100.00)
-          (contentsOpaque 1)
-          (preserves3D 1)
-          (drawsContent 1)
-          (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 1.00 1.00])
-        )
-        (GraphicsLayer
-          (position 18.00 120.00)
-          (bounds 100.00 100.00)
-          (contentsOpaque 1)
-          (transform [1.00 0.00 0.00 0.00] [0.00 1.00 0.00 0.00] [0.00 0.00 1.00 0.00] [0.00 0.00 1.00 1.00])
-        )
-      )
-    )
-  )
-)
+PASS parentNodeTransformStyle('transform-style-preserve-3d') is "preserve-3d"
+PASS parentNodeTransformStyle('transform-style-flat') is "flat"
+PASS parentNodeTransformStyle('overflow-hidden-with-transform-style-preserve-3d') is "preserve-3d"
+PASS parentNodeTransformStyle('overflow-hidden-with-transform-style-flat') is "flat"
+PASS getBoundingClientWidth('transform-style-preserve-3d') is not getBoundingClientWidth('transform-style-flat')
+PASS getBoundingClientWidth('overflow-hidden-with-transform-style-flat') is getBoundingClientWidth('transform-style-flat')
+PASS getBoundingClientWidth('overflow-hidden-with-transform-style-preserve-3d') is getBoundingClientWidth('transform-style-flat')
+PASS successfullyParsed is true
 
+TEST COMPLETE
+Test that an element with mix-blend-mode other than normal forces the used value of transform-style to flat, but not the computed value..
+
+

Modified: trunk/LayoutTests/compositing/overflow-trumps-transform-style.html (287741 => 287742)


--- trunk/LayoutTests/compositing/overflow-trumps-transform-style.html	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/compositing/overflow-trumps-transform-style.html	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,36 +1,53 @@
-<!DOCTYPE html>
-
-<html>
-<head>
-  <style>
+<!DOCTYPE HTML>
+<style>
     .box {
-      height: 100px;
-      width: 100px;
-      margin: 10px;
-      background-color: blue;
+        width: 100px;
+        height: 100px;
     }
-  </style>
-  <script>
-    if (window.testRunner)
-      testRunner.dumpAsText();
+    .parent {
+        transform-style: preserve-3d;
+        transform: rotateY(45deg)
+    }
+    .child {
+        transform: rotateY(45deg);
+        background: lightblue
+    }
+</style>
 
-    function dumpResults()
-    {
-      var results = document.getElementById('layers');
-      
-      // Check the computed value.
-      results.innerText = window.getComputedStyle(document.getElementById('box1')).webkitTransformStyle + '\n';
-      results.innerText += window.getComputedStyle(document.getElementById('box2')).webkitTransformStyle + '\n';
-      
-      if (window.testRunner)
-        results.innerText += window.internals.layerTreeAsText(document);
+<p>Test that an element with mix-blend-mode other than normal forces the used value of transform-style to flat, but not the computed value..</p>
+
+<div class="parent box">
+    <div id="transform-style-preserve-3d" class="box child"></div>
+</div>
+
+<div class="parent box" style="transform-style: flat">
+    <div id="transform-style-flat" class="box child"></div>
+</div>
+
+<div class="parent box" style="overflow: hidden; transform-style: flat">
+    <div id="overflow-hidden-with-transform-style-flat" class="box child"></div>
+</div>
+
+<div class="parent box" style="overflow: hidden;">
+    <div id="overflow-hidden-with-transform-style-preserve-3d" class="box child"></div>
+</div>
+
+<script src=""
+<script>
+    function parentNodeTransformStyle(id) {
+        return getComputedStyle(document.getElementById(id).parentNode).transformStyle;
     }
-    window.addEventListener('load', dumpResults, false);
-  </script>
-</head>
-<body>
-<div class="box" id="box1" style="-webkit-transform: translateZ(1px); -webkit-transform-style: preserve-3d"></div>
-<div class="box" id="box2" style="-webkit-transform: translateZ(1px); -webkit-transform-style: preserve-3d; overflow: hidden"></div>
-<pre id="layers">Layer tree goes here in DRT</pre>
-</body>
-</html>
+
+    function getBoundingClientWidth(id) {
+        return document.getElementById(id).getBoundingClientRect().width;
+    }
+
+    shouldBeEqualToString("parentNodeTransformStyle('transform-style-preserve-3d')", "preserve-3d");
+    shouldBeEqualToString("parentNodeTransformStyle('transform-style-flat')", "flat");
+    shouldBeEqualToString("parentNodeTransformStyle('overflow-hidden-with-transform-style-preserve-3d')", "preserve-3d");
+    shouldBeEqualToString("parentNodeTransformStyle('overflow-hidden-with-transform-style-flat')", "flat");
+
+    shouldNotBe("getBoundingClientWidth('transform-style-preserve-3d')", "getBoundingClientWidth('transform-style-flat')");
+    shouldBe("getBoundingClientWidth('overflow-hidden-with-transform-style-flat')", "getBoundingClientWidth('transform-style-flat')");
+    shouldBe("getBoundingClientWidth('overflow-hidden-with-transform-style-preserve-3d')", "getBoundingClientWidth('transform-style-flat')");
+</script>

Modified: trunk/LayoutTests/css3/blending/blend-mode-transform-style-expected.txt (287741 => 287742)


--- trunk/LayoutTests/css3/blending/blend-mode-transform-style-expected.txt	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/css3/blending/blend-mode-transform-style-expected.txt	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,9 +1,13 @@
-PASS getTransformStyle("blend-mode-normal-with-transform-style-preserve-3d") is "preserve-3d"
-PASS getTransformStyle("blending-with-transform-style-preserve-3d") is "flat"
-PASS getTransformStyle("blending-with-transform-style-flat") is "flat"
+PASS parentNodeTransformStyle('transform-style-preserve-3d') is "preserve-3d"
+PASS parentNodeTransformStyle('transform-style-flat') is "flat"
+PASS parentNodeTransformStyle('blending-with-transform-style-preserve-3d') is "preserve-3d"
+PASS parentNodeTransformStyle('blending-with-transform-style-flat') is "flat"
+PASS getBoundingClientWidth('transform-style-preserve-3d') is not getBoundingClientWidth('transform-style-flat')
+PASS getBoundingClientWidth('transform-style-flat') is getBoundingClientWidth('blending-with-transform-style-flat')
+PASS getBoundingClientWidth('transform-style-flat') is getBoundingClientWidth('blending-with-transform-style-preserve-3d')
 PASS successfullyParsed is true
 
 TEST COMPLETE
-Test that an element with mix-blend-mode other than normal forces the computed value of transform-style to flat.
+Test that an element with mix-blend-mode other than normal forces the used value of transform-style to flat, but not the computed value..
 
 

Modified: trunk/LayoutTests/css3/blending/blend-mode-transform-style.html (287741 => 287742)


--- trunk/LayoutTests/css3/blending/blend-mode-transform-style.html	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/css3/blending/blend-mode-transform-style.html	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,21 +1,51 @@
 <!DOCTYPE HTML>
 <link rel="stylesheet" href=""
 
-<p>Test that an element with mix-blend-mode other than normal forces the computed value of transform-style to flat.</p>
-<div id="blend-mode-normal-with-transform-style-preserve-3d" class="box" style="-webkit-transform-style: preserve-3d;"></div>
-<div id="blending-with-transform-style-preserve-3d" class="box difference" style="-webkit-transform-style: preserve-3d;"></div>
-<div id="blending-with-transform-style-flat" class="box difference" style="-webkit-transform-style: flat;"></div>
+<style>
+  .parent {
+    transform: rotateY(45deg)
+  }
+
+  .child {
+    transform: rotateY(45deg);
+    background: lightblue
+  }
+</style>
+
+<p>Test that an element with mix-blend-mode other than normal forces the used value of transform-style to flat, but not the computed value..</p>
+
+<div class="parent box" style="transform-style: preserve-3d">
+    <div id="transform-style-preserve-3d" class="box child"></div>
+</div>
+
+<div class="parent box" style="transform-style: flat">
+    <div id="transform-style-flat" class="box child"></div>
+</div>
+
+<div class="parent box difference" style="transform-style: preserve-3d">
+    <div id="blending-with-transform-style-preserve-3d" class="box child"></div>
+</div>
+
+<div class="parent box difference" style="transform-style: flat">
+    <div id="blending-with-transform-style-flat" class="box child"></div>
+</div>
+
 <script src=""
 <script>
-    function getTransformStyle(elementID) {
-        return getComputedStyle(document.getElementById(elementID)).webkitTransformStyle;
+    function parentNodeTransformStyle(id) {
+        return getComputedStyle(document.getElementById(id).parentNode).transformStyle;
     }
 
-    function test(id, expected) {
-        shouldBeEqualToString('getTransformStyle("' + id + '")', expected);
+    function getBoundingClientWidth(id) {
+        return document.getElementById(id).getBoundingClientRect().width;
     }
 
-    test("blend-mode-normal-with-transform-style-preserve-3d", "preserve-3d");
-    test("blending-with-transform-style-preserve-3d", "flat");
-    test("blending-with-transform-style-flat", "flat");
+    shouldBeEqualToString("parentNodeTransformStyle('transform-style-preserve-3d')", "preserve-3d");
+    shouldBeEqualToString("parentNodeTransformStyle('transform-style-flat')", "flat");
+    shouldBeEqualToString("parentNodeTransformStyle('blending-with-transform-style-preserve-3d')", "preserve-3d");
+    shouldBeEqualToString("parentNodeTransformStyle('blending-with-transform-style-flat')", "flat");
+
+    shouldNotBe("getBoundingClientWidth('transform-style-preserve-3d')", "getBoundingClientWidth('transform-style-flat')");
+    shouldBe("getBoundingClientWidth('transform-style-flat')", "getBoundingClientWidth('blending-with-transform-style-flat')");
+    shouldBe("getBoundingClientWidth('transform-style-flat')", "getBoundingClientWidth('blending-with-transform-style-preserve-3d')");
 </script>

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (287741 => 287742)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,3 +1,13 @@
+2022-01-07  Martin Robinson  <[email protected]>
+
+        When transform-style: preserve-3d is used with a grouping property it should still create a containing block
+        https://bugs.webkit.org/show_bug.cgi?id=234145
+        <rdar://problem/86630387>
+
+        Reviewed by Simon Fraser.
+
+        * web-platform-tests/css/css-transforms/preserve-3d-flat-grouping-properties-containing-block-expected.txt:
+
 2022-01-06  Tim Nguyen  <[email protected]>
 
         Unprefix -webkit-print-color-adjust CSS property

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/preserve-3d-flat-grouping-properties-containing-block-expected.txt (287741 => 287742)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/preserve-3d-flat-grouping-properties-containing-block-expected.txt	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/preserve-3d-flat-grouping-properties-containing-block-expected.txt	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,4 +1,4 @@
 
-FAIL Preserve-3d element with a grouping property still a containing block assert_equals: expected Element node <div id="parentWithGrouping" style="transform-style: pres... but got Element node <body><div id="parentWithGrouping" style="transform-style...
+PASS Preserve-3d element with a grouping property still a containing block
 PASS Preserve-3d element without a grouping property still a containing block
 

Modified: trunk/Source/WebCore/ChangeLog (287741 => 287742)


--- trunk/Source/WebCore/ChangeLog	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/ChangeLog	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1,3 +1,56 @@
+2022-01-07  Martin Robinson  <[email protected]>
+
+        When transform-style: preserve-3d is used with a grouping property it should still create a containing block
+        https://bugs.webkit.org/show_bug.cgi?id=234145
+        <rdar://problem/86630387>
+
+        Reviewed by Simon Fraser.
+
+        No new tests. This is covered by an existing WPT test.
+
+        Previously, when a grouping property (and the few extra properties specific to WebKit) forced
+        transform-style: flat, this change was made in the StyleAdjuster and affected computed style.
+        The specification says that these properties should actually adjust the used value of
+        the property.
+
+        The specification also says:
+        > The use of this property with any value other than none establishes a
+        > stacking context. It also establishes a containing block for all
+        > descendants, just like the transform property does.
+
+        Together, this means that no matter what the used value is of transform-style, it should
+        establish a containing block and create a stacking context.
+
+        This change adds a usedTransformStyle RenderStyle method and a StyleRareNonInheritedData member
+        to adjust the return value appropriately. RenderStyle::preserves3D reads the used value
+        and hasTransformRelatedProperty, which is used for establishing containing blocks
+        and stacking contexts, uses the calculated value.
+
+        * rendering/RenderLayer.h:
+        (WebCore::RenderLayer::preserves3D const): Use usedTransformStyle.
+        * rendering/RenderLayerBacking.cpp:
+        (WebCore::RenderLayerBacking::updateGeometry): This now calls preserve3D() and usedTransformStyle3D().
+        * rendering/RenderLayerCompositor.cpp:
+        (WebCore::recompositeChangeRequiresGeometryUpdate): Ditto.
+        (WebCore::RenderLayerCompositor::requiresCompositingForBackfaceVisibility const): Ditto.
+        (WebCore::RenderLayerCompositor::computeIndirectCompositingReason const): Ditto.
+        (WebCore::RenderLayerCompositor::styleChangeMayAffectIndirectCompositingReasons): Ditto.
+        (WebCore::RenderLayerCompositor::layerHas3DContent const): Ditto.
+        * rendering/style/RenderStyle.cpp:
+        (WebCore::RenderStyle::changeRequiresRecompositeLayer const): Ditto.
+        * rendering/style/RenderStyle.h:
+        (WebCore::RenderStyle::hasTransformRelatedProperty const): Modified to look at the calculated value explicitly.
+        (WebCore::RenderStyle::usedTransformStyle3D const): Return 'flat' when the property is forced to flat.
+        (WebCore::RenderStyle::preserves3D const): Look at the used value.
+        (WebCore::RenderStyle::setTransformStyleForcedToFlat): Added.
+        * rendering/style/StyleRareNonInheritedData.cpp: Added a new transformStyleForcedToFlat member.
+        (WebCore::StyleRareNonInheritedData::StyleRareNonInheritedData): Ditto.
+        (WebCore::StyleRareNonInheritedData::operator== const): Ditto.
+        * rendering/style/StyleRareNonInheritedData.h:
+        * style/StyleAdjuster.cpp:
+        (WebCore::Style::Adjuster::adjust const): Call setTransformStyleForcedToFlat with the
+        appropriate value when an element has 'preserve-3d' set.
+
 2022-01-06  Antoine Quint <[email protected]>
 
         Unreviewed, removing duplicated code added in https://commits.webkit.org/245793@trunk.

Modified: trunk/Source/WebCore/rendering/RenderLayer.h (287741 => 287742)


--- trunk/Source/WebCore/rendering/RenderLayer.h	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/RenderLayer.h	2022-01-07 08:45:30 UTC (rev 287742)
@@ -736,7 +736,7 @@
     // Note that this transform has the perspective-origin baked in.
     TransformationMatrix perspectiveTransform(const LayoutRect& layerRect) const;
     FloatPoint perspectiveOrigin() const;
-    bool preserves3D() const { return renderer().style().transformStyle3D() == TransformStyle3D::Preserve3D; }
+    bool preserves3D() const { return renderer().style().preserves3D(); }
     bool has3DTransform() const { return m_transform && !m_transform->isAffine(); }
     bool hasTransformedAncestor() const { return m_hasTransformedAncestor; }
 

Modified: trunk/Source/WebCore/rendering/RenderLayerBacking.cpp (287741 => 287742)


--- trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/RenderLayerBacking.cpp	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1323,7 +1323,7 @@
     auto primaryLayerPosition = primaryGraphicsLayerRect.location();
 
     // FIXME: reflections should force transform-style to be flat in the style: https://bugs.webkit.org/show_bug.cgi?id=106959
-    bool preserves3D = style.transformStyle3D() == TransformStyle3D::Preserve3D && !renderer().hasReflection();
+    bool preserves3D = style.preserves3D() && !renderer().hasReflection();
     if (m_contentsContainmentLayer) {
         m_contentsContainmentLayer->setPreserves3D(preserves3D);
         m_contentsContainmentLayer->setPosition(primaryLayerPosition);
@@ -1347,7 +1347,7 @@
 
 #if ENABLE(CSS_TRANSFORM_STYLE_OPTIMIZED_3D)
     // FIXME: Take ancestry into account and remove unnecessary structural layers.
-    m_graphicsLayer->setIsSeparated(style.transformStyle3D() == TransformStyle3D::Optimized3D);
+    m_graphicsLayer->setIsSeparated(style.usedTransformStyle3D() == TransformStyle3D::Optimized3D);
 #endif
 
     // Compute renderer offset from primary graphics layer. Note that primaryGraphicsLayerRect is in parentGraphicsLayer's coordinate system which is not necessarily

Modified: trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp (287741 => 287742)


--- trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/RenderLayerCompositor.cpp	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1642,7 +1642,7 @@
         || oldStyle.transformOriginX() != newStyle.transformOriginX()
         || oldStyle.transformOriginY() != newStyle.transformOriginY()
         || oldStyle.transformOriginZ() != newStyle.transformOriginZ()
-        || oldStyle.transformStyle3D() != newStyle.transformStyle3D()
+        || oldStyle.usedTransformStyle3D() != newStyle.usedTransformStyle3D()
         || oldStyle.perspective() != newStyle.perspective()
         || oldStyle.perspectiveOriginX() != newStyle.perspectiveOriginX()
         || oldStyle.perspectiveOriginY() != newStyle.perspectiveOriginY()
@@ -3044,7 +3044,7 @@
     
     // FIXME: workaround for webkit.org/b/132801
     auto* stackingContext = renderer.layer()->stackingContext();
-    if (stackingContext && stackingContext->renderer().style().transformStyle3D() == TransformStyle3D::Preserve3D)
+    if (stackingContext && stackingContext->renderer().style().preserves3D())
         return true;
 
     return false;
@@ -3291,7 +3291,7 @@
     // A layer with preserve-3d or perspective only needs to be composited if there are descendant layers that
     // will be affected by the preserve-3d or perspective.
     if (has3DTransformedDescendants) {
-        if (renderer.style().transformStyle3D() == TransformStyle3D::Preserve3D)
+        if (renderer.style().preserves3D())
             return IndirectCompositingReason::Preserve3D;
     
         if (renderer.style().hasPerspective())
@@ -3322,7 +3322,7 @@
         return true;
     if (newStyle.boxReflect() != oldStyle.boxReflect())
         return true;
-    if (newStyle.transformStyle3D() != oldStyle.transformStyle3D())
+    if (newStyle.usedTransformStyle3D() != oldStyle.usedTransformStyle3D())
         return true;
     if (newStyle.hasPerspective() != oldStyle.hasPerspective())
         return true;
@@ -4329,7 +4329,7 @@
 {
     const RenderStyle& style = layer.renderer().style();
 
-    if (style.transformStyle3D() == TransformStyle3D::Preserve3D || style.hasPerspective() || styleHas3DTransformOperation(style))
+    if (style.preserves3D() || style.hasPerspective() || styleHas3DTransformOperation(style))
         return true;
 
     const_cast<RenderLayer&>(layer).updateLayerListsIfNeeded();

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.cpp (287741 => 287742)


--- trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.cpp	2022-01-07 08:45:30 UTC (rev 287742)
@@ -1185,7 +1185,7 @@
         return true;
 
     if (m_rareNonInheritedData.ptr() != other.m_rareNonInheritedData.ptr()) {
-        if (m_rareNonInheritedData->transformStyle3D != other.m_rareNonInheritedData->transformStyle3D
+        if (usedTransformStyle3D() != other.usedTransformStyle3D()
             || m_rareNonInheritedData->backfaceVisibility != other.m_rareNonInheritedData->backfaceVisibility
             || m_rareNonInheritedData->perspective != other.m_rareNonInheritedData->perspective
             || m_rareNonInheritedData->perspectiveOriginX != other.m_rareNonInheritedData->perspectiveOriginX

Modified: trunk/Source/WebCore/rendering/style/RenderStyle.h (287741 => 287742)


--- trunk/Source/WebCore/rendering/style/RenderStyle.h	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/style/RenderStyle.h	2022-01-07 08:45:30 UTC (rev 287742)
@@ -674,8 +674,9 @@
     LengthPoint objectPosition() const { return m_rareNonInheritedData->objectPosition; }
 
     // Return true if any transform related property (currently transform, translate, scale, rotate, transformStyle3D or perspective)
-    // indicates that we are transforming.
-    bool hasTransformRelatedProperty() const { return hasTransform() || translate() || scale() || rotate() || preserves3D() || hasPerspective(); }
+    // indicates that we are transforming. The usedTransformStyle3D is not used here because in many cases (such as for deciding
+    // whether or not to establish a containing block), the computed value is what matters.
+    bool hasTransformRelatedProperty() const { return hasTransform() || translate() || scale() || rotate() || transformStyle3D() == TransformStyle3D::Preserve3D || hasPerspective(); }
 
     enum class TransformOperationOption : uint8_t {
         TransformOrigin = 1 << 0,
@@ -721,7 +722,8 @@
     bool hasTransitions() const { return m_rareNonInheritedData->transitions && m_rareNonInheritedData->transitions->size() > 0; }
 
     TransformStyle3D transformStyle3D() const { return static_cast<TransformStyle3D>(m_rareNonInheritedData->transformStyle3D); }
-    bool preserves3D() const { return transformStyle3D() == TransformStyle3D::Preserve3D; }
+    TransformStyle3D usedTransformStyle3D() const { return static_cast<bool>(m_rareNonInheritedData->transformStyleForcedToFlat) ? TransformStyle3D::Flat : transformStyle3D(); }
+    bool preserves3D() const { return usedTransformStyle3D() == TransformStyle3D::Preserve3D; }
 
     BackfaceVisibility backfaceVisibility() const { return static_cast<BackfaceVisibility>(m_rareNonInheritedData->backfaceVisibility); }
     float perspective() const { return m_rareNonInheritedData->perspective; }
@@ -1294,6 +1296,7 @@
     void adjustTransitions();
 
     void setTransformStyle3D(TransformStyle3D b) { SET_VAR(m_rareNonInheritedData, transformStyle3D, static_cast<unsigned>(b)); }
+    void setTransformStyleForcedToFlat(bool b) { SET_VAR(m_rareNonInheritedData, transformStyleForcedToFlat, static_cast<unsigned>(b)); }
     void setBackfaceVisibility(BackfaceVisibility b) { SET_VAR(m_rareNonInheritedData, backfaceVisibility, static_cast<unsigned>(b)); }
     void setPerspective(float p) { SET_VAR(m_rareNonInheritedData, perspective, p); }
     void setPerspectiveOriginX(Length&& length) { SET_VAR(m_rareNonInheritedData, perspectiveOriginX, WTFMove(length)); }

Modified: trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp (287741 => 287742)


--- trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.cpp	2022-01-07 08:45:30 UTC (rev 287742)
@@ -86,6 +86,7 @@
     , touchActions(RenderStyle::initialTouchActions())
     , pageSizeType(PAGE_SIZE_AUTO)
     , transformStyle3D(static_cast<unsigned>(RenderStyle::initialTransformStyle3D()))
+    , transformStyleForcedToFlat(false)
     , backfaceVisibility(static_cast<unsigned>(RenderStyle::initialBackfaceVisibility()))
     , userDrag(static_cast<unsigned>(RenderStyle::initialUserDrag()))
     , textOverflow(static_cast<unsigned>(RenderStyle::initialTextOverflow()))
@@ -188,6 +189,7 @@
     , touchActions(o.touchActions)
     , pageSizeType(o.pageSizeType)
     , transformStyle3D(o.transformStyle3D)
+    , transformStyleForcedToFlat(o.transformStyleForcedToFlat)
     , backfaceVisibility(o.backfaceVisibility)
     , userDrag(o.userDrag)
     , textOverflow(o.textOverflow)
@@ -293,6 +295,7 @@
             || (!customPaintWatchedProperties && !o.customPaintWatchedProperties))
         && pageSizeType == o.pageSizeType
         && transformStyle3D == o.transformStyle3D
+        && transformStyleForcedToFlat == o.transformStyleForcedToFlat
         && backfaceVisibility == o.backfaceVisibility
         && userDrag == o.userDrag
         && textOverflow == o.textOverflow

Modified: trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h (287741 => 287742)


--- trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/rendering/style/StyleRareNonInheritedData.h	2022-01-07 08:45:30 UTC (rev 287742)
@@ -197,6 +197,7 @@
 
     unsigned pageSizeType : 2; // PageSizeType
     unsigned transformStyle3D : 2; // TransformStyle3D
+    unsigned transformStyleForcedToFlat : 1; // The used value for transform-style is forced to flat by a grouping property.
     unsigned backfaceVisibility : 1; // BackfaceVisibility
 
     unsigned userDrag : 2; // UserDrag

Modified: trunk/Source/WebCore/style/StyleAdjuster.cpp (287741 => 287742)


--- trunk/Source/WebCore/style/StyleAdjuster.cpp	2022-01-07 08:28:59 UTC (rev 287741)
+++ trunk/Source/WebCore/style/StyleAdjuster.cpp	2022-01-07 08:45:30 UTC (rev 287742)
@@ -500,19 +500,21 @@
     if (style.hasPseudoStyle(PseudoId::FirstLetter))
         style.setUnique();
 
-    if (style.preserves3D() && (style.overflowX() != Overflow::Visible
-        || style.hasOpacity()
-        || style.overflowY() != Overflow::Visible
-        || style.hasClip()
-        || style.clipPath()
-        || style.hasFilter()
-        || style.hasIsolation()
-        || style.hasMask()
+    if (style.preserves3D()) {
+        bool forceToFlat = style.overflowX() != Overflow::Visible
+            || style.hasOpacity()
+            || style.overflowY() != Overflow::Visible
+            || style.hasClip()
+            || style.clipPath()
+            || style.hasFilter()
+            || style.hasIsolation()
+            || style.hasMask()
 #if ENABLE(FILTERS_LEVEL_2)
-        || style.hasBackdropFilter()
+            || style.hasBackdropFilter()
 #endif
-        || style.hasBlendMode()))
-        style.setTransformStyle3D(TransformStyle3D::Flat);
+            || style.hasBlendMode();
+        style.setTransformStyleForcedToFlat(forceToFlat);
+    }
 
     if (is<SVGElement>(m_element))
         adjustSVGElementStyle(style, downcast<SVGElement>(*m_element));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to