mirror of
https://github.com/servo/servo.git
synced 2025-08-02 04:00:32 +01:00
Auto merge of #5583 - pcwalton:float-ceiling-top-margin-redux, r=mbrubeck
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. r? @mbrubeck
This commit is contained in:
commit
1c884dc76b
7 changed files with 77 additions and 8 deletions
|
@ -1994,7 +1994,8 @@ pub struct ISizeConstraintSolution {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl 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 {
|
ISizeConstraintSolution {
|
||||||
inline_start: Au(0),
|
inline_start: Au(0),
|
||||||
inline_end: Au(0),
|
inline_end: Au(0),
|
||||||
|
|
|
@ -174,7 +174,12 @@ impl MarginCollapseInfo {
|
||||||
|
|
||||||
pub fn current_float_ceiling(&mut self) -> Au {
|
pub fn current_float_ceiling(&mut self) -> Au {
|
||||||
match self.state {
|
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(),
|
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
|
/// 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
|
/// 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.
|
/// 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) {
|
match (self.state, *child_collapsible_margins) {
|
||||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin, CollapsibleMargins::None(block_start, _)) => {
|
(MarginCollapseState::AccumulatingCollapsibleTopMargin,
|
||||||
|
CollapsibleMargins::None(block_start, _)) => {
|
||||||
self.state = MarginCollapseState::AccumulatingMarginIn;
|
self.state = MarginCollapseState::AccumulatingMarginIn;
|
||||||
block_start
|
block_start
|
||||||
}
|
}
|
||||||
(MarginCollapseState::AccumulatingCollapsibleTopMargin, CollapsibleMargins::Collapse(block_start, _)) => {
|
(MarginCollapseState::AccumulatingCollapsibleTopMargin,
|
||||||
|
CollapsibleMargins::Collapse(block_start, _)) => {
|
||||||
self.block_start_margin.union(block_start);
|
self.block_start_margin.union(block_start);
|
||||||
self.state = MarginCollapseState::AccumulatingMarginIn;
|
self.state = MarginCollapseState::AccumulatingMarginIn;
|
||||||
Au(0)
|
Au(0)
|
||||||
}
|
}
|
||||||
(MarginCollapseState::AccumulatingMarginIn, CollapsibleMargins::None(block_start, _)) => {
|
(MarginCollapseState::AccumulatingMarginIn,
|
||||||
|
CollapsibleMargins::None(block_start, _)) => {
|
||||||
let previous_margin_value = self.margin_in.collapse();
|
let previous_margin_value = self.margin_in.collapse();
|
||||||
self.margin_in = AdjoiningMargins::new();
|
self.margin_in = AdjoiningMargins::new();
|
||||||
previous_margin_value + block_start
|
previous_margin_value + block_start
|
||||||
|
|
|
@ -114,6 +114,7 @@ flaky_cpu == append_style_a.html append_style_b.html
|
||||||
== float_intrinsic_width_a.html float_intrinsic_width_ref.html
|
== float_intrinsic_width_a.html float_intrinsic_width_ref.html
|
||||||
== float_right_intrinsic_width_a.html float_right_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_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_generated_content_a.html floated_generated_content_b.html
|
||||||
== floated_list_item_a.html floated_list_item_ref.html
|
== floated_list_item_a.html floated_list_item_ref.html
|
||||||
== floated_table_with_margin_a.html floated_table_with_margin_ref.html
|
== floated_table_with_margin_a.html floated_table_with_margin_ref.html
|
||||||
|
|
|
@ -19,6 +19,6 @@
|
||||||
<div class="otherprojects">
|
<div class="otherprojects">
|
||||||
<div class="otherprojects-item">
|
<div class="otherprojects-item">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</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="float: left;">
|
||||||
<div style="margin-bottom: 64px;">Must be this tall</div>
|
<div style="margin-bottom: 64px;">Must be this tall</div>
|
||||||
<div style="margin-top: 64px;">to write multi-threaded code.</div>
|
<div style="margin-top: 64px;">to write multi-threaded code.</div>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue