Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / svg / SVGTextPathElement.h
index 493471c..5677f5b 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2007 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2018-2019 Apple Inc. All rights reserved.
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef SVGTextPathElement_h
-#define SVGTextPathElement_h
+#pragma once
 
-#if ENABLE(SVG)
+#include "SVGNames.h"
 #include "SVGTextContentElement.h"
-
 #include "SVGURIReference.h"
 
 namespace WebCore {
 
 enum SVGTextPathMethodType {
-    SVG_TEXTPATH_METHODTYPE_UNKNOWN = 0,
-    SVG_TEXTPATH_METHODTYPE_ALIGN = 1,
-    SVG_TEXTPATH_METHODTYPE_STRETCH = 2
+    SVGTextPathMethodUnknown = 0,
+    SVGTextPathMethodAlign,
+    SVGTextPathMethodStretch
 };
 
 enum SVGTextPathSpacingType {
-    SVG_TEXTPATH_SPACINGTYPE_UNKNOWN = 0,
-    SVG_TEXTPATH_SPACINGTYPE_AUTO = 1,
-    SVG_TEXTPATH_SPACINGTYPE_EXACT = 2
-};
-
-class SVGTextPathElement : public SVGTextContentElement,
-                           public SVGURIReference {
-public:
-    // Forward declare these enums in the w3c naming scheme, for IDL generation
-    enum {
-        TEXTPATH_METHODTYPE_UNKNOWN = SVG_TEXTPATH_METHODTYPE_UNKNOWN,
-        TEXTPATH_METHODTYPE_ALIGN = SVG_TEXTPATH_METHODTYPE_ALIGN,
-        TEXTPATH_METHODTYPE_STRETCH = SVG_TEXTPATH_METHODTYPE_STRETCH,
-        TEXTPATH_SPACINGTYPE_UNKNOWN = SVG_TEXTPATH_SPACINGTYPE_UNKNOWN,
-        TEXTPATH_SPACINGTYPE_AUTO = SVG_TEXTPATH_SPACINGTYPE_AUTO,
-        TEXTPATH_SPACINGTYPE_EXACT = SVG_TEXTPATH_SPACINGTYPE_EXACT
-    };
-
-    static PassRefPtr<SVGTextPathElement> create(const QualifiedName&, Document*);
-private:
-    SVGTextPathElement(const QualifiedName&, Document*);
-
-    virtual void insertedIntoDocument();
-
-    bool isSupportedAttribute(const QualifiedName&);
-    virtual void parseMappedAttribute(Attribute*);
-    virtual void svgAttributeChanged(const QualifiedName&);
-    virtual void synchronizeProperty(const QualifiedName&);
-    virtual void fillAttributeToPropertyTypeMap();
-    virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
-
-    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
-    virtual bool childShouldCreateRenderer(Node*) const;
-    virtual bool rendererIsNeeded(const NodeRenderingContext&);
-
-    virtual bool selfHasRelativeLengths() const;
-
-    // Animated property declarations
-    DECLARE_ANIMATED_LENGTH(StartOffset, startOffset)
-    DECLARE_ANIMATED_ENUMERATION(Method, method, SVGTextPathMethodType)
-    DECLARE_ANIMATED_ENUMERATION(Spacing, spacing, SVGTextPathSpacingType)
-
-    // SVGURIReference
-    DECLARE_ANIMATED_STRING(Href, href)
+    SVGTextPathSpacingUnknown = 0,
+    SVGTextPathSpacingAuto,
+    SVGTextPathSpacingExact
 };
 
 template<>
 struct SVGPropertyTraits<SVGTextPathMethodType> {
-    static SVGTextPathMethodType highestEnumValue() { return SVG_TEXTPATH_METHODTYPE_STRETCH; }
+    static unsigned highestEnumValue() { return SVGTextPathMethodStretch; }
 
     static String toString(SVGTextPathMethodType type)
     {
         switch (type) {
-        case SVG_TEXTPATH_METHODTYPE_UNKNOWN:
+        case SVGTextPathMethodUnknown:
             return emptyString();
-        case SVG_TEXTPATH_METHODTYPE_ALIGN:
-            return "align";
-        case SVG_TEXTPATH_METHODTYPE_STRETCH:
-            return "stretch";
+        case SVGTextPathMethodAlign:
+            return "align"_s;
+        case SVGTextPathMethodStretch:
+            return "stretch"_s;
         }
     
         ASSERT_NOT_REACHED();
@@ -103,26 +60,26 @@ struct SVGPropertyTraits<SVGTextPathMethodType> {
     static SVGTextPathMethodType fromString(const String& value)
     {
         if (value == "align")
-            return SVG_TEXTPATH_METHODTYPE_ALIGN;
+            return SVGTextPathMethodAlign;
         if (value == "stretch")
-            return SVG_TEXTPATH_METHODTYPE_STRETCH;
-        return SVG_TEXTPATH_METHODTYPE_UNKNOWN;
+            return SVGTextPathMethodStretch;
+        return SVGTextPathMethodUnknown;
     }
 };
 
 template<>
 struct SVGPropertyTraits<SVGTextPathSpacingType> {
-    static SVGTextPathSpacingType highestEnumValue() { return SVG_TEXTPATH_SPACINGTYPE_EXACT; }
+    static unsigned highestEnumValue() { return SVGTextPathSpacingExact; }
 
     static String toString(SVGTextPathSpacingType type)
     {
         switch (type) {
-        case SVG_TEXTPATH_SPACINGTYPE_UNKNOWN:
+        case SVGTextPathSpacingUnknown:
             return emptyString();
-        case SVG_TEXTPATH_SPACINGTYPE_AUTO:
-            return "auto";
-        case SVG_TEXTPATH_SPACINGTYPE_EXACT:
-            return "exact";
+        case SVGTextPathSpacingAuto:
+            return "auto"_s;
+        case SVGTextPathSpacingExact:
+            return "exact"_s;
         }
 
         ASSERT_NOT_REACHED();
@@ -132,14 +89,64 @@ struct SVGPropertyTraits<SVGTextPathSpacingType> {
     static SVGTextPathSpacingType fromString(const String& value)
     {
         if (value == "auto")
-            return SVG_TEXTPATH_SPACINGTYPE_AUTO;
+            return SVGTextPathSpacingAuto;
         if (value == "exact")
-            return SVG_TEXTPATH_SPACINGTYPE_EXACT;
-        return SVG_TEXTPATH_SPACINGTYPE_UNKNOWN;
+            return SVGTextPathSpacingExact;
+        return SVGTextPathSpacingUnknown;
     }
 };
 
-} // namespace WebCore
+class SVGTextPathElement final : public SVGTextContentElement, public SVGURIReference {
+    WTF_MAKE_ISO_ALLOCATED(SVGTextPathElement);
+public:
+    // Forward declare enumerations in the W3C naming scheme, for IDL generation.
+    enum {
+        TEXTPATH_METHODTYPE_UNKNOWN = SVGTextPathMethodUnknown,
+        TEXTPATH_METHODTYPE_ALIGN = SVGTextPathMethodAlign,
+        TEXTPATH_METHODTYPE_STRETCH = SVGTextPathMethodStretch,
+        TEXTPATH_SPACINGTYPE_UNKNOWN = SVGTextPathSpacingUnknown,
+        TEXTPATH_SPACINGTYPE_AUTO = SVGTextPathSpacingAuto,
+        TEXTPATH_SPACINGTYPE_EXACT = SVGTextPathSpacingExact
+    };
+
+    static Ref<SVGTextPathElement> create(const QualifiedName&, Document&);
+
+    const SVGLengthValue& startOffset() const { return m_startOffset->currentValue(); }
+    SVGTextPathMethodType method() const { return m_method->currentValue<SVGTextPathMethodType>(); }
+    SVGTextPathSpacingType spacing() const { return m_spacing->currentValue<SVGTextPathSpacingType>(); }
+
+    SVGAnimatedLength& startOffsetAnimated() { return m_startOffset; }
+    SVGAnimatedEnumeration& methodAnimated() { return m_method; }
+    SVGAnimatedEnumeration& spacingAnimated() { return m_spacing; }
+
+protected:
+    void didFinishInsertingNode() override;
+
+private:
+    SVGTextPathElement(const QualifiedName&, Document&);
+    virtual ~SVGTextPathElement();
 
-#endif // ENABLE(SVG)
-#endif
+    using PropertyRegistry = SVGPropertyOwnerRegistry<SVGTextPathElement, SVGTextContentElement, SVGURIReference>;
+    const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
+
+    void parseAttribute(const QualifiedName&, const AtomString&) override;
+    void svgAttributeChanged(const QualifiedName&) override;
+
+    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
+    bool childShouldCreateRenderer(const Node&) const override;
+    bool rendererIsNeeded(const RenderStyle&) override;
+
+    void clearResourceReferences();
+    void buildPendingResource() override;
+    InsertedIntoAncestorResult insertedIntoAncestor(InsertionType, ContainerNode&) override;
+    void removedFromAncestor(RemovalType, ContainerNode&) override;
+
+    bool selfHasRelativeLengths() const override;
+
+    PropertyRegistry m_propertyRegistry { *this };
+    Ref<SVGAnimatedLength> m_startOffset { SVGAnimatedLength::create(this, LengthModeOther) };
+    Ref<SVGAnimatedEnumeration> m_method { SVGAnimatedEnumeration::create(this, SVGTextPathMethodAlign) };
+    Ref<SVGAnimatedEnumeration> m_spacing { SVGAnimatedEnumeration::create(this, SVGTextPathSpacingExact) };
+};
+
+} // namespace WebCore