Commit 9b5d9de1 authored by Aleks Totic's avatar Aleks Totic Committed by Chromium LUCI CQ

[TablesNG] Columns take precedence in table-layout:fixed

Inside table-layout:fixed, columns always take precedence
over cells.

Updated wpt column widths test.

Bug: 958381, 832323
Change-Id: I07e682d9e41218774889d9517a0e4d652bbecd68
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2575724Reviewed-by: default avatarDavid Grogan <dgrogan@chromium.org>
Reviewed-by: default avatarIan Kilpatrick <ikilpatrick@chromium.org>
Commit-Queue: Ian Kilpatrick <ikilpatrick@chromium.org>
Cr-Commit-Position: refs/heads/master@{#833995}
parent 430c04eb
...@@ -76,7 +76,8 @@ constexpr LayoutUnit NGTableTypes::kTableMaxInlineSize; ...@@ -76,7 +76,8 @@ constexpr LayoutUnit NGTableTypes::kTableMaxInlineSize;
// "outer min-content and outer max-content widths for colgroups" // "outer min-content and outer max-content widths for colgroups"
NGTableTypes::Column NGTableTypes::CreateColumn( NGTableTypes::Column NGTableTypes::CreateColumn(
const ComputedStyle& style, const ComputedStyle& style,
base::Optional<LayoutUnit> default_inline_size) { base::Optional<LayoutUnit> default_inline_size,
bool is_table_fixed) {
base::Optional<LayoutUnit> inline_size; base::Optional<LayoutUnit> inline_size;
base::Optional<LayoutUnit> min_inline_size; base::Optional<LayoutUnit> min_inline_size;
base::Optional<LayoutUnit> max_inline_size; base::Optional<LayoutUnit> max_inline_size;
...@@ -97,7 +98,8 @@ NGTableTypes::Column NGTableTypes::CreateColumn( ...@@ -97,7 +98,8 @@ NGTableTypes::Column NGTableTypes::CreateColumn(
percentage_inline_size, percentage_inline_size,
LayoutUnit() /* percent_border_padding */, LayoutUnit() /* percent_border_padding */,
is_constrained, is_constrained,
is_collapsed}; is_collapsed,
is_table_fixed};
} }
// Implements https://www.w3.org/TR/css-tables-3/#computing-cell-measures // Implements https://www.w3.org/TR/css-tables-3/#computing-cell-measures
...@@ -282,6 +284,10 @@ void NGTableTypes::Column::Encompass( ...@@ -282,6 +284,10 @@ void NGTableTypes::Column::Encompass(
if (!cell) if (!cell)
return; return;
// Constrained columns in fixed tables take precedence over cells.
if (is_constrained && is_table_fixed)
return;
if (min_inline_size) { if (min_inline_size) {
if (min_inline_size < cell->min_inline_size) { if (min_inline_size < cell->min_inline_size) {
min_inline_size = cell->min_inline_size; min_inline_size = cell->min_inline_size;
......
...@@ -66,6 +66,7 @@ class CORE_EXPORT NGTableTypes { ...@@ -66,6 +66,7 @@ class CORE_EXPORT NGTableTypes {
// True if any cell for this column is constrained. // True if any cell for this column is constrained.
bool is_constrained = false; bool is_constrained = false;
bool is_collapsed = false; bool is_collapsed = false;
bool is_table_fixed = false;
void Encompass(const base::Optional<NGTableTypes::CellInlineConstraint>&); void Encompass(const base::Optional<NGTableTypes::CellInlineConstraint>&);
LayoutUnit ResolvePercentInlineSize( LayoutUnit ResolvePercentInlineSize(
...@@ -180,7 +181,8 @@ class CORE_EXPORT NGTableTypes { ...@@ -180,7 +181,8 @@ class CORE_EXPORT NGTableTypes {
}; };
static Column CreateColumn(const ComputedStyle&, static Column CreateColumn(const ComputedStyle&,
base::Optional<LayoutUnit> default_inline_size); base::Optional<LayoutUnit> default_inline_size,
bool is_table_fixed);
static CellInlineConstraint CreateCellInlineConstraint( static CellInlineConstraint CreateCellInlineConstraint(
const NGBlockNode&, const NGBlockNode&,
......
...@@ -243,10 +243,12 @@ class ColumnConstraintsBuilder { ...@@ -243,10 +243,12 @@ class ColumnConstraintsBuilder {
wtf_size_t span) { wtf_size_t span) {
// COL creates SPAN constraints. Its width is col css width, or enclosing // COL creates SPAN constraints. Its width is col css width, or enclosing
// colgroup css width. // colgroup css width.
NGTableTypes::Column col_constraint = NGTableTypes::CreateColumn( NGTableTypes::Column col_constraint =
column.Style(), !is_fixed_layout_ && colgroup_constraint_ NGTableTypes::CreateColumn(column.Style(),
? colgroup_constraint_->max_inline_size !is_fixed_layout_ && colgroup_constraint_
: base::nullopt); ? colgroup_constraint_->max_inline_size
: base::nullopt,
is_fixed_layout_);
for (wtf_size_t i = 0; i < span; ++i) for (wtf_size_t i = 0; i < span; ++i)
column_constraints_->data.push_back(col_constraint); column_constraints_->data.push_back(col_constraint);
column.GetLayoutBox()->ClearNeedsLayout(); column.GetLayoutBox()->ClearNeedsLayout();
...@@ -254,8 +256,8 @@ class ColumnConstraintsBuilder { ...@@ -254,8 +256,8 @@ class ColumnConstraintsBuilder {
void EnterColgroup(const NGLayoutInputNode& colgroup, void EnterColgroup(const NGLayoutInputNode& colgroup,
wtf_size_t start_column_index) { wtf_size_t start_column_index) {
colgroup_constraint_ = colgroup_constraint_ = NGTableTypes::CreateColumn(
NGTableTypes::CreateColumn(colgroup.Style(), base::nullopt); colgroup.Style(), base::nullopt, is_fixed_layout_);
} }
void LeaveColgroup(const NGLayoutInputNode& colgroup, void LeaveColgroup(const NGLayoutInputNode& colgroup,
......
...@@ -39,5 +39,7 @@ PASS table 28 ...@@ -39,5 +39,7 @@ PASS table 28
PASS table 29 PASS table 29
PASS table 30 PASS table 30
PASS table 31 PASS table 31
PASS table 32
PASS table 33
Harness: the test ran to completion. Harness: the test ran to completion.
...@@ -276,7 +276,23 @@ column.max = max(td.max, col.max)</p> ...@@ -276,7 +276,23 @@ column.max = max(td.max, col.max)</p>
<table style="width:1px" data-expected-width=234> <table style="width:1px" data-expected-width=234>
<col style="width:50%"> <col style="width:50%">
<td style="width:100px" data-expected-width=10><div style="width:10px">10</div></td> <td style="width:100px" data-expected-width=10><div style="width:10px">10</div></td>
<td><div style="width:200px">200</div> <td><div style="width:200px">200</div></td>
</table>
<p class="testdesc">col fixed td fixed inside table-layout:fixed
constrained columns take precedence in fixed layout.
<table style="width:324px;table-layout:fixed" data-expected-width=324>
<col style="width:100px">
<td style="width:200px" data-expected-width=100>100</td>
<td data-expected-width=200><div style="width:400px" >200</div></td>
</table>
<p class="testdesc">col percent td fixed inside table-layout:fixed
constrained columns take precedence in fixed layout.
<table style="width:324px;table-layout:fixed" data-expected-width=324>
<col style="width:50%">
<td style="width:200px" data-expected-width=150>150</td>
<td><div style="width:400px">150</div></td>
</table> </table>
</main> </main>
<script> <script>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment