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 f591f023f043..64cc24a0746d 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 f308bc346972..000000000000 --- 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 c37a3dee6e60..914e6b9e4185 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