mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00: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 {
|
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,
|
||||||
});
|
});
|
||||||
|
|
|
@ -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": [
|
"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",
|
||||||
[]
|
[]
|
||||||
|
|
|
@ -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