diff --git a/components/layout/block.rs b/components/layout/block.rs index 2d768b0c55d..4f69a9487d8 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -809,7 +809,7 @@ impl BlockFlow { // At this point, `cur_b` is at the content edge of our box. Now iterate over children. let mut floats = self.base.floats.clone(); let thread_id = self.base.thread_id; - let mut had_float_children = false; + let (mut had_floated_children, mut had_children_with_clearance) = (false, false); for (child_index, kid) in self.base.child_iter_mut().enumerate() { if flow::base(kid).flags.contains(IS_ABSOLUTELY_POSITIONED) { // Assume that the *hypothetical box* for an absolute flow starts immediately @@ -845,12 +845,12 @@ impl BlockFlow { // before. flow::mut_base(kid).floats = floats.clone(); if flow::base(kid).flags.is_float() { - had_float_children = true; + had_floated_children = true; flow::mut_base(kid).position.start.b = cur_b; { let kid_block = kid.as_mut_block(); - kid_block.float.as_mut().unwrap().float_ceiling = - margin_collapse_info.current_float_ceiling(); + let float_ceiling = margin_collapse_info.current_float_ceiling(); + kid_block.float.as_mut().unwrap().float_ceiling = float_ceiling } kid.place_float_if_applicable(layout_context); @@ -875,9 +875,17 @@ impl BlockFlow { kid.assign_block_size_for_inorder_child_if_necessary(layout_context, thread_id); + if !had_children_with_clearance && + floats.is_present() && + (flow::base(kid).flags.contains(CLEARS_LEFT) || + flow::base(kid).flags.contains(CLEARS_RIGHT)) { + had_children_with_clearance = true + } + // Handle any (possibly collapsed) top margin. let delta = margin_collapse_info.advance_block_start_margin( - &flow::base(kid).collapsible_margins); + &flow::base(kid).collapsible_margins, + !had_children_with_clearance); translate_including_floats(&mut cur_b, delta, &mut floats); // Clear past the floats that came in, if necessary. @@ -935,7 +943,7 @@ impl BlockFlow { &self.fragment, self.base.block_container_explicit_block_size, can_collapse_block_end_margin_with_kids, - !had_float_children); + !had_floated_children); self.base.collapsible_margins = collapsible_margins; translate_including_floats(&mut cur_b, delta, &mut floats); diff --git a/components/layout/floats.rs b/components/layout/floats.rs index a31d7461db0..63fdc6da796 100644 --- a/components/layout/floats.rs +++ b/components/layout/floats.rs @@ -413,6 +413,10 @@ impl Floats { } clearance } + + pub fn is_present(&self) -> bool { + self.list.is_present() + } } /// The speculated inline sizes of floats flowing through or around a flow (depending on whether diff --git a/components/layout/model.rs b/components/layout/model.rs index 7bb4cf23cbe..ac592bb4139 100644 --- a/components/layout/model.rs +++ b/components/layout/model.rs @@ -18,7 +18,7 @@ use style::values::computed::{BorderRadiusSize, LengthOrPercentageOrAuto}; use style::values::computed::{LengthOrPercentage, LengthOrPercentageOrNone}; /// A collapsible margin. See CSS 2.1 § 8.3.1. -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug)] pub struct AdjoiningMargins { /// The value of the greatest positive margin. pub most_positive: Au, @@ -61,7 +61,7 @@ impl AdjoiningMargins { } /// Represents the block-start and block-end margins of a flow with collapsible margins. See CSS 2.1 § 8.3.1. -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug)] pub enum CollapsibleMargins { /// Margins may not collapse with this flow. None(Au, Au), @@ -169,12 +169,14 @@ impl MarginCollapseInfo { FinalMarginState::MarginsCollapseThrough => { let advance = self.block_start_margin.collapse(); self.margin_in.union(AdjoiningMargins::from_margin(block_end_margin)); - (CollapsibleMargins::Collapse(self.block_start_margin, self.margin_in), advance) + (CollapsibleMargins::Collapse(self.block_start_margin, self.margin_in), + advance) } FinalMarginState::BottomMarginCollapses => { let advance = self.margin_in.collapse(); self.margin_in.union(AdjoiningMargins::from_margin(block_end_margin)); - (CollapsibleMargins::Collapse(self.block_start_margin, self.margin_in), advance) + (CollapsibleMargins::Collapse(self.block_start_margin, self.margin_in), + advance) } } } else { @@ -206,8 +208,14 @@ 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) + pub fn advance_block_start_margin(&mut self, + child_collapsible_margins: &CollapsibleMargins, + can_collapse_block_start_margin: bool) -> Au { + if !can_collapse_block_start_margin { + self.state = MarginCollapseState::AccumulatingMarginIn + } + match (self.state, *child_collapsible_margins) { (MarginCollapseState::AccumulatingCollapsibleTopMargin, CollapsibleMargins::None(block_start, _)) => { @@ -226,14 +234,16 @@ impl MarginCollapseInfo { self.margin_in = AdjoiningMargins::new(); previous_margin_value + block_start } - (MarginCollapseState::AccumulatingMarginIn, CollapsibleMargins::Collapse(block_start, _)) => { + (MarginCollapseState::AccumulatingMarginIn, + CollapsibleMargins::Collapse(block_start, _)) => { self.margin_in.union(block_start); let margin_value = self.margin_in.collapse(); self.margin_in = AdjoiningMargins::new(); margin_value } (_, CollapsibleMargins::CollapseThrough(_)) => { - // For now, we ignore this; this will be handled by `advance_block-end_margin` below. + // For now, we ignore this; this will be handled by `advance_block_end_margin` + // below. Au(0) } } @@ -274,9 +284,11 @@ impl MarginCollapseInfo { } } -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug)] pub enum MarginCollapseState { + /// We are accumulating margin on the logical top of this flow. AccumulatingCollapsibleTopMargin, + /// We are accumulating margin between two blocks. AccumulatingMarginIn, } diff --git a/tests/wpt/css-tests/css21_dev/html4/margin-collapse-018.htm b/tests/wpt/css-tests/css21_dev/html4/margin-collapse-018.htm index 54628a0f05a..48df2b5173e 100644 --- a/tests/wpt/css-tests/css21_dev/html4/margin-collapse-018.htm +++ b/tests/wpt/css-tests/css21_dev/html4/margin-collapse-018.htm @@ -51,4 +51,4 @@
- \ No newline at end of file + diff --git a/tests/wpt/metadata-css/css-flexbox-1_dev/html/Flexible-order.htm.ini b/tests/wpt/metadata-css/css-flexbox-1_dev/html/Flexible-order.htm.ini deleted file mode 100644 index 06733df63a9..00000000000 --- a/tests/wpt/metadata-css/css-flexbox-1_dev/html/Flexible-order.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[Flexible-order.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/adjacent-floats-001.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/adjacent-floats-001.htm.ini deleted file mode 100644 index 751675d3649..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/adjacent-floats-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[adjacent-floats-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/bidi-010b.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/bidi-010b.htm.ini new file mode 100644 index 00000000000..b92db65df74 --- /dev/null +++ b/tests/wpt/metadata-css/css21_dev/html4/bidi-010b.htm.ini @@ -0,0 +1,4 @@ +[bidi-010b.htm] + type: reftest + disabled: intermittent failure on reference, starting from PR #10458 + diff --git a/tests/wpt/metadata-css/css21_dev/html4/border-right-color-175.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/border-right-color-175.htm.ini deleted file mode 100644 index e01f3c411c0..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/border-right-color-175.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[border-right-color-175.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-002.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-002.htm.ini deleted file mode 100644 index 289f7e06307..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[c414-flt-fit-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-003.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-003.htm.ini deleted file mode 100644 index 8fb87cde40d..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-003.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[c414-flt-fit-003.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-004.htm.ini deleted file mode 100644 index 8f885773830..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-004.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[c414-flt-fit-004.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-005.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-005.htm.ini deleted file mode 100644 index 537ca9e2134..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-005.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[c414-flt-fit-005.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-006.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-006.htm.ini deleted file mode 100644 index b394bb4053d..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/c414-flt-fit-006.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[c414-flt-fit-006.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-002.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-002.htm.ini deleted file mode 100644 index 5d1ffb0b92a..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-004.htm.ini deleted file mode 100644 index b47387c5b20..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-004.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-004.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-005.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-005.htm.ini deleted file mode 100644 index e79aa05629b..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-005.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-005.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-006.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-006.htm.ini deleted file mode 100644 index 9cda771c766..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-006.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-006.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-007.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-007.htm.ini deleted file mode 100644 index be0abf967f9..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-007.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-007.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-008.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-008.htm.ini deleted file mode 100644 index c38ed2c231d..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-008.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-008.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/clear-float-009.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/clear-float-009.htm.ini deleted file mode 100644 index 535fccfe97d..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/clear-float-009.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[clear-float-009.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-006.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-006.htm.ini deleted file mode 100644 index 751a06666cd..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-006.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-006.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-009.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-009.htm.ini deleted file mode 100644 index b5f424ebc66..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-009.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-009.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-012.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-012.htm.ini deleted file mode 100644 index ab19deefdfd..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-012.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-012.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-non-replaced-height-001.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-non-replaced-height-001.htm.ini deleted file mode 100644 index b1c53396ecc..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-non-replaced-height-001.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-non-replaced-height-001.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-003.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-003.htm.ini deleted file mode 100644 index bb50a94124b..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-003.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-003.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-004.htm.ini deleted file mode 100644 index 1301be2990a..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-004.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-004.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-123.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-123.htm.ini deleted file mode 100644 index 5006229f2c5..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-123.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-123.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-141.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-141.htm.ini deleted file mode 100644 index 6b5cd007313..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-141.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-141.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-144.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-144.htm.ini deleted file mode 100644 index 65993a416e3..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-144.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-144.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-145.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-145.htm.ini index 17b0779acd5..0e215dc3026 100644 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-145.htm.ini +++ b/tests/wpt/metadata-css/css21_dev/html4/floats-145.htm.ini @@ -1,3 +1,3 @@ [floats-145.htm] type: reftest - expected: FAIL + disabled: depends on unspecified line-height behavior, see PR #10458 diff --git a/tests/wpt/metadata-css/css21_dev/html4/floats-146.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-146.htm.ini deleted file mode 100644 index 2d37eaf361e..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/floats-146.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[floats-146.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/position-absolute-007.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/position-absolute-007.htm.ini deleted file mode 100644 index cb0a84bc39c..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/position-absolute-007.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[position-absolute-007.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/mozilla/meta/MANIFEST.json b/tests/wpt/mozilla/meta/MANIFEST.json index 3a382bae04b..69c05eaecdc 100644 --- a/tests/wpt/mozilla/meta/MANIFEST.json +++ b/tests/wpt/mozilla/meta/MANIFEST.json @@ -1571,6 +1571,30 @@ "url": "/_mozilla/css/floated_table_with_margin_a.html" } ], + "css/floats_margin_collapse_a.html": [ + { + "path": "css/floats_margin_collapse_a.html", + "references": [ + [ + "/_mozilla/css/floats_margin_collapse_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/floats_margin_collapse_a.html" + } + ], + "css/floats_margin_collapse_with_clearance_a.html": [ + { + "path": "css/floats_margin_collapse_with_clearance_a.html", + "references": [ + [ + "/_mozilla/css/floats_margin_collapse_with_clearance_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/floats_margin_collapse_with_clearance_a.html" + } + ], "css/focus_selector.html": [ { "path": "css/focus_selector.html", @@ -8161,6 +8185,30 @@ "url": "/_mozilla/css/floated_table_with_margin_a.html" } ], + "css/floats_margin_collapse_a.html": [ + { + "path": "css/floats_margin_collapse_a.html", + "references": [ + [ + "/_mozilla/css/floats_margin_collapse_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/floats_margin_collapse_a.html" + } + ], + "css/floats_margin_collapse_with_clearance_a.html": [ + { + "path": "css/floats_margin_collapse_with_clearance_a.html", + "references": [ + [ + "/_mozilla/css/floats_margin_collapse_with_clearance_ref.html", + "==" + ] + ], + "url": "/_mozilla/css/floats_margin_collapse_with_clearance_a.html" + } + ], "css/focus_selector.html": [ { "path": "css/focus_selector.html", diff --git a/tests/wpt/mozilla/tests/css/floats_margin_collapse_a.html b/tests/wpt/mozilla/tests/css/floats_margin_collapse_a.html new file mode 100644 index 00000000000..06d0b6a386b --- /dev/null +++ b/tests/wpt/mozilla/tests/css/floats_margin_collapse_a.html @@ -0,0 +1,42 @@ + + + + + +
+
+ diff --git a/tests/wpt/mozilla/tests/css/floats_margin_collapse_ref.html b/tests/wpt/mozilla/tests/css/floats_margin_collapse_ref.html new file mode 100644 index 00000000000..164370a58f7 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/floats_margin_collapse_ref.html @@ -0,0 +1,19 @@ + + + +
+ diff --git a/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_a.html b/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_a.html new file mode 100644 index 00000000000..a2745f796cf --- /dev/null +++ b/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_a.html @@ -0,0 +1,45 @@ + + + + + + +
+
+ + diff --git a/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_ref.html b/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_ref.html new file mode 100644 index 00000000000..58fb43b5105 --- /dev/null +++ b/tests/wpt/mozilla/tests/css/floats_margin_collapse_with_clearance_ref.html @@ -0,0 +1,25 @@ + + + +
+
+ +