From ecabdc2583f8e82f39600c2b5d1ca81a7219f235 Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Thu, 21 Mar 2024 12:48:39 +0100 Subject: [PATCH] Don't trim leading whitespace of anonymous table cells (#31803) A sequence of whitespace shouldn't generate an anonymous table row/cell, but we can't just throw away the leading whitespace, because afterwards we may encounter some other content, and then the leading whitespace should appear in the cell (noticeable with e.g. `white-space: pre`). --- components/layout_2020/table/construct.rs | 27 +++++++++++++------ .../table-anonymous-objects-199.xht.ini | 2 -- .../table-anonymous-objects-200.xht.ini | 2 -- .../table-anonymous-objects-201.xht.ini | 2 -- .../table-anonymous-objects-202.xht.ini | 2 -- .../table-anonymous-objects-203.xht.ini | 2 -- .../table-anonymous-objects-204.xht.ini | 2 -- .../table-anonymous-objects-211.xht.ini | 2 -- .../anonymous-table-ws-001.html.ini | 2 -- .../css/css-tables/table-model-fixup.html.ini | 3 --- .../css/css-tables/whitespace-001.html.ini | 2 -- 11 files changed, 19 insertions(+), 29 deletions(-) delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-199.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-200.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-201.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-202.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-203.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-204.xht.ini delete mode 100644 tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-211.xht.ini delete mode 100644 tests/wpt/meta/css/css-tables/anonymous-table-ws-001.html.ini delete mode 100644 tests/wpt/meta/css/css-tables/whitespace-001.html.ini diff --git a/components/layout_2020/table/construct.rs b/components/layout_2020/table/construct.rs index 5e9b00ddbe4f..ac689c951e14 100644 --- a/components/layout_2020/table/construct.rs +++ b/components/layout_2020/table/construct.rs @@ -56,6 +56,19 @@ pub(crate) enum AnonymousTableContent<'dom, Node> { }, } +impl<'dom, Node> AnonymousTableContent<'dom, Node> { + fn is_whitespace_only(&self) -> bool { + match self { + Self::Element { .. } => false, + Self::Text(_, ref text) => text.chars().all(char_is_whitespace), + } + } + + fn contents_are_whitespace_only(contents: &[Self]) -> bool { + contents.iter().all(|content| content.is_whitespace_only()) + } +} + impl Table { pub(crate) fn construct<'dom>( context: &LayoutContext, @@ -627,7 +640,9 @@ where } fn finish_anonymous_row_if_needed(&mut self) { - if self.current_anonymous_row_content.is_empty() { + if AnonymousTableContent::contents_are_whitespace_only(&self.current_anonymous_row_content) + { + self.current_anonymous_row_content.clear(); return; } @@ -689,9 +704,6 @@ where Node: NodeExt<'dom>, { fn handle_text(&mut self, info: &NodeAndStyleInfo, text: Cow<'dom, str>) { - if text.chars().all(char_is_whitespace) { - return; - } self.current_anonymous_row_content .push(AnonymousTableContent::Text(info.clone(), text)); } @@ -897,7 +909,9 @@ where } fn finish_current_anonymous_cell_if_needed(&mut self) { - if self.current_anonymous_cell_content.is_empty() { + if AnonymousTableContent::contents_are_whitespace_only(&self.current_anonymous_cell_content) + { + self.current_anonymous_cell_content.clear(); return; } @@ -947,9 +961,6 @@ where Node: NodeExt<'dom>, { fn handle_text(&mut self, info: &NodeAndStyleInfo, text: Cow<'dom, str>) { - if text.chars().all(char_is_whitespace) { - return; - } self.current_anonymous_cell_content .push(AnonymousTableContent::Text(info.clone(), text)); } diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-199.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-199.xht.ini deleted file mode 100644 index e67617bcc90f..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-199.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-199.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-200.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-200.xht.ini deleted file mode 100644 index df790626e1a1..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-200.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-200.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-201.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-201.xht.ini deleted file mode 100644 index 7df8c8b68881..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-201.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-201.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-202.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-202.xht.ini deleted file mode 100644 index 3445d39db402..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-202.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-202.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-203.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-203.xht.ini deleted file mode 100644 index b21a61a16ad4..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-203.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-203.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-204.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-204.xht.ini deleted file mode 100644 index e8115dc0cebc..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-204.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-204.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-211.xht.ini b/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-211.xht.ini deleted file mode 100644 index b97050679468..000000000000 --- a/tests/wpt/meta/css/CSS2/tables/table-anonymous-objects-211.xht.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-anonymous-objects-211.xht] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/anonymous-table-ws-001.html.ini b/tests/wpt/meta/css/css-tables/anonymous-table-ws-001.html.ini deleted file mode 100644 index 62060b75d3ec..000000000000 --- a/tests/wpt/meta/css/css-tables/anonymous-table-ws-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[anonymous-table-ws-001.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/table-model-fixup.html.ini b/tests/wpt/meta/css/css-tables/table-model-fixup.html.ini index 481c9dbffee4..ddfbf98f98f1 100644 --- a/tests/wpt/meta/css/css-tables/table-model-fixup.html.ini +++ b/tests/wpt/meta/css/css-tables/table-model-fixup.html.ini @@ -14,8 +14,5 @@ [2.2. An anonymous table-row box must be generated around each sequence of consecutive children of a table-row-grouping box which are not table-row boxes. (3/3)] expected: FAIL - [1.4. Anonymous inline boxes which contains only white space and are between two immediate siblings *each* of which is a table-non-root element, are treated as if they had display: none.] - expected: FAIL - [2.3 happens after 2.1. and 2.2. (1/2)] expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/whitespace-001.html.ini b/tests/wpt/meta/css/css-tables/whitespace-001.html.ini deleted file mode 100644 index d58da5a92235..000000000000 --- a/tests/wpt/meta/css/css-tables/whitespace-001.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[whitespace-001.html] - expected: FAIL