diff options
-rw-r--r-- | components/layout/block.rs | 21 | ||||
-rw-r--r-- | tests/ref/basic.list | 1 | ||||
-rw-r--r-- | tests/ref/block_formatting_context_cleared_float_a.html | 28 | ||||
-rw-r--r-- | tests/ref/block_formatting_context_cleared_float_ref.html | 27 |
4 files changed, 67 insertions, 10 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs index 980bf6b5204..24eac4f48ea 100644 --- a/components/layout/block.rs +++ b/components/layout/block.rs @@ -1313,6 +1313,17 @@ impl BlockFlow { kid_base.fixed_static_i_offset = fixed_static_i_offset; } + // Determine float impaction, and update the inline size speculations if necessary. + if flow::base(kid).flags.contains(CLEARS_LEFT) { + inline_start_floats_impact_child = false; + inline_size_of_preceding_left_floats = Au(0); + } + if flow::base(kid).flags.contains(CLEARS_RIGHT) { + inline_end_floats_impact_child = false; + inline_size_of_preceding_right_floats = Au(0); + } + + // Update the speculated inline size if this child is floated. match flow::base(kid).flags.float_kind() { float::T::none => {} float::T::left => { @@ -1353,16 +1364,6 @@ impl BlockFlow { } } - // Determine float impaction. - if flow::base(kid).flags.contains(CLEARS_LEFT) { - inline_start_floats_impact_child = false; - inline_size_of_preceding_left_floats = Au(0); - } - if flow::base(kid).flags.contains(CLEARS_RIGHT) { - inline_end_floats_impact_child = false; - inline_size_of_preceding_right_floats = Au(0); - } - { let kid_base = flow::mut_base(kid); inline_start_floats_impact_child = inline_start_floats_impact_child || diff --git a/tests/ref/basic.list b/tests/ref/basic.list index fa364d85237..1d814a10e87 100644 --- a/tests/ref/basic.list +++ b/tests/ref/basic.list @@ -50,6 +50,7 @@ flaky_cpu == append_style_a.html append_style_b.html == background_style_attr.html background_ref.html == basic_width_px.html basic_width_em.html == block_formatting_context_a.html block_formatting_context_ref.html +== block_formatting_context_cleared_float_a.html block_formatting_context_cleared_float_ref.html == block_formatting_context_complex_a.html block_formatting_context_complex_ref.html == block_formatting_context_containing_floats_a.html block_formatting_context_containing_floats_ref.html == block_formatting_context_relative_a.html block_formatting_context_ref.html diff --git a/tests/ref/block_formatting_context_cleared_float_a.html b/tests/ref/block_formatting_context_cleared_float_a.html new file mode 100644 index 00000000000..495a09cc119 --- /dev/null +++ b/tests/ref/block_formatting_context_cleared_float_a.html @@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<!-- + Tests that block formatting context inline-size speculation works when the floats that impact + the block formatting context are cleared. +--> +<style> +#a { + background: silver; + height: 150px; + width: 150px; + float: right; + clear: right; +} +#b { + background: goldenrod; + height: 300px; + overflow: hidden; +} +</style> +</head> +<body> +<div id=a></div> +<div id=b></div> +</body> +</html> + diff --git a/tests/ref/block_formatting_context_cleared_float_ref.html b/tests/ref/block_formatting_context_cleared_float_ref.html new file mode 100644 index 00000000000..88408a8e8d4 --- /dev/null +++ b/tests/ref/block_formatting_context_cleared_float_ref.html @@ -0,0 +1,27 @@ +<!DOCTYPE html> +<html> +<head> +<!-- + Tests that block formatting context inline-size speculation works when the floats that impact + the block formatting context are cleared. +--> +<style> +#a { + background: silver; + height: 150px; + width: 150px; + float: right; +} +#b { + background: goldenrod; + height: 300px; + overflow: hidden; +} +</style> +</head> +<body> +<div id=a></div> +<div id=b></div> +</body> +</html> + |