From e765c8edbf3c5def46eae348937eef0162931a24 Mon Sep 17 00:00:00 2001 From: FranklinDM Date: Sun, 17 Apr 2022 01:26:10 +0800 Subject: [PATCH] Issue #1370 - Follow-up: Give table wrapper boxes a special case during flex base size resolution, so that percent main-sizes can be respected This is a workaround, based on https://bugzilla.mozilla.org/show_bug.cgi?id=1455976 --- layout/generic/nsFrame.cpp | 9 ++- .../flexbox-table-flex-items-2-ref.html | 64 ++++++++++++++++ .../flexbox/flexbox-table-flex-items-2.html | 73 ++++++++++++++++++ .../flexbox-table-flex-items-3-ref.html | 66 ++++++++++++++++ .../flexbox/flexbox-table-flex-items-3.html | 75 +++++++++++++++++++ layout/reftests/flexbox/reftest.list | 2 + 6 files changed, 288 insertions(+), 1 deletion(-) create mode 100644 layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html create mode 100644 layout/reftests/flexbox/flexbox-table-flex-items-2.html create mode 100644 layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html create mode 100644 layout/reftests/flexbox/flexbox-table-flex-items-3.html diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 27365836ec..60f3515c31 100644 --- a/layout/generic/nsFrame.cpp +++ b/layout/generic/nsFrame.cpp @@ -4645,6 +4645,13 @@ nsFrame::SetCoordToFlexBasis(bool aIsInlineFlexItem, auto mainAxisCoord = aIsInlineFlexItem ? aInlineStyle : aBlockStyle; + // NOTE: If we're a table-wrapper frame, we skip this clause and just stick + // with 'main-size:auto' behavior (which -- unlike 'content' + // i.e. 'max-content' -- will give us the ability to honor percent sizes on + // our table-box child when resolving the flex base size). The flexbox spec + // doesn't call for this special case, but webcompat & regression-avoidance + // seems to require it, for the time being... Tables sure are special. + bool isTableWrapperFrame = GetType() == nsGkAtoms::tableWrapperFrame; // We have a used flex-basis of 'content' if flex-basis explicitly has that // value, OR if flex-basis is 'auto' (deferring to the main-size property) // and the main-size property is also 'auto'. @@ -4665,7 +4672,7 @@ nsFrame::SetCoordToFlexBasis(bool aIsInlineFlexItem, // which substep we fall into) by using the 'auto' keyword for our // main-axis coordinate here. (This makes sense, because the spec is // effectively trying to produce the 'auto' sizing behavior). - if (aIntrinsic) { + if (aIntrinsic || MOZ_LIKELY(isTableWrapperFrame)) { static const nsStyleCoord autoStyleCoord(eStyleUnit_Auto); *mainAxisCoord = &autoStyleCoord; } else { diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html b/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html new file mode 100644 index 0000000000..98a93716a5 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html @@ -0,0 +1,64 @@ + + + + + + CSS Reftest Reference + + + + + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-2.html b/layout/reftests/flexbox/flexbox-table-flex-items-2.html new file mode 100644 index 0000000000..c11ce70802 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-2.html @@ -0,0 +1,73 @@ + + + + + + + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + + + + + + + + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html b/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html new file mode 100644 index 0000000000..568495f341 --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html @@ -0,0 +1,66 @@ + + + + + + CSS Reftest Reference + + + + + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + diff --git a/layout/reftests/flexbox/flexbox-table-flex-items-3.html b/layout/reftests/flexbox/flexbox-table-flex-items-3.html new file mode 100644 index 0000000000..c68152856f --- /dev/null +++ b/layout/reftests/flexbox/flexbox-table-flex-items-3.html @@ -0,0 +1,75 @@ + + + + + + + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + + + + + + + + + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + + diff --git a/layout/reftests/flexbox/reftest.list b/layout/reftests/flexbox/reftest.list index be156100e8..075b789026 100644 --- a/layout/reftests/flexbox/reftest.list +++ b/layout/reftests/flexbox/reftest.list @@ -116,3 +116,5 @@ fuzzy-if(gtkWidget,1,31) == flexbox-widget-flex-items-4.html flexbox-widget-flex # Tests for table flex items == flexbox-table-flex-items-1-ref.html flexbox-table-flex-items-1-ref.html +== flexbox-table-flex-items-2.html flexbox-table-flex-items-2-ref.html +== flexbox-table-flex-items-3.html flexbox-table-flex-items-3-ref.html