diff --git a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.cpp b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.cpp index d6aa65039a8..ce035b0d364 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.cpp +++ b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -29,6 +30,13 @@ void SVGSymbolElement::initialize(JS::Realm& realm) { Base::initialize(realm); WEB_SET_PROTOTYPE_FOR_INTERFACE(SVGSymbolElement); + m_view_box_for_bindings = heap().allocate(realm, realm); +} + +void SVGSymbolElement::visit_edges(Cell::Visitor& visitor) +{ + Base::visit_edges(visitor); + visitor.visit(m_view_box_for_bindings); } // https://svgwg.org/svg2-draft/struct.html#SymbolNotes @@ -45,8 +53,14 @@ void SVGSymbolElement::apply_presentational_hints(CSS::StyleProperties& style) c void SVGSymbolElement::attribute_changed(FlyString const& name, Optional const& old_value, Optional const& value) { Base::attribute_changed(name, old_value, value); - if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox)) + if (name.equals_ignoring_ascii_case(SVG::AttributeNames::viewBox)) { m_view_box = try_parse_view_box(value.value_or(String {})); + m_view_box_for_bindings->set_nulled(!m_view_box.has_value()); + if (m_view_box.has_value()) { + m_view_box_for_bindings->set_base_val(Gfx::DoubleRect { m_view_box->min_x, m_view_box->min_y, m_view_box->width, m_view_box->height }); + m_view_box_for_bindings->set_anim_val(Gfx::DoubleRect { m_view_box->min_x, m_view_box->min_y, m_view_box->width, m_view_box->height }); + } + } } bool SVGSymbolElement::is_direct_child_of_use_shadow_tree() const diff --git a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.h b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.h index 30b29802d96..317684b5cd2 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.h +++ b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.h @@ -28,10 +28,13 @@ public: return {}; } + JS::NonnullGCPtr view_box_for_bindings() { return *m_view_box_for_bindings; } + private: SVGSymbolElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; + virtual void visit_edges(Cell::Visitor&) override; virtual JS::GCPtr create_layout_node(NonnullRefPtr) override; @@ -40,6 +43,8 @@ private: virtual void attribute_changed(FlyString const& name, Optional const& old_value, Optional const& value) override; Optional m_view_box; + + JS::GCPtr m_view_box_for_bindings; }; } diff --git a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.idl b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.idl index 52f33386a68..d0023d5f24f 100644 --- a/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.idl +++ b/Userland/Libraries/LibWeb/SVG/SVGSymbolElement.idl @@ -6,4 +6,4 @@ interface SVGSymbolElement : SVGGraphicsElement { }; -// FIXME: SVGSymbolElement includes SVGFitToViewBox; +SVGSymbolElement includes SVGFitToViewBox;