Add SVGPropertyTraits::fromString() to all the SVG animated types
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Feb 2018 02:02:57 +0000 (02:02 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 20 Feb 2018 02:02:57 +0000 (02:02 +0000)
https://bugs.webkit.org/show_bug.cgi?id=182901

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2018-02-19
Reviewed by Dean Jackson.

This is a work toward https://bugs.webkit.org/show_bug.cgi?id=168586. The
goal is is to templatize the SVGAnimatedType class and to use SVGPropertyTraits
methods inside the template functions.

* WebCore.xcodeproj/project.pbxproj: Move the enum and the SVGPropertyTraits
from SVGMarkerElement.h to SVGMarkerTypes.h.
* svg/SVGAngle.h:
(WebCore::SVGAngle::SVGAngle): Delete unused constructor and create() method.
* svg/SVGAngleValue.h:
* svg/SVGAnimateMotionElement.cpp:
(WebCore::parsePoint): Deleted. Move this function to SVGParserUtilities.cpp
* svg/SVGAnimatedAngle.cpp:
(WebCore::SVGAnimatedAngleAnimator::constructFromString): Use SVGPropertyTraits::fromString().
* svg/SVGAnimatedBoolean.cpp:
(WebCore::SVGAnimatedBooleanAnimator::constructFromString): Ditto.
* svg/SVGAnimatedColor.cpp:
(WebCore::SVGAnimatedColorAnimator::constructFromString): Ditto.
(WebCore::SVGAnimatedColorAnimator::addAnimatedTypes): Use const.
(WebCore::SVGAnimatedColorAnimator::calculateAnimatedValue): Ditto.
* svg/SVGAnimatedEnumeration.cpp:
(WebCore::SVGAnimatedEnumerationAnimator::constructFromString): Ditto.
* svg/SVGAnimatedInteger.cpp:
(WebCore::SVGAnimatedIntegerAnimator::constructFromString): Ditto.
* svg/SVGAnimatedIntegerOptionalInteger.cpp:
(WebCore::SVGAnimatedIntegerOptionalIntegerAnimator::constructFromString): Ditto.
* svg/SVGAnimatedLength.cpp:
* svg/SVGAnimatedLengthList.cpp:
(WebCore::SVGAnimatedLengthListAnimator::constructFromString): Ditto.
* svg/SVGAnimatedNumber.cpp:
(WebCore::SVGAnimatedNumberAnimator::constructFromString): Ditto
(WebCore::parseNumberFromString):
* svg/SVGAnimatedNumberList.cpp:
(WebCore::SVGAnimatedNumberListAnimator::constructFromString): Ditto.
* svg/SVGAnimatedNumberOptionalNumber.cpp:
(WebCore::SVGAnimatedNumberOptionalNumberAnimator::constructFromString): Ditto.
* svg/SVGAnimatedPath.cpp:
(WebCore::SVGAnimatedPathAnimator::constructFromString): Ditto.
* svg/SVGAnimatedPointList.cpp:
(WebCore::SVGAnimatedPointListAnimator::constructFromString): Ditto.
* svg/SVGAnimatedPreserveAspectRatio.cpp:
(WebCore::SVGAnimatedPreserveAspectRatioAnimator::constructFromString): Ditto.
* svg/SVGAnimatedRect.cpp:
(WebCore::SVGAnimatedRectAnimator::constructFromString): Ditto.
* svg/SVGAnimatedString.cpp:
(WebCore::SVGAnimatedStringAnimator::constructFromString): Ditto.
* svg/SVGAnimatedTransformList.cpp:
(WebCore::SVGAnimatedTransformListAnimator::constructFromString): Ditto.
* svg/SVGLength.h:
(WebCore::SVGLength::SVGLength): Delete unused constructor and create() method.
* svg/SVGLengthListValues.h:
(WebCore::SVGPropertyTraits<SVGLengthListValues>::fromString): New SVGPropertyTraits method.
(WebCore::SVGPropertyTraits<SVGLengthListValues>::parse): Ditto.
* svg/SVGMarkerElement.h:
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::highestEnumValue): Deleted.
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::toString): Deleted.
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::fromString): Deleted.
(WebCore::SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue): Deleted.
(WebCore::SVGPropertyTraits<SVGMarkerOrientType>::highestEnumValue): Deleted.
(WebCore::SVGPropertyTraits<SVGMarkerOrientType>::fromString): Deleted.
* svg/SVGMarkerTypes.h: Added.
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::highestEnumValue):
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::toString):
(WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::fromString):
(WebCore::SVGPropertyTraits<SVGMarkerOrientType>::highestEnumValue):
(WebCore::SVGPropertyTraits<SVGMarkerOrientType>::fromString):
(WebCore::SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue):
* svg/SVGMatrix.h: Delete unused constructor and create method.
* svg/SVGNumber.h:
(WebCore::SVGNumber::SVGNumber): Ditto.
* svg/SVGNumberListValues.h:
(WebCore::SVGPropertyTraits<SVGNumberListValues>::fromString): New SVGPropertyTraits method.
* svg/SVGParserUtilities.cpp:
(WebCore::parsePoint): This is moved from SVGAnimateMotionElement.cpp
* svg/SVGParserUtilities.h:
* svg/SVGPathByteStream.h:
(WebCore::SVGPathByteStream::SVGPathByteStream):
(WebCore::SVGPathByteStream::operator=): Add copy and move assignment operators.
(WebCore::SVGPathByteStream::copy const): Use the copy assignment.
(WebCore::SVGPathByteStream::isEmpty const): Use Data.isEmpty().
(WebCore::SVGPropertyTraits<SVGPathByteStream>::initialValue): New SVGPropertyTraits method.
(WebCore::SVGPropertyTraits<SVGPathByteStream>::fromString): Ditto.
* svg/SVGPathUtilities.cpp:
(WebCore::addToSVGPathByteStream): Answer Simon's questions which were added in r190844.
* svg/SVGPoint.h:
(WebCore::SVGPoint::SVGPoint): Delete unused constructor and create method.
* svg/SVGPointListValues.h:
(WebCore::SVGPropertyTraits<SVGPointListValues>::fromString): New SVGPropertyTraits method.
* svg/SVGPolyElement.cpp:
(WebCore::SVGPolyElement::parseAttribute): Use the move assignment operator.
* svg/SVGPreserveAspectRatio.h:
(WebCore::SVGPreserveAspectRatio::SVGPreserveAspectRatio): Delete unused constructor and create method.
* svg/SVGPreserveAspectRatioValue.cpp:
(WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue): Add new constructor.
* svg/SVGPreserveAspectRatioValue.h:
(WebCore::SVGPropertyTraits<SVGPreserveAspectRatioValue>::fromString): New SVGPropertyTraits method.
(WebCore::SVGPropertyTraits<SVGPreserveAspectRatioValue>::toString): Ditto.
* svg/SVGRect.h:
(WebCore::SVGRect::SVGRect): Delete unused constructor and create method.
* svg/SVGRectTraits.h: Removed.
* svg/SVGTransform.h:
(WebCore::SVGTransform::SVGTransform): Delete unused constructor and create method.
* svg/SVGTransformListValues.h:
(WebCore::SVGPropertyTraits<SVGTransformListValues>::fromString): New SVGPropertyTraits method.
* svg/properties/SVGPropertyTearOff.h: Delete unused create method.
* svg/properties/SVGPropertyTraits.h: New SVGPropertyTraits methods.
(WebCore::SVGPropertyTraits<bool>::fromString):
(WebCore::SVGPropertyTraits<Color>::initialValue):
(WebCore::SVGPropertyTraits<Color>::fromString):
(WebCore::SVGPropertyTraits<Color>::parse):
(WebCore::SVGPropertyTraits<Color>::toString):
(WebCore::SVGPropertyTraits<int>::fromString):
(WebCore::SVGPropertyTraits<float>::fromString):
(WebCore::SVGPropertyTraits<float>::parse):
(WebCore::SVGPropertyTraits<FloatPoint>::initialValue):
(WebCore::SVGPropertyTraits<FloatPoint>::fromString):
(WebCore::SVGPropertyTraits<FloatPoint>::parse):
(WebCore::SVGPropertyTraits<FloatPoint>::toString):
(WebCore::SVGPropertyTraits<FloatRect>::initialValue):
(WebCore::SVGPropertyTraits<FloatRect>::fromString):
(WebCore::SVGPropertyTraits<FloatRect>::parse):
(WebCore::SVGPropertyTraits<FloatRect>::toString):
(WebCore::SVGPropertyTraits<String>::fromString):
(WebCore::SVGPropertyTraits<String>::parse):
(WebCore::SVGPropertyTraits<String>::toString):

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

45 files changed:
Source/WebCore/ChangeLog
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/svg/SVGAngle.h
Source/WebCore/svg/SVGAngleValue.h
Source/WebCore/svg/SVGAnimateMotionElement.cpp
Source/WebCore/svg/SVGAnimatedAngle.cpp
Source/WebCore/svg/SVGAnimatedBoolean.cpp
Source/WebCore/svg/SVGAnimatedColor.cpp
Source/WebCore/svg/SVGAnimatedEnumeration.cpp
Source/WebCore/svg/SVGAnimatedInteger.cpp
Source/WebCore/svg/SVGAnimatedIntegerOptionalInteger.cpp
Source/WebCore/svg/SVGAnimatedLength.cpp
Source/WebCore/svg/SVGAnimatedLengthList.cpp
Source/WebCore/svg/SVGAnimatedNumber.cpp
Source/WebCore/svg/SVGAnimatedNumberList.cpp
Source/WebCore/svg/SVGAnimatedNumberOptionalNumber.cpp
Source/WebCore/svg/SVGAnimatedPath.cpp
Source/WebCore/svg/SVGAnimatedPointList.cpp
Source/WebCore/svg/SVGAnimatedPreserveAspectRatio.cpp
Source/WebCore/svg/SVGAnimatedRect.cpp
Source/WebCore/svg/SVGAnimatedString.cpp
Source/WebCore/svg/SVGAnimatedTransformList.cpp
Source/WebCore/svg/SVGLength.h
Source/WebCore/svg/SVGLengthListValues.h
Source/WebCore/svg/SVGMarkerElement.h
Source/WebCore/svg/SVGMarkerTypes.h [new file with mode: 0644]
Source/WebCore/svg/SVGMatrix.h
Source/WebCore/svg/SVGNumber.h
Source/WebCore/svg/SVGNumberListValues.h
Source/WebCore/svg/SVGParserUtilities.cpp
Source/WebCore/svg/SVGParserUtilities.h
Source/WebCore/svg/SVGPathByteStream.h
Source/WebCore/svg/SVGPathUtilities.cpp
Source/WebCore/svg/SVGPoint.h
Source/WebCore/svg/SVGPointListValues.h
Source/WebCore/svg/SVGPolyElement.cpp
Source/WebCore/svg/SVGPreserveAspectRatio.h
Source/WebCore/svg/SVGPreserveAspectRatioValue.cpp
Source/WebCore/svg/SVGPreserveAspectRatioValue.h
Source/WebCore/svg/SVGRect.h
Source/WebCore/svg/SVGRectTraits.h [deleted file]
Source/WebCore/svg/SVGTransform.h
Source/WebCore/svg/SVGTransformListValues.h
Source/WebCore/svg/properties/SVGPropertyTearOff.h
Source/WebCore/svg/properties/SVGPropertyTraits.h

index 3d583e6..8c37909 100644 (file)
@@ -1,3 +1,135 @@
+2018-02-19  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        Add SVGPropertyTraits::fromString() to all the SVG animated types
+        https://bugs.webkit.org/show_bug.cgi?id=182901
+
+        Reviewed by Dean Jackson.
+
+        This is a work toward https://bugs.webkit.org/show_bug.cgi?id=168586. The
+        goal is is to templatize the SVGAnimatedType class and to use SVGPropertyTraits
+        methods inside the template functions.
+
+        * WebCore.xcodeproj/project.pbxproj: Move the enum and the SVGPropertyTraits
+        from SVGMarkerElement.h to SVGMarkerTypes.h.
+        * svg/SVGAngle.h:
+        (WebCore::SVGAngle::SVGAngle): Delete unused constructor and create() method.
+        * svg/SVGAngleValue.h:
+        * svg/SVGAnimateMotionElement.cpp:
+        (WebCore::parsePoint): Deleted. Move this function to SVGParserUtilities.cpp
+        * svg/SVGAnimatedAngle.cpp:
+        (WebCore::SVGAnimatedAngleAnimator::constructFromString): Use SVGPropertyTraits::fromString().
+        * svg/SVGAnimatedBoolean.cpp:
+        (WebCore::SVGAnimatedBooleanAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedColor.cpp:
+        (WebCore::SVGAnimatedColorAnimator::constructFromString): Ditto.
+        (WebCore::SVGAnimatedColorAnimator::addAnimatedTypes): Use const.
+        (WebCore::SVGAnimatedColorAnimator::calculateAnimatedValue): Ditto.
+        * svg/SVGAnimatedEnumeration.cpp:
+        (WebCore::SVGAnimatedEnumerationAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedInteger.cpp:
+        (WebCore::SVGAnimatedIntegerAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedIntegerOptionalInteger.cpp:
+        (WebCore::SVGAnimatedIntegerOptionalIntegerAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedLength.cpp:
+        * svg/SVGAnimatedLengthList.cpp:
+        (WebCore::SVGAnimatedLengthListAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedNumber.cpp:
+        (WebCore::SVGAnimatedNumberAnimator::constructFromString): Ditto
+        (WebCore::parseNumberFromString):
+        * svg/SVGAnimatedNumberList.cpp:
+        (WebCore::SVGAnimatedNumberListAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedNumberOptionalNumber.cpp:
+        (WebCore::SVGAnimatedNumberOptionalNumberAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedPath.cpp:
+        (WebCore::SVGAnimatedPathAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedPointList.cpp:
+        (WebCore::SVGAnimatedPointListAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedPreserveAspectRatio.cpp:
+        (WebCore::SVGAnimatedPreserveAspectRatioAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedRect.cpp:
+        (WebCore::SVGAnimatedRectAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedString.cpp:
+        (WebCore::SVGAnimatedStringAnimator::constructFromString): Ditto.
+        * svg/SVGAnimatedTransformList.cpp:
+        (WebCore::SVGAnimatedTransformListAnimator::constructFromString): Ditto.
+        * svg/SVGLength.h:
+        (WebCore::SVGLength::SVGLength): Delete unused constructor and create() method.
+        * svg/SVGLengthListValues.h:
+        (WebCore::SVGPropertyTraits<SVGLengthListValues>::fromString): New SVGPropertyTraits method.
+        (WebCore::SVGPropertyTraits<SVGLengthListValues>::parse): Ditto.
+        * svg/SVGMarkerElement.h:
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::highestEnumValue): Deleted.
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::toString): Deleted.
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::fromString): Deleted.
+        (WebCore::SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue): Deleted.
+        (WebCore::SVGPropertyTraits<SVGMarkerOrientType>::highestEnumValue): Deleted.
+        (WebCore::SVGPropertyTraits<SVGMarkerOrientType>::fromString): Deleted.
+        * svg/SVGMarkerTypes.h: Added.
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::highestEnumValue):
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::toString):
+        (WebCore::SVGPropertyTraits<SVGMarkerUnitsType>::fromString):
+        (WebCore::SVGPropertyTraits<SVGMarkerOrientType>::highestEnumValue):
+        (WebCore::SVGPropertyTraits<SVGMarkerOrientType>::fromString):
+        (WebCore::SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue):
+        * svg/SVGMatrix.h: Delete unused constructor and create method.
+        * svg/SVGNumber.h:
+        (WebCore::SVGNumber::SVGNumber): Ditto.
+        * svg/SVGNumberListValues.h:
+        (WebCore::SVGPropertyTraits<SVGNumberListValues>::fromString): New SVGPropertyTraits method.
+        * svg/SVGParserUtilities.cpp:
+        (WebCore::parsePoint): This is moved from SVGAnimateMotionElement.cpp
+        * svg/SVGParserUtilities.h:
+        * svg/SVGPathByteStream.h:
+        (WebCore::SVGPathByteStream::SVGPathByteStream):
+        (WebCore::SVGPathByteStream::operator=): Add copy and move assignment operators.
+        (WebCore::SVGPathByteStream::copy const): Use the copy assignment.
+        (WebCore::SVGPathByteStream::isEmpty const): Use Data.isEmpty().
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::initialValue): New SVGPropertyTraits method.
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::fromString): Ditto.
+        * svg/SVGPathUtilities.cpp:
+        (WebCore::addToSVGPathByteStream): Answer Simon's questions which were added in r190844.
+        * svg/SVGPoint.h:
+        (WebCore::SVGPoint::SVGPoint): Delete unused constructor and create method.
+        * svg/SVGPointListValues.h:
+        (WebCore::SVGPropertyTraits<SVGPointListValues>::fromString): New SVGPropertyTraits method.
+        * svg/SVGPolyElement.cpp:
+        (WebCore::SVGPolyElement::parseAttribute): Use the move assignment operator.
+        * svg/SVGPreserveAspectRatio.h:
+        (WebCore::SVGPreserveAspectRatio::SVGPreserveAspectRatio): Delete unused constructor and create method.
+        * svg/SVGPreserveAspectRatioValue.cpp:
+        (WebCore::SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue): Add new constructor.
+        * svg/SVGPreserveAspectRatioValue.h:
+        (WebCore::SVGPropertyTraits<SVGPreserveAspectRatioValue>::fromString): New SVGPropertyTraits method.
+        (WebCore::SVGPropertyTraits<SVGPreserveAspectRatioValue>::toString): Ditto.
+        * svg/SVGRect.h:
+        (WebCore::SVGRect::SVGRect): Delete unused constructor and create method.
+        * svg/SVGRectTraits.h: Removed.
+        * svg/SVGTransform.h:
+        (WebCore::SVGTransform::SVGTransform): Delete unused constructor and create method.
+        * svg/SVGTransformListValues.h:
+        (WebCore::SVGPropertyTraits<SVGTransformListValues>::fromString): New SVGPropertyTraits method.
+        * svg/properties/SVGPropertyTearOff.h: Delete unused create method.
+        * svg/properties/SVGPropertyTraits.h: New SVGPropertyTraits methods.
+        (WebCore::SVGPropertyTraits<bool>::fromString): 
+        (WebCore::SVGPropertyTraits<Color>::initialValue):
+        (WebCore::SVGPropertyTraits<Color>::fromString):
+        (WebCore::SVGPropertyTraits<Color>::parse):
+        (WebCore::SVGPropertyTraits<Color>::toString):
+        (WebCore::SVGPropertyTraits<int>::fromString):
+        (WebCore::SVGPropertyTraits<float>::fromString):
+        (WebCore::SVGPropertyTraits<float>::parse):
+        (WebCore::SVGPropertyTraits<FloatPoint>::initialValue):
+        (WebCore::SVGPropertyTraits<FloatPoint>::fromString):
+        (WebCore::SVGPropertyTraits<FloatPoint>::parse):
+        (WebCore::SVGPropertyTraits<FloatPoint>::toString):
+        (WebCore::SVGPropertyTraits<FloatRect>::initialValue):
+        (WebCore::SVGPropertyTraits<FloatRect>::fromString):
+        (WebCore::SVGPropertyTraits<FloatRect>::parse):
+        (WebCore::SVGPropertyTraits<FloatRect>::toString):
+        (WebCore::SVGPropertyTraits<String>::fromString):
+        (WebCore::SVGPropertyTraits<String>::parse):
+        (WebCore::SVGPropertyTraits<String>::toString):
+
 2018-02-19  Antoine Quint  <graouts@apple.com>
 
         [Modern Media Controls] Implement a compact set of media controls
index f091c71..b1dc873 100644 (file)
                7CE191791F2ABE7100272F78 /* JSFetchRequestMode.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE1916C1F2AB70A00272F78 /* JSFetchRequestMode.h */; };
                7CE1917B1F2ABE7100272F78 /* JSFetchRequestRedirect.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE1916A1F2AB70600272F78 /* JSFetchRequestRedirect.h */; };
                7CE58D4A1DD64A5B00128552 /* SVGPoint.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE58D491DD64A5B00128552 /* SVGPoint.h */; };
-               7CE58D4E1DD694FE00128552 /* SVGRectTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE58D4D1DD694FE00128552 /* SVGRectTraits.h */; };
                7CE58D501DD69A1E00128552 /* SVGNumber.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE58D4F1DD69A1E00128552 /* SVGNumber.h */; };
                7CE58D581DD7D96D00128552 /* SVGTransformValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE58D561DD7D96D00128552 /* SVGTransformValue.h */; };
                7CE58D5C1DD7EC9C00128552 /* SVGMatrixValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 7CE58D5B1DD7EC9C00128552 /* SVGMatrixValue.h */; };
                B2227A4B0D00BF220071B782 /* SVGMetadataElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278B50D00BF200071B782 /* SVGMetadataElement.h */; };
                B2227A4E0D00BF220071B782 /* SVGMPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278B80D00BF200071B782 /* SVGMPathElement.h */; };
                B2227A510D00BF220071B782 /* SVGNumberList.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278BB0D00BF200071B782 /* SVGNumberList.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               B2227A570D00BF220071B782 /* SVGParserUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C10D00BF200071B782 /* SVGParserUtilities.h */; };
+               B2227A570D00BF220071B782 /* SVGParserUtilities.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C10D00BF200071B782 /* SVGParserUtilities.h */; settings = {ATTRIBUTES = (Private, ); }; };
                B2227A590D00BF220071B782 /* SVGPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C30D00BF200071B782 /* SVGPathElement.h */; };
                B2227A5B0D00BF220071B782 /* SVGPathSeg.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C50D00BF200071B782 /* SVGPathSeg.h */; };
                B2227A5E0D00BF220071B782 /* SVGPathSegArc.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C80D00BF200071B782 /* SVGPathSegArc.h */; };
                53ED3FDD167A88E7006762E6 /* JSInternalSettingsGenerated.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSInternalSettingsGenerated.h; sourceTree = "<group>"; };
                550A0BC7085F6039007353D6 /* QualifiedName.cpp */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QualifiedName.cpp; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
                550A0BC8085F6039007353D6 /* QualifiedName.h */ = {isa = PBXFileReference; fileEncoding = 30; indentWidth = 4; lastKnownFileType = sourcecode.c.h; path = QualifiedName.h; sourceTree = "<group>"; tabWidth = 8; usesTabs = 0; };
+               55137B2C20379E550001004B /* SVGMarkerTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGMarkerTypes.h; sourceTree = "<group>"; };
                554675771FD1FC1A003B10B0 /* ImageSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = ImageSource.cpp; sourceTree = "<group>"; };
                554675781FD1FC1A003B10B0 /* ImageSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ImageSource.h; sourceTree = "<group>"; };
                5550CB411E955E3C00111AA0 /* ImageTypes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageTypes.h; sourceTree = "<group>"; };
                7CE1916E1F2AB70D00272F7B /* JSCacheQueryOptions.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSCacheQueryOptions.cpp; sourceTree = "<group>"; };
                7CE1916F1F2AB70F00272F78 /* JSFetchRequestRedirect.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSFetchRequestRedirect.cpp; sourceTree = "<group>"; };
                7CE58D491DD64A5B00128552 /* SVGPoint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPoint.h; sourceTree = "<group>"; };
-               7CE58D4D1DD694FE00128552 /* SVGRectTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGRectTraits.h; sourceTree = "<group>"; };
                7CE58D4F1DD69A1E00128552 /* SVGNumber.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGNumber.h; sourceTree = "<group>"; };
                7CE58D511DD7B09300128552 /* SVGLength.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLength.h; sourceTree = "<group>"; };
                7CE58D521DD7B09300128552 /* SVGLengthValue.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGLengthValue.cpp; sourceTree = "<group>"; };
                                B22278AD0D00BF200071B782 /* SVGMarkerElement.cpp */,
                                B22278AE0D00BF200071B782 /* SVGMarkerElement.h */,
                                B22278AF0D00BF200071B782 /* SVGMarkerElement.idl */,
+                               55137B2C20379E550001004B /* SVGMarkerTypes.h */,
                                B22278B00D00BF200071B782 /* SVGMaskElement.cpp */,
                                B22278B10D00BF200071B782 /* SVGMaskElement.h */,
                                B22278B20D00BF200071B782 /* SVGMaskElement.idl */,
                                B22279070D00BF210071B782 /* SVGRectElement.cpp */,
                                B22279080D00BF210071B782 /* SVGRectElement.h */,
                                B22279090D00BF210071B782 /* SVGRectElement.idl */,
-                               7CE58D4D1DD694FE00128552 /* SVGRectTraits.h */,
                                B222790A0D00BF210071B782 /* SVGRenderingIntent.h */,
                                B222790B0D00BF210071B782 /* SVGRenderingIntent.idl */,
                                B222790C0D00BF210071B782 /* SVGScriptElement.cpp */,
                                B2227A9A0D00BF220071B782 /* SVGRadialGradientElement.h in Headers */,
                                08EDE19F12A50B8E00B95797 /* SVGRect.h in Headers */,
                                B2227A9E0D00BF220071B782 /* SVGRectElement.h in Headers */,
-                               7CE58D4E1DD694FE00128552 /* SVGRectTraits.h in Headers */,
                                197B180C1506353200E4ADA8 /* SVGRenderingContext.h in Headers */,
                                B2227AA00D00BF220071B782 /* SVGRenderingIntent.h in Headers */,
                                BC2274790E8366E200E7F975 /* SVGRenderStyle.h in Headers */,
index 0432943..c02fa04 100644 (file)
@@ -42,11 +42,6 @@ public:
         return adoptRef(*new SVGAngle(initialValue));
     }
 
-    static Ref<SVGAngle> create(const SVGAngleValue* initialValue)
-    {
-        return adoptRef(*new SVGAngle(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGAngle>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -145,11 +140,6 @@ private:
         : SVGPropertyTearOff<SVGAngleValue>(initialValue)
     {
     }
-
-    explicit SVGAngle(const SVGAngleValue* initialValue)
-        : SVGPropertyTearOff<SVGAngleValue>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index 3707507..4d402f7 100644 (file)
@@ -56,7 +56,8 @@ private:
     float m_valueInSpecifiedUnits { 0 };
 };
 
-template<> struct SVGPropertyTraits<SVGAngleValue> {
+template<>
+struct SVGPropertyTraits<SVGAngleValue> {
     static SVGAngleValue initialValue() { return SVGAngleValue(); }
     static String toString(const SVGAngleValue& type) { return type.valueAsString(); }
 };
index 966f463..a9be9f1 100644 (file)
@@ -136,31 +136,6 @@ void SVGAnimateMotionElement::updateAnimationPath()
     updateAnimationMode();
 }
 
-static bool parsePoint(const String& s, FloatPoint& point)
-{
-    if (s.isEmpty())
-        return false;
-    auto upconvertedCharacters = StringView(s).upconvertedCharacters();
-    const UChar* cur = upconvertedCharacters;
-    const UChar* end = cur + s.length();
-    
-    if (!skipOptionalSVGSpaces(cur, end))
-        return false;
-    
-    float x = 0;
-    if (!parseNumber(cur, end, x))
-        return false;
-    
-    float y = 0;
-    if (!parseNumber(cur, end, y))
-        return false;
-    
-    point = FloatPoint(x, y);
-    
-    // disallow anything except spaces at the end
-    return !skipOptionalSVGSpaces(cur, end);
-}
-    
 void SVGAnimateMotionElement::resetAnimatedType()
 {
     if (!hasValidAttributeType())
index c573255..766f831 100644 (file)
@@ -32,17 +32,8 @@ SVGAnimatedAngleAnimator::SVGAnimatedAngleAnimator(SVGAnimationElement* animatio
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedAngleAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createAngleAndEnumeration(std::make_unique<std::pair<SVGAngleValue, unsigned>>());
-    auto& animatedPair = animatedType->angleAndEnumeration();
-
-    SVGAngleValue angle;
-    SVGMarkerOrientType orientType = SVGPropertyTraits<SVGMarkerOrientType>::fromString(string, angle);
-    if (orientType > 0)
-        animatedPair.second = orientType;
-    if (orientType == SVGMarkerOrientAngle)
-        animatedPair.first = angle;
-
-    return animatedType;
+    auto values = SVGPropertyTraits<std::pair<SVGAngleValue, unsigned>>::fromString(string);
+    return SVGAnimatedType::createAngleAndEnumeration(std::make_unique<std::pair<SVGAngleValue, unsigned>>(values));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedAngleAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index ec0842a..f452c9c 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
@@ -31,9 +32,8 @@ SVGAnimatedBooleanAnimator::SVGAnimatedBooleanAnimator(SVGAnimationElement* anim
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedBooleanAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createBoolean(std::make_unique<bool>());
-    animatedType->boolean() = (string == "true"); // wat?
-    return animatedType;
+    auto value = SVGPropertyTraits<bool>::fromString(string);
+    return SVGAnimatedType::createBoolean(std::make_unique<bool>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedBooleanAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 1670ffb..fd02342 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
@@ -33,7 +34,8 @@ SVGAnimatedColorAnimator::SVGAnimatedColorAnimator(SVGAnimationElement& animatio
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedColorAnimator::constructFromString(const String& string)
 {
-    return SVGAnimatedType::createColor(std::make_unique<Color>(CSSParser::parseColor(string.stripWhiteSpace())));
+    auto value = SVGPropertyTraits<Color>::fromString(string);
+    return SVGAnimatedType::createColor(std::make_unique<Color>(value));
 }
 
 void SVGAnimatedColorAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
@@ -44,7 +46,7 @@ void SVGAnimatedColorAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimat
     ASSERT(to->type() == AnimatedColor);
 
     // Ignores any alpha and sets alpha on result to 100% opaque.
-    auto& fromColor = from->color();
+    const auto& fromColor = from->color();
     auto& toColor = to->color();
     toColor = { roundAndClampColorChannel(toColor.red() + fromColor.red()),
         roundAndClampColorChannel(toColor.green() + fromColor.green()),
@@ -82,7 +84,7 @@ void SVGAnimatedColorAnimator::calculateAnimatedValue(float percentage, unsigned
     if (m_animationElement->toPropertyValueType() == CurrentColorValue)
         toColor = currentColor(*m_contextElement);
 
-    auto& toAtEndOfDurationColor = toAtEndOfDuration->color();
+    const auto& toAtEndOfDurationColor = toAtEndOfDuration->color();
     auto& animatedColor = animated->color();
 
     // FIXME: ExtendedColor - this will need to handle blending between colors in different color spaces,
index c107929..c334e51 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2012. All rights reserved.
+ * Copyright (C) 2018 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
@@ -109,9 +110,8 @@ SVGAnimatedEnumerationAnimator::SVGAnimatedEnumerationAnimator(SVGAnimationEleme
 std::unique_ptr<SVGAnimatedType> SVGAnimatedEnumerationAnimator::constructFromString(const String& string)
 {
     ASSERT(m_animationElement);
-    auto animatedType = SVGAnimatedType::createEnumeration(std::make_unique<unsigned>());
-    animatedType->enumeration() = enumerationValueForTargetAttribute(m_animationElement->targetElement(), m_animationElement->attributeName(), string);
-    return animatedType;
+    auto value = enumerationValueForTargetAttribute(m_animationElement->targetElement(), m_animationElement->attributeName(), string);
+    return SVGAnimatedType::createEnumeration(std::make_unique<unsigned>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedEnumerationAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index c3f8c8e..4ef12f4 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
@@ -33,9 +34,8 @@ SVGAnimatedIntegerAnimator::SVGAnimatedIntegerAnimator(SVGAnimationElement* anim
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedIntegerAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createInteger(std::make_unique<int>());
-    animatedType->integer() = string.toIntStrict();
-    return animatedType;
+    auto value = SVGPropertyTraits<int>::fromString(string);
+    return SVGAnimatedType::createInteger(std::make_unique<int>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedIntegerAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 5b567ed..10634b2 100644 (file)
@@ -33,18 +33,8 @@ SVGAnimatedIntegerOptionalIntegerAnimator::SVGAnimatedIntegerOptionalIntegerAnim
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedIntegerOptionalIntegerAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createIntegerOptionalInteger(std::make_unique<std::pair<int, int>>());
-    std::pair<int, int>& animatedInteger = animatedType->integerOptionalInteger();
-    float firstNumber = 0;
-    float secondNumber = 0;
-    if (!parseNumberOptionalNumber(string, firstNumber, secondNumber)) {
-        animatedInteger.first = 0;
-        animatedInteger.second = 0;
-    } else {
-        animatedInteger.first = static_cast<int>(roundf(firstNumber));
-        animatedInteger.second = static_cast<int>(roundf(secondNumber));
-    }
-    return animatedType;
+    auto values = SVGPropertyTraits<std::pair<int, int>>::fromString(string);
+    return SVGAnimatedType::createIntegerOptionalInteger(std::make_unique<std::pair<int, int>>(values));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedIntegerOptionalIntegerAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 25cf3f3..f80b650 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
index 95ffb6a..636d0e5 100644 (file)
@@ -33,9 +33,8 @@ SVGAnimatedLengthListAnimator::SVGAnimatedLengthListAnimator(SVGAnimationElement
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthListAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createLengthList(std::make_unique<SVGLengthListValues>());
-    animatedType->lengthList().parse(string, m_lengthMode);
-    return animatedType;
+    auto value = SVGPropertyTraits<SVGLengthListValues>::fromString(string, m_lengthMode);
+    return SVGAnimatedType::createLengthList(std::make_unique<SVGLengthListValues>(WTFMove(value)));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedLengthListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 4f1ea9a..3cdf571 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
@@ -32,11 +33,8 @@ SVGAnimatedNumberAnimator::SVGAnimatedNumberAnimator(SVGAnimationElement* animat
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createNumber(std::make_unique<float>());
-    float& animatedNumber = animatedType->number();
-    if (!parseNumberFromString(string, animatedNumber))
-        animatedNumber = 0;
-    return animatedType;
+    auto value = SVGPropertyTraits<float>::fromString(string);
+    return SVGAnimatedType::createNumber(std::make_unique<float>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
@@ -74,9 +72,7 @@ void SVGAnimatedNumberAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnima
 
 static float parseNumberFromString(SVGAnimationElement*, const String& string)
 {
-    float number = 0;
-    parseNumberFromString(string, number);
-    return number;
+    return SVGPropertyTraits<float>::fromString(string);
 }
 
 void SVGAnimatedNumberAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
index 87f973a..cbaddef 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ * Copyright (C) 2018 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
@@ -32,9 +33,8 @@ SVGAnimatedNumberListAnimator::SVGAnimatedNumberListAnimator(SVGAnimationElement
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberListAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createNumberList(std::make_unique<SVGNumberListValues>());
-    animatedType->numberList().parse(string);
-    return animatedType;
+    auto values = SVGPropertyTraits<SVGNumberListValues>::fromString(string);
+    return SVGAnimatedType::createNumberList(std::make_unique<SVGNumberListValues>(WTFMove(values)));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 3c4ca86..be0ac8f 100644 (file)
@@ -33,13 +33,8 @@ SVGAnimatedNumberOptionalNumberAnimator::SVGAnimatedNumberOptionalNumberAnimator
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberOptionalNumberAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createNumberOptionalNumber(std::make_unique<std::pair<float, float>>());
-    std::pair<float, float>& animatedNumber = animatedType->numberOptionalNumber();
-    if (!parseNumberOptionalNumber(string, animatedNumber.first, animatedNumber.second)) {
-        animatedNumber.first = 0;
-        animatedNumber.second = 0;
-    }
-    return animatedType;
+    auto values = SVGPropertyTraits<std::pair<float, float>>::fromString(string);
+    return SVGAnimatedType::createNumberOptionalNumber(std::make_unique<std::pair<float, float>>(values));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedNumberOptionalNumberAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index a33a149..0fe82cd 100644 (file)
@@ -22,7 +22,6 @@
 
 #include "SVGAnimateElementBase.h"
 #include "SVGAnimatedPathSegListPropertyTearOff.h"
-#include "SVGPathUtilities.h"
 
 namespace WebCore {
 
@@ -33,9 +32,8 @@ SVGAnimatedPathAnimator::SVGAnimatedPathAnimator(SVGAnimationElement* animationE
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPathAnimator::constructFromString(const String& string)
 {
-    auto byteStream = std::make_unique<SVGPathByteStream>();
-    buildSVGPathByteStreamFromString(string, *byteStream, UnalteredParsing);
-    return SVGAnimatedType::createPath(WTFMove(byteStream));
+    auto value = SVGPropertyTraits<SVGPathByteStream>::fromString(string);
+    return SVGAnimatedType::createPath(std::make_unique<SVGPathByteStream>(WTFMove(value)));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPathAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 5f0780d..2093669 100644 (file)
@@ -34,9 +34,8 @@ SVGAnimatedPointListAnimator::SVGAnimatedPointListAnimator(SVGAnimationElement*
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPointListAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createPointList(std::make_unique<SVGPointListValues>());
-    pointsListFromSVGData(animatedType->pointList(), string);
-    return animatedType;
+    auto values = SVGPropertyTraits<SVGPointListValues>::fromString(string);
+    return SVGAnimatedType::createPointList(std::make_unique<SVGPointListValues>(WTFMove(values)));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPointListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 801025b..5f4824e 100644 (file)
@@ -31,9 +31,8 @@ SVGAnimatedPreserveAspectRatioAnimator::SVGAnimatedPreserveAspectRatioAnimator(S
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPreserveAspectRatioAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createPreserveAspectRatio(std::make_unique<SVGPreserveAspectRatioValue>());
-    animatedType->preserveAspectRatio().parse(string);
-    return animatedType;
+    auto value = SVGPropertyTraits<SVGPreserveAspectRatioValue>::fromString(string);
+    return SVGAnimatedType::createPreserveAspectRatio(std::make_unique<SVGPreserveAspectRatioValue>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedPreserveAspectRatioAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index b94abf5..050f950 100644 (file)
@@ -32,9 +32,8 @@ SVGAnimatedRectAnimator::SVGAnimatedRectAnimator(SVGAnimationElement* animationE
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedRectAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createRect(std::make_unique<FloatRect>());
-    parseRect(string, animatedType->rect());
-    return animatedType;
+    auto value = SVGPropertyTraits<FloatRect>::fromString(string);
+    return SVGAnimatedType::createRect(std::make_unique<FloatRect>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedRectAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 6985ecb..e1a77a5 100644 (file)
@@ -31,9 +31,8 @@ SVGAnimatedStringAnimator::SVGAnimatedStringAnimator(SVGAnimationElement* animat
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedStringAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createString(std::make_unique<String>());
-    animatedType->string() = string;
-    return animatedType;
+    auto value = SVGPropertyTraits<String>::fromString(string);
+    return SVGAnimatedType::createString(std::make_unique<String>(value));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedStringAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index 20356e0..bd0d5d1 100644 (file)
@@ -41,10 +41,9 @@ SVGAnimatedTransformListAnimator::SVGAnimatedTransformListAnimator(SVGAnimationE
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedTransformListAnimator::constructFromString(const String& string)
 {
-    auto animatedType = SVGAnimatedType::createTransformList(std::make_unique<SVGTransformListValues>());
-    animatedType->transformList().parse(m_transformTypeString + string + ')');
-    ASSERT(animatedType->transformList().size() <= 1);
-    return animatedType;
+    auto values = SVGPropertyTraits<SVGTransformListValues>::fromString(m_transformTypeString + string + ')');
+    ASSERT(values.size() <= 1);
+    return SVGAnimatedType::createTransformList(std::make_unique<SVGTransformListValues>(WTFMove(values)));
 }
 
 std::unique_ptr<SVGAnimatedType> SVGAnimatedTransformListAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
index cc89110..94529d2 100644 (file)
@@ -57,11 +57,6 @@ public:
         return adoptRef(*new SVGLength(initialValue));
     }
 
-    static Ref<SVGLength> create(const SVGLengthValue* initialValue)
-    {
-        return adoptRef(*new SVGLength(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGLength>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -162,11 +157,6 @@ private:
         : SVGPropertyTearOff<SVGLengthValue>(initialValue)
     {
     }
-
-    explicit SVGLength(const SVGLengthValue* initialValue)
-        : SVGPropertyTearOff<SVGLengthValue>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index fdc839f..b072860 100644 (file)
@@ -34,13 +34,26 @@ public:
     String valueAsString() const;
 };
 
-template<> struct SVGPropertyTraits<SVGLengthListValues> {
+template<>
+struct SVGPropertyTraits<SVGLengthListValues> {
+    static SVGLengthListValues initialValue() { return { }; }
+    static SVGLengthListValues fromString(const String& string, SVGLengthMode lengthMode)
+    {
+        SVGLengthListValues list;
+        list.parse(string, lengthMode);
+        return list;
+    }
+    static std::optional<SVGLengthListValues> parse(const QualifiedName& attrName, const String& string)
+    {
+        SVGLengthListValues list;
+        list.parse(string, SVGLengthValue::lengthModeForAnimatedLengthAttribute(attrName));
+        return list;
+    }
+    static String toString(const SVGLengthListValues& type) { return type.valueAsString(); }
+
     using ListItemType = SVGLengthValue;
     using ListItemTearOff = SVGLength;
     using ListPropertyTearOff = SVGLengthList;
-
-    static SVGLengthListValues initialValue() { return  { }; }
-    static String toString(const SVGLengthListValues& type) { return type.valueAsString(); }
 };
 
 } // namespace WebCore
index c757d1d..87f4f1a 100644 (file)
 #include "SVGElement.h"
 #include "SVGExternalResourcesRequired.h"
 #include "SVGFitToViewBox.h"
+#include "SVGMarkerTypes.h"
 
 namespace WebCore {
 
-enum SVGMarkerUnitsType {
-    SVGMarkerUnitsUnknown = 0,
-    SVGMarkerUnitsUserSpaceOnUse,
-    SVGMarkerUnitsStrokeWidth
-};
-
-enum SVGMarkerOrientType {
-    SVGMarkerOrientUnknown = 0,
-    SVGMarkerOrientAuto,
-    SVGMarkerOrientAngle,
-    SVGMarkerOrientAutoStartReverse,
-
-    // Add new elements before here.
-    SVGMarkerOrientMax
-};
-
-template<>
-struct SVGPropertyTraits<SVGMarkerUnitsType> {
-    static unsigned highestEnumValue() { return SVGMarkerUnitsStrokeWidth; }
-
-    static String toString(SVGMarkerUnitsType type)
-    {
-        switch (type) {
-        case SVGMarkerUnitsUnknown:
-            return emptyString();
-        case SVGMarkerUnitsUserSpaceOnUse:
-            return ASCIILiteral("userSpaceOnUse");
-        case SVGMarkerUnitsStrokeWidth:
-            return ASCIILiteral("strokeWidth");
-        }
-
-        ASSERT_NOT_REACHED();
-        return emptyString();
-    }
-
-    static SVGMarkerUnitsType fromString(const String& value)
-    {
-        if (value == "userSpaceOnUse")
-            return SVGMarkerUnitsUserSpaceOnUse;
-        if (value == "strokeWidth")
-            return SVGMarkerUnitsStrokeWidth;
-        return SVGMarkerUnitsUnknown;
-    }
-};
-
-template<>
-inline unsigned SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue() { return SVGMarkerOrientAngle; }
-
-template<> struct SVGPropertyTraits<SVGMarkerOrientType> {
-    static unsigned highestEnumValue() { return SVGMarkerOrientAutoStartReverse; }
-
-    // toString is not needed, synchronizeOrientType() handles this on its own.
-
-    static SVGMarkerOrientType fromString(const String& value, SVGAngleValue& angle)
-    {
-        if (value == "auto")
-            return SVGMarkerOrientAuto;
-        if (value == "auto-start-reverse")
-            return SVGMarkerOrientAutoStartReverse;
-        auto setValueResult = angle.setValueAsString(value);
-        if (setValueResult.hasException())
-            return SVGMarkerOrientUnknown;
-        return SVGMarkerOrientAngle;
-    }
-};
-
 class SVGMarkerElement final : public SVGElement,
                                public SVGExternalResourcesRequired,
                                public SVGFitToViewBox {
diff --git a/Source/WebCore/svg/SVGMarkerTypes.h b/Source/WebCore/svg/SVGMarkerTypes.h
new file mode 100644 (file)
index 0000000..476f503
--- /dev/null
@@ -0,0 +1,107 @@
+/*
+ * Copyright (C) 2018 Apple Inc.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+ * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+ * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
+ * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#pragma once
+
+#include "SVGAngleValue.h"
+#include "SVGPropertyTraits.h"
+
+namespace WebCore {
+
+enum SVGMarkerUnitsType {
+    SVGMarkerUnitsUnknown = 0,
+    SVGMarkerUnitsUserSpaceOnUse,
+    SVGMarkerUnitsStrokeWidth
+};
+
+enum SVGMarkerOrientType {
+    SVGMarkerOrientUnknown = 0,
+    SVGMarkerOrientAuto,
+    SVGMarkerOrientAngle,
+    SVGMarkerOrientAutoStartReverse,
+    
+    // Add new elements before here.
+    SVGMarkerOrientMax
+};
+    
+template<>
+struct SVGPropertyTraits<SVGMarkerUnitsType> {
+    static unsigned highestEnumValue() { return SVGMarkerUnitsStrokeWidth; }
+    static String toString(SVGMarkerUnitsType type)
+    {
+        switch (type) {
+        case SVGMarkerUnitsUnknown:
+            return emptyString();
+        case SVGMarkerUnitsUserSpaceOnUse:
+            return ASCIILiteral("userSpaceOnUse");
+        case SVGMarkerUnitsStrokeWidth:
+            return ASCIILiteral("strokeWidth");
+        }
+        
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+    static SVGMarkerUnitsType fromString(const String& value)
+    {
+        if (value == "userSpaceOnUse")
+            return SVGMarkerUnitsUserSpaceOnUse;
+        if (value == "strokeWidth")
+            return SVGMarkerUnitsStrokeWidth;
+        return SVGMarkerUnitsUnknown;
+    }
+};
+
+template<>
+struct SVGPropertyTraits<SVGMarkerOrientType> {
+    static unsigned highestEnumValue() { return SVGMarkerOrientAutoStartReverse; }
+    static SVGMarkerOrientType fromString(const String& value, SVGAngleValue& angle)
+    {
+        if (value == "auto")
+            return SVGMarkerOrientAuto;
+        if (value == "auto-start-reverse")
+            return SVGMarkerOrientAutoStartReverse;
+        auto setValueResult = angle.setValueAsString(value);
+        if (setValueResult.hasException())
+            return SVGMarkerOrientUnknown;
+        return SVGMarkerOrientAngle;
+    }
+};
+
+template<>
+inline unsigned SVGIDLEnumLimits<SVGMarkerOrientType>::highestExposedEnumValue() { return SVGMarkerOrientAngle; }
+
+template<>
+struct SVGPropertyTraits<std::pair<SVGAngleValue, unsigned>> {
+    static std::pair<SVGAngleValue, unsigned> fromString(const String& string)
+    {
+        SVGAngleValue angle;
+        SVGMarkerOrientType orientType = SVGPropertyTraits<SVGMarkerOrientType>::fromString(string, angle);
+        if (orientType != SVGMarkerOrientAngle)
+            angle = { };
+        return std::pair<SVGAngleValue, unsigned>(angle, orientType);
+    }
+};
+
+} // namespace WebCore
index e24adad..772ee58 100644 (file)
@@ -43,11 +43,6 @@ public:
         return adoptRef(*new SVGMatrix(initialValue));
     }
 
-    static Ref<SVGMatrix> create(const SVGMatrixValue* initialValue)
-    {
-        return adoptRef(*new SVGMatrix(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGMatrix>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
index e12e7cc..d578014 100644 (file)
@@ -41,11 +41,6 @@ public:
         return adoptRef(*new SVGNumber(initialValue));
     }
 
-    static Ref<SVGNumber> create(const float* initialValue)
-    {
-        return adoptRef(*new SVGNumber(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGNumber>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -79,11 +74,6 @@ private:
         : SVGPropertyTearOff<float>(initialValue)
     {
     }
-
-    explicit SVGNumber(const float* initialValue)
-        : SVGPropertyTearOff<float>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index 7b4ac77..ff66184 100644 (file)
@@ -36,6 +36,12 @@ public:
 
 template<> struct SVGPropertyTraits<SVGNumberListValues> {
     static SVGNumberListValues initialValue() { return { }; }
+    static SVGNumberListValues fromString(const String& string)
+    {
+        SVGNumberListValues list;
+        list.parse(string);
+        return list;
+    }
     static String toString(const SVGNumberListValues& list) { return list.valueAsString(); }
 
     using ListItemType = float;
index 7e2d313..14069ec 100644 (file)
@@ -2,7 +2,7 @@
  * Copyright (C) 2002, 2003 The Karbon Developers
  * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
  * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org>
- * Copyright (C) 2007, 2009, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2007-2018 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
@@ -219,6 +219,31 @@ bool parseNumberOptionalNumber(const String& s, float& x, float& y)
     return cur == end;
 }
 
+bool parsePoint(const String& s, FloatPoint& point)
+{
+    if (s.isEmpty())
+        return false;
+    auto upconvertedCharacters = StringView(s).upconvertedCharacters();
+    const UChar* cur = upconvertedCharacters;
+    const UChar* end = cur + s.length();
+
+    if (!skipOptionalSVGSpaces(cur, end))
+        return false;
+
+    float x = 0;
+    if (!parseNumber(cur, end, x))
+        return false;
+
+    float y = 0;
+    if (!parseNumber(cur, end, y))
+        return false;
+
+    point = FloatPoint(x, y);
+
+    // Disallow anything except spaces at the end.
+    return !skipOptionalSVGSpaces(cur, end);
+}
+
 bool parseRect(const String& string, FloatRect& rect)
 {
     auto upconvertedCharacters = StringView(string).upconvertedCharacters();
index 3283871..677dbcc 100644 (file)
@@ -42,6 +42,7 @@ bool parseNumberFromString(const String&, float& number, bool skip = true);
 bool parseNumberOptionalNumber(const String& s, float& h, float& v);
 bool parseArcFlag(const LChar*& ptr, const LChar* end, bool& flag);
 bool parseArcFlag(const UChar*& ptr, const UChar* end, bool& flag);
+bool parsePoint(const String&, FloatPoint&);
 bool parseRect(const String&, FloatRect&);
 
 template <typename CharacterType>
index b2d8589..aa4ca3f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2018 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
@@ -19,6 +20,8 @@
 
 #pragma once
 
+#include "SVGPathUtilities.h"
+#include "SVGPropertyTraits.h"
 #include <wtf/Vector.h>
 
 namespace WebCore {
@@ -46,34 +49,47 @@ public:
     typedef Data::const_iterator DataIterator;
 
     SVGPathByteStream() { }
-    SVGPathByteStream(const Data& data) : m_data(data) { }
-    
-    bool operator==(const SVGPathByteStream& other) const
+    SVGPathByteStream(const SVGPathByteStream& other)
     {
-        return m_data == other.m_data;
+        *this = other;
     }
 
-    bool operator!=(const SVGPathByteStream& other) const
+    SVGPathByteStream(SVGPathByteStream&& other)
     {
-        return !(*this == other);
+        *this = WTFMove(other);
     }
 
+    SVGPathByteStream& operator=(const SVGPathByteStream& other)
+    {
+        if (*this == other)
+            return *this;
+        m_data = other.m_data;
+        return *this;
+    }
+
+    SVGPathByteStream& operator=(SVGPathByteStream&& other)
+    {
+        if (*this == other)
+            return *this;
+        m_data = WTFMove(other.m_data);
+        return *this;
+    }
+
+    bool operator==(const SVGPathByteStream& other) const { return m_data == other.m_data; }
+    bool operator!=(const SVGPathByteStream& other) const { return !(*this == other); }
+
     std::unique_ptr<SVGPathByteStream> copy() const
     {
-        return std::make_unique<SVGPathByteStream>(m_data);
+        return std::make_unique<SVGPathByteStream>(*this);
     }
 
     DataIterator begin() const { return m_data.begin(); }
     DataIterator end() const { return m_data.end(); }
 
     void append(unsigned char byte) { m_data.append(byte); }
-    void append(const SVGPathByteStream& other)
-    {
-        for (auto stream : other)
-            append(stream);
-    }
+    void append(const SVGPathByteStream& other) { m_data.appendVector(other.m_data); }
     void clear() { m_data.clear(); }
-    bool isEmpty() const { return !m_data.size(); }
+    bool isEmpty() const { return m_data.isEmpty(); }
     unsigned size() const { return m_data.size(); }
 
     // Only defined to let SVGAnimatedPathAnimator use the standard list code paths - this method is never called.
@@ -83,4 +99,15 @@ private:
     Data m_data;
 };
 
+template<>
+struct SVGPropertyTraits<SVGPathByteStream> {
+    static SVGPathByteStream initialValue() { return SVGPathByteStream(); }
+    static SVGPathByteStream fromString(const String& string)
+    {
+        SVGPathByteStream byteStream;
+        buildSVGPathByteStreamFromString(string, byteStream, UnalteredParsing);
+        return byteStream;
+    }
+};
+
 } // namespace WebCore
index ce4613a..cf9f014 100644 (file)
@@ -206,15 +206,15 @@ bool buildAnimatedSVGPathByteStream(const SVGPathByteStream& fromStream, const S
 
 bool addToSVGPathByteStream(SVGPathByteStream& streamToAppendTo, const SVGPathByteStream& byStream, unsigned repeatCount)
 {
-    // Why return when streamToAppendTo is empty? Don't we still need to append?
+    // The byStream will be blended with streamToAppendTo. So streamToAppendTo has to have elements.
     if (streamToAppendTo.isEmpty() || byStream.isEmpty())
         return true;
 
-    // Is it OK to make the SVGPathByteStreamBuilder from a stream, and then clear that stream?
+    // builder is the destination of blending fromSource and bySource. The stream of builder
+    // (i.e. streamToAppendTo) has to be cleared before calling addAnimatedPath.
     SVGPathByteStreamBuilder builder(streamToAppendTo);
 
-    SVGPathByteStream fromStreamCopy = streamToAppendTo;
-    streamToAppendTo.clear();
+    SVGPathByteStream fromStreamCopy = WTFMove(streamToAppendTo);
 
     SVGPathByteStreamSource fromSource(fromStreamCopy);
     SVGPathByteStreamSource bySource(byStream);
index b17686e..926c8cb 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) 2013 Samsung Electronics. All rights reserved.
+ * Copyright (C) 2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,11 +44,6 @@ public:
         return adoptRef(*new SVGPoint(initialValue));
     }
 
-    static Ref<SVGPoint> create(const FloatPoint* initialValue)
-    {
-        return adoptRef(*new SVGPoint(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGPoint>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -113,11 +109,6 @@ protected:
         : SVGPropertyTearOff<FloatPoint>(initialValue)
     {
     }
-
-    explicit SVGPoint(const FloatPoint* initialValue)
-        : SVGPropertyTearOff<FloatPoint>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index abab822..c685a5b 100644 (file)
@@ -34,8 +34,15 @@ public:
     String valueAsString() const;
 };
 
-template<> struct SVGPropertyTraits<SVGPointListValues> {
+template<>
+struct SVGPropertyTraits<SVGPointListValues> {
     static SVGPointListValues initialValue() { return { }; }
+    static SVGPointListValues fromString(const String& string)
+    {
+        SVGPointListValues list;
+        pointsListFromSVGData(list, string);
+        return list;
+    }
 
     using ListItemType = FloatPoint;
     using ListItemTearOff = SVGPoint;
index 9225dc0..afe9b55 100644 (file)
@@ -73,7 +73,7 @@ void SVGPolyElement::parseAttribute(const QualifiedName& name, const AtomicStrin
         if (auto wrapper = SVGAnimatedProperty::lookupWrapper<SVGPolyElement, SVGAnimatedPointList>(this, pointsPropertyInfo()))
             static_pointer_cast<SVGAnimatedPointList>(wrapper)->detachListWrappers(newList.size());
 
-        m_points.value = newList;
+        m_points.value = WTFMove(newList);
         return;
     }
 
index b93e43e..8839f85 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -42,11 +42,6 @@ public:
         return adoptRef(*new SVGPreserveAspectRatio(initialValue));
     }
 
-    static Ref<SVGPreserveAspectRatio> create(const SVGPreserveAspectRatioValue* initialValue)
-    {
-        return adoptRef(*new SVGPreserveAspectRatio(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGPreserveAspectRatio>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -100,11 +95,6 @@ private:
         : SVGPropertyTearOff<SVGPreserveAspectRatioValue>(initialValue)
     {
     }
-
-    explicit SVGPreserveAspectRatio(const SVGPreserveAspectRatioValue* initialValue)
-        : SVGPropertyTearOff<SVGPreserveAspectRatioValue>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index 540d520..54641af 100644 (file)
@@ -35,6 +35,11 @@ SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue()
 {
 }
 
+SVGPreserveAspectRatioValue::SVGPreserveAspectRatioValue(const String& value)
+{
+    parse(value);
+}
+
 ExceptionOr<void> SVGPreserveAspectRatioValue::setAlign(unsigned short align)
 {
     if (align == SVG_PRESERVEASPECTRATIO_UNKNOWN || align > SVG_PRESERVEASPECTRATIO_XMAXYMAX)
index a1fc114..6dca5f0 100644 (file)
@@ -52,6 +52,7 @@ public:
     };
 
     SVGPreserveAspectRatioValue();
+    SVGPreserveAspectRatioValue(const String&);
 
     ExceptionOr<void> setAlign(unsigned short);
     unsigned short align() const { return m_align; }
@@ -77,7 +78,15 @@ private:
 
 template<> struct SVGPropertyTraits<SVGPreserveAspectRatioValue> {
     static SVGPreserveAspectRatioValue initialValue() { return SVGPreserveAspectRatioValue(); }
-    static String toString(const SVGPreserveAspectRatioValue& type) { return type.valueAsString(); }
+    static SVGPreserveAspectRatioValue fromString(const String& string)
+    {
+        return SVGPreserveAspectRatioValue(string);
+
+    }
+    static String toString(const SVGPreserveAspectRatioValue& type)
+    {
+        return type.valueAsString();
+    }
 };
 
 } // namespace WebCore
index dfc9cac..5412005 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2018 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
@@ -20,7 +21,7 @@
 #pragma once
 
 #include "SVGPropertyTearOff.h"
-#include "SVGRectTraits.h"
+#include "SVGPropertyTraits.h"
 
 namespace WebCore {
 
@@ -36,11 +37,6 @@ public:
         return adoptRef(*new SVGRect(initialValue));
     }
 
-    static Ref<SVGRect> create(const FloatRect* initialValue)
-    {
-        return adoptRef(*new SVGRect(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGRect>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -122,11 +118,6 @@ private:
         : SVGPropertyTearOff<FloatRect>(initialValue)
     {
     }
-
-    explicit SVGRect(const FloatRect* initialValue)
-        : SVGPropertyTearOff<FloatRect>(initialValue)
-    {
-    }
 };
 
 
diff --git a/Source/WebCore/svg/SVGRectTraits.h b/Source/WebCore/svg/SVGRectTraits.h
deleted file mode 100644 (file)
index 7d84c6e..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- *    notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- *    notice, this list of conditions and the following disclaimer in the
- *    documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include "FloatRect.h"
-#include "SVGPropertyTraits.h"
-#include <wtf/text/StringBuilder.h>
-
-namespace WebCore {
-
-template<>
-struct SVGPropertyTraits<FloatRect> {
-    static FloatRect initialValue() { return { }; }
-    static String toString(const FloatRect& type)
-    {
-        StringBuilder builder;
-        builder.appendNumber(type.x());
-        builder.append(' ');
-        builder.appendNumber(type.y());
-        builder.append(' ');
-        builder.appendNumber(type.width());
-        builder.append(' ');
-        builder.appendNumber(type.height());
-        return builder.toString();
-    }
-};
-
-} // namespace WebCore
index 1b867a3..eff8dbc 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 Apple Inc. All rights reserved.
+ * Copyright (C) 2016-2018 Apple Inc. All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -43,11 +43,6 @@ public:
         return adoptRef(*new SVGTransform(initialValue));
     }
 
-    static Ref<SVGTransform> create(const SVGTransformValue* initialValue)
-    {
-        return adoptRef(*new SVGTransform(initialValue));
-    }
-
     template<typename T> static ExceptionOr<Ref<SVGTransform>> create(ExceptionOr<T>&& initialValue)
     {
         if (initialValue.hasException())
@@ -143,11 +138,6 @@ private:
         : SVGPropertyTearOff<SVGTransformValue>(initialValue)
     {
     }
-
-    explicit SVGTransform(const SVGTransformValue* initialValue)
-        : SVGPropertyTearOff<SVGTransformValue>(initialValue)
-    {
-    }
 };
 
 } // namespace WebCore
index 2940762..3df425b 100644 (file)
@@ -44,6 +44,12 @@ public:
 
 template<> struct SVGPropertyTraits<SVGTransformListValues> {
     static SVGTransformListValues initialValue() { return { }; }
+    static SVGTransformListValues fromString(const String& string)
+    {
+        SVGTransformListValues values;
+        values.parse(string);
+        return values;
+    }
     static String toString(const SVGTransformListValues& list) { return list.valueAsString(); }
 
     using ListItemType = SVGTransformValue;
index 6f63b16..ceb4bf3 100644 (file)
@@ -53,11 +53,6 @@ public:
         return adoptRef(*new Self(initialValue));
     }
 
-    static Ref<Self> create(const PropertyType* initialValue)
-    {
-        return adoptRef(*new Self(initialValue));
-    }
-
     template<typename U> static ExceptionOr<Ref<Self>> create(ExceptionOr<U>&& initialValue)
     {
         if (initialValue.hasException())
index afdad95..2a0b547 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 2018 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
 
 #pragma once
 
+#include "CSSParser.h"
+#include "Color.h"
+#include "FloatPoint.h"
+#include "FloatRect.h"
+#include "QualifiedName.h"
+#include "SVGParserUtilities.h"
+#include <wtf/text/StringBuilder.h>
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -30,10 +38,25 @@ struct SVGPropertyTraits { };
 template<>
 struct SVGPropertyTraits<bool> {
     static bool initialValue() { return false; }
+    static bool fromString(const String& string) { return string == "true"; }
     static String toString(bool type) { return type ? "true" : "false"; }
 };
 
 template<>
+struct SVGPropertyTraits<Color> {
+    static Color initialValue() { return Color(); }
+    static Color fromString(const String& string) { return CSSParser::parseColor(string.stripWhiteSpace()); }
+    static std::optional<Color> parse(const QualifiedName&, const String& string)
+    {
+        Color color = CSSParser::parseColor(string.stripWhiteSpace());
+        if (!color.isValid())
+            return std::nullopt;
+        return color;
+    }
+    static String toString(const Color& type) { return type.serialized(); }
+};
+
+template<>
 struct SVGPropertyTraits<unsigned> {
     static unsigned initialValue() { return 0; }
     static String toString(unsigned type) { return String::number(type); }
@@ -42,19 +65,118 @@ struct SVGPropertyTraits<unsigned> {
 template<>
 struct SVGPropertyTraits<int> {
     static int initialValue() { return 0; }
+    static int fromString(const String&string) { return string.toIntStrict(); }
     static String toString(int type) { return String::number(type); }
 };
 
 template<>
+struct SVGPropertyTraits<std::pair<int, int>> {
+    static std::pair<int, int> initialValue() { return { }; }
+    static std::pair<int, int> fromString(const String& string)
+    {
+        float firstNumber = 0, secondNumber = 0;
+        if (!parseNumberOptionalNumber(string, firstNumber, secondNumber))
+            return { };
+        return std::make_pair(static_cast<int>(roundf(firstNumber)), static_cast<int>(roundf(secondNumber)));
+    }
+};
+
+template<>
 struct SVGPropertyTraits<float> {
     static float initialValue() { return 0; }
+    static float fromString(const String& string)
+    {
+        float number = 0;
+        if (!parseNumberFromString(string, number))
+            return 0;
+        return number;
+    }
+    static std::optional<float> parse(const QualifiedName&, const String& string)
+    {
+        float number;
+        if (!parseNumberFromString(string, number))
+            return std::nullopt;
+        return number;
+    }
     static String toString(float type) { return String::number(type); }
 };
 
 template<>
+struct SVGPropertyTraits<std::pair<float, float>> {
+    static std::pair<float, float> initialValue() { return { }; }
+    static std::pair<float, float> fromString(const String& string)
+    {
+        float firstNumber = 0, secondNumber = 0;
+        if (!parseNumberOptionalNumber(string, firstNumber, secondNumber))
+            return { };
+        return std::make_pair(firstNumber, secondNumber);
+    }
+};
+
+template<>
+struct SVGPropertyTraits<FloatPoint> {
+    static FloatPoint initialValue() { return FloatPoint(); }
+    static FloatPoint fromString(const String& string)
+    {
+        FloatPoint point;
+        if (!parsePoint(string, point))
+            return { };
+        return point;
+    }
+    static std::optional<FloatPoint> parse(const QualifiedName&, const String& string)
+    {
+        FloatPoint point;
+        if (!parsePoint(string, point))
+            return std::nullopt;
+        return point;
+    }
+    static String toString(const FloatPoint& type)
+    {
+        StringBuilder builder;
+        builder.appendNumber(type.x());
+        builder.append(' ');
+        builder.appendNumber(type.y());
+        return builder.toString();
+    }
+};
+
+template<>
+struct SVGPropertyTraits<FloatRect> {
+    static FloatRect initialValue() { return FloatRect(); }
+    static FloatRect fromString(const String& string)
+    {
+        FloatRect rect;
+        if (!parseRect(string, rect))
+            return { };
+        return rect;
+    }
+    static std::optional<FloatRect> parse(const QualifiedName&, const String& string)
+    {
+        FloatRect rect;
+        if (!parseRect(string, rect))
+            return std::nullopt;
+        return rect;
+    }
+    static String toString(const FloatRect& type)
+    {
+        StringBuilder builder;
+        builder.appendNumber(type.x());
+        builder.append(' ');
+        builder.appendNumber(type.y());
+        builder.append(' ');
+        builder.appendNumber(type.width());
+        builder.append(' ');
+        builder.appendNumber(type.height());
+        return builder.toString();
+    }
+};
+
+template<>
 struct SVGPropertyTraits<String> {
     static String initialValue() { return String(); }
-    static String toString(const String& type) { return type; }
+    static String fromString(const String& string) { return string; }
+    static std::optional<String> parse(const QualifiedName&, const String& string) { return string; }
+    static String toString(const String& string) { return string; }
 };
 
 template<typename EnumType>