diff options
4 files changed, 49 insertions, 4 deletions
diff --git a/components/layout_2020/flow/float.rs b/components/layout_2020/flow/float.rs index 784c5d62722..0ac6529278a 100644 --- a/components/layout_2020/flow/float.rs +++ b/components/layout_2020/flow/float.rs @@ -25,7 +25,7 @@ use std::{f32, mem}; use style::computed_values::clear::T as ClearProperty; use style::computed_values::float::T as FloatProperty; use style::properties::ComputedValues; -use style::values::computed::Length; +use style::values::computed::{CSSPixelLength, Length}; use style::values::specified::text::TextDecorationLine; /// A floating box. @@ -191,14 +191,22 @@ impl FloatContext { /// Places a new float and adds it to the list. Returns the start corner of its margin box. pub fn add_float(&mut self, new_float: &PlacementInfo) -> Vec2<Length> { // Place the float. - let new_float_origin = self.place_object(new_float); + let new_float_origin = self.place_object(&new_float); let new_float_extent = match new_float.side { FloatSide::Left => new_float_origin.inline + new_float.size.inline, FloatSide::Right => new_float_origin.inline, }; + let new_float_rect = Rect { start_corner: new_float_origin, - size: new_float.size.clone(), + // If this float has a negative margin, we should only consider its non-negative + // block size contribution when determing where to place it. When the margin is + // so negative that it's placed completely above the current float ceiling, then + // we should position it as if it had zero block size. + size: Vec2 { + inline: new_float.size.inline.max(CSSPixelLength::zero()), + block: new_float.size.block.max(CSSPixelLength::zero()), + }, }; // Update clear. @@ -759,7 +767,6 @@ impl FloatBox { .make_fragments(&replaced.style, content_size.clone()); }, }; - let margin_box_start_corner = float_context.add_float(&PlacementInfo { size: &content_size + &pbm_sums.sum(), side: FloatSide::from_style(&style).expect("Float box wasn't floated!"), diff --git a/tests/wpt/metadata/MANIFEST.json b/tests/wpt/metadata/MANIFEST.json index b9f1e10f2eb..11b98518104 100644 --- a/tests/wpt/metadata/MANIFEST.json +++ b/tests/wpt/metadata/MANIFEST.json @@ -60677,6 +60677,19 @@ {} ] ], + "negative-block-margin-pushing-float-out-of-block-formatting-context.html": [ + "0ebe54c1904e0c2487ebe15c4d60e9e93672d859", + [ + null, + [ + [ + "/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html", + "==" + ] + ], + {} + ] + ], "negative-margin-float-positioning.html": [ "8b4aef22f71f8695ebbc5b6dc83ad5639945618d", [ @@ -359622,6 +359635,10 @@ "68139cdbe2d7c998b6d948f5ecca0ed7ce367694", [] ], + "negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html": [ + "09a0ed094f8eb82f9fa25c4f09bb3f8a1f79c4c9", + [] + ], "overflow-scroll-float-paint-order-ref.html": [ "0fb53d4ecd3cd77e6588be0b271a2ee47950bd29", [] diff --git a/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html b/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html new file mode 100644 index 00000000000..09a0ed094f8 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html @@ -0,0 +1,8 @@ +<!DOCTYPE html> + +<link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com" /> +<meta name="assert" content="When a floating box has a negative margin negative enough that it pushes the float past the top of the block formatting context, it should render properly."/> + +<body> +<div style="width: 50px; height: 50px; background: green;"></div> +</body> diff --git a/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context.html b/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context.html new file mode 100644 index 00000000000..0ebe54c1904 --- /dev/null +++ b/tests/wpt/web-platform-tests/css/CSS2/floats/negative-block-margin-pushing-float-out-of-block-formatting-context.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> + +<link rel="author" title="Martin Robinson" href="mailto:mrobinson@igalia.com" /> +<link rel="help" href="https://drafts.csswg.org/css2/#float-position"/> +<meta name="assert" content="When a floating box has a negative margin negative enough that it pushes the float past the top of the block formatting context, it should render properly."/> +<link rel="match" href="negative-block-margin-pushing-float-out-of-block-formatting-context-ref.html"/> + +<body> +<div style="height: 100px;"></div> +<div style="position: absolute;"> + <div style="float: left; width: 50px; height: 50px; margin-top: -100px; background: green;"></div> +</div> +</body> |