Replace RenderSVGResource::cast<T>() with downcast<T>()
authorzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Nov 2014 07:44:20 +0000 (07:44 +0000)
committerzandobersek@gmail.com <zandobersek@gmail.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Mon, 17 Nov 2014 07:44:20 +0000 (07:44 +0000)
https://bugs.webkit.org/show_bug.cgi?id=138290

Reviewed by Chris Dumez.

Add type traits for the RenderSVGResource hierarchy. This enables
using the typecasting framework in getRenderSVGResourceById() that
in return renders the RenderSVGResource::cast<>() template and all
the static s_resourceType member variables in the hierarchy removable.

* WebCore.order:
* rendering/svg/RenderSVGResource.h:
(WebCore::RenderSVGResource::cast): Deleted.
* rendering/svg/RenderSVGResourceClipper.h:
* rendering/svg/RenderSVGResourceContainer.h:
(WebCore::getRenderSVGResourceById):
* rendering/svg/RenderSVGResourceFilter.h:
(isType):
* rendering/svg/RenderSVGResourceLinearGradient.h:
* rendering/svg/RenderSVGResourceMarker.h:
* rendering/svg/RenderSVGResourceMasker.h:
* rendering/svg/RenderSVGResourcePattern.h:
* rendering/svg/RenderSVGResourceRadialGradient.h:
* rendering/svg/RenderSVGResourceSolidColor.h:

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@176180 268f45cc-cd09-0410-ab3c-d52691b4dbfc

12 files changed:
Source/WebCore/ChangeLog
Source/WebCore/WebCore.order
Source/WebCore/rendering/svg/RenderSVGResource.h
Source/WebCore/rendering/svg/RenderSVGResourceClipper.h
Source/WebCore/rendering/svg/RenderSVGResourceContainer.h
Source/WebCore/rendering/svg/RenderSVGResourceFilter.h
Source/WebCore/rendering/svg/RenderSVGResourceLinearGradient.h
Source/WebCore/rendering/svg/RenderSVGResourceMarker.h
Source/WebCore/rendering/svg/RenderSVGResourceMasker.h
Source/WebCore/rendering/svg/RenderSVGResourcePattern.h
Source/WebCore/rendering/svg/RenderSVGResourceRadialGradient.h
Source/WebCore/rendering/svg/RenderSVGResourceSolidColor.h

index e530dd4..b583f43 100644 (file)
@@ -1,3 +1,30 @@
+2014-11-16  Zan Dobersek  <zdobersek@igalia.com>
+
+        Replace RenderSVGResource::cast<T>() with downcast<T>()
+        https://bugs.webkit.org/show_bug.cgi?id=138290
+
+        Reviewed by Chris Dumez.
+
+        Add type traits for the RenderSVGResource hierarchy. This enables
+        using the typecasting framework in getRenderSVGResourceById() that
+        in return renders the RenderSVGResource::cast<>() template and all
+        the static s_resourceType member variables in the hierarchy removable.
+
+        * WebCore.order:
+        * rendering/svg/RenderSVGResource.h:
+        (WebCore::RenderSVGResource::cast): Deleted.
+        * rendering/svg/RenderSVGResourceClipper.h:
+        * rendering/svg/RenderSVGResourceContainer.h:
+        (WebCore::getRenderSVGResourceById):
+        * rendering/svg/RenderSVGResourceFilter.h:
+        (isType):
+        * rendering/svg/RenderSVGResourceLinearGradient.h:
+        * rendering/svg/RenderSVGResourceMarker.h:
+        * rendering/svg/RenderSVGResourceMasker.h:
+        * rendering/svg/RenderSVGResourcePattern.h:
+        * rendering/svg/RenderSVGResourceRadialGradient.h:
+        * rendering/svg/RenderSVGResourceSolidColor.h:
+
 2014-11-16  Benjamin Poulain  <benjamin@webkit.org>
 
         Implement :valid and :invalid matching for the fieldset element
index da8858b..d133e5b 100644 (file)
@@ -26177,13 +26177,6 @@ __ZTVN3WTF21MemoryInstrumentation7WrapperIN7WebCore17StyleSurroundDataEEE
 __ZTVN3WTF21MemoryInstrumentation7WrapperIN7WebCore19StyleBackgroundDataEEE
 __ZTVN3WTF21MemoryInstrumentation7WrapperIN7WebCore15StyleVisualDataEEE
 __ZTVN3WTF21MemoryInstrumentation7WrapperIN7WebCore12StyleBoxDataEEE
-__ZN7WebCore24RenderSVGResourceClipper14s_resourceTypeE
-__ZN7WebCore23RenderSVGResourceFilter14s_resourceTypeE
-__ZN7WebCore31RenderSVGResourceLinearGradient14s_resourceTypeE
-__ZN7WebCore23RenderSVGResourceMarker14s_resourceTypeE
-__ZN7WebCore24RenderSVGResourcePattern14s_resourceTypeE
-__ZN7WebCore31RenderSVGResourceRadialGradient14s_resourceTypeE
-__ZN7WebCore27RenderSVGResourceSolidColor14s_resourceTypeE
 __ZTVN7WebCore14RenderSVGTSpanE
 __ZTVN7WebCore17RenderSVGTextPathE
 __ZTVN7WebCore30BoundingRectStrokeStyleApplierE
@@ -28775,7 +28768,6 @@ __ZN7WebCore14OscillatorNode17s_waveTableSquareE
 __ZN7WebCore14OscillatorNode19s_waveTableSawtoothE
 __ZN7WebCore14OscillatorNode19s_waveTableTriangleE
 __ZN7WebCore21RenderLayerFilterInfo11s_filterMapE
-__ZN7WebCore23RenderSVGResourceMasker14s_resourceTypeE
 __ZN7WebCore15ResourceRequest23s_httpPipeliningEnabledE
 __ZN7WebCore22RuntimeEnabledFeatures22isCSSExclusionsEnabledE
 __ZN7WebCore22RuntimeEnabledFeatures18isCSSShapesEnabledE
index 1935f3b..ed7a70f 100644 (file)
@@ -23,6 +23,7 @@
 #include "RenderSVGShape.h"
 #include "RenderStyleConstants.h"
 #include "SVGDocumentExtensions.h"
+#include <wtf/TypeCasts.h>
 
 namespace WebCore {
 
@@ -67,15 +68,6 @@ public:
 
     virtual RenderSVGResourceType resourceType() const = 0;
 
-    template<class Renderer>
-    Renderer* cast()
-    {
-        if (Renderer::s_resourceType == resourceType())
-            return static_cast<Renderer*>(this);
-
-        return 0;
-    }
-
     // Helper utilities used in the render tree to access resources used for painting shapes/text (gradients & patterns & solid colors only)
     static RenderSVGResource* fillPaintingResource(RenderElement&, const RenderStyle&, Color& fallbackColor);
     static RenderSVGResource* strokePaintingResource(RenderElement&, const RenderStyle&, Color& fallbackColor);
@@ -86,4 +78,9 @@ public:
 
 }
 
+#define SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(ToValueTypeName, ResourceType) \
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::ToValueTypeName) \
+    static bool isType(const WebCore::RenderSVGResource& resource) { return resource.resourceType() == WebCore::ResourceType; } \
+SPECIALIZE_TYPE_TRAITS_END()
+
 #endif
index a26ba02..31141f9 100644 (file)
@@ -54,8 +54,7 @@ public:
     bool applyClippingToContext(RenderElement&, const FloatRect&, const FloatRect&, GraphicsContext*);
     virtual FloatRect resourceBoundingBox(const RenderObject&) override;
 
-    static const RenderSVGResourceType s_resourceType = ClipperResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return ClipperResourceType; }
     
     bool hitTestClipContent(const FloatRect&, const FloatPoint&);
 
@@ -76,4 +75,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceClipper, ClipperResourceType)
+
 #endif
index 36be34d..97748fb 100644 (file)
@@ -89,8 +89,11 @@ inline RenderSVGResourceContainer* getRenderSVGResourceContainerById(Document& d
 template<typename Renderer>
 Renderer* getRenderSVGResourceById(Document& document, const AtomicString& id)
 {
-    if (RenderSVGResourceContainer* container = getRenderSVGResourceContainerById(document, id))
-        return container->cast<Renderer>();
+    // Using the RenderSVGResource type here avoids ambiguous casts for types that
+    // descend from both RenderObject and RenderSVGResourceContainer.
+    RenderSVGResource* container = getRenderSVGResourceContainerById(document, id);
+    if (is<Renderer>(container))
+        return downcast<Renderer>(container);
 
     return nullptr;
 }
index 86015c9..3d39789 100644 (file)
@@ -82,8 +82,7 @@ public:
 
     void primitiveAttributeChanged(RenderObject*, const QualifiedName&);
 
-    static const RenderSVGResourceType s_resourceType = FilterResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return FilterResourceType; }
 
     FloatRect drawingRegion(RenderObject*) const;
 private:
@@ -99,6 +98,9 @@ private:
 
 } // namespace WebCore
 
-SPECIALIZE_TYPE_TRAITS_RENDER_OBJECT(RenderSVGResourceFilter, isSVGResourceFilter())
+SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::RenderSVGResourceFilter)
+    static bool isType(const WebCore::RenderObject& renderer) { return renderer.isSVGResourceFilter(); }
+    static bool isType(const WebCore::RenderSVGResource& resource) { return resource.resourceType() == WebCore::FilterResourceType; }
+SPECIALIZE_TYPE_TRAITS_END()
 
 #endif // RenderSVGResourceFilter_h
index b380033..0ff8458 100644 (file)
@@ -34,8 +34,7 @@ public:
 
     SVGLinearGradientElement& linearGradientElement() const { return downcast<SVGLinearGradientElement>(RenderSVGResourceGradient::gradientElement()); }
 
-    static const RenderSVGResourceType s_resourceType = LinearGradientResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return LinearGradientResourceType; }
 
     virtual SVGUnitTypes::SVGUnitType gradientUnits() const override { return m_attributes.gradientUnits(); }
     virtual void calculateGradientTransform(AffineTransform& transform) override { transform = m_attributes.gradientTransform(); }
@@ -55,4 +54,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceLinearGradient, LinearGradientResourceType)
+
 #endif
index f0bf740..27a90a9 100644 (file)
@@ -59,8 +59,7 @@ public:
     float angle() const;
     SVGMarkerUnitsType markerUnits() const { return markerElement().markerUnits(); }
 
-    static const RenderSVGResourceType s_resourceType = MarkerResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return MarkerResourceType; }
 
 private:
     void element() const = delete;
@@ -79,4 +78,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceMarker, MarkerResourceType)
+
 #endif
index 659c664..a1ffb3f 100644 (file)
@@ -50,8 +50,7 @@ public:
     SVGUnitTypes::SVGUnitType maskUnits() const { return maskElement().maskUnits(); }
     SVGUnitTypes::SVGUnitType maskContentUnits() const { return maskElement().maskContentUnits(); }
 
-    static const RenderSVGResourceType s_resourceType = MaskerResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return MaskerResourceType; }
 
 private:
     void element() const = delete;
@@ -67,4 +66,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceMasker, MaskerResourceType)
+
 #endif
index 325c360..619189b 100644 (file)
@@ -51,8 +51,7 @@ public:
     virtual void postApplyResource(RenderElement&, GraphicsContext*&, unsigned short resourceMode, const Path*, const RenderSVGShape*) override;
     virtual FloatRect resourceBoundingBox(const RenderObject&) override { return FloatRect(); }
 
-    static const RenderSVGResourceType s_resourceType = PatternResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return PatternResourceType; }
 
 private:
     void element() const = delete;
@@ -71,4 +70,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourcePattern, PatternResourceType)
+
 #endif
index d6bcf49..165ac03 100644 (file)
@@ -36,8 +36,7 @@ public:
 
     SVGRadialGradientElement& radialGradientElement() const { return downcast<SVGRadialGradientElement>(RenderSVGResourceGradient::gradientElement()); }
 
-    static const RenderSVGResourceType s_resourceType = RadialGradientResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return RadialGradientResourceType; }
 
     virtual SVGUnitTypes::SVGUnitType gradientUnits() const override { return m_attributes.gradientUnits(); }
     virtual void calculateGradientTransform(AffineTransform& transform) override { transform = m_attributes.gradientTransform(); }
@@ -59,4 +58,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceRadialGradient, RadialGradientResourceType)
+
 #endif
index b9b4410..7ecd878 100644 (file)
@@ -37,8 +37,7 @@ public:
     virtual void postApplyResource(RenderElement&, GraphicsContext*&, unsigned short resourceMode, const Path*, const RenderSVGShape*) override;
     virtual FloatRect resourceBoundingBox(const RenderObject&) override { return FloatRect(); }
 
-    static const RenderSVGResourceType s_resourceType = SolidColorResourceType;
-    virtual RenderSVGResourceType resourceType() const override { return s_resourceType; }
+    virtual RenderSVGResourceType resourceType() const override { return SolidColorResourceType; }
 
     const Color& color() const { return m_color; }
     void setColor(const Color& color) { m_color = color; }
@@ -49,4 +48,6 @@ private:
 
 }
 
+SPECIALIZE_TYPE_TRAITS_RENDER_SVG_RESOURCE(RenderSVGResourceSolidColor, SolidColorResourceType)
+
 #endif