mirror of
https://github.com/servo/servo.git
synced 2025-06-06 16:45:39 +00:00
layout: Don't take collapsible top margin into account when determining
the float ceiling. As the float ceiling is relative to the border box, not the margin box, of the parent flow, top margin must not be included. This exposed a pre-existing bug whereby margins are discarded if a block contains only floats and no content, affecting the tests `float_intrinsic_height.html` and `margins_inside_floats_a.html`. As a workaround, some invisible content has been added to the bodies of both tests.
This commit is contained in:
parent
c7e210f24c
commit
c86bc2eb8b
7 changed files with 77 additions and 8 deletions
|
@ -1990,7 +1990,8 @@ pub struct ISizeConstraintSolution {
|
|||
}
|
||||
|
||||
impl ISizeConstraintSolution {
|
||||
pub fn new(inline_size: Au, margin_inline_start: Au, margin_inline_end: Au) -> ISizeConstraintSolution {
|
||||
pub fn new(inline_size: Au, margin_inline_start: Au, margin_inline_end: Au)
|
||||
-> ISizeConstraintSolution {
|
||||
ISizeConstraintSolution {
|
||||
inline_start: Au(0),
|
||||
inline_end: Au(0),
|
||||
|
|
|
@ -174,7 +174,12 @@ impl MarginCollapseInfo {
|
|||
|
||||
pub fn current_float_ceiling(&mut self) -> Au {
|
||||
match self.state {
|
||||
MarginCollapseState::AccumulatingCollapsibleTopMargin => self.block_start_margin.collapse(),
|
||||
MarginCollapseState::AccumulatingCollapsibleTopMargin => {
|
||||
// We do not include the top margin in the float ceiling, because the float flow
|
||||
// needs to be positioned relative to our *border box*, not our margin box. See
|
||||
// `tests/ref/float_under_top_margin_a.html`.
|
||||
Au(0)
|
||||
}
|
||||
MarginCollapseState::AccumulatingMarginIn => self.margin_in.collapse(),
|
||||
}
|
||||
}
|
||||
|
@ -182,18 +187,22 @@ impl MarginCollapseInfo {
|
|||
/// Adds the child's potentially collapsible block-start margin to the current margin state and
|
||||
/// advances the Y offset by the appropriate amount to handle that margin. Returns the amount
|
||||
/// that should be added to the Y offset during block layout.
|
||||
pub fn advance_block_start_margin(&mut self, child_collapsible_margins: &CollapsibleMargins) -> Au {
|
||||
pub fn advance_block_start_margin(&mut self, child_collapsible_margins: &CollapsibleMargins)
|
||||
-> Au {
|
||||
match (self.state, *child_collapsible_margins) {
|
||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin, CollapsibleMargins::None(block_start, _)) => {
|
||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin,
|
||||
CollapsibleMargins::None(block_start, _)) => {
|
||||
self.state = MarginCollapseState::AccumulatingMarginIn;
|
||||
block_start
|
||||
}
|
||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin, CollapsibleMargins::Collapse(block_start, _)) => {
|
||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin,
|
||||
CollapsibleMargins::Collapse(block_start, _)) => {
|
||||
self.block_start_margin.union(block_start);
|
||||
self.state = MarginCollapseState::AccumulatingMarginIn;
|
||||
Au(0)
|
||||
}
|
||||
(MarginCollapseState::AccumulatingMarginIn, CollapsibleMargins::None(block_start, _)) => {
|
||||
(MarginCollapseState::AccumulatingMarginIn,
|
||||
CollapsibleMargins::None(block_start, _)) => {
|
||||
let previous_margin_value = self.margin_in.collapse();
|
||||
self.margin_in = AdjoiningMargins::new();
|
||||
previous_margin_value + block_start
|
||||
|
|
|
@ -100,6 +100,7 @@ flaky_cpu == append_style_a.html append_style_b.html
|
|||
== float_intrinsic_width_a.html float_intrinsic_width_ref.html
|
||||
== float_right_intrinsic_width_a.html float_right_intrinsic_width_ref.html
|
||||
== float_table_a.html float_table_ref.html
|
||||
== float_under_top_margin_a.html float_under_top_margin_ref.html
|
||||
== floated_generated_content_a.html floated_generated_content_b.html
|
||||
== floated_list_item_a.html floated_list_item_ref.html
|
||||
== floated_table_with_margin_a.html floated_table_with_margin_ref.html
|
||||
|
|
|
@ -19,6 +19,6 @@
|
|||
<div class="otherprojects">
|
||||
<div class="otherprojects-item">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
29
tests/ref/float_under_top_margin_a.html
Normal file
29
tests/ref/float_under_top_margin_a.html
Normal file
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
margin-top: 64px;
|
||||
}
|
||||
#foo, #bar {
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
}
|
||||
#foo {
|
||||
background: blue;
|
||||
float: right;
|
||||
}
|
||||
#bar {
|
||||
background: gold;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id=foo></div><div id=bar></div>
|
||||
</body>
|
||||
</html>
|
||||
|
29
tests/ref/float_under_top_margin_ref.html
Normal file
29
tests/ref/float_under_top_margin_ref.html
Normal file
|
@ -0,0 +1,29 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
body {
|
||||
padding-top: 64px;
|
||||
}
|
||||
#foo, #bar {
|
||||
height: 35px;
|
||||
width: 35px;
|
||||
}
|
||||
#foo {
|
||||
background: blue;
|
||||
float: right;
|
||||
}
|
||||
#bar {
|
||||
background: gold;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id=foo></div><div id=bar></div>
|
||||
</body>
|
||||
</html>
|
||||
|
|
@ -4,7 +4,7 @@
|
|||
<div style="float: left;">
|
||||
<div style="margin-bottom: 64px;">Must be this tall</div>
|
||||
<div style="margin-top: 64px;">to write multi-threaded code.</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue