From 00c1da8cbceb21fa79e6b0a6d132d3acbc760e7e Mon Sep 17 00:00:00 2001 From: implicitfield <114500360+implicitfield@users.noreply.github.com> Date: Sun, 19 Nov 2023 22:19:32 +0400 Subject: [PATCH] LibWeb: Support `cellpadding` attribute on `table` elements --- .../expected/table/table-cellpadding.txt | 38 +++++++++++++++++++ .../Layout/input/table/table-cellpadding.html | 6 +++ .../LibWeb/HTML/HTMLTableCellElement.cpp | 9 +++++ .../LibWeb/HTML/HTMLTableElement.cpp | 19 ++++++++++ .../Libraries/LibWeb/HTML/HTMLTableElement.h | 3 ++ 5 files changed, 75 insertions(+) create mode 100644 Tests/LibWeb/Layout/expected/table/table-cellpadding.txt create mode 100644 Tests/LibWeb/Layout/input/table/table-cellpadding.html diff --git a/Tests/LibWeb/Layout/expected/table/table-cellpadding.txt b/Tests/LibWeb/Layout/expected/table/table-cellpadding.txt new file mode 100644 index 0000000000..ed4aff9d78 --- /dev/null +++ b/Tests/LibWeb/Layout/expected/table/table-cellpadding.txt @@ -0,0 +1,38 @@ +Viewport <#document> at (0,0) content-size 800x600 children: not-inline + BlockContainer at (0,0) content-size 800x220 [BFC] children: not-inline + BlockContainer at (8,8) content-size 784x204 children: not-inline + TableWrapper <(anonymous)> at (8,8) content-size 498.1875x204 [BFC] children: not-inline + Box at (9,9) content-size 496.1875x202 table-box [TFC] children: not-inline + Box at (9,9) content-size 488.1875x198 table-row-group children: not-inline + Box at (11,11) content-size 488.1875x198 table-row children: not-inline + BlockContainer
at (71,71) content-size 26.640625x17.46875 table-cell [BFC] children: inline + line 0 width: 26.640625, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 3, rect: [71,71 26.640625x17.46875] + "top" + TextNode <#text> + BlockContainer at (219.640625,101.265625) content-size 45.4375x17.46875 table-cell [BFC] children: inline + line 0 width: 45.4375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 6, rect: [219.640625,101.265625 45.4375x17.46875] + "middle" + TextNode <#text> + BlockContainer at (387.078125,131.53125) content-size 56.109375x17.46875 table-cell [BFC] children: inline + line 0 width: 56.109375, height: 17.46875, bottom: 17.46875, baseline: 13.53125 + frag 0 from TextNode start: 0, length: 6, rect: [387.078125,131.53125 56.109375x17.46875] + "bottom" + TextNode <#text> + BlockContainer <(anonymous)> (not painted) children: inline + TextNode <#text> + +ViewportPaintable (Viewport<#document>) [0,0 800x600] + PaintableWithLines (BlockContainer) [0,0 800x220] + PaintableWithLines (BlockContainer) [8,8 784x204] + PaintableWithLines (TableWrapper(anonymous)) [8,8 498.1875x204] + PaintableBox (Box) [8,8 498.1875x204] + PaintableBox (Box) [9,9 488.1875x198] overflow: [9,9 494.1875x200] + PaintableBox (Box) [11,11 488.1875x198] overflow: [11,11 492.1875x198] + PaintableWithLines (BlockContainer
) [11,11 146.640625x198] + TextPaintable (TextNode<#text>) + PaintableWithLines (BlockContainer) [159.640625,11 165.4375x198] + TextPaintable (TextNode<#text>) + PaintableWithLines (BlockContainer) [327.078125,11 176.109375x198] + TextPaintable (TextNode<#text>) diff --git a/Tests/LibWeb/Layout/input/table/table-cellpadding.html b/Tests/LibWeb/Layout/input/table/table-cellpadding.html new file mode 100644 index 0000000000..d160256267 --- /dev/null +++ b/Tests/LibWeb/Layout/input/table/table-cellpadding.html @@ -0,0 +1,6 @@ + diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp index 8959afac95..cf98cda984 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLTableCellElement.cpp @@ -85,7 +85,16 @@ void HTMLTableCellElement::apply_presentational_hints(CSS::StyleProperties& styl } }); auto const& table_element = table_containing_cell(*this); + + if (auto padding = table_element.padding()) { + style.set_property(CSS::PropertyID::PaddingTop, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); + style.set_property(CSS::PropertyID::PaddingBottom, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); + style.set_property(CSS::PropertyID::PaddingLeft, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); + style.set_property(CSS::PropertyID::PaddingRight, CSS::LengthStyleValue::create(CSS::Length::make_px(padding))); + } + auto border = table_element.border(); + if (!border) return; auto apply_border_style = [&](CSS::PropertyID style_property, CSS::PropertyID width_property, CSS::PropertyID color_property) { diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTableElement.cpp b/Userland/Libraries/LibWeb/HTML/HTMLTableElement.cpp index 70a4a5899a..9f535e607a 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLTableElement.cpp +++ b/Userland/Libraries/LibWeb/HTML/HTMLTableElement.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include #include @@ -100,6 +101,19 @@ void HTMLTableElement::apply_presentational_hints(CSS::StyleProperties& style) c }); } +void HTMLTableElement::attribute_changed(FlyString const& name, Optional const& value) +{ + Base::attribute_changed(name, value); + if (name == HTML::AttributeNames::cellpadding) { + if (value.has_value()) + m_padding = max(0, parse_integer(value.value()).value_or(0)); + else + m_padding = 1; + + return; + } +} + // https://html.spec.whatwg.org/multipage/tables.html#dom-table-caption JS::GCPtr HTMLTableElement::caption() { @@ -424,4 +438,9 @@ unsigned int HTMLTableElement::border() const return parse_border(deprecated_attribute(HTML::AttributeNames::border)); } +unsigned int HTMLTableElement::padding() const +{ + return m_padding; +} + } diff --git a/Userland/Libraries/LibWeb/HTML/HTMLTableElement.h b/Userland/Libraries/LibWeb/HTML/HTMLTableElement.h index 36888a78fa..8f6c3bba0b 100644 --- a/Userland/Libraries/LibWeb/HTML/HTMLTableElement.h +++ b/Userland/Libraries/LibWeb/HTML/HTMLTableElement.h @@ -47,6 +47,7 @@ public: virtual Optional default_role() const override { return ARIA::Role::table; } unsigned border() const; + unsigned padding() const; private: HTMLTableElement(DOM::Document&, DOM::QualifiedName); @@ -57,9 +58,11 @@ private: virtual void visit_edges(Cell::Visitor&) override; virtual void apply_presentational_hints(CSS::StyleProperties&) const override; + virtual void attribute_changed(FlyString const& name, Optional const& value) override; JS::GCPtr mutable m_rows; JS::GCPtr mutable m_t_bodies; + unsigned m_padding { 1 }; }; }
topmiddlebottom