Title: [287128] trunk
Revision
287128
Author
commit-qu...@webkit.org
Date
2021-12-16 03:03:48 -0800 (Thu, 16 Dec 2021)

Log Message

Flexbox ignores margins of absolute positioned children when `align-items: flex-end` or `justify-content: flex-end`
https://bugs.webkit.org/show_bug.cgi?id=234143

Patch by Vitaly Dyachkov <obyknoven...@me.com> on 2021-12-16
Reviewed by Sergio Villar Senin.

LayoutTests/imported/w3c:

* web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003-expected.html: Added.
* web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html: Added.
* web-platform-tests/css/css-flexbox/abspos/position-absolute-015-expected.txt: Replaced FAIL
by PASS expectations.

Source/WebCore:

When flexbox layouts its children every absolutely-positioned child is processed separately from regular flex items as it were the sole flex item.
Absolutely-positioned can be both main- and cross-axis aligned. To correctly align it we first must calculate available space for it.
To do that the code was correctly subtracting the size of the item from the size of the container but was not subtracting the margins.
Fixed by including the margins into available size calculation.

Test: imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html

* rendering/RenderFlexibleBox.cpp:
(WebCore::RenderFlexibleBox::mainAxisMarginExtentForChild const):
(WebCore::RenderFlexibleBox::staticMainAxisPositionForPositionedChild):

LayoutTests:

* TestExpectations: Unksipped a flexbox test that is now passing.

Modified Paths

Added Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (287127 => 287128)


--- trunk/LayoutTests/ChangeLog	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/LayoutTests/ChangeLog	2021-12-16 11:03:48 UTC (rev 287128)
@@ -1,3 +1,12 @@
+2021-12-16  Vitaly Dyachkov  <obyknoven...@me.com>
+
+        Flexbox ignores margins of absolute positioned children when `align-items: flex-end` or `justify-content: flex-end`
+        https://bugs.webkit.org/show_bug.cgi?id=234143
+
+        Reviewed by Sergio Villar Senin.
+
+        * TestExpectations: Unksipped a flexbox test that is now passing.
+
 2021-12-15  Alex Christensen  <achristen...@webkit.org>
 
         Remove unreachable code in Plugin and PluginController

Modified: trunk/LayoutTests/TestExpectations (287127 => 287128)


--- trunk/LayoutTests/TestExpectations	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/LayoutTests/TestExpectations	2021-12-16 11:03:48 UTC (rev 287128)
@@ -4239,7 +4239,6 @@
 # Static position alignment in Flexbox.
 webkit.org/b/221472 imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-align-self-safe-001.html [ ImageOnlyFailure ]
 webkit.org/b/221472 imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-fallback-align-content-001.html [ ImageOnlyFailure ]
-webkit.org/b/221472 imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-002.html [ ImageOnlyFailure ]
 
 # Tables as flex items.
 webkit.org/b/221473 imported/w3c/web-platform-tests/css/css-flexbox/table-as-item-min-height-1.html [ ImageOnlyFailure ]

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (287127 => 287128)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2021-12-16 11:03:48 UTC (rev 287128)
@@ -1,3 +1,15 @@
+2021-12-16  Vitaly Dyachkov  <obyknoven...@me.com>
+
+        Flexbox ignores margins of absolute positioned children when `align-items: flex-end` or `justify-content: flex-end`
+        https://bugs.webkit.org/show_bug.cgi?id=234143
+
+        Reviewed by Sergio Villar Senin.
+
+        * web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003-expected.html: Added.
+        * web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html: Added.
+        * web-platform-tests/css/css-flexbox/abspos/position-absolute-015-expected.txt: Replaced FAIL
+        by PASS expectations.
+
 2021-12-16  Joonghun Park  <jh718.p...@samsung.com>
 
         Unreviewed. Import updated table-child-percentage-height-with-border-box-expected.html

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003-expected.html (0 => 287128)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003-expected.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003-expected.html	2021-12-16 11:03:48 UTC (rev 287128)
@@ -0,0 +1,68 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Static position of abspos children in a row flex container, with various margins applied, and "align-items: flex-end" reference</title>
+<style>
+  .container {
+    display: block;
+    padding: 1px 2px;
+    border: 1px solid black;
+    background: yellow;
+    margin-bottom: 5px;
+    margin-right: 10px;
+    float: left; /* For testing in "rows" of containers */
+  }
+  br { clear: both }
+
+  .big > .container {
+    height: 14px;
+    width: 20px;
+  }
+  .small > .container {
+    height: 2px;
+    width: 4px;
+  }
+
+  .container > * {
+    background: teal;
+    height: 6px;
+    width: 8px;
+  }
+</style>
+<div class="big">
+  <!-- Margin just on one side: -->
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 5px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 8px 0 0 3px"></div></div>
+  <!-- Margin on all sides: -->
+  <div class="container"><div style="margin: 5px 0 0 4px"></div></div>
+  <br>
+
+  <!-- "auto" margin on just one side (should be treated as 0): -->
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <!-- "auto" margin on all sides (should be treated as 0): -->
+  <div class="container"><div style="margin: 8px 0 0 0"></div></div>
+  <br>
+</div>
+<div class="small">
+  <!-- Margin just on one side: -->
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -7px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -4px 0 0 3px"></div></div>
+  <!-- Margin on all sides: -->
+  <div class="container"><div style="margin: -7px 0 0 4px"></div></div>
+  <br>
+
+  <!-- "auto" margin on just one side (should be treated as 0): -->
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <!-- "auto" margin on all sides (should be treated as 0): -->
+  <div class="container"><div style="margin: -4px 0 0 0"></div></div>
+  <br>
+</div>

Added: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html (0 => 287128)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html	                        (rev 0)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html	2021-12-16 11:03:48 UTC (rev 287128)
@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<meta charset="utf-8">
+<title>Static position of abspos children in a row flex container, with various margins applied, and "align-items: flex-end"</title>
+<link rel="author" title="Vitaly Dyachkov" href=""
+<link rel="help" href=""
+<link rel="match" href=""
+<style>
+  .container {
+    display: flex;
+    flex-flow: row;
+    align-items: flex-end;
+    padding: 1px 2px;
+    border: 1px solid black;
+    background: yellow;
+    margin-bottom: 5px;
+    margin-right: 10px;
+    float: left; /* For testing in "rows" of containers */
+  }
+  br { clear: both }
+
+  .big > .container {
+    height: 14px;
+    width: 20px;
+  }
+  .small > .container {
+    height: 2px;
+    width: 4px;
+  }
+
+  .container > * {
+    position: absolute;
+    background: teal;
+    height: 6px;
+    width: 8px;
+  }
+</style>
+<div class="big">
+  <!-- Margin just on one side: -->
+  <div class="container"><div style="margin-top: 3px"></div></div>
+  <div class="container"><div style="margin-right: 3px"></div></div>
+  <div class="container"><div style="margin-bottom: 3px"></div></div>
+  <div class="container"><div style="margin-left: 3px"></div></div>
+  <!-- Margin on all sides: -->
+  <div class="container"><div style="margin: 1px 2px 3px 4px"></div></div>
+  <br>
+
+  <!-- "auto" margin on just one side (should be treated as 0): -->
+  <div class="container"><div style="margin-top: auto"></div></div>
+  <div class="container"><div style="margin-right: auto"></div></div>
+  <div class="container"><div style="margin-bottom: auto"></div></div>
+  <div class="container"><div style="margin-left: auto"></div></div>
+  <!-- "auto" margin on all sides (should be treated as 0): -->
+  <div class="container"><div style="margin: auto"></div></div>
+  <br>
+</div>
+<div class="small">
+  <!-- Margin just on one side: -->
+  <div class="container"><div style="margin-top: 3px"></div></div>
+  <div class="container"><div style="margin-right: 3px"></div></div>
+  <div class="container"><div style="margin-bottom: 3px"></div></div>
+  <div class="container"><div style="margin-left: 3px"></div></div>
+  <!-- Margin on all sides: -->
+  <div class="container"><div style="margin: 1px 2px 3px 4px"></div></div>
+  <br>
+
+  <!-- "auto" margin on just one side (should be treated as 0): -->
+  <div class="container"><div style="margin-top: auto"></div></div>
+  <div class="container"><div style="margin-right: auto"></div></div>
+  <div class="container"><div style="margin-bottom: auto"></div></div>
+  <div class="container"><div style="margin-left: auto"></div></div>
+  <!-- "auto" margin on all sides (should be treated as 0): -->
+  <div class="container"><div style="margin: auto"></div></div>
+  <br>
+</div>

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/position-absolute-015-expected.txt (287127 => 287128)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/position-absolute-015-expected.txt	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-flexbox/abspos/position-absolute-015-expected.txt	2021-12-16 11:03:48 UTC (rev 287128)
@@ -1,5 +1,3 @@
 
-FAIL #abspos 1 assert_equals:
-<div style="background: cyan; margin: 20px; position: absolute; width: 30px; height: 40px;" data-offset-x="150" id="abspos"></div>
-offsetLeft expected 150 but got 190
+PASS #abspos 1
 

Modified: trunk/Source/WebCore/ChangeLog (287127 => 287128)


--- trunk/Source/WebCore/ChangeLog	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/Source/WebCore/ChangeLog	2021-12-16 11:03:48 UTC (rev 287128)
@@ -1,3 +1,21 @@
+2021-12-16  Vitaly Dyachkov  <obyknoven...@me.com>
+
+        Flexbox ignores margins of absolute positioned children when `align-items: flex-end` or `justify-content: flex-end`
+        https://bugs.webkit.org/show_bug.cgi?id=234143
+
+        Reviewed by Sergio Villar Senin.
+
+        When flexbox layouts its children every absolutely-positioned child is processed separately from regular flex items as it were the sole flex item.
+        Absolutely-positioned can be both main- and cross-axis aligned. To correctly align it we first must calculate available space for it.
+        To do that the code was correctly subtracting the size of the item from the size of the container but was not subtracting the margins.
+        Fixed by including the margins into available size calculation.
+
+        Test: imported/w3c/web-platform-tests/css/css-flexbox/abspos/flex-abspos-staticpos-margin-003.html
+
+        * rendering/RenderFlexibleBox.cpp:
+        (WebCore::RenderFlexibleBox::mainAxisMarginExtentForChild const):
+        (WebCore::RenderFlexibleBox::staticMainAxisPositionForPositionedChild):
+
 2021-12-15  Andres Gonzalez  <andresg...@apple.com>
 
         Fix for crash in AXIsolatedObject::textMarkerRangeForNSRange.

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp (287127 => 287128)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.cpp	2021-12-16 11:03:48 UTC (rev 287128)
@@ -823,6 +823,20 @@
     return marginTop();
 }
 
+LayoutUnit RenderFlexibleBox::mainAxisMarginExtentForChild(const RenderBox& child) const
+{
+    if (!child.needsLayout())
+        return isHorizontalFlow() ? child.horizontalMarginExtent() : child.verticalMarginExtent();
+
+    LayoutUnit marginStart;
+    LayoutUnit marginEnd;
+    if (isHorizontalFlow())
+        child.computeInlineDirectionMargins(*this, child.containingBlockLogicalWidthForContentInFragment(nullptr), child.logicalWidth(), marginStart, marginEnd);
+    else
+        child.computeBlockDirectionMargins(*this, marginStart, marginEnd);
+    return marginStart + marginEnd;
+}
+
 LayoutUnit RenderFlexibleBox::crossAxisMarginExtentForChild(const RenderBox& child) const
 {
     if (!child.needsLayout())
@@ -1673,7 +1687,8 @@
 
 LayoutUnit RenderFlexibleBox::staticMainAxisPositionForPositionedChild(const RenderBox& child)
 {
-    const LayoutUnit availableSpace = mainAxisContentExtent(contentLogicalHeight()) - mainAxisExtentForChild(child);
+    auto childMainExtent = mainAxisMarginExtentForChild(child) + mainAxisExtentForChild(child);
+    auto availableSpace = mainAxisContentExtent(contentLogicalHeight()) - childMainExtent;
     auto isReverse = isColumnOrRowReverse();
     LayoutUnit offset = initialJustifyContentOffset(style(), availableSpace, 1, isReverse);
     if (isReverse)

Modified: trunk/Source/WebCore/rendering/RenderFlexibleBox.h (287127 => 287128)


--- trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2021-12-16 10:52:35 UTC (rev 287127)
+++ trunk/Source/WebCore/rendering/RenderFlexibleBox.h	2021-12-16 11:03:48 UTC (rev 287128)
@@ -140,6 +140,7 @@
     LayoutUnit flowAwareMarginEndForChild(const RenderBox& child) const;
     LayoutUnit flowAwareMarginBeforeForChild(const RenderBox& child) const;
     LayoutUnit crossAxisMarginExtentForChild(const RenderBox& child) const;
+    LayoutUnit mainAxisMarginExtentForChild(const RenderBox& child) const;
     LayoutUnit crossAxisScrollbarExtent() const;
     LayoutUnit crossAxisScrollbarExtentForChild(const RenderBox& child) const;
     LayoutPoint flowAwareLocationForChild(const RenderBox& child) const;
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to