From 2c2c60e44d7bb3b00a27f17745965703026e8d81 Mon Sep 17 00:00:00 2001 From: Pu Xingyu Date: Sat, 6 Aug 2016 21:31:37 +0800 Subject: [PATCH] layout: Freeze flex item properly Fix the currently logic that a item will freeze if it should grow(shrink) and its basesize is less(more) than its min(max) size. Also fix the divide by zero error when an item should shrink but it has zero length and zero min size. --- components/layout/flex.rs | 7 +++---- .../html/flexbox-flex-wrap-flexing.htm.ini | 3 --- .../html/flexbox_computedstyle_min-width-auto.htm.ini | 3 ++- 3 files changed, 5 insertions(+), 8 deletions(-) delete mode 100644 tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox-flex-wrap-flexing.htm.ini diff --git a/components/layout/flex.rs b/components/layout/flex.rs index f591f023f04..64cc24a0746 100644 --- a/components/layout/flex.rs +++ b/components/layout/flex.rs @@ -276,9 +276,8 @@ impl FlexLine { // https://drafts.csswg.org/css-flexbox/#resolve-flexible-lengths for item in items.iter_mut().filter(|i| !(i.is_strut && collapse)) { item.main_size = max(item.min_size, min(item.base_size, item.max_size)); - if item.main_size != item.base_size - || (self.free_space > Au(0) && item.flex_grow == 0.0) - || (self.free_space < Au(0) && item.flex_shrink == 0.0) { + if (self.free_space > Au(0) && (item.flex_grow == 0.0 || item.base_size >= item.max_size)) || + (self.free_space < Au(0) && (item.flex_shrink == 0.0 || item.base_size <= item.min_size)) { item.is_frozen = true; } else { item.is_frozen = false; @@ -311,7 +310,7 @@ impl FlexLine { (item.flex_shrink * item.base_size.0 as f32 / total_scaled, item.min_size) }; let variation = self.free_space.scale_by(factor); - if variation.0.abs() > (end_size - item.main_size).0.abs() { + if variation.0.abs() >= (end_size - item.main_size).0.abs() { // Use constraint as the target main size, and freeze item. total_variation += end_size - item.main_size; item.main_size = end_size; diff --git a/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox-flex-wrap-flexing.htm.ini b/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox-flex-wrap-flexing.htm.ini deleted file mode 100644 index f308bc34697..00000000000 --- a/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox-flex-wrap-flexing.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[flexbox-flex-wrap-flexing.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox_computedstyle_min-width-auto.htm.ini b/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox_computedstyle_min-width-auto.htm.ini index c37a3dee6e6..914e6b9e418 100644 --- a/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox_computedstyle_min-width-auto.htm.ini +++ b/tests/wpt/metadata-css/css-flexbox-1_dev/html/flexbox_computedstyle_min-width-auto.htm.ini @@ -1,4 +1,5 @@ [flexbox_computedstyle_min-width-auto.htm] type: testharness - expected: TIMEOUT + [flexbox | computed style | min-width: auto] + expected: FAIL