diff --git a/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp b/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp index b866d784691..392b52d20bb 100644 --- a/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020-2022, Andreas Kling + * Copyright (c) 2020-2025, Andreas Kling * Copyright (c) 2024, Jamie Mansfield * * SPDX-License-Identifier: BSD-2-Clause @@ -99,11 +99,11 @@ void HTMLTableCellElement::apply_presentational_hints(GC::Refpadding()) { - cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingTop, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); - cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingBottom, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); - cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingLeft, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); - cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingRight, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); + if (auto padding = table_element->cellpadding(); padding.has_value()) { + cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingTop, CSS::LengthStyleValue::create(CSS::Length::make_px(*padding))); + cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingBottom, CSS::LengthStyleValue::create(CSS::Length::make_px(*padding))); + cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingLeft, CSS::LengthStyleValue::create(CSS::Length::make_px(*padding))); + cascaded_properties->set_property_from_presentational_hint(CSS::PropertyID::PaddingRight, CSS::LengthStyleValue::create(CSS::Length::make_px(*padding))); } auto border = table_element->border(); diff --git a/Libraries/LibWeb/HTML/HTMLTableCellElement.h b/Libraries/LibWeb/HTML/HTMLTableCellElement.h index 8ff23b8751e..e1645788bd9 100644 --- a/Libraries/LibWeb/HTML/HTMLTableCellElement.h +++ b/Libraries/LibWeb/HTML/HTMLTableCellElement.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2025, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ diff --git a/Libraries/LibWeb/HTML/HTMLTableElement.cpp b/Libraries/LibWeb/HTML/HTMLTableElement.cpp index fd8201267c7..7dd0343d813 100644 --- a/Libraries/LibWeb/HTML/HTMLTableElement.cpp +++ b/Libraries/LibWeb/HTML/HTMLTableElement.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2025, Andreas Kling * Copyright (c) 2021, Adam Hodgen * * SPDX-License-Identifier: BSD-2-Clause @@ -16,6 +16,7 @@ #include #include #include +#include #include #include #include @@ -145,11 +146,20 @@ void HTMLTableElement::attribute_changed(FlyString const& name, Optional Base::attribute_changed(name, old_value, value, namespace_); if (name == HTML::AttributeNames::cellpadding) { + auto old_cellpadding = m_cellpadding; if (value.has_value()) - m_padding = max(0, parse_integer(value.value()).value_or(0)); + m_cellpadding = max(0, parse_integer(value.value()).value_or(0)); else - m_padding = 1; + m_cellpadding = 1; + // NOTE: cellpadding is magical, it applies to the cells inside this table, not the table itself. + // When it changes, we need new style for the cells. + if (old_cellpadding != m_cellpadding) { + for_each_in_subtree_of_type([&](auto& cell) { + cell.set_needs_style_update(true); + return TraversalDecision::Continue; + }); + } return; } } @@ -478,9 +488,9 @@ unsigned int HTMLTableElement::border() const return parse_border(get_attribute_value(HTML::AttributeNames::border)); } -unsigned int HTMLTableElement::padding() const +Optional HTMLTableElement::cellpadding() const { - return m_padding; + return m_cellpadding; } } diff --git a/Libraries/LibWeb/HTML/HTMLTableElement.h b/Libraries/LibWeb/HTML/HTMLTableElement.h index b5926d1b7d8..69c6f9baef4 100644 --- a/Libraries/LibWeb/HTML/HTMLTableElement.h +++ b/Libraries/LibWeb/HTML/HTMLTableElement.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2020, Andreas Kling + * Copyright (c) 2020-2025, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ @@ -48,7 +48,7 @@ public: virtual Optional default_role() const override { return ARIA::Role::table; } unsigned border() const; - unsigned padding() const; + [[nodiscard]] Optional cellpadding() const; private: HTMLTableElement(DOM::Document&, DOM::QualifiedName); @@ -64,7 +64,7 @@ private: GC::Ptr mutable m_rows; GC::Ptr mutable m_t_bodies; - unsigned m_padding { 1 }; + Optional m_cellpadding; }; } diff --git a/Tests/LibWeb/Text/expected/HTML/table-cellpadding.txt b/Tests/LibWeb/Text/expected/HTML/table-cellpadding.txt new file mode 100644 index 00000000000..58b32d70771 --- /dev/null +++ b/Tests/LibWeb/Text/expected/HTML/table-cellpadding.txt @@ -0,0 +1,4 @@ +1px +5px +0px +0px diff --git a/Tests/LibWeb/Text/input/HTML/table-cellpadding.html b/Tests/LibWeb/Text/input/HTML/table-cellpadding.html new file mode 100644 index 00000000000..3e3a0d15bd7 --- /dev/null +++ b/Tests/LibWeb/Text/input/HTML/table-cellpadding.html @@ -0,0 +1,15 @@ + +
+