Avoid crash in PlacementAmongFloats (#30235)

PlacementAmongFloats was assuming that there would always be a FloatBand
at a position smaller than or equal to the given ceiling, but this was
not the case for negative ceilings.

The reason is that the FloatContext initialized the FloatBandTree with
a band at 0, and another at +∞.

This patch changes the initial bands to −∞ and +∞. This seems more
consistent and matches the expectation of PlacementAmongFloats.
This commit is contained in:
Oriol Brufau 2023-08-29 20:40:05 +02:00 committed by GitHub
parent 70f0088986
commit 9aa3f74878
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 109 additions and 1 deletions

View file

@ -307,7 +307,7 @@ impl FloatContext {
pub fn new(max_inline_size: Length) -> Self { pub fn new(max_inline_size: Length) -> Self {
let mut bands = FloatBandTree::new(); let mut bands = FloatBandTree::new();
bands = bands.insert(FloatBand { bands = bands.insert(FloatBand {
top: Length::zero(), top: Length::new(-f32::INFINITY),
left: None, left: None,
right: None, right: None,
}); });

View file

@ -0,0 +1,2 @@
[floats-wrap-bfc-with-margin-010.html]
expected: FAIL

View file

@ -61965,6 +61965,19 @@
{} {}
] ]
], ],
"floats-wrap-bfc-with-margin-010.html": [
"1cc9690602fd6b6beb383aef8a80e7ee8be926e3",
[
null,
[
[
"/css/CSS2/floats/floats-wrap-bfc-with-margin-010-ref.html",
"=="
]
],
{}
]
],
"floats-wrap-top-below-bfc-001l.xht": [ "floats-wrap-top-below-bfc-001l.xht": [
"17bec33eb143ce14f13c439e83f433c3fef74fdd", "17bec33eb143ce14f13c439e83f433c3fef74fdd",
[ [
@ -365676,6 +365689,10 @@
"ac45eb30bf43748284a1c7a19061f8df56fa5dca", "ac45eb30bf43748284a1c7a19061f8df56fa5dca",
[] []
], ],
"floats-wrap-bfc-with-margin-010-ref.html": [
"b29df933ebae5558f63d799907cbef138910dfd5",
[]
],
"floats-wrap-top-below-001l-notref.xht": [ "floats-wrap-top-below-001l-notref.xht": [
"0953df73d203c1bb3e8d1dba0a3b7a2cde465e18", "0953df73d203c1bb3e8d1dba0a3b7a2cde465e18",
[] []

View file

@ -0,0 +1,43 @@
<!DOCTYPE html>
<title>CSS Test Reference</title>
<link rel="author" title="Oriol Brufau" href="obrufau@igalia.com">
<style>
body {
position: relative;
}
.wrapper {
position: absolute;
width: 100px;
border: 5px solid;
top: 75px;
}
.float {
position: absolute;
width: 50px;
height: 50px;
left: 0;
top: 0;
background: cyan;
}
.bfc {
position: absolute;
height: 50px;
background: green;
}
</style>
<div class="wrapper" style="left: 10px; height: 50px">
<div class="float"></div>
<div class="bfc" style="width: 50px; left: 0; top: -75px"></div>
</div>
<div class="wrapper" style="left: 140px; height: 50px">
<div class="float"></div>
<div class="bfc" style="width: 75px; left: 0; top: -75px"></div>
</div>
<div class="wrapper" style="left: 270px; height: 50px">
<div class="float"></div>
<div class="bfc" style="width: 50px; left: 50px; top: -25px"></div>
</div>
<div class="wrapper" style="left: 400px; height: 100px">
<div class="float"></div>
<div class="bfc" style="width: 75px; left: 0px; top: 50px"></div>
</div>

View file

@ -0,0 +1,46 @@
<!DOCTYPE html>
<title>CSS Test: Float followed by a BFC root with a negative margin-top</title>
<link rel="author" title="Oriol Brufau" href="obrufau@igalia.com">
<link rel="help" href="https://drafts.csswg.org/css2/#floats">
<link rel="match" href="floats-wrap-bfc-with-margin-010-ref.html">
<meta name="assert" content="
If the negative margin places the BFC root entirely above the float,
then they don't overlap so we are done.
If the negative margin is not enough to prevent them from overlapping,
then the BFC root needs to be placed adjacent to the float if there
is enough available space, or be cleared below the float.">
<style>
.wrapper {
float: left;
width: 100px;
border: 5px solid;
margin: 75px 10px;
}
.float {
float: left;
width: 50px;
height: 50px;
background: cyan;
}
.bfc {
overflow: hidden;
height: 50px;
background: green;
}
</style>
<div class="wrapper">
<div class="float"></div>
<div class="bfc" style="margin-top: -75px; width: 50px"></div>
</div>
<div class="wrapper">
<div class="float"></div>
<div class="bfc" style="margin-top: -75px; width: 75px"></div>
</div>
<div class="wrapper">
<div class="float"></div>
<div class="bfc" style="margin-top: -25px; width: 50px"></div>
</div>
<div class="wrapper">
<div class="float"></div>
<div class="bfc" style="margin-top: -25px; width: 75px"></div>
</div>