From 3289e7d84dd6d905099d99751781a66da55fe04e Mon Sep 17 00:00:00 2001 From: Martin Robinson Date: Tue, 5 Nov 2024 14:32:34 +0100 Subject: [PATCH] layout: Properly calculate free space in flexbox flexible length resolution (#34150) Previously, when there were no more violations, the returned value for line free space was incorrect for flexible length resolution. It was returning the container main space minus the inner length of each item. Free space is determined by the outer length though. Fix this by reusing the `free_space()` function, but with an argument indicating that all items are now frozen. Fixes #34079. Signed-off-by: Martin Robinson --- components/layout_2020/flexbox/layout.rs | 11 +++++------ .../wpt/meta/css/css-flexbox/flex-flow-013.html.ini | 12 ------------ .../flexbox-basic-canvas-horiz-001.xhtml.ini | 2 -- .../flexbox-basic-canvas-horiz-001v.xhtml.ini | 2 -- .../flexbox-basic-canvas-vert-001.xhtml.ini | 2 -- .../flexbox-basic-canvas-vert-001v.xhtml.ini | 2 -- .../flexbox-basic-fieldset-horiz-001.xhtml.ini | 2 -- .../flexbox-basic-fieldset-vert-001.xhtml.ini | 2 -- .../flexbox-basic-iframe-horiz-001.xhtml.ini | 2 -- .../flexbox-basic-iframe-vert-001.xhtml.ini | 2 -- .../flexbox-basic-img-horiz-001.xhtml.ini | 2 -- .../css-flexbox/flexbox-basic-img-vert-001.xhtml.ini | 2 -- .../flexbox-basic-textarea-horiz-001.xhtml.ini | 2 -- .../flexbox-basic-textarea-vert-001.xhtml.ini | 2 -- .../flexbox-basic-video-horiz-001.xhtml.ini | 2 -- .../flexbox-basic-video-vert-001.xhtml.ini | 2 -- 16 files changed, 5 insertions(+), 46 deletions(-) delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001v.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001v.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-vert-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-vert-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-img-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-img-vert-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-vert-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-video-horiz-001.xhtml.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/flexbox-basic-video-vert-001.xhtml.ini diff --git a/components/layout_2020/flexbox/layout.rs b/components/layout_2020/flexbox/layout.rs index d107ec78bfb..5adf9c912f0 100644 --- a/components/layout_2020/flexbox/layout.rs +++ b/components/layout_2020/flexbox/layout.rs @@ -1416,12 +1416,12 @@ impl InitialFlexLineLayout<'_> { } let check_for_flexible_items = || frozen_count.get() < items.len(); - let free_space = || { + let free_space = |all_items_frozen: bool| { container_main_size - items_and_main_sizes() .map(|((item, target_main_size), frozen)| { item.pbm_auto_is_zero.main + - if frozen.get() { + if all_items_frozen || frozen.get() { target_main_size.get() } else { item.flex_base_size @@ -1430,7 +1430,7 @@ impl InitialFlexLineLayout<'_> { .sum() }; // https://drafts.csswg.org/css-flexbox/#initial-free-space - let initial_free_space = free_space(); + let initial_free_space = free_space(false); let unfrozen_items = || { items_and_main_sizes().filter_map(|(item_and_target_main_size, frozen)| { if !frozen.get() { @@ -1442,7 +1442,7 @@ impl InitialFlexLineLayout<'_> { }; loop { // https://drafts.csswg.org/css-flexbox/#remaining-free-space - let mut remaining_free_space = free_space(); + let mut remaining_free_space = free_space(false); if !check_for_flexible_items() { return (target_main_sizes_vec, remaining_free_space); } @@ -1504,8 +1504,7 @@ impl InitialFlexLineLayout<'_> { Ordering::Equal => { // “Freeze all items.” // Return instead, as that’s what the next loop iteration would do. - let remaining_free_space = - container_main_size - target_main_sizes_vec.iter().cloned().sum(); + let remaining_free_space = free_space(true); return (target_main_sizes_vec, remaining_free_space); }, Ordering::Greater => { diff --git a/tests/wpt/meta/css/css-flexbox/flex-flow-013.html.ini b/tests/wpt/meta/css/css-flexbox/flex-flow-013.html.ini index f42a2a0010d..60c9c874e55 100644 --- a/tests/wpt/meta/css/css-flexbox/flex-flow-013.html.ini +++ b/tests/wpt/meta/css/css-flexbox/flex-flow-013.html.ini @@ -5,18 +5,6 @@ [.flexbox 11] expected: FAIL - [.flexbox 4] - expected: FAIL - - [.flexbox 2] - expected: FAIL - - [.flexbox 1] - expected: FAIL - - [.flexbox 3] - expected: FAIL - [.flexbox 9] expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001.xhtml.ini deleted file mode 100644 index 33508636edf..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-canvas-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001v.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001v.xhtml.ini deleted file mode 100644 index c33eb69f9e9..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-horiz-001v.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-canvas-horiz-001v.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001.xhtml.ini deleted file mode 100644 index 50da74a7d55..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-canvas-vert-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001v.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001v.xhtml.ini deleted file mode 100644 index 33cdfcd51ee..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-canvas-vert-001v.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-canvas-vert-001v.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-horiz-001.xhtml.ini deleted file mode 100644 index ab01e596fb6..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-fieldset-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-vert-001.xhtml.ini deleted file mode 100644 index bdb738da04e..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-fieldset-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-fieldset-vert-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-horiz-001.xhtml.ini deleted file mode 100644 index 36cc12e570c..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-iframe-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-vert-001.xhtml.ini deleted file mode 100644 index 98e1aadf6ea..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-iframe-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-iframe-vert-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-horiz-001.xhtml.ini deleted file mode 100644 index b81dc136ed2..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-img-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-vert-001.xhtml.ini deleted file mode 100644 index 8d2aa03e0d7..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-img-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-img-vert-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-horiz-001.xhtml.ini deleted file mode 100644 index fcbae31856f..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-textarea-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-vert-001.xhtml.ini deleted file mode 100644 index 6209fc1effc..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-textarea-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-textarea-vert-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-horiz-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-horiz-001.xhtml.ini deleted file mode 100644 index 228a9d52f61..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-horiz-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-video-horiz-001.xhtml] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-vert-001.xhtml.ini b/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-vert-001.xhtml.ini deleted file mode 100644 index 78a712924f5..00000000000 --- a/tests/wpt/meta/css/css-flexbox/flexbox-basic-video-vert-001.xhtml.ini +++ /dev/null @@ -1,2 +0,0 @@ -[flexbox-basic-video-vert-001.xhtml] - expected: FAIL