From 5bd9f4c31c68a496ce06ba53b461fbe6ebdceda5 Mon Sep 17 00:00:00 2001 From: Andi Gallo Date: Wed, 21 Jun 2023 02:11:51 +0000 Subject: [PATCH] LibWeb: Add undistributable space to GRID{MIN, MAX} instead of content Adding undistributable space right before setting the content width is incorrect when it's a percentage. Follow the specification and add it to GRIDMIN and GRIDMAX instead. --- ...ot-be-affected-by-presentational-hints.txt | 10 +-- .../border-spacing-with-percentage-width.txt | 36 +++++++++++ .../table/columns-width-distribution-1.txt | 25 ++++---- .../table/long-caption-increases-width.txt | 61 ++++++++++--------- .../Layout/expected/table/table-width.txt | 10 +-- .../border-spacing-with-percentage-width.html | 31 ++++++++++ .../LibWeb/Layout/TableFormattingContext.cpp | 9 ++- 7 files changed, 129 insertions(+), 53 deletions(-) create mode 100644 Tests/LibWeb/Layout/expected/table/border-spacing-with-percentage-width.txt create mode 100644 Tests/LibWeb/Layout/input/table/border-spacing-with-percentage-width.html diff --git a/Tests/LibWeb/Layout/expected/css-pseudo-element-should-not-be-affected-by-presentational-hints.txt b/Tests/LibWeb/Layout/expected/css-pseudo-element-should-not-be-affected-by-presentational-hints.txt index 73f07ba0c7b..99db6d63f79 100644 --- a/Tests/LibWeb/Layout/expected/css-pseudo-element-should-not-be-affected-by-presentational-hints.txt +++ b/Tests/LibWeb/Layout/expected/css-pseudo-element-should-not-be-affected-by-presentational-hints.txt @@ -2,11 +2,11 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (1,1) content-size 798x124 [BFC] children: not-inline BlockContainer at (10,10) content-size 780x106 children: not-inline TableWrapper <(anonymous)> at (10,10) content-size 106x106 [BFC] children: not-inline - Box at (11,11) content-size 106x104 table-box [TFC] children: not-inline - Box at (11,11) content-size 102x100 table-row-group children: not-inline - Box at (13,13) content-size 102x100 table-row children: not-inline - BlockContainer
at (15,51.082031) content-size 98x23.835937 table-cell [BFC] children: not-inline - BlockContainer <(anonymous)> at (16,52.082031) content-size 96x21.835937 children: inline + Box at (11,11) content-size 104x104 table-box [TFC] children: not-inline + Box at (11,11) content-size 100x100 table-row-group children: not-inline + Box at (13,13) content-size 100x100 table-row children: not-inline + BlockContainer at (125.599999,8) content-size 474.24x19.46875 table-row-group children: not-inline + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + Box at (127.599999,10) content-size 474.24x19.46875 table-row children: not-inline + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + BlockContainer at (9,9) content-size 782x90.21875 table-row-group children: not-inline - Box at (11,11) content-size 782x90.21875 table-row children: not-inline - BlockContainer at (12,31.109375) content-size 50x50 table-cell [BFC] children: not-inline - BlockContainer at (12,31.109375) content-size 50x50 children: not-inline - BlockContainer at (66,12) content-size 728x88.21875 table-cell [BFC] children: inline + Box at (9,9) content-size 774x107.15625 table-row-group children: not-inline + Box at (11,11) content-size 774x107.15625 table-row children: not-inline + BlockContainer at (12,39.578125) content-size 50x50 table-cell [BFC] children: not-inline + BlockContainer at (12,39.578125) content-size 50x50 children: not-inline + BlockContainer at (66,12) content-size 720x105.15625 table-cell [BFC] children: inline line 0 width: 689.640625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 frag 0 from TextNode start: 1, length: 84, rect: [66,12 689.640625x17.46875] "In a scene set in a lawyer's office, the lawyer sits alone and bounces a rubber ball" @@ -22,7 +22,10 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline line 3 width: 695.90625, height: 17.875, bottom: 70.28125, baseline: 13.53125 frag 0 from TextNode start: 257, length: 81, rect: [66,64 695.90625x17.46875] "some papers from a large envelope, which turn out to be divorce papers from their" - line 4 width: 725.734375, height: 18.34375, bottom: 88.21875, baseline: 13.53125 - frag 0 from TextNode start: 339, length: 92, rect: [66,81 725.734375x17.46875] - "significant other. Finally, the lawyer instructs their assistant to send in the next client." + line 4 width: 670.515625, height: 18.34375, bottom: 88.21875, baseline: 13.53125 + frag 0 from TextNode start: 339, length: 84, rect: [66,81 670.515625x17.46875] + "significant other. Finally, the lawyer instructs their assistant to send in the next" + line 5 width: 47.21875, height: 17.8125, bottom: 105.15625, baseline: 13.53125 + frag 0 from TextNode start: 424, length: 7, rect: [66,99 47.21875x17.46875] + "client." TextNode <#text> diff --git a/Tests/LibWeb/Layout/expected/table/long-caption-increases-width.txt b/Tests/LibWeb/Layout/expected/table/long-caption-increases-width.txt index 2107dc4f528..50d1b2d5633 100644 --- a/Tests/LibWeb/Layout/expected/table/long-caption-increases-width.txt +++ b/Tests/LibWeb/Layout/expected/table/long-caption-increases-width.txt @@ -1,38 +1,41 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline - BlockContainer at (0,0) content-size 800x127.8125 [BFC] children: not-inline + BlockContainer at (0,0) content-size 800x146.21875 [BFC] children: not-inline BlockContainer <(anonymous)> at (0,0) content-size 800x0 children: inline TextNode <#text> - BlockContainer at (8,8) content-size 784x111.8125 children: not-inline - TableWrapper <(anonymous)> at (8,8) content-size 61.046875x111.8125 [BFC] children: not-inline - Box at (10,43.40625) content-size 61.046875x72.40625 table-box [TFC] children: not-inline + BlockContainer at (8,8) content-size 784x130.21875 children: not-inline + TableWrapper <(anonymous)> at (8,8) content-size 55.046875x130.21875 [BFC] children: not-inline + Box at (10,61.8125) content-size 55.046875x72.40625 table-box [TFC] children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (10,10) content-size 55.046875x21.46875 table-header-group children: not-inline + Box at (10,10) content-size 51.6875x21.46875 table-header-group children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box at (12,45.40625) content-size 55.046875x21.46875 table-row children: not-inline + Box at (12,63.8125) content-size 51.6875x21.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (10,31.46875) content-size 55.046875x21.46875 table-row-group children: not-inline + Box at (10,31.46875) content-size 51.6875x21.46875 table-row-group children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box at (12,66.875) content-size 55.046875x21.46875 table-row children: not-inline + Box at (12,85.28125) content-size 51.6875x21.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (10,52.9375) content-size 55.046875x21.46875 table-footer-group children: not-inline + Box at (10,52.9375) content-size 51.6875x21.46875 table-footer-group children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box at (12,88.34375) content-size 55.046875x21.46875 table-row children: not-inline + Box at (12,106.75) content-size 51.6875x21.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (108,108) content-size 584x10 table-row-group children: not-inline - Box at (110,110) content-size 584x10 table-row children: not-inline - BlockContainer at (111,115) content-size 582x0 table-cell [BFC] children: not-inline + TableWrapper <(anonymous)> at (8,8) content-size 584x214 [BFC] children: not-inline + Box at (108,108) content-size 584x14 table-box [TFC] children: not-inline + Box at (108,108) content-size 580x10 table-row-group children: not-inline + Box at (110,110) content-size 580x10 table-row children: not-inline + BlockContainer at (111,115) content-size 578x0 table-cell [BFC] children: not-inline diff --git a/Tests/LibWeb/Layout/input/table/border-spacing-with-percentage-width.html b/Tests/LibWeb/Layout/input/table/border-spacing-with-percentage-width.html new file mode 100644 index 00000000000..bb6fff2955f --- /dev/null +++ b/Tests/LibWeb/Layout/input/table/border-spacing-with-percentage-width.html @@ -0,0 +1,31 @@ + +
A
+
at (15,51.082031) content-size 96x23.835937 table-cell [BFC] children: not-inline + BlockContainer <(anonymous)> at (16,52.082031) content-size 94x21.835937 children: inline line 0 width: 0, height: 21.835937, bottom: 21.835937, baseline: 16.914062 frag 0 from TextNode start: 0, length: 0, rect: [16,52.082031 0x21.835937] "" diff --git a/Tests/LibWeb/Layout/expected/table/border-spacing-with-percentage-width.txt b/Tests/LibWeb/Layout/expected/table/border-spacing-with-percentage-width.txt new file mode 100644 index 00000000000..ae40893dafb --- /dev/null +++ b/Tests/LibWeb/Layout/expected/table/border-spacing-with-percentage-width.txt @@ -0,0 +1,36 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x0 children: inline + BlockContainer at (8,8) content-size 117.599999x17.46875 floating [BFC] children: inline + line 0 width: 14.265625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 1, rect: [8,8 14.265625x17.46875] + "A" + TextNode <#text> + TextNode <#text> + TableWrapper <(anonymous)> at (125.599999,8) content-size 478.24x23.46875 floating [BFC] children: not-inline + Box at (125.599999,8) content-size 478.24x23.46875 table-box [TFC] children: not-inline + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + Box
at (128.599999,11) content-size 472.24x17.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: [128.599999,11 9.34375x17.46875] + "B" + TextNode <#text> + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + TextNode <#text> + BlockContainer at (8,32) content-size 188.159999x17.46875 floating [BFC] children: inline + line 0 width: 10.3125, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 1, length: 1, rect: [8,32 10.3125x17.46875] + "C" + TextNode <#text> diff --git a/Tests/LibWeb/Layout/expected/table/columns-width-distribution-1.txt b/Tests/LibWeb/Layout/expected/table/columns-width-distribution-1.txt index 96eb89661c6..58b04cb633b 100644 --- a/Tests/LibWeb/Layout/expected/table/columns-width-distribution-1.txt +++ b/Tests/LibWeb/Layout/expected/table/columns-width-distribution-1.txt @@ -1,15 +1,15 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline - BlockContainer at (8,8) content-size 784x96.21875 children: not-inline - TableWrapper <(anonymous)> at (8,8) content-size 784x96.21875 [BFC] children: not-inline - Box at (9,9) content-size 788x94.21875 table-box [TFC] children: not-inline + BlockContainer at (8,8) content-size 784x113.15625 children: not-inline + TableWrapper <(anonymous)> at (8,8) content-size 782x113.15625 [BFC] children: not-inline + Box at (9,9) content-size 780x111.15625 table-box [TFC] children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box
at (8,8) content-size 59.046875x35.40625 [BFC] children: inline - line 0 width: 54.03125, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 1, length: 6, rect: [10,8 54.03125x17.46875] - "A long" - line 1 width: 59.046875, height: 17.9375, bottom: 35.40625, baseline: 13.53125 - frag 0 from TextNode start: 8, length: 7, rect: [8,25 59.046875x17.46875] + BlockContainer at (8,8) content-size 59.046875x53.8125 [BFC] children: inline + line 0 width: 14.265625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 1, length: 1, rect: [22,8 14.265625x17.46875] + "A" + line 1 width: 31.765625, height: 17.9375, bottom: 35.40625, baseline: 13.53125 + frag 0 from TextNode start: 3, length: 4, rect: [14,25 31.765625x17.46875] + "long" + line 2 width: 59.046875, height: 18.40625, bottom: 53.34375, baseline: 13.53125 + frag 0 from TextNode start: 8, length: 7, rect: [8,42 59.046875x17.46875] "caption" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box
at (14,47.40625) content-size 22.208835x17.46875 table-cell [BFC] children: inline + BlockContainer at (14,65.8125) content-size 20.609375x17.46875 table-cell [BFC] children: inline line 0 width: 20.609375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [14,47.40625 20.609375x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [14,65.8125 20.609375x17.46875] "A1" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (42.208835,47.40625) content-size 24.838039x17.46875 table-cell [BFC] children: inline + BlockContainer at (40.609375,65.8125) content-size 23.078125x17.46875 table-cell [BFC] children: inline line 0 width: 23.078125, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [42.208835,47.40625 23.078125x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [40.609375,65.8125 23.078125x17.46875] "A2" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline @@ -41,22 +44,22 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box
at (14,70.875) content-size 22.208835x17.46875 table-cell [BFC] children: inline + BlockContainer at (14,89.28125) content-size 20.609375x17.46875 table-cell [BFC] children: inline line 0 width: 15.6875, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [14,70.875 15.6875x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [14,89.28125 15.6875x17.46875] "B1" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (42.208835,70.875) content-size 24.838039x17.46875 table-cell [BFC] children: inline + BlockContainer at (40.609375,89.28125) content-size 23.078125x17.46875 table-cell [BFC] children: inline line 0 width: 18.15625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [42.208835,70.875 18.15625x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [40.609375,89.28125 18.15625x17.46875] "B2" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline @@ -65,22 +68,22 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - Box
at (14,94.34375) content-size 22.208835x17.46875 table-cell [BFC] children: inline + BlockContainer at (14,112.75) content-size 20.609375x17.46875 table-cell [BFC] children: inline line 0 width: 18.890625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [14,94.34375 18.890625x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [14,112.75 18.890625x17.46875] "F1" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (42.208835,94.34375) content-size 24.838039x17.46875 table-cell [BFC] children: inline + BlockContainer at (40.609375,112.75) content-size 23.078125x17.46875 table-cell [BFC] children: inline line 0 width: 21.359375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 2, rect: [42.208835,94.34375 21.359375x17.46875] + frag 0 from TextNode start: 0, length: 2, rect: [40.609375,112.75 21.359375x17.46875] "F2" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline @@ -89,5 +92,5 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer <(anonymous)> at (8,119.8125) content-size 784x0 children: inline + BlockContainer <(anonymous)> at (8,138.21875) content-size 784x0 children: inline TextNode <#text> diff --git a/Tests/LibWeb/Layout/expected/table/table-width.txt b/Tests/LibWeb/Layout/expected/table/table-width.txt index fae1e62c101..e27dfd71ff7 100644 --- a/Tests/LibWeb/Layout/expected/table/table-width.txt +++ b/Tests/LibWeb/Layout/expected/table/table-width.txt @@ -1,8 +1,8 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline BlockContainer at (0,0) content-size 800x600 [BFC] children: not-inline BlockContainer at (8,8) content-size 784x214 children: not-inline - TableWrapper <(anonymous)> at (8,8) content-size 588x214 [BFC] children: not-inline - Box at (108,108) content-size 588x14 table-box [TFC] children: not-inline - Box
+ + + + + +
B
+
+ C +
\ No newline at end of file diff --git a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp index 35cc34d2463..6542341289d 100644 --- a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp @@ -332,12 +332,16 @@ void TableFormattingContext::compute_table_width() // not the table wrapper box itself. CSSPixels width_of_table_wrapper_containing_block = m_state.get(*table_wrapper().containing_block()).content_width(); + // Compute undistributable space due to border spacing: https://www.w3.org/TR/css-tables-3/#computing-undistributable-space. + auto undistributable_space = (m_columns.size() + 1) * border_spacing_horizontal(); + // The row/column-grid width minimum (GRIDMIN) width is the sum of the min-content width // of all the columns plus cell spacing or borders. CSSPixels grid_min = 0.0f; for (auto& column : m_columns) { grid_min += column.min_size; } + grid_min += undistributable_space; // The row/column-grid width maximum (GRIDMAX) width is the sum of the max-content width // of all the columns plus cell spacing or borders. @@ -345,6 +349,7 @@ void TableFormattingContext::compute_table_width() for (auto& column : m_columns) { grid_max += column.max_size; } + grid_max += undistributable_space; // The used min-width of a table is the greater of the resolved min-width, CAPMIN, and GRIDMIN. auto used_min_width = max(grid_min, compute_capmin()); @@ -367,9 +372,7 @@ void TableFormattingContext::compute_table_width() used_width = min(used_width, computed_values.max_width().to_px(table_box(), width_of_table_wrapper_containing_block)); } - // Compute undistributable space due to border spacing: https://www.w3.org/TR/css-tables-3/#computing-undistributable-space. - auto undistributable_space = (m_columns.size() + 1) * border_spacing_horizontal(); - table_box_state.set_content_width(used_width - table_box_state.border_left - table_box_state.border_right + undistributable_space); + table_box_state.set_content_width(used_width - table_box_state.border_left - table_box_state.border_right); } void TableFormattingContext::distribute_width_to_columns()