Account for percentages in fixed table layout

Fixes #13166
This commit is contained in:
Michael Howell 2016-09-06 22:04:26 -07:00
parent 72279cc7eb
commit 070bb7ff58

View file

@ -335,13 +335,17 @@ impl Flow for TableFlow {
let containing_block_inline_size = self.block_flow.base.block_container_inline_size; let containing_block_inline_size = self.block_flow.base.block_container_inline_size;
let mut num_unspecified_inline_sizes = 0; 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_inline_size = Au(0);
let mut total_column_percentage_size = 0.0;
for column_inline_size in &self.column_intrinsic_inline_sizes { for column_inline_size in &self.column_intrinsic_inline_sizes {
if column_inline_size.constrained { if column_inline_size.percentage != 0.0 {
total_column_inline_size = total_column_inline_size + total_column_percentage_size += column_inline_size.percentage;
column_inline_size.minimum_length num_percentage_inline_sizes += 1;
} else if column_inline_size.constrained {
total_column_inline_size += column_inline_size.minimum_length;
} else { } else {
num_unspecified_inline_sizes += 1 num_unspecified_inline_sizes += 1;
} }
} }
@ -364,20 +368,12 @@ impl Flow for TableFlow {
TableLayout::Fixed => { TableLayout::Fixed => {
// In fixed table layout, we distribute extra space among the unspecified columns // 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. // 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(); self.column_computed_inline_sizes.clear();
if num_unspecified_inline_sizes == 0 { if num_unspecified_inline_sizes != 0 {
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),
});
}
} else if num_unspecified_inline_sizes != 0 {
let extra_column_inline_size = content_inline_size - total_column_inline_size; let extra_column_inline_size = content_inline_size - total_column_inline_size;
for column_inline_size in &self.column_intrinsic_inline_sizes { for column_inline_size in &self.column_intrinsic_inline_sizes {
if !column_inline_size.constrained && if !column_inline_size.constrained {
column_inline_size.percentage == 0.0 {
self.column_computed_inline_sizes.push(ColumnComputedInlineSize { self.column_computed_inline_sizes.push(ColumnComputedInlineSize {
size: extra_column_inline_size / num_unspecified_inline_sizes, size: extra_column_inline_size / num_unspecified_inline_sizes,
}); });
@ -387,6 +383,23 @@ impl Flow for TableFlow {
}); });
} }
} }
} 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 {
self.column_computed_inline_sizes.push(ColumnComputedInlineSize {
size: extra_column_inline_size.scale_by(ratio * column_inline_size.percentage),
});
}
} 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),
});
}
} }
} }
_ => { _ => {