diff options
author | FranklinDM <mrmineshafter17@gmail.com> | 2022-04-17 01:26:10 +0800 |
---|---|---|
committer | Moonchild <moonchild@palemoon.org> | 2022-04-17 11:03:22 +0200 |
commit | bb9700d982ee71799026030ade86e20fb12e09e7 (patch) | |
tree | 5b24263a5d20578bfdefcfdad2f7a5d7c0063808 /layout | |
parent | 279ed4a9cf67740095672a6f62d7848627809993 (diff) | |
download | uxp-bb9700d982ee71799026030ade86e20fb12e09e7.tar.gz |
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
Diffstat (limited to 'layout')
-rw-r--r-- | layout/generic/nsFrame.cpp | 9 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-2-ref.html | 64 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-2.html | 73 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-3-ref.html | 66 | ||||
-rw-r--r-- | layout/reftests/flexbox/flexbox-table-flex-items-3.html | 75 | ||||
-rw-r--r-- | layout/reftests/flexbox/reftest.list | 2 |
6 files changed, 288 insertions, 1 deletions
diff --git a/layout/generic/nsFrame.cpp b/layout/generic/nsFrame.cpp index 458b18abd9..af3d2f9457 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 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title>CSS Reftest Reference</title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <style> + .container { + display: flex; + width: 100px; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="width: 30px"><ib></ib></div> + <div class="block" style="width: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="width: 30%"><ib></ib></div> + <div class="block" style="width: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="width: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="width: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> 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 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + </title> + <!-- XXXdholbert NOTE: This probably eventually should move to our + upstreamed reftest directory. But for now, this is just asserting + backwards-compatible/interoperable (but not necessary spec-compliant) + behavior, per https://github.com/w3c/csswg-drafts/issues/2604 --> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <link rel="match" href="flexbox-table-flex-items-2.html"> + <style> + .container { + display: flex; + width: 100px; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + display: table; + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="width: 30px"><ib></ib></div> + <div class="block" style="width: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="width: 30%"><ib></ib></div> + <div class="block" style="width: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="width: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="width: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> 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 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title>CSS Reftest Reference</title> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <style> + .container { + display: flex; + flex-direction: column; + height: 100px; + float: left; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="height: 30px"><ib></ib></div> + <div class="block" style="height: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="height: 30%"><ib></ib></div> + <div class="block" style="height: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="height: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="height: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> 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 @@ +<!DOCTYPE html> +<!-- + Any copyright is dedicated to the Public Domain. + http://creativecommons.org/publicdomain/zero/1.0/ +--> +<html> +<head> + <meta charset="utf-8"> + <title> + CSS Test: Testing that implicit "flex-basis: content" on table wrapper box + doesn't prevent explicit table size from influencing flex base size. + </title> + <!-- XXXdholbert NOTE: This probably eventually should move to our + upstreamed reftest directory. But for now, this is just asserting + backwards-compatible/interoperable (but not necessary spec-compliant) + behavior, per https://github.com/w3c/csswg-drafts/issues/2604 --> + <link rel="author" title="Daniel Holbert" href="mailto:dholbert@mozilla.com"> + <link rel="help" href="https://www.w3.org/TR/css-flexbox-1/#flex-base-size"> + <link rel="match" href="flexbox-table-flex-items-3.html"> + <style> + .container { + display: flex; + flex-direction: column; + height: 100px; + float: left; + border: 1px solid black; + } + + /* Two types of flex items: */ + .table { + display: table; + border: 2px solid teal; + } + .block { + border: 2px solid brown; + } + + /* Each flex item gets one of these as its contents, + to have a nonzero content size: */ + ib { + display: inline-block; + background: blue; + border: 1px solid gray; + width: 15px; + height: 10px; + } + </style> +</head> +<body> +<!-- auto size: --> +<div class="container"> + <div class="table"><ib></ib></div> + <div class="block"><ib></ib></div> +</div> + +<!-- px size: --> +<div class="container"> + <div class="table" style="height: 30px"><ib></ib></div> + <div class="block" style="height: 30px"><ib></ib></div> +</div> + +<!-- % size: --> +<div class="container"> + <div class="table" style="height: 30%"><ib></ib></div> + <div class="block" style="height: 30%"><ib></ib></div> +</div> + +<!-- calc() size: --> +<div class="container"> + <div class="table" style="height: calc(10px + 20%)"><ib></ib></div> + <div class="block" style="height: calc(10px + 20%)"><ib></ib></div> +</div> + +</body> +</html> 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 |