Rename AtomicString to AtomString
[WebKit-https.git] / Source / WebCore / svg / SVGTextPathElement.h
index b113718..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
+    SVGTextPathSpacingUnknown = 0,
+    SVGTextPathSpacingAuto,
+    SVGTextPathSpacingExact
+};
+
+template<>
+struct SVGPropertyTraits<SVGTextPathMethodType> {
+    static unsigned highestEnumValue() { return SVGTextPathMethodStretch; }
+
+    static String toString(SVGTextPathMethodType type)
+    {
+        switch (type) {
+        case SVGTextPathMethodUnknown:
+            return emptyString();
+        case SVGTextPathMethodAlign:
+            return "align"_s;
+        case SVGTextPathMethodStretch:
+            return "stretch"_s;
+        }
+    
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGTextPathMethodType fromString(const String& value)
+    {
+        if (value == "align")
+            return SVGTextPathMethodAlign;
+        if (value == "stretch")
+            return SVGTextPathMethodStretch;
+        return SVGTextPathMethodUnknown;
+    }
+};
+
+template<>
+struct SVGPropertyTraits<SVGTextPathSpacingType> {
+    static unsigned highestEnumValue() { return SVGTextPathSpacingExact; }
+
+    static String toString(SVGTextPathSpacingType type)
+    {
+        switch (type) {
+        case SVGTextPathSpacingUnknown:
+            return emptyString();
+        case SVGTextPathSpacingAuto:
+            return "auto"_s;
+        case SVGTextPathSpacingExact:
+            return "exact"_s;
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGTextPathSpacingType fromString(const String& value)
+    {
+        if (value == "auto")
+            return SVGTextPathSpacingAuto;
+        if (value == "exact")
+            return SVGTextPathSpacingExact;
+        return SVGTextPathSpacingUnknown;
+    }
 };
 
-class SVGTextPathElement : public SVGTextContentElement,
-                           public SVGURIReference {
+class SVGTextPathElement final : public SVGTextContentElement, public SVGURIReference {
+    WTF_MAKE_ISO_ALLOCATED(SVGTextPathElement);
 public:
-    // Forward declare these enums in the w3c naming scheme, for IDL generation
+    // Forward declare enumerations 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
+        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 PassRefPtr<SVGTextPathElement> create(const QualifiedName&, Document*);
+    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*);
+    SVGTextPathElement(const QualifiedName&, Document&);
+    virtual ~SVGTextPathElement();
 
-    virtual void insertedIntoDocument();
+    using PropertyRegistry = SVGPropertyOwnerRegistry<SVGTextPathElement, SVGTextContentElement, SVGURIReference>;
+    const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
 
-    virtual void parseMappedAttribute(Attribute*);
-    virtual void svgAttributeChanged(const QualifiedName&);
-    virtual void synchronizeProperty(const QualifiedName&);
-    virtual void fillAttributeToPropertyTypeMap();
-    virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
+    void parseAttribute(const QualifiedName&, const AtomString&) override;
+    void svgAttributeChanged(const QualifiedName&) override;
 
-    virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
-    virtual bool childShouldCreateRenderer(Node*) const;
-    virtual bool rendererIsNeeded(RenderStyle*);
+    RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) override;
+    bool childShouldCreateRenderer(const Node&) const override;
+    bool rendererIsNeeded(const RenderStyle&) override;
 
-    virtual bool selfHasRelativeLengths() const;
+    void clearResourceReferences();
+    void buildPendingResource() override;
+    InsertedIntoAncestorResult insertedIntoAncestor(InsertionType, ContainerNode&) override;
+    void removedFromAncestor(RemovalType, ContainerNode&) override;
 
-    // Animated property declarations
-    DECLARE_ANIMATED_LENGTH(StartOffset, startOffset)
-    DECLARE_ANIMATED_ENUMERATION(Method, method)
-    DECLARE_ANIMATED_ENUMERATION(Spacing, spacing)
+    bool selfHasRelativeLengths() const override;
 
-    // SVGURIReference
-    DECLARE_ANIMATED_STRING(Href, href)
+    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
-
-#endif // ENABLE(SVG)
-#endif