/* * 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& old_value, 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; void process_the_url(Optional const& href); static Optional parse_id_from_href(StringView); JS::GCPtr 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; JS::GCPtr m_document_observer; JS::GCPtr m_resource_request; Optional m_load_event_delayer; }; } namespace Web::DOM { template<> inline bool Node::fast_is() const { return is_svg_use_element(); } }