Forráskód Böngészése

LibWeb: Add SVGURIReference

Luke Wilde 1 éve
szülő
commit
968bec9844

+ 6 - 0
Userland/Libraries/LibWeb/SVG/SVGTextPathElement.cpp

@@ -33,6 +33,12 @@ void SVGTextPathElement::initialize(JS::Realm& realm)
     set_prototype(&Bindings::ensure_web_prototype<Bindings::SVGTextPathElementPrototype>(realm, "SVGTextPathElement"_fly_string));
 }
 
+void SVGTextPathElement::visit_edges(Cell::Visitor& visitor)
+{
+    Base::visit_edges(visitor);
+    SVGURIReferenceMixin::visit_edges(visitor);
+}
+
 JS::GCPtr<Layout::Node> SVGTextPathElement::create_layout_node(NonnullRefPtr<CSS::StyleProperties> style)
 {
     return heap().allocate_without_realm<Layout::SVGTextPathBox>(document(), *this, move(style));

+ 5 - 1
Userland/Libraries/LibWeb/SVG/SVGTextPathElement.h

@@ -8,11 +8,14 @@
 
 #include <LibWeb/SVG/SVGGeometryElement.h>
 #include <LibWeb/SVG/SVGTextContentElement.h>
+#include <LibWeb/SVG/SVGURIReference.h>
 
 namespace Web::SVG {
 
 // https://svgwg.org/svg2-draft/text.html#TextPathElement
-class SVGTextPathElement : public SVGTextContentElement {
+class SVGTextPathElement
+    : public SVGTextContentElement
+    , public SVGURIReferenceMixin<SupportsXLinkHref::Yes> {
     WEB_PLATFORM_OBJECT(SVGTextPathElement, SVGTextContentElement);
     JS_DECLARE_ALLOCATOR(SVGTextPathElement);
 
@@ -25,6 +28,7 @@ protected:
     SVGTextPathElement(DOM::Document&, DOM::QualifiedName);
 
     virtual void initialize(JS::Realm&) override;
+    virtual void visit_edges(Cell::Visitor&) override;
 };
 
 }

+ 50 - 0
Userland/Libraries/LibWeb/SVG/SVGURIReference.h

@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2023, Luke Wilde <lukew@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibWeb/SVG/AttributeNames.h>
+#include <LibWeb/SVG/SVGAnimatedString.h>
+
+namespace Web::SVG {
+
+enum class SupportsXLinkHref {
+    No,
+    Yes,
+};
+
+// https://svgwg.org/svg2-draft/types.html#InterfaceSVGURIReference
+template<SupportsXLinkHref supports_xlink_href>
+class SVGURIReferenceMixin {
+public:
+    virtual ~SVGURIReferenceMixin() = default;
+
+    JS::NonnullGCPtr<SVGAnimatedString> href()
+    {
+        // The href IDL attribute represents the value of the ‘href’ attribute, and, on elements that are defined to support
+        // it, the deprecated ‘xlink:href’ attribute. On getting href, an SVGAnimatedString object is returned that:
+        //    - reflects the ‘href’ attribute, and
+        //    - if the element is defined to support the deprecated ‘xlink:href’ attribute, additionally reflects that
+        //      deprecated attribute.
+        if (!m_href_animated_string) {
+            auto* this_svg_element = dynamic_cast<SVGElement*>(this);
+            VERIFY(this_svg_element);
+            m_href_animated_string = SVGAnimatedString::create(this_svg_element->realm(), *this_svg_element, AttributeNames::href, supports_xlink_href == SupportsXLinkHref::Yes ? Optional<FlyString> { AttributeNames::xlink_href } : OptionalNone {});
+        }
+        return *m_href_animated_string;
+    }
+
+protected:
+    void visit_edges(JS::Cell::Visitor& visitor)
+    {
+        visitor.visit(m_href_animated_string);
+    }
+
+private:
+    JS::GCPtr<SVGAnimatedString> m_href_animated_string;
+};
+
+}

+ 4 - 1
Userland/Libraries/LibWeb/SVG/SVGURIReference.idl

@@ -1,3 +1,6 @@
+#import <SVG/SVGAnimatedString.idl>
+
+// https://svgwg.org/svg2-draft/types.html#InterfaceSVGURIReference
 interface mixin SVGURIReference {
-  // FIXME: [SameObject] readonly attribute SVGAnimatedString href;
+    [SameObject] readonly attribute SVGAnimatedString href;
 };