From 19a26533a92a9156dcd2f3981111cc1dbea69acf Mon Sep 17 00:00:00 2001 From: Andi Gallo Date: Fri, 14 Jul 2023 06:57:58 +0000 Subject: [PATCH] LibWeb: Make the type of column whether it's percent or not Change how we store type of columns. It was used where the specification only distinguishes between percent and everything else, so it makes more sense to store and use it as a boolean. --- ...cell-relative-to-specified-table-width.txt | 20 +++++++++---------- ...ell-relative-to-specified-table-width.html | 0 .../LibWeb/Layout/TableFormattingContext.cpp | 19 +++++------------- .../LibWeb/Layout/TableFormattingContext.h | 10 ++-------- 4 files changed, 17 insertions(+), 32 deletions(-) rename Tests/LibWeb/Layout/expected/{ => table}/cell-relative-to-specified-table-width.txt (81%) rename Tests/LibWeb/Layout/input/{ => table}/cell-relative-to-specified-table-width.html (100%) diff --git a/Tests/LibWeb/Layout/expected/cell-relative-to-specified-table-width.txt b/Tests/LibWeb/Layout/expected/table/cell-relative-to-specified-table-width.txt similarity index 81% rename from Tests/LibWeb/Layout/expected/cell-relative-to-specified-table-width.txt rename to Tests/LibWeb/Layout/expected/table/cell-relative-to-specified-table-width.txt index 560cf15c11..386b518e90 100644 --- a/Tests/LibWeb/Layout/expected/cell-relative-to-specified-table-width.txt +++ b/Tests/LibWeb/Layout/expected/table/cell-relative-to-specified-table-width.txt @@ -11,23 +11,23 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline Box at (10,10) content-size 776x19.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (11,11) content-size 300.274545x17.46875 table-cell [BFC] children: inline + BlockContainer at (11,11) content-size 300.639999x17.46875 table-cell [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: [154,11 14.265625x17.46875] "A" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (315.274545,11) content-size 169.470316x17.46875 table-cell [BFC] children: inline + BlockContainer at (315.639999,11) content-size 168.719999x17.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: [395.274545,11 9.34375x17.46875] + frag 0 from TextNode start: 0, length: 1, rect: [395.639999,11 9.34375x17.46875] "B" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (488.744861,11) content-size 300.255138x17.46875 table-cell [BFC] children: inline + BlockContainer at (488.36,11) content-size 300.639999x17.46875 table-cell [BFC] children: inline line 0 width: 29.453125, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 3, rect: [623.744861,11 29.453125x17.46875] + frag 0 from TextNode start: 0, length: 3, rect: [624.36,11 29.453125x17.46875] "C D" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline @@ -37,23 +37,23 @@ Viewport <#document> at (0,0) content-size 800x600 children: not-inline Box at (10,31.46875) content-size 776x19.46875 table-row children: not-inline BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (11,32.46875) content-size 300.274545x17.46875 table-cell [BFC] children: inline + BlockContainer at (11,32.46875) content-size 300.639999x17.46875 table-cell [BFC] children: inline line 0 width: 11.859375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 frag 0 from TextNode start: 0, length: 1, rect: [155,32.46875 11.859375x17.46875] "E" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (315.274545,32.46875) content-size 169.470316x17.46875 table-cell [BFC] children: inline + BlockContainer at (315.639999,32.46875) content-size 168.719999x17.46875 table-cell [BFC] children: inline line 0 width: 12.546875, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 1, rect: [393.274545,32.46875 12.546875x17.46875] + frag 0 from TextNode start: 0, length: 1, rect: [393.639999,32.46875 12.546875x17.46875] "F" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline TextNode <#text> - BlockContainer at (488.744861,32.46875) content-size 300.255138x17.46875 table-cell [BFC] children: inline + BlockContainer at (488.36,32.46875) content-size 300.639999x17.46875 table-cell [BFC] children: inline line 0 width: 13.234375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 - frag 0 from TextNode start: 0, length: 1, rect: [632.744861,32.46875 13.234375x17.46875] + frag 0 from TextNode start: 0, length: 1, rect: [632.36,32.46875 13.234375x17.46875] "G" TextNode <#text> BlockContainer <(anonymous)> (not painted) children: inline diff --git a/Tests/LibWeb/Layout/input/cell-relative-to-specified-table-width.html b/Tests/LibWeb/Layout/input/table/cell-relative-to-specified-table-width.html similarity index 100% rename from Tests/LibWeb/Layout/input/cell-relative-to-specified-table-width.html rename to Tests/LibWeb/Layout/input/table/cell-relative-to-specified-table-width.html diff --git a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp index adfc9ca8ff..bbeac00310 100644 --- a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp +++ b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.cpp @@ -192,19 +192,13 @@ void TableFormattingContext::compute_cell_measures(AvailableSpace const& availab } if (computed_values.width().is_percentage()) { - m_columns[cell.column_index].type = SizeType::Percent; + m_columns[cell.column_index].has_percentage_width = true; m_columns[cell.column_index].percentage_width = max(m_columns[cell.column_index].percentage_width, computed_values.width().percentage().value()); - } else { - // FIXME: Columns with no specified width should remain SizeType::Auto. - m_columns[cell.column_index].type = SizeType::Pixel; } if (computed_values.height().is_percentage()) { - m_rows[cell.row_index].type = SizeType::Percent; + m_rows[cell.row_index].has_percentage_height = true; m_rows[cell.row_index].percentage_height = max(m_rows[cell.row_index].percentage_height, computed_values.height().percentage().value()); - } else { - // FIXME: Rows with no specified width should remain SizeType::Auto. - m_rows[cell.row_index].type = SizeType::Pixel; } } @@ -282,10 +276,7 @@ void TableFormattingContext::initialize_table_measurescomputed_values(); if (cell.row_span == 1) { - // FIXME: Implement intrinsic percentage width of a column based on cells of span up to 1. - auto specified_height = m_rows[cell.row_index].type == SizeType::Pixel - ? computed_values.height().to_px(cell.box, containing_block.content_height()) - : 0; + auto specified_height = computed_values.height().to_px(cell.box, containing_block.content_height()); // https://www.w3.org/TR/css-tables-3/#row-layout makes specified cell height part of the initialization formula for row table measures: // This is done by running the same algorithm as the column measurement, with the span=1 value being initialized (for min-content) with // the largest of the resulting height of the previous row layout, the height specified on the corresponding table-row (if any), and @@ -531,7 +522,7 @@ void TableFormattingContext::distribute_width_to_columns() // - all other columns are assigned their min-content width. for (size_t i = 0; i < m_columns.size(); ++i) { auto& column = m_columns[i]; - if (column.type == SizeType::Percent) { + if (column.has_percentage_width) { candidate_widths[i] = max(column.min_size, column.percentage_width / 100 * available_width); } } @@ -574,7 +565,7 @@ void TableFormattingContext::distribute_width_to_columns() // - all other columns are assigned their max-content width. for (size_t i = 0; i < m_columns.size(); ++i) { auto& column = m_columns[i]; - if (column.type != SizeType::Percent) { + if (!column.has_percentage_width) { candidate_widths[i] = column.max_size; } } diff --git a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.h b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.h index 021eb6da71..2c5acf12fd 100644 --- a/Userland/Libraries/LibWeb/Layout/TableFormattingContext.h +++ b/Userland/Libraries/LibWeb/Layout/TableFormattingContext.h @@ -58,18 +58,12 @@ private: Optional m_available_space; - enum class SizeType { - Percent, - Pixel, - Auto - }; - struct Column { - SizeType type { SizeType::Auto }; CSSPixels left_offset { 0 }; CSSPixels min_size { 0 }; CSSPixels max_size { 0 }; CSSPixels used_width { 0 }; + bool has_percentage_width { false }; double percentage_width { 0 }; // Store whether the column is constrained: https://www.w3.org/TR/css-tables-3/#constrainedness bool is_constrained { false }; @@ -81,9 +75,9 @@ private: CSSPixels reference_height { 0 }; CSSPixels final_height { 0 }; CSSPixels baseline { 0 }; - SizeType type { SizeType::Auto }; CSSPixels min_size { 0 }; CSSPixels max_size { 0 }; + bool has_percentage_height { false }; double percentage_height { 0 }; // Store whether the row is constrained: https://www.w3.org/TR/css-tables-3/#constrainedness bool is_constrained { false };