mirror of
https://github.com/servo/servo.git
synced 2025-07-23 07:13:52 +01:00
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:
parent
70f0088986
commit
9aa3f74878
5 changed files with 109 additions and 1 deletions
|
@ -307,7 +307,7 @@ impl FloatContext {
|
|||
pub fn new(max_inline_size: Length) -> Self {
|
||||
let mut bands = FloatBandTree::new();
|
||||
bands = bands.insert(FloatBand {
|
||||
top: Length::zero(),
|
||||
top: Length::new(-f32::INFINITY),
|
||||
left: None,
|
||||
right: None,
|
||||
});
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
[floats-wrap-bfc-with-margin-010.html]
|
||||
expected: FAIL
|
|
@ -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": [
|
||||
"17bec33eb143ce14f13c439e83f433c3fef74fdd",
|
||||
[
|
||||
|
@ -365676,6 +365689,10 @@
|
|||
"ac45eb30bf43748284a1c7a19061f8df56fa5dca",
|
||||
[]
|
||||
],
|
||||
"floats-wrap-bfc-with-margin-010-ref.html": [
|
||||
"b29df933ebae5558f63d799907cbef138910dfd5",
|
||||
[]
|
||||
],
|
||||
"floats-wrap-top-below-001l-notref.xht": [
|
||||
"0953df73d203c1bb3e8d1dba0a3b7a2cde465e18",
|
||||
[]
|
||||
|
|
|
@ -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>
|
|
@ -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>
|
Loading…
Add table
Add a link
Reference in a new issue