From 7d1b19c865855101561dd2030631feed2409a96d Mon Sep 17 00:00:00 2001 From: Oriol Brufau Date: Mon, 29 Jan 2024 12:51:30 +0100 Subject: [PATCH] Add support for cellpadding attribute (#31201) --- components/script/dom/element.rs | 26 +++++++++++++++++++ components/script/dom/htmltablecellelement.rs | 20 +++++++++++--- components/script/dom/htmltableelement.rs | 15 +++++++++++ .../css/css-tables/colspan-001.html.ini | 9 ------- .../css/css-tables/colspan-002.html.ini | 9 ------- .../css/css-tables/colspan-003.html.ini | 9 ------- .../computing-column-measure-0.html.ini | 6 ----- .../css/css-ui/text-overflow-024.html.ini | 2 -- .../css/css-ui/text-overflow-025.html.ini | 2 -- ...with-infinite-max-intrinsic-width.html.ini | 2 -- ...with-infinite-max-intrinsic-width.html.ini | 2 -- .../meta/css/css-tables/colspan-001.html.ini | 6 ----- .../meta/css/css-tables/colspan-002.html.ini | 6 ----- .../meta/css/css-tables/colspan-003.html.ini | 6 ----- .../css/css-ui/text-overflow-024.html.ini | 2 -- .../meta/css/table_colspan_fixed_a.html.ini | 2 -- .../meta/css/table_colspan_simple_a.html.ini | 2 -- 17 files changed, 58 insertions(+), 68 deletions(-) delete mode 100644 tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-024.html.ini delete mode 100644 tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-025.html.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/item-with-table-with-infinite-max-intrinsic-width.html.ini delete mode 100644 tests/wpt/meta/css/css-flexbox/table-with-infinite-max-intrinsic-width.html.ini delete mode 100644 tests/wpt/meta/css/css-ui/text-overflow-024.html.ini delete mode 100644 tests/wpt/mozilla/meta/css/table_colspan_fixed_a.html.ini delete mode 100644 tests/wpt/mozilla/meta/css/table_colspan_simple_a.html.ini diff --git a/components/script/dom/element.rs b/components/script/dom/element.rs index b54d35c408b..e607f27c232 100644 --- a/components/script/dom/element.rs +++ b/components/script/dom/element.rs @@ -989,6 +989,32 @@ impl<'dom> LayoutElementHelpers<'dom> for LayoutDom<'dom, Element> { PropertyDeclaration::BorderRightWidth(width_value), )); } + + if let Some(cellpadding) = self + .downcast::() + .and_then(|this| this.get_table()) + .and_then(|table| table.get_cellpadding()) + { + let cellpadding = NonNegative(specified::LengthPercentage::Length( + specified::NoCalcLength::from_px(cellpadding as f32), + )); + hints.push(from_declaration( + shared_lock, + PropertyDeclaration::PaddingTop(cellpadding.clone()), + )); + hints.push(from_declaration( + shared_lock, + PropertyDeclaration::PaddingLeft(cellpadding.clone()), + )); + hints.push(from_declaration( + shared_lock, + PropertyDeclaration::PaddingBottom(cellpadding.clone()), + )); + hints.push(from_declaration( + shared_lock, + PropertyDeclaration::PaddingRight(cellpadding), + )); + } } fn get_colspan(self) -> u32 { diff --git a/components/script/dom/htmltablecellelement.rs b/components/script/dom/htmltablecellelement.rs index 4f55fbd4ea7..80e124a584f 100644 --- a/components/script/dom/htmltablecellelement.rs +++ b/components/script/dom/htmltablecellelement.rs @@ -17,8 +17,10 @@ use crate::dom::bindings::str::DOMString; use crate::dom::document::Document; use crate::dom::element::{Element, LayoutElementHelpers}; use crate::dom::htmlelement::HTMLElement; +use crate::dom::htmltableelement::HTMLTableElement; use crate::dom::htmltablerowelement::HTMLTableRowElement; -use crate::dom::node::Node; +use crate::dom::htmltablesectionelement::HTMLTableSectionElement; +use crate::dom::node::{LayoutNodeHelpers, Node}; use crate::dom::virtualmethods::VirtualMethods; const DEFAULT_COLSPAN: u32 = 1; @@ -103,14 +105,15 @@ impl HTMLTableCellElementMethods for HTMLTableCellElement { } } -pub trait HTMLTableCellElementLayoutHelpers { +pub trait HTMLTableCellElementLayoutHelpers<'dom> { fn get_background_color(self) -> Option; fn get_colspan(self) -> Option; fn get_rowspan(self) -> Option; + fn get_table(self) -> Option>; fn get_width(self) -> LengthOrPercentageOrAuto; } -impl HTMLTableCellElementLayoutHelpers for LayoutDom<'_, HTMLTableCellElement> { +impl<'dom> HTMLTableCellElementLayoutHelpers<'dom> for LayoutDom<'dom, HTMLTableCellElement> { fn get_background_color(self) -> Option { self.upcast::() .get_attr_for_layout(&ns!(), &local_name!("bgcolor")) @@ -130,6 +133,17 @@ impl HTMLTableCellElementLayoutHelpers for LayoutDom<'_, HTMLTableCellElement> { .map(AttrValue::as_uint) } + fn get_table(self) -> Option> { + let row = self.upcast::().composed_parent_node_ref()?; + row.downcast::()?; + let section = row.composed_parent_node_ref()?; + section.downcast::().or_else(|| { + section.downcast::()?; + let table = section.composed_parent_node_ref()?; + table.downcast::() + }) + } + fn get_width(self) -> LengthOrPercentageOrAuto { self.upcast::() .get_attr_for_layout(&ns!(), &local_name!("width")) diff --git a/components/script/dom/htmltableelement.rs b/components/script/dom/htmltableelement.rs index 2bddc484499..4c50349cf70 100644 --- a/components/script/dom/htmltableelement.rs +++ b/components/script/dom/htmltableelement.rs @@ -33,6 +33,7 @@ use crate::dom::virtualmethods::VirtualMethods; pub struct HTMLTableElement { htmlelement: HTMLElement, border: Cell>, + cellpadding: Cell>, cellspacing: Cell>, tbodies: MutNullableDom, } @@ -62,6 +63,7 @@ impl HTMLTableElement { HTMLTableElement { htmlelement: HTMLElement::new_inherited(local_name, prefix, document), border: Cell::new(None), + cellpadding: Cell::new(None), cellspacing: Cell::new(None), tbodies: Default::default(), } @@ -425,6 +427,7 @@ impl HTMLTableElementMethods for HTMLTableElement { pub trait HTMLTableElementLayoutHelpers { fn get_background_color(self) -> Option; fn get_border(self) -> Option; + fn get_cellpadding(self) -> Option; fn get_cellspacing(self) -> Option; fn get_width(self) -> LengthOrPercentageOrAuto; } @@ -442,6 +445,11 @@ impl HTMLTableElementLayoutHelpers for LayoutDom<'_, HTMLTableElement> { unsafe { (*self.unsafe_get()).border.get() } } + #[allow(unsafe_code)] + fn get_cellpadding(self) -> Option { + unsafe { (*self.unsafe_get()).cellpadding.get() } + } + #[allow(unsafe_code)] fn get_cellspacing(self) -> Option { unsafe { (*self.unsafe_get()).cellspacing.get() } @@ -472,6 +480,13 @@ impl VirtualMethods for HTMLTableElement { .map(|value| parse_unsigned_integer(value.chars()).unwrap_or(1)), ); }, + local_name!("cellpadding") => { + self.cellpadding.set( + mutation + .new_value(attr) + .and_then(|value| parse_unsigned_integer(value.chars()).ok()), + ); + }, local_name!("cellspacing") => { self.cellspacing.set( mutation diff --git a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-001.html.ini b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-001.html.ini index ef795856ae6..06c3e8f2062 100644 --- a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-001.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-001.html.ini @@ -4,12 +4,3 @@ [td 2] expected: FAIL - - [td 3] - expected: FAIL - - [td 4] - expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-002.html.ini b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-002.html.ini index ee282514bb2..668ade2e009 100644 --- a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-002.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-002.html.ini @@ -4,12 +4,3 @@ [td 2] expected: FAIL - - [td 3] - expected: FAIL - - [td 4] - expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-003.html.ini b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-003.html.ini index 82165f5cbb2..bea1fd91d7b 100644 --- a/tests/wpt/meta-legacy-layout/css/css-tables/colspan-003.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-tables/colspan-003.html.ini @@ -4,12 +4,3 @@ [td 2] expected: FAIL - - [td 3] - expected: FAIL - - [td 4] - expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-tables/width-distribution/computing-column-measure-0.html.ini b/tests/wpt/meta-legacy-layout/css/css-tables/width-distribution/computing-column-measure-0.html.ini index ee974f1514c..e5046560643 100644 --- a/tests/wpt/meta-legacy-layout/css/css-tables/width-distribution/computing-column-measure-0.html.ini +++ b/tests/wpt/meta-legacy-layout/css/css-tables/width-distribution/computing-column-measure-0.html.ini @@ -1,9 +1,3 @@ [computing-column-measure-0.html] - [Checking intermediate min-content width for span 1 (2)] - expected: FAIL - - [Checking intermediate min-content width for span 1 (3)] - expected: FAIL - [Checking intermediate min-content width for span 1 (4)] expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-024.html.ini b/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-024.html.ini deleted file mode 100644 index 3efcee3ee66..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-024.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-overflow-024.html] - expected: FAIL diff --git a/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-025.html.ini b/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-025.html.ini deleted file mode 100644 index a7d356084b2..00000000000 --- a/tests/wpt/meta-legacy-layout/css/css-ui/text-overflow-025.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-overflow-025.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/item-with-table-with-infinite-max-intrinsic-width.html.ini b/tests/wpt/meta/css/css-flexbox/item-with-table-with-infinite-max-intrinsic-width.html.ini deleted file mode 100644 index 81de7819bb8..00000000000 --- a/tests/wpt/meta/css/css-flexbox/item-with-table-with-infinite-max-intrinsic-width.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[item-with-table-with-infinite-max-intrinsic-width.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-flexbox/table-with-infinite-max-intrinsic-width.html.ini b/tests/wpt/meta/css/css-flexbox/table-with-infinite-max-intrinsic-width.html.ini deleted file mode 100644 index 434f3e40277..00000000000 --- a/tests/wpt/meta/css/css-flexbox/table-with-infinite-max-intrinsic-width.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table-with-infinite-max-intrinsic-width.html] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/colspan-001.html.ini b/tests/wpt/meta/css/css-tables/colspan-001.html.ini index ef795856ae6..6cd6b19d88c 100644 --- a/tests/wpt/meta/css/css-tables/colspan-001.html.ini +++ b/tests/wpt/meta/css/css-tables/colspan-001.html.ini @@ -5,11 +5,5 @@ [td 2] expected: FAIL - [td 3] - expected: FAIL - [td 4] expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/colspan-002.html.ini b/tests/wpt/meta/css/css-tables/colspan-002.html.ini index ee282514bb2..edc4bdec83d 100644 --- a/tests/wpt/meta/css/css-tables/colspan-002.html.ini +++ b/tests/wpt/meta/css/css-tables/colspan-002.html.ini @@ -5,11 +5,5 @@ [td 2] expected: FAIL - [td 3] - expected: FAIL - [td 4] expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta/css/css-tables/colspan-003.html.ini b/tests/wpt/meta/css/css-tables/colspan-003.html.ini index 82165f5cbb2..7c1dc536a8b 100644 --- a/tests/wpt/meta/css/css-tables/colspan-003.html.ini +++ b/tests/wpt/meta/css/css-tables/colspan-003.html.ini @@ -5,11 +5,5 @@ [td 2] expected: FAIL - [td 3] - expected: FAIL - [td 4] expected: FAIL - - [td 5] - expected: FAIL diff --git a/tests/wpt/meta/css/css-ui/text-overflow-024.html.ini b/tests/wpt/meta/css/css-ui/text-overflow-024.html.ini deleted file mode 100644 index 3efcee3ee66..00000000000 --- a/tests/wpt/meta/css/css-ui/text-overflow-024.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[text-overflow-024.html] - expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/table_colspan_fixed_a.html.ini b/tests/wpt/mozilla/meta/css/table_colspan_fixed_a.html.ini deleted file mode 100644 index 603357e5443..00000000000 --- a/tests/wpt/mozilla/meta/css/table_colspan_fixed_a.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table_colspan_fixed_a.html] - expected: FAIL diff --git a/tests/wpt/mozilla/meta/css/table_colspan_simple_a.html.ini b/tests/wpt/mozilla/meta/css/table_colspan_simple_a.html.ini deleted file mode 100644 index d4fe578d3dd..00000000000 --- a/tests/wpt/mozilla/meta/css/table_colspan_simple_a.html.ini +++ /dev/null @@ -1,2 +0,0 @@ -[table_colspan_simple_a.html] - expected: FAIL