From 2d5833d3afbff09218f6e0396afba1dcec41e174 Mon Sep 17 00:00:00 2001 From: Keith Yeung Date: Mon, 24 Apr 2017 03:31:40 -0700 Subject: [PATCH] Fix fixed table layout column width distribution --- components/layout/table.rs | 85 ++++++++++--------- .../html4/float-applies-to-001a.htm.ini | 3 - .../html4/float-applies-to-002.htm.ini | 3 - .../html4/float-applies-to-003.htm.ini | 3 - .../html4/float-applies-to-004.htm.ini | 3 - .../html4/float-applies-to-004a.htm.ini | 3 - .../html4/float-applies-to-005.htm.ini | 3 - .../html4/float-applies-to-006.htm.ini | 3 - ...lies-to-001.htm.ini => floats-149.htm.ini} | 2 +- 9 files changed, 45 insertions(+), 63 deletions(-) delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001a.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-002.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-003.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004a.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-005.htm.ini delete mode 100644 tests/wpt/metadata-css/css21_dev/html4/float-applies-to-006.htm.ini rename tests/wpt/metadata-css/css21_dev/html4/{float-applies-to-001.htm.ini => floats-149.htm.ini} (55%) diff --git a/components/layout/table.rs b/components/layout/table.rs index e45fd7ca8c2..b130b62bd04 100644 --- a/components/layout/table.rs +++ b/components/layout/table.rs @@ -352,20 +352,16 @@ impl Flow for TableFlow { let shared_context = layout_context.shared_context(); // The position was set to the containing block by the flow's parent. + // FIXME: The code for distributing column widths should really be placed under table_wrapper.rs. let containing_block_inline_size = self.block_flow.base.block_container_inline_size; - let mut num_unspecified_inline_sizes = 0; - let mut num_percentage_inline_sizes = 0; - let mut total_column_inline_size = Au(0); - let mut total_column_percentage_size = 0.0; - for column_inline_size in &self.column_intrinsic_inline_sizes { - if column_inline_size.percentage != 0.0 { - total_column_percentage_size += column_inline_size.percentage; - num_percentage_inline_sizes += 1; - } else if column_inline_size.constrained { - total_column_inline_size += column_inline_size.minimum_length; - } else { - num_unspecified_inline_sizes += 1; + let mut constrained_column_inline_sizes_indices = vec![]; + let mut unspecified_inline_sizes_indices = vec![]; + for (idx, column_inline_size) in self.column_intrinsic_inline_sizes.iter().enumerate() { + if column_inline_size.constrained { + constrained_column_inline_sizes_indices.push(idx); + } else if column_inline_size.percentage == 0.0 { + unspecified_inline_sizes_indices.push(idx); } } @@ -383,43 +379,50 @@ impl Flow for TableFlow { let total_horizontal_spacing = self.total_horizontal_spacing(); let content_inline_size = self.block_flow.fragment.border_box.size.inline - padding_and_borders - total_horizontal_spacing; + let mut remaining_inline_size = content_inline_size; match self.table_layout { TableLayout::Fixed => { - // In fixed table layout, we distribute extra space among the unspecified columns - // if there are any, or among all the columns if all are specified. - // See: https://drafts.csswg.org/css-tables-3/#distributing-width-to-columns - // (infobox) self.column_computed_inline_sizes.clear(); - if num_unspecified_inline_sizes != 0 { - let extra_column_inline_size = content_inline_size - total_column_inline_size; - for column_inline_size in &self.column_intrinsic_inline_sizes { - if !column_inline_size.constrained { - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: extra_column_inline_size / num_unspecified_inline_sizes, - }); - } else { - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: column_inline_size.minimum_length, - }); - } - } - } else if num_percentage_inline_sizes != 0 { - let extra_column_inline_size = content_inline_size - total_column_inline_size; - let ratio = content_inline_size.to_f32_px() / - total_column_percentage_size; - for column_inline_size in &self.column_intrinsic_inline_sizes { + + // https://drafts.csswg.org/css2/tables.html#fixed-table-layout + for column_inline_size in &self.column_intrinsic_inline_sizes { + if column_inline_size.constrained { self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: extra_column_inline_size.scale_by(ratio * column_inline_size.percentage), + size: column_inline_size.minimum_length, }); + remaining_inline_size -= column_inline_size.minimum_length; + } else if column_inline_size.percentage != 0.0 { + let size = remaining_inline_size.scale_by(column_inline_size.percentage); + self.column_computed_inline_sizes.push(ColumnComputedInlineSize { + size: size, + }); + remaining_inline_size -= size; + } else { + // Set the size to 0 now, distribute the remaining widths later + self.column_computed_inline_sizes.push(ColumnComputedInlineSize { + size: Au(0), + }); + } + } + + // Distribute remaining content inline size + if unspecified_inline_sizes_indices.len() > 0 { + for &index in &unspecified_inline_sizes_indices { + self.column_computed_inline_sizes[index].size = + remaining_inline_size.scale_by(1.0 / unspecified_inline_sizes_indices.len() as f32); } } else { - let ratio = content_inline_size.to_f32_px() / - total_column_inline_size.to_f32_px(); - for column_inline_size in &self.column_intrinsic_inline_sizes { - self.column_computed_inline_sizes.push(ColumnComputedInlineSize { - size: column_inline_size.minimum_length.scale_by(ratio), - }); + let total_minimum_size = self.column_intrinsic_inline_sizes + .iter() + .filter(|size| size.constrained) + .map(|size| size.minimum_length.0 as f32) + .sum::(); + + for &index in &constrained_column_inline_sizes_indices { + self.column_computed_inline_sizes[index].size += + remaining_inline_size.scale_by( + self.column_computed_inline_sizes[index].size.0 as f32 / total_minimum_size); } } } diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001a.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001a.htm.ini deleted file mode 100644 index bdf95812166..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001a.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-001a.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-002.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-002.htm.ini deleted file mode 100644 index 864fb0ecb60..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-002.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-002.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-003.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-003.htm.ini deleted file mode 100644 index 0651d31285a..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-003.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-003.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004.htm.ini deleted file mode 100644 index 14ba0700266..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-004.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004a.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004a.htm.ini deleted file mode 100644 index 2ee3706b612..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-004a.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-004a.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-005.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-005.htm.ini deleted file mode 100644 index 099b6991aa5..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-005.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-005.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-006.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-006.htm.ini deleted file mode 100644 index 9f8363b9f52..00000000000 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-006.htm.ini +++ /dev/null @@ -1,3 +0,0 @@ -[float-applies-to-006.htm] - type: reftest - expected: FAIL diff --git a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001.htm.ini b/tests/wpt/metadata-css/css21_dev/html4/floats-149.htm.ini similarity index 55% rename from tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001.htm.ini rename to tests/wpt/metadata-css/css21_dev/html4/floats-149.htm.ini index cfd50607bfa..28383a7707b 100644 --- a/tests/wpt/metadata-css/css21_dev/html4/float-applies-to-001.htm.ini +++ b/tests/wpt/metadata-css/css21_dev/html4/floats-149.htm.ini @@ -1,3 +1,3 @@ -[float-applies-to-001.htm] +[floats-149.htm] type: reftest expected: FAIL