LibWeb: Distribute cell contribution to all spanned columns

The specification isn't explicit about it, but the contribution we
compute should be distributed to all columns, not just the first one.

The first reason for it is symmetry, it doesn't make sense for the
increased width of the spanning column to only affect the first column
in the span.

The second reason is the formula for the cell contribution, which is
weighted by the non-spanning width of the cell relative to the total
width of the columns in the same row. This only covers a fraction of the
gap, in order to fully cover it we have to add it to all columns in the
span. For this to be exactly the case when the columns don't all have
the same width, we'd have to add additional weighting based on the width
ratios, but given that the specification doesn't suggest it at all we'll
leave it out for now.
This commit is contained in:
Andi Gallo 2023-06-10 01:21:10 +00:00 committed by Andreas Kling
parent 50df78d2a2
commit 4d49852454
2 changed files with 15 additions and 11 deletions

View file

@ -5,12 +5,12 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
BlockContainer <body> at (8,8) content-size 784x44.9375 children: not-inline
BlockContainer <(anonymous)> at (8,8) content-size 784x0 children: inline
TextNode <#text>
TableWrapper <(anonymous)> at (8,8) content-size 32.904952x44.9375 [BFC] children: not-inline
Box <table> at (9,9) content-size 32.904952x42.9375 table-box [TFC] children: not-inline
TableWrapper <(anonymous)> at (8,8) content-size 41.122404x44.9375 [BFC] children: not-inline
Box <table> at (9,9) content-size 41.122404x42.9375 table-box [TFC] children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
Box <tbody> at (9,9) content-size 34.904952x42.9375 table-row-group children: not-inline
Box <tr> at (9,9) content-size 34.904952x21.46875 table-row children: not-inline
Box <tbody> at (9,9) content-size 43.122404x42.9375 table-row-group children: not-inline
Box <tr> at (9,9) content-size 43.122404x21.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (11,11) content-size 17.561202x17.46875 table-cell [BFC] children: inline
@ -20,21 +20,21 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (32.561202,11) content-size 9.34375x17.46875 table-cell [BFC] children: inline
BlockContainer <td> at (32.561202,11) content-size 17.561202x17.46875 table-cell [BFC] children: inline
line 0 width: 9.34375, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 1, rect: [32.561202,11 9.34375x17.46875]
frag 0 from TextNode start: 0, length: 1, rect: [36.561202,11 9.34375x17.46875]
"B"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
Box <tr> at (9,30.46875) content-size 34.904952x21.46875 table-row children: not-inline
Box <tr> at (9,30.46875) content-size 43.122404x21.46875 table-row children: not-inline
BlockContainer <(anonymous)> (not painted) children: inline
TextNode <#text>
BlockContainer <td> at (11,32.46875) content-size 30.904952x17.46875 table-cell [BFC] children: inline
BlockContainer <td> at (11,32.46875) content-size 39.122404x17.46875 table-cell [BFC] children: inline
line 0 width: 33.3125, height: 17.46875, bottom: 17.46875, baseline: 13.53125
frag 0 from TextNode start: 0, length: 3, rect: [11,32.46875 33.3125x17.46875]
frag 0 from TextNode start: 0, length: 3, rect: [14,32.46875 33.3125x17.46875]
"CDE"
TextNode <#text>
BlockContainer <(anonymous)> (not painted) children: inline

View file

@ -234,8 +234,12 @@ void TableFormattingContext::compute_table_measures()
// - the outer max-content width of the cell minus the baseline max-content width and the baseline border spacing, or 0 if this is negative
cell_max_contribution += (m_columns[cell.column_index].max_width / baseline_max_content_width) * max(CSSPixels(0), cell.max_width - baseline_max_content_width);
cell_min_contributions_by_column_index[cell.column_index].append(cell_min_contribution);
cell_max_contributions_by_column_index[cell.column_index].append(cell_max_contribution);
// Spread contribution to all columns, since we've weighted the gap to the desired spanned width by the the
// ratio of the max-content width based on cells of span up to N-1 of the column to the baseline max-content width.
for (auto column_index = cell_start_column_index; column_index < cell_end_column_index; column_index++) {
cell_min_contributions_by_column_index[column_index].append(cell_min_contribution);
cell_max_contributions_by_column_index[column_index].append(cell_max_contribution);
}
}
}