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 @@
+
+
+