From 4d498524542a15d7fdb80646801c56ba889e1ac7 Mon Sep 17 00:00:00 2001 From: Andi Gallo Date: Sat, 10 Jun 2023 01:21:10 +0000 Subject: [PATCH] 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. --- .../table/colspan-width-distribution.txt | 18 +++++++++--------- .../LibWeb/Layout/TableFormattingContext.cpp | 8 ++++++-- 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/Tests/LibWeb/Layout/expected/table/colspan-width-distribution.txt b/Tests/LibWeb/Layout/expected/table/colspan-width-distribution.txt index 4ceb0e61c2..d8a29597ca 100644 --- a/Tests/LibWeb/Layout/expected/table/colspan-width-distribution.txt +++ b/Tests/LibWeb/Layout/expected/table/colspan-width-distribution.txt @@ -5,12 +5,12 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer 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 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
at (9,9) content-size 41.122404x42.9375 table-box [TFC] children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box at (9,9) content-size 34.904952x42.9375 table-row-group children: not-inline - Box at (9,9) content-size 34.904952x21.46875 table-row children: not-inline + Box at (9,9) content-size 43.122404x42.9375 table-row-group children: not-inline + Box at (9,9) content-size 43.122404x21.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> BlockContainer at (9,30.46875) content-size 34.904952x21.46875 table-row children: not-inline + Box at (9,30.46875) content-size 43.122404x21.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer
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 at (32.561202,11) content-size 9.34375x17.46875 table-cell [BFC] children: inline + BlockContainer 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
at (11,32.46875) content-size 30.904952x17.46875 table-cell [BFC] children: inline + BlockContainer 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 diff --git a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp index c6562dc0df..fcb916a777 100644 --- a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp @@ -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); + } } }