/* * Copyright (c) 2023, Preston Taylor <95388976+PrestonLTaylor@users.noreply.github.com> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include namespace Web::SVG { class SVGUseElement final : public SVGGraphicsElement , public SVGURIReferenceMixin { WEB_PLATFORM_OBJECT(SVGUseElement, SVGGraphicsElement); JS_DECLARE_ALLOCATOR(SVGUseElement); public: virtual ~SVGUseElement() override = default; virtual void attribute_changed(FlyString const& name, Optional const& value) override; virtual void inserted() override; void svg_element_changed(SVGElement&); void svg_element_removed(SVGElement&); JS::NonnullGCPtr x() const; JS::NonnullGCPtr y() const; JS::NonnullGCPtr width() const; JS::NonnullGCPtr height() const; JS::GCPtr instance_root() const; JS::GCPtr animated_instance_root() const; virtual Gfx::AffineTransform element_transform() const override; private: SVGUseElement(DOM::Document&, DOM::QualifiedName); virtual void initialize(JS::Realm&) override; virtual void visit_edges(Cell::Visitor&) override; virtual bool is_svg_use_element() const override { return true; } virtual JS::GCPtr create_layout_node(NonnullRefPtr) override; static Optional parse_id_from_href(StringView); JS::GCPtr referenced_element(); void clone_element_tree_as_our_shadow_tree(Element* to_clone) const; bool is_valid_reference_element(Element* reference_element) const; Optional m_x; Optional m_y; Optional m_referenced_id; JS::GCPtr m_document_observer; }; } namespace Web::DOM { template<> inline bool Node::fast_is() const { return is_svg_use_element(); } }