/* * Copyright (c) 2023, Preston Taylor <95388976+PrestonLTaylor@users.noreply.github.com> * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include namespace Web::SVG { class SVGUseElement final : public SVGGraphicsElement , public SVGURIReferenceMixin { WEB_PLATFORM_OBJECT(SVGUseElement, SVGGraphicsElement); GC_DECLARE_ALLOCATOR(SVGUseElement); public: virtual ~SVGUseElement() override = default; virtual void attribute_changed(FlyString const& name, Optional const& old_value, Optional const& value, Optional const& namespace_) override; virtual void inserted() override; void svg_element_changed(SVGElement&); void svg_element_removed(SVGElement&); GC::Ref x() const; GC::Ref y() const; GC::Ref width() const; GC::Ref height() const; GC::Ptr instance_root() const; GC::Ptr 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 GC::Ptr create_layout_node(GC::Ref) override; void process_the_url(Optional const& href); static Optional parse_id_from_href(StringView); GC::Ptr referenced_element(); void fetch_the_document(URL::URL const& url); bool is_referrenced_element_same_document() const; void clone_element_tree_as_our_shadow_tree(Element* to_clone); bool is_valid_reference_element(Element const& reference_element) const; Optional m_x; Optional m_y; URL::URL m_href; GC::Ptr m_document_observer; GC::Ptr m_resource_request; Optional m_load_event_delayer; }; } namespace Web::DOM { template<> inline bool Node::fast_is() const { return is_svg_use_element(); } }