Remove the SVG tear off objects for SVGPathSeg, SVGPathSegList and SVGAnimatedPathSegList
authorcommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Mar 2019 18:56:05 +0000 (18:56 +0000)
committercommit-queue@webkit.org <commit-queue@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 27 Mar 2019 18:56:05 +0000 (18:56 +0000)
https://bugs.webkit.org/show_bug.cgi?id=196085

Patch by Said Abou-Hallawa <sabouhallawa@apple.com> on 2019-03-27
Reviewed by Simon Fraser.

Source/WebCore:

The SVGPathSegList is similar to the other SVGLists, e.g. SVGNUmberList
and SVGPointList except in two things:

1. Its items can be different but they are derived from the same base
   class SVGPathSeg.

2. The SVGPathSeg items are only used for DOM. When drawing or animating
   we have to have an SVGPathByteStream and convert it to a Path. Converting
   an SVGPathByteStream to SVGPathSeg items and vice versa is expensive.
   Building a Path from an SVGPathByteStream is also expensive. So an extra
   care needs to be taken for when these conversions happen.

In addition to handling the SVGPathSeg items, SVGPathSegList will manage
the associated SVGPathByteStream and Path objects. SVGPathSegList will be
lazy in getting updated objects when a change happens. For example, when
the byte stream changes, SVGPathSegList will clear its items and nullify
the Path object. But it will not build any of them until they are explicitly
requested.

Like what was done for other SVG properties when removing their tear off
objects, a new accessor, a new animator and a new animation function will
be added for the SVGAnimatedPathSegList.

All the header files of the concrete classes of SVGPathSeg will be removed
because they are small structures which hold some data items and they provide
setters and getters for these items. Here is the new file structures and
their contents:

-- SVGPathSeg.h still has the class SVGPathSeg which is now a superclass
   of SVGProperty.

-- SVGPathSegValue.h will have the template class SVGPathSegValue which
   holds an std::tuple of packed arguments. It provides setters and getters
   for these arguments. SVGPathSegValue.h will also have specialized
   classed derived from SVGPathSegValue and hold different arguments.

-- SVGPathSegImpl.h will have the final concrete SVGPathSeg classes.

Note SVGPathSeg concrete classes do not need to have a reference to the
the context SVGPathElement. SVGPathSeg will be owned by its SVGPathSegList
which will be owned by the SVGAnimatedPathSegList which will be owned by
the SVGPathElement.

* Sources.txt:
* WebCore.xcodeproj/project.pbxproj:
* bindings/js/JSSVGPathSegCustom.cpp:
* bindings/scripts/CodeGenerator.pm:
(IsSVGPathSegTypeName):
(IsSVGPathSegType):
* bindings/scripts/CodeGeneratorJS.pm:
(GenerateHeader):
* rendering/svg/SVGPathData.cpp:
(WebCore::pathFromPathElement):
* svg/SVGAnimatedPath.cpp: Removed.
* svg/SVGAnimatedPath.h: Removed.
* svg/SVGAnimatedType.h:
(WebCore::SVGAnimatedType::type const):
* svg/SVGAnimatorFactory.h:
(WebCore::SVGAnimatorFactory::create):
* svg/SVGPathByteStream.h:
(WebCore::SVGPathByteStream::SVGPathByteStream):
This constructor is used by SVGAnimationPathSegListFunction to convert
the 'form', 'to' and 'toAtEndOfDuration' strings to SVGPathByteStreams.

(WebCore::SVGPathByteStream::resize): Deleted.
(WebCore::SVGPropertyTraits<SVGPathByteStream>::initialValue): Deleted.
(WebCore::SVGPropertyTraits<SVGPathByteStream>::fromString): Deleted.
(WebCore::SVGPropertyTraits<SVGPathByteStream>::parse): Deleted.
(WebCore::SVGPropertyTraits<SVGPathByteStream>::toString): Deleted.
* svg/SVGPathElement.cpp:
(WebCore::SVGPathElement::SVGPathElement):
(WebCore::SVGPathElement::parseAttribute):
(WebCore::SVGPathElement::svgAttributeChanged):
(WebCore::SVGPathElement::getTotalLength const):
(WebCore::SVGPathElement::getPointAtLength const):
(WebCore::SVGPathElement::getPathSegAtLength const):
(WebCore::SVGPathElement::createSVGPathSegClosePath): Deleted.
(WebCore::SVGPathElement::createSVGPathSegMovetoAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegMovetoRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoCubicAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoCubicRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegArcAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegArcRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoVerticalAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegLinetoVerticalRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs): Deleted.
(WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel): Deleted.
The SVGPathSeg creation functions are moved to the header file.

(WebCore::SVGPathElement::registerAttributes): Deleted.
(WebCore::SVGPathElement::pathByteStream const): Deleted.
(WebCore::SVGPathElement::pathForByteStream const): Deleted.
(WebCore::SVGPathElement::lookupOrCreateDWrapper): Deleted.
(WebCore::SVGPathElement::animatedPropertyWillBeDeleted): Deleted.
(WebCore::SVGPathElement::pathSegList): Deleted.
(WebCore::SVGPathElement::normalizedPathSegList): Deleted.
(WebCore::SVGPathElement::animatedPathSegList): Deleted.
(WebCore::SVGPathElement::animatedNormalizedPathSegList): Deleted.
(WebCore::SVGPathElement::approximateMemoryCost const): Deleted.
(WebCore::SVGPathElement::pathSegListChanged): Deleted.
Managing the SVGPathByteStream and the drawing Path objects will be the
responsibility of SVGPathSegList.

* svg/SVGPathElement.h:
* svg/SVGPathSeg.h:
* svg/SVGPathSegArc.h: Removed.
* svg/SVGPathSegArcAbs.h: Removed.
* svg/SVGPathSegArcRel.h: Removed.
* svg/SVGPathSegClosePath.h: Removed.
* svg/SVGPathSegCurvetoCubic.h: Removed.
* svg/SVGPathSegCurvetoCubicAbs.h: Removed.
* svg/SVGPathSegCurvetoCubicRel.h: Removed.
* svg/SVGPathSegCurvetoCubicSmooth.h: Removed.
* svg/SVGPathSegCurvetoCubicSmoothAbs.h: Removed.
* svg/SVGPathSegCurvetoCubicSmoothRel.h: Removed.
* svg/SVGPathSegCurvetoQuadratic.h: Removed.
* svg/SVGPathSegCurvetoQuadraticAbs.h: Removed.
* svg/SVGPathSegCurvetoQuadraticRel.h: Removed.
* svg/SVGPathSegCurvetoQuadraticSmoothAbs.h: Removed.
* svg/SVGPathSegCurvetoQuadraticSmoothRel.h: Removed.
* svg/SVGPathSegImpl.h: Added.
* svg/SVGPathSegLinetoAbs.h: Removed.
* svg/SVGPathSegLinetoHorizontal.h: Removed.
* svg/SVGPathSegLinetoHorizontalAbs.h: Removed.
* svg/SVGPathSegLinetoHorizontalRel.h: Removed.
* svg/SVGPathSegLinetoRel.h: Removed.
* svg/SVGPathSegLinetoVertical.h: Removed.
* svg/SVGPathSegLinetoVerticalAbs.h: Removed.
* svg/SVGPathSegLinetoVerticalRel.h: Removed.
The definition of these classes are now in SVGPathSegImpl.h.

* svg/SVGPathSegList.cpp: Removed.
* svg/SVGPathSegList.h:
* svg/SVGPathSegListBuilder.cpp:
(WebCore::SVGPathSegListBuilder::SVGPathSegListBuilder):
(WebCore::SVGPathSegListBuilder::moveTo):
(WebCore::SVGPathSegListBuilder::lineTo):
(WebCore::SVGPathSegListBuilder::lineToHorizontal):
(WebCore::SVGPathSegListBuilder::lineToVertical):
(WebCore::SVGPathSegListBuilder::curveToCubic):
(WebCore::SVGPathSegListBuilder::curveToCubicSmooth):
(WebCore::SVGPathSegListBuilder::curveToQuadratic):
(WebCore::SVGPathSegListBuilder::curveToQuadraticSmooth):
(WebCore::SVGPathSegListBuilder::arcTo):
(WebCore::SVGPathSegListBuilder::closePath):
* svg/SVGPathSegListBuilder.h:
The concrete SVGPathSeg classes can now create instances of their classes
without having to go through the SVGPathElement.

* svg/SVGPathSegListSource.cpp:
(WebCore::SVGPathSegListSource::SVGPathSegListSource):
* svg/SVGPathSegListSource.h:
* svg/SVGPathSegListValues.cpp: Removed.
* svg/SVGPathSegListValues.h: Removed.
* svg/SVGPathSegMovetoAbs.h: Removed.
* svg/SVGPathSegMovetoRel.h: Removed.
* svg/SVGPathSegValue.h: Added.
(WebCore::SVGPathSegValue::create):
(WebCore::SVGPathSegValue::clone const):
(WebCore::SVGPathSegValue::SVGPathSegValue):
(WebCore::SVGPathSegValue::argument const):
(WebCore::SVGPathSegValue::setArgument):
(WebCore::SVGPathSegLinetoHorizontal::x const):
(WebCore::SVGPathSegLinetoHorizontal::setX):
(WebCore::SVGPathSegLinetoVertical::y const):
(WebCore::SVGPathSegLinetoVertical::setY):
(WebCore::SVGPathSegSingleCoordinate::x const):
(WebCore::SVGPathSegSingleCoordinate::setX):
(WebCore::SVGPathSegSingleCoordinate::y const):
(WebCore::SVGPathSegSingleCoordinate::setY):
(WebCore::SVGPathSegCurvetoQuadratic::x const):
(WebCore::SVGPathSegCurvetoQuadratic::setX):
(WebCore::SVGPathSegCurvetoQuadratic::y const):
(WebCore::SVGPathSegCurvetoQuadratic::setY):
(WebCore::SVGPathSegCurvetoQuadratic::x1 const):
(WebCore::SVGPathSegCurvetoQuadratic::setX1):
(WebCore::SVGPathSegCurvetoQuadratic::y1 const):
(WebCore::SVGPathSegCurvetoQuadratic::setY1):
(WebCore::SVGPathSegCurvetoCubicSmooth::x const):
(WebCore::SVGPathSegCurvetoCubicSmooth::setX):
(WebCore::SVGPathSegCurvetoCubicSmooth::y const):
(WebCore::SVGPathSegCurvetoCubicSmooth::setY):
(WebCore::SVGPathSegCurvetoCubicSmooth::x2 const):
(WebCore::SVGPathSegCurvetoCubicSmooth::setX2):
(WebCore::SVGPathSegCurvetoCubicSmooth::y2 const):
(WebCore::SVGPathSegCurvetoCubicSmooth::setY2):
(WebCore::SVGPathSegCurvetoCubic::x const):
(WebCore::SVGPathSegCurvetoCubic::setX):
(WebCore::SVGPathSegCurvetoCubic::y const):
(WebCore::SVGPathSegCurvetoCubic::setY):
(WebCore::SVGPathSegCurvetoCubic::x1 const):
(WebCore::SVGPathSegCurvetoCubic::setX1):
(WebCore::SVGPathSegCurvetoCubic::y1 const):
(WebCore::SVGPathSegCurvetoCubic::setY1):
(WebCore::SVGPathSegCurvetoCubic::x2 const):
(WebCore::SVGPathSegCurvetoCubic::setX2):
(WebCore::SVGPathSegCurvetoCubic::y2 const):
(WebCore::SVGPathSegCurvetoCubic::setY2):
(WebCore::SVGPathSegArc::x const):
(WebCore::SVGPathSegArc::setX):
(WebCore::SVGPathSegArc::y const):
(WebCore::SVGPathSegArc::setY):
(WebCore::SVGPathSegArc::r1 const):
(WebCore::SVGPathSegArc::setR1):
(WebCore::SVGPathSegArc::r2 const):
(WebCore::SVGPathSegArc::setR2):
(WebCore::SVGPathSegArc::angle const):
(WebCore::SVGPathSegArc::setAngle):
(WebCore::SVGPathSegArc::largeArcFlag const):
(WebCore::SVGPathSegArc::setLargeArcFlag):
(WebCore::SVGPathSegArc::sweepFlag const):
(WebCore::SVGPathSegArc::setSweepFlag):
* svg/SVGPathSegWithContext.h: Removed.

* svg/SVGPathUtilities.cpp:
(WebCore::buildSVGPathByteStreamFromSVGPathSegList):
(WebCore::buildSVGPathSegListFromByteStream):
(WebCore::buildStringFromByteStream):
(WebCore::buildSVGPathByteStreamFromSVGPathSegListValues): Deleted.
(WebCore::appendSVGPathByteStreamFromSVGPathSeg): Deleted.
(WebCore::buildSVGPathSegListValuesFromByteStream): Deleted.
(WebCore::buildStringFromSVGPathSegListValues): Deleted.
* svg/SVGPathUtilities.h:
Since the class SVGPathSegListValues is removed, all the parsing functions
have now to deal with SVGPathSegList directly.

* svg/SVGPoint.h:
* svg/SVGValue.h:
* svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp: Removed.
* svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Removed.
* svg/properties/SVGAnimatedPropertyAccessorImpl.h:
* svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
* svg/properties/SVGAnimatedPropertyImpl.h:
(WebCore::SVGAnimatedPathSegList::create):
(WebCore::SVGAnimatedPathSegList::currentPathByteStream):
(WebCore::SVGAnimatedPathSegList::currentPath):
(WebCore::SVGAnimatedPathSegList::approximateMemoryCost const):
Provides an easy way to access the current SVGPathByteStream and Path
objects from the SVGAnimatedPathSegList.

* svg/properties/SVGAnimationAdditiveValueFunctionImpl.h:
(WebCore::SVGAnimationPathSegListFunction::progress):
* svg/properties/SVGPropertyOwnerRegistry.h:
(WebCore::SVGPropertyOwnerRegistry::registerProperty):

LayoutTests:

* svg/dom/SVGPathSegList-appendItem-expected.txt:
* svg/dom/SVGPathSegList-appendItem.xhtml:
* svg/dom/SVGPathSegList-clear-and-initialize-expected.txt:
* svg/dom/SVGPathSegList-clear-and-initialize.xhtml:
* svg/dom/SVGPathSegList-insertItemBefore-expected.txt:
* svg/dom/SVGPathSegList-insertItemBefore.xhtml:
* svg/dom/SVGPathSegList-replaceItem-expected.txt:
* svg/dom/SVGPathSegList-replaceItem.xhtml:
These changes are required because SVGPathSegList will be following the SVG2
specs regarding adding new items to the list.

See https://www.w3.org/TR/SVG/types.html#TermListInterface.

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

70 files changed:
LayoutTests/ChangeLog
LayoutTests/svg/dom/SVGPathSegList-appendItem-expected.txt
LayoutTests/svg/dom/SVGPathSegList-appendItem.xhtml
LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize-expected.txt
LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize.xhtml
LayoutTests/svg/dom/SVGPathSegList-insertItemBefore-expected.txt
LayoutTests/svg/dom/SVGPathSegList-insertItemBefore.xhtml
LayoutTests/svg/dom/SVGPathSegList-replaceItem-expected.txt
LayoutTests/svg/dom/SVGPathSegList-replaceItem.xhtml
Source/WebCore/ChangeLog
Source/WebCore/Sources.txt
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/bindings/js/JSSVGPathSegCustom.cpp
Source/WebCore/bindings/scripts/CodeGenerator.pm
Source/WebCore/bindings/scripts/CodeGeneratorJS.pm
Source/WebCore/rendering/svg/SVGPathData.cpp
Source/WebCore/svg/SVGAnimatedPath.cpp [deleted file]
Source/WebCore/svg/SVGAnimatedPath.h [deleted file]
Source/WebCore/svg/SVGAnimatedType.h
Source/WebCore/svg/SVGAnimatorFactory.h
Source/WebCore/svg/SVGPathByteStream.h
Source/WebCore/svg/SVGPathElement.cpp
Source/WebCore/svg/SVGPathElement.h
Source/WebCore/svg/SVGPathSeg.h
Source/WebCore/svg/SVGPathSegArc.h [deleted file]
Source/WebCore/svg/SVGPathSegArcAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegArcRel.h [deleted file]
Source/WebCore/svg/SVGPathSegClosePath.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubic.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubicAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubicRel.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubicSmooth.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoQuadratic.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoQuadraticRel.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.h [deleted file]
Source/WebCore/svg/SVGPathSegImpl.h [new file with mode: 0644]
Source/WebCore/svg/SVGPathSegLinetoAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoHorizontal.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoHorizontalAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoHorizontalRel.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoRel.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoVertical.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoVerticalAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegLinetoVerticalRel.h [deleted file]
Source/WebCore/svg/SVGPathSegList.cpp [deleted file]
Source/WebCore/svg/SVGPathSegList.h
Source/WebCore/svg/SVGPathSegListBuilder.cpp
Source/WebCore/svg/SVGPathSegListBuilder.h
Source/WebCore/svg/SVGPathSegListSource.cpp
Source/WebCore/svg/SVGPathSegListSource.h
Source/WebCore/svg/SVGPathSegListValues.cpp [deleted file]
Source/WebCore/svg/SVGPathSegListValues.h [deleted file]
Source/WebCore/svg/SVGPathSegMovetoAbs.h [deleted file]
Source/WebCore/svg/SVGPathSegMovetoRel.h [deleted file]
Source/WebCore/svg/SVGPathSegValue.h [new file with mode: 0644]
Source/WebCore/svg/SVGPathSegWithContext.h [deleted file]
Source/WebCore/svg/SVGPathUtilities.cpp
Source/WebCore/svg/SVGPathUtilities.h
Source/WebCore/svg/SVGValue.h
Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp [deleted file]
Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h [deleted file]
Source/WebCore/svg/properties/SVGAnimatedPropertyAccessorImpl.h
Source/WebCore/svg/properties/SVGAnimatedPropertyAnimatorImpl.h
Source/WebCore/svg/properties/SVGAnimatedPropertyImpl.h
Source/WebCore/svg/properties/SVGAnimationAdditiveValueFunctionImpl.h
Source/WebCore/svg/properties/SVGPropertyOwnerRegistry.h

index 2e8efff..3271821 100644 (file)
@@ -1,3 +1,23 @@
+2019-03-27  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        Remove the SVG tear off objects for SVGPathSeg, SVGPathSegList and SVGAnimatedPathSegList
+        https://bugs.webkit.org/show_bug.cgi?id=196085
+
+        Reviewed by Simon Fraser.
+
+        * svg/dom/SVGPathSegList-appendItem-expected.txt:
+        * svg/dom/SVGPathSegList-appendItem.xhtml:
+        * svg/dom/SVGPathSegList-clear-and-initialize-expected.txt:
+        * svg/dom/SVGPathSegList-clear-and-initialize.xhtml:
+        * svg/dom/SVGPathSegList-insertItemBefore-expected.txt:
+        * svg/dom/SVGPathSegList-insertItemBefore.xhtml:
+        * svg/dom/SVGPathSegList-replaceItem-expected.txt:
+        * svg/dom/SVGPathSegList-replaceItem.xhtml:
+        These changes are required because SVGPathSegList will be following the SVG2
+        specs regarding adding new items to the list. 
+
+        See https://www.w3.org/TR/SVG/types.html#TermListInterface.
+
 2019-03-27  Shawn Roberts  <sroberts@apple.com>
 
         http/tests/resourceLoadStatistics/website-data-removal-for-site-navigated-to-with-link-decoration.html is a flaky failure
index 833738d..44da68a 100644 (file)
@@ -36,9 +36,11 @@ PASS path2.pathSegList.getItem(3).x = -path2.pathSegList.getItem(3).x is -100
 
 Swap segment four and five of path2 - now should look like a rectangle
 PASS path2.pathSegList.appendItem(path2.pathSegList.getItem(3)).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.removeItem(3).toString() is "[object SVGPathSegLinetoHorizontalRel]"
 
 Append second item from path2 to path1 list
 PASS path1.pathSegList.appendItem(path2.pathSegList.getItem(1)).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.removeItem(1).toString() is "[object SVGPathSegLinetoAbs]"
 
 Change last item of path1 list, that came from path2 list, assure it's updating path1
 PASS path1.pathSegList.getItem(3).x -= 50 is 0
index be5dd7f..d5d899c 100644 (file)
     debug("")
     debug("Swap segment four and five of path2 - now should look like a rectangle");
     shouldBeEqualToString("path2.pathSegList.appendItem(path2.pathSegList.getItem(3)).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBeEqualToString("path2.pathSegList.removeItem(3).toString()", "[object SVGPathSegLinetoHorizontalRel]");
 
     debug("");
     debug("Append second item from path2 to path1 list");
     shouldBeEqualToString("path1.pathSegList.appendItem(path2.pathSegList.getItem(1)).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBeEqualToString("path2.pathSegList.removeItem(1).toString()", "[object SVGPathSegLinetoAbs]");
 
     debug("");
     debug("Change last item of path1 list, that came from path2 list, assure it's updating path1");
index 2875461..1ea17b7 100644 (file)
@@ -59,6 +59,7 @@ PASS path2.pathSegList.getItem(2).y is 0
 
 Initialize path1 list with first item of path2
 PASS path1.pathSegList.initialize(path2.pathSegList.getItem(0)).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.removeItem(0).toString() is "[object SVGPathSegMovetoAbs]"
 
 Check intermediate list state of path1
 PASS path1.pathSegList.numberOfItems is 1
index f616545..ae5aa07 100644 (file)
@@ -85,6 +85,7 @@
     debug("");
     debug("Initialize path1 list with first item of path2");
     shouldBeEqualToString("path1.pathSegList.initialize(path2.pathSegList.getItem(0)).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBeEqualToString("path2.pathSegList.removeItem(0).toString()", "[object SVGPathSegMovetoAbs]");
 
     debug("");
     debug("Check intermediate list state of path1");
index ca43b3d..7767d12 100644 (file)
@@ -21,6 +21,7 @@ PASS path1.pathSegList.getItem(3).y is 100
 
 Insert fourth item at position three using insertItemBefore()
 PASS path1.pathSegList.insertItemBefore(path1.pathSegList.getItem(3), 2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.removeItem(4).toString() is "[object SVGPathSegLinetoAbs]"
 
 Check final 'pathSegList' value of path1
 PASS path1.pathSegList.numberOfItems is 4
index f1e390d..c87bc94 100644 (file)
@@ -38,6 +38,7 @@
     debug("");
     debug("Insert fourth item at position three using insertItemBefore()");
     shouldBeEqualToString("path1.pathSegList.insertItemBefore(path1.pathSegList.getItem(3), 2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBeEqualToString("path1.pathSegList.removeItem(4).toString()", "[object SVGPathSegLinetoAbs]");
 
     debug("");
     debug("Check final 'pathSegList' value of path1");
index 6b982aa..a785ef2 100644 (file)
@@ -39,9 +39,11 @@ PASS path2.pathSegList.getItem(3).x is -100
 
 Replace second item with third item of path1
 PASS path1.pathSegList.replaceItem(path1.pathSegList.getItem(2), 1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.removeItem(2).toString() is "[object SVGPathSegLinetoAbs]"
 
 Replace third item of path2 with fourth item of path1
 PASS path2.pathSegList.replaceItem(path1.pathSegList.getItem(3), 2).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path1.pathSegList.removeItem(3).toString() is "[object SVGPathSegLinetoVerticalRel]"
 
 Check final 'pathSegList' value of path1
 PASS path1.pathSegList.numberOfItems is 4
index 7fbfa87..e8b403c 100644 (file)
     debug("");
     debug("Replace second item with third item of path1");
     shouldBeEqualToString("path1.pathSegList.replaceItem(path1.pathSegList.getItem(2), 1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBeEqualToString("path1.pathSegList.removeItem(2).toString()", "[object SVGPathSegLinetoAbs]");
 
     debug("");
     debug("Replace third item of path2 with fourth item of path1");
     shouldBeEqualToString("path2.pathSegList.replaceItem(path1.pathSegList.getItem(3), 2).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBeEqualToString("path1.pathSegList.removeItem(3).toString()", "[object SVGPathSegLinetoVerticalRel]");
 
     debug("");
     debug("Check final 'pathSegList' value of path1");
index 620eddf..0c7020c 100644 (file)
@@ -1,3 +1,263 @@
+2019-03-27  Said Abou-Hallawa  <sabouhallawa@apple.com>
+
+        Remove the SVG tear off objects for SVGPathSeg, SVGPathSegList and SVGAnimatedPathSegList
+        https://bugs.webkit.org/show_bug.cgi?id=196085
+
+        Reviewed by Simon Fraser.
+
+        The SVGPathSegList is similar to the other SVGLists, e.g. SVGNUmberList
+        and SVGPointList except in two things:
+
+        1. Its items can be different but they are derived from the same base 
+           class SVGPathSeg.
+
+        2. The SVGPathSeg items are only used for DOM. When drawing or animating
+           we have to have an SVGPathByteStream and convert it to a Path. Converting
+           an SVGPathByteStream to SVGPathSeg items and vice versa is expensive.
+           Building a Path from an SVGPathByteStream is also expensive. So an extra
+           care needs to be taken for when these conversions happen.
+
+        In addition to handling the SVGPathSeg items, SVGPathSegList will manage
+        the associated SVGPathByteStream and Path objects. SVGPathSegList will be
+        lazy in getting updated objects when a change happens. For example, when
+        the byte stream changes, SVGPathSegList will clear its items and nullify
+        the Path object. But it will not build any of them until they are explicitly
+        requested.
+
+        Like what was done for other SVG properties when removing their tear off
+        objects, a new accessor, a new animator and a new animation function will
+        be added for the SVGAnimatedPathSegList.
+
+        All the header files of the concrete classes of SVGPathSeg will be removed
+        because they are small structures which hold some data items and they provide
+        setters and getters for these items. Here is the new file structures and
+        their contents:
+
+        -- SVGPathSeg.h still has the class SVGPathSeg which is now a superclass
+           of SVGProperty. 
+
+        -- SVGPathSegValue.h will have the template class SVGPathSegValue which 
+           holds an std::tuple of packed arguments. It provides setters and getters
+           for these arguments. SVGPathSegValue.h will also have specialized 
+           classed derived from SVGPathSegValue and hold different arguments.
+
+        -- SVGPathSegImpl.h will have the final concrete SVGPathSeg classes.
+
+        Note SVGPathSeg concrete classes do not need to have a reference to the
+        the context SVGPathElement. SVGPathSeg will be owned by its SVGPathSegList
+        which will be owned by the SVGAnimatedPathSegList which will be owned by
+        the SVGPathElement.
+
+        * Sources.txt:
+        * WebCore.xcodeproj/project.pbxproj:
+        * bindings/js/JSSVGPathSegCustom.cpp:
+        * bindings/scripts/CodeGenerator.pm:
+        (IsSVGPathSegTypeName):
+        (IsSVGPathSegType):
+        * bindings/scripts/CodeGeneratorJS.pm:
+        (GenerateHeader):
+        * rendering/svg/SVGPathData.cpp:
+        (WebCore::pathFromPathElement):
+        * svg/SVGAnimatedPath.cpp: Removed.
+        * svg/SVGAnimatedPath.h: Removed.
+        * svg/SVGAnimatedType.h:
+        (WebCore::SVGAnimatedType::type const):
+        * svg/SVGAnimatorFactory.h:
+        (WebCore::SVGAnimatorFactory::create):
+        * svg/SVGPathByteStream.h:
+        (WebCore::SVGPathByteStream::SVGPathByteStream):
+        This constructor is used by SVGAnimationPathSegListFunction to convert
+        the 'form', 'to' and 'toAtEndOfDuration' strings to SVGPathByteStreams.
+
+        (WebCore::SVGPathByteStream::resize): Deleted.
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::initialValue): Deleted.
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::fromString): Deleted.
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::parse): Deleted.
+        (WebCore::SVGPropertyTraits<SVGPathByteStream>::toString): Deleted.
+        * svg/SVGPathElement.cpp:
+        (WebCore::SVGPathElement::SVGPathElement):
+        (WebCore::SVGPathElement::parseAttribute):
+        (WebCore::SVGPathElement::svgAttributeChanged):
+        (WebCore::SVGPathElement::getTotalLength const):
+        (WebCore::SVGPathElement::getPointAtLength const):
+        (WebCore::SVGPathElement::getPathSegAtLength const):
+        (WebCore::SVGPathElement::createSVGPathSegClosePath): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegMovetoAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegMovetoRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegArcAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegArcRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs): Deleted.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel): Deleted.
+        The SVGPathSeg creation functions are moved to the header file.
+
+        (WebCore::SVGPathElement::registerAttributes): Deleted.
+        (WebCore::SVGPathElement::pathByteStream const): Deleted.
+        (WebCore::SVGPathElement::pathForByteStream const): Deleted.
+        (WebCore::SVGPathElement::lookupOrCreateDWrapper): Deleted.
+        (WebCore::SVGPathElement::animatedPropertyWillBeDeleted): Deleted.
+        (WebCore::SVGPathElement::pathSegList): Deleted.
+        (WebCore::SVGPathElement::normalizedPathSegList): Deleted.
+        (WebCore::SVGPathElement::animatedPathSegList): Deleted.
+        (WebCore::SVGPathElement::animatedNormalizedPathSegList): Deleted.
+        (WebCore::SVGPathElement::approximateMemoryCost const): Deleted.
+        (WebCore::SVGPathElement::pathSegListChanged): Deleted.
+        Managing the SVGPathByteStream and the drawing Path objects will be the
+        responsibility of SVGPathSegList.
+
+        * svg/SVGPathElement.h:
+        * svg/SVGPathSeg.h:
+        * svg/SVGPathSegArc.h: Removed.
+        * svg/SVGPathSegArcAbs.h: Removed.
+        * svg/SVGPathSegArcRel.h: Removed.
+        * svg/SVGPathSegClosePath.h: Removed.
+        * svg/SVGPathSegCurvetoCubic.h: Removed.
+        * svg/SVGPathSegCurvetoCubicAbs.h: Removed.
+        * svg/SVGPathSegCurvetoCubicRel.h: Removed.
+        * svg/SVGPathSegCurvetoCubicSmooth.h: Removed.
+        * svg/SVGPathSegCurvetoCubicSmoothAbs.h: Removed.
+        * svg/SVGPathSegCurvetoCubicSmoothRel.h: Removed.
+        * svg/SVGPathSegCurvetoQuadratic.h: Removed.
+        * svg/SVGPathSegCurvetoQuadraticAbs.h: Removed.
+        * svg/SVGPathSegCurvetoQuadraticRel.h: Removed.
+        * svg/SVGPathSegCurvetoQuadraticSmoothAbs.h: Removed.
+        * svg/SVGPathSegCurvetoQuadraticSmoothRel.h: Removed.
+        * svg/SVGPathSegImpl.h: Added.
+        * svg/SVGPathSegLinetoAbs.h: Removed.
+        * svg/SVGPathSegLinetoHorizontal.h: Removed.
+        * svg/SVGPathSegLinetoHorizontalAbs.h: Removed.
+        * svg/SVGPathSegLinetoHorizontalRel.h: Removed.
+        * svg/SVGPathSegLinetoRel.h: Removed.
+        * svg/SVGPathSegLinetoVertical.h: Removed.
+        * svg/SVGPathSegLinetoVerticalAbs.h: Removed.
+        * svg/SVGPathSegLinetoVerticalRel.h: Removed.
+        The definition of these classes are now in SVGPathSegImpl.h.
+
+        * svg/SVGPathSegList.cpp: Removed.
+        * svg/SVGPathSegList.h:
+        * svg/SVGPathSegListBuilder.cpp:
+        (WebCore::SVGPathSegListBuilder::SVGPathSegListBuilder):
+        (WebCore::SVGPathSegListBuilder::moveTo):
+        (WebCore::SVGPathSegListBuilder::lineTo):
+        (WebCore::SVGPathSegListBuilder::lineToHorizontal):
+        (WebCore::SVGPathSegListBuilder::lineToVertical):
+        (WebCore::SVGPathSegListBuilder::curveToCubic):
+        (WebCore::SVGPathSegListBuilder::curveToCubicSmooth):
+        (WebCore::SVGPathSegListBuilder::curveToQuadratic):
+        (WebCore::SVGPathSegListBuilder::curveToQuadraticSmooth):
+        (WebCore::SVGPathSegListBuilder::arcTo):
+        (WebCore::SVGPathSegListBuilder::closePath):        
+        * svg/SVGPathSegListBuilder.h:
+        The concrete SVGPathSeg classes can now create instances of their classes
+        without having to go through the SVGPathElement.
+
+        * svg/SVGPathSegListSource.cpp:
+        (WebCore::SVGPathSegListSource::SVGPathSegListSource):
+        * svg/SVGPathSegListSource.h:
+        * svg/SVGPathSegListValues.cpp: Removed.
+        * svg/SVGPathSegListValues.h: Removed.
+        * svg/SVGPathSegMovetoAbs.h: Removed.
+        * svg/SVGPathSegMovetoRel.h: Removed.
+        * svg/SVGPathSegValue.h: Added.
+        (WebCore::SVGPathSegValue::create):
+        (WebCore::SVGPathSegValue::clone const):
+        (WebCore::SVGPathSegValue::SVGPathSegValue):
+        (WebCore::SVGPathSegValue::argument const):
+        (WebCore::SVGPathSegValue::setArgument):
+        (WebCore::SVGPathSegLinetoHorizontal::x const):
+        (WebCore::SVGPathSegLinetoHorizontal::setX):
+        (WebCore::SVGPathSegLinetoVertical::y const):
+        (WebCore::SVGPathSegLinetoVertical::setY):
+        (WebCore::SVGPathSegSingleCoordinate::x const):
+        (WebCore::SVGPathSegSingleCoordinate::setX):
+        (WebCore::SVGPathSegSingleCoordinate::y const):
+        (WebCore::SVGPathSegSingleCoordinate::setY):
+        (WebCore::SVGPathSegCurvetoQuadratic::x const):
+        (WebCore::SVGPathSegCurvetoQuadratic::setX):
+        (WebCore::SVGPathSegCurvetoQuadratic::y const):
+        (WebCore::SVGPathSegCurvetoQuadratic::setY):
+        (WebCore::SVGPathSegCurvetoQuadratic::x1 const):
+        (WebCore::SVGPathSegCurvetoQuadratic::setX1):
+        (WebCore::SVGPathSegCurvetoQuadratic::y1 const):
+        (WebCore::SVGPathSegCurvetoQuadratic::setY1):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::x const):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::setX):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::y const):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::setY):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::x2 const):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::setX2):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::y2 const):
+        (WebCore::SVGPathSegCurvetoCubicSmooth::setY2):
+        (WebCore::SVGPathSegCurvetoCubic::x const):
+        (WebCore::SVGPathSegCurvetoCubic::setX):
+        (WebCore::SVGPathSegCurvetoCubic::y const):
+        (WebCore::SVGPathSegCurvetoCubic::setY):
+        (WebCore::SVGPathSegCurvetoCubic::x1 const):
+        (WebCore::SVGPathSegCurvetoCubic::setX1):
+        (WebCore::SVGPathSegCurvetoCubic::y1 const):
+        (WebCore::SVGPathSegCurvetoCubic::setY1):
+        (WebCore::SVGPathSegCurvetoCubic::x2 const):
+        (WebCore::SVGPathSegCurvetoCubic::setX2):
+        (WebCore::SVGPathSegCurvetoCubic::y2 const):
+        (WebCore::SVGPathSegCurvetoCubic::setY2):
+        (WebCore::SVGPathSegArc::x const):
+        (WebCore::SVGPathSegArc::setX):
+        (WebCore::SVGPathSegArc::y const):
+        (WebCore::SVGPathSegArc::setY):
+        (WebCore::SVGPathSegArc::r1 const):
+        (WebCore::SVGPathSegArc::setR1):
+        (WebCore::SVGPathSegArc::r2 const):
+        (WebCore::SVGPathSegArc::setR2):
+        (WebCore::SVGPathSegArc::angle const):
+        (WebCore::SVGPathSegArc::setAngle):
+        (WebCore::SVGPathSegArc::largeArcFlag const):
+        (WebCore::SVGPathSegArc::setLargeArcFlag):
+        (WebCore::SVGPathSegArc::sweepFlag const):
+        (WebCore::SVGPathSegArc::setSweepFlag):
+        * svg/SVGPathSegWithContext.h: Removed.
+
+        * svg/SVGPathUtilities.cpp:
+        (WebCore::buildSVGPathByteStreamFromSVGPathSegList):
+        (WebCore::buildSVGPathSegListFromByteStream):
+        (WebCore::buildStringFromByteStream):
+        (WebCore::buildSVGPathByteStreamFromSVGPathSegListValues): Deleted.
+        (WebCore::appendSVGPathByteStreamFromSVGPathSeg): Deleted.
+        (WebCore::buildSVGPathSegListValuesFromByteStream): Deleted.
+        (WebCore::buildStringFromSVGPathSegListValues): Deleted.
+        * svg/SVGPathUtilities.h:
+        Since the class SVGPathSegListValues is removed, all the parsing functions
+        have now to deal with SVGPathSegList directly.
+
+        * svg/SVGPoint.h:
+        * svg/SVGValue.h:
+        * svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp: Removed.
+        * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Removed.
+        * svg/properties/SVGAnimatedPropertyAccessorImpl.h:
+        * svg/properties/SVGAnimatedPropertyAnimatorImpl.h:
+        * svg/properties/SVGAnimatedPropertyImpl.h:
+        (WebCore::SVGAnimatedPathSegList::create):
+        (WebCore::SVGAnimatedPathSegList::currentPathByteStream):
+        (WebCore::SVGAnimatedPathSegList::currentPath):
+        (WebCore::SVGAnimatedPathSegList::approximateMemoryCost const):
+        Provides an easy way to access the current SVGPathByteStream and Path
+        objects from the SVGAnimatedPathSegList.
+
+        * svg/properties/SVGAnimationAdditiveValueFunctionImpl.h:
+        (WebCore::SVGAnimationPathSegListFunction::progress):
+        * svg/properties/SVGPropertyOwnerRegistry.h:
+        (WebCore::SVGPropertyOwnerRegistry::registerProperty):
+
 2019-03-27  Ryan Haddad  <ryanhaddad@apple.com>
 
         AVAudioSessionRouteSharingPolicyLongForm has been deprecated
index 8872a32..927a488 100644 (file)
@@ -2267,7 +2267,6 @@ svg/SVGAnimateElement.cpp
 svg/SVGAnimateElementBase.cpp
 svg/SVGAnimateMotionElement.cpp
 svg/SVGAnimateTransformElement.cpp
-svg/SVGAnimatedPath.cpp
 svg/SVGAnimatedTransformList.cpp
 svg/SVGAnimatedTypeAnimator.cpp
 svg/SVGAnimationElement.cpp
@@ -2348,10 +2347,8 @@ svg/SVGPathByteStreamBuilder.cpp
 svg/SVGPathByteStreamSource.cpp
 svg/SVGPathElement.cpp
 svg/SVGPathParser.cpp
-svg/SVGPathSegList.cpp
 svg/SVGPathSegListBuilder.cpp
 svg/SVGPathSegListSource.cpp
-svg/SVGPathSegListValues.cpp
 svg/SVGPathStringBuilder.cpp
 svg/SVGPathStringSource.cpp
 svg/SVGPathTraversalStateBuilder.cpp
@@ -2405,7 +2402,6 @@ svg/graphics/filters/SVGFEImage.cpp
 svg/graphics/filters/SVGFilter.cpp
 svg/graphics/filters/SVGFilterBuilder.cpp
 
-svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp
 svg/properties/SVGAnimatedProperty.cpp
 svg/properties/SVGAnimationAdditiveValueFunctionImpl.cpp
 svg/properties/SVGAttributeAnimator.cpp
index bbc1883..e3e3e05 100644 (file)
                081AA8DA1111237E002AB06E /* SVGElementRareData.h in Headers */ = {isa = PBXBuildFile; fileRef = 081AA8D91111237E002AB06E /* SVGElementRareData.h */; };
                081EBF3B0FD34F4100DA7559 /* SVGFilterBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */; };
                08250939128BD4D800E2ED8E /* SVGAnimatedTransformList.h in Headers */ = {isa = PBXBuildFile; fileRef = 08250938128BD4D800E2ED8E /* SVGAnimatedTransformList.h */; };
-               082DE42D1292621600D923DF /* SVGPathSegWithContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 082DE42C1292621600D923DF /* SVGPathSegWithContext.h */; };
                083DAEA70F01A7FB00342754 /* RenderTextControlMultiLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 083DAEA30F01A7FB00342754 /* RenderTextControlMultiLine.h */; };
                083DAEA90F01A7FB00342754 /* RenderTextControlSingleLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 083DAEA50F01A7FB00342754 /* RenderTextControlSingleLine.h */; };
                0845680812B90DA600960A9F /* FontMetrics.h in Headers */ = {isa = PBXBuildFile; fileRef = 0845680712B90DA600960A9F /* FontMetrics.h */; settings = {ATTRIBUTES = (Private, ); }; };
                0854B0251255E4E600B9CDD0 /* SVGTextQuery.h in Headers */ = {isa = PBXBuildFile; fileRef = 0854B0131255E4E600B9CDD0 /* SVGTextQuery.h */; };
                085A15931289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 085A15921289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h */; };
                085B92BB0EFDE73D00E6123C /* FormDataBuilder.h in Headers */ = {isa = PBXBuildFile; fileRef = 085B92B90EFDE73D00E6123C /* FormDataBuilder.h */; settings = {ATTRIBUTES = (); }; };
-               0863951613B5FE5700BB344D /* SVGAnimatedPath.h in Headers */ = {isa = PBXBuildFile; fileRef = 0863951413B5FE5700BB344D /* SVGAnimatedPath.h */; };
                08641D4812142F7D008DE9F6 /* RenderImageResourceStyleImage.h in Headers */ = {isa = PBXBuildFile; fileRef = 08641D4612142F7D008DE9F6 /* RenderImageResourceStyleImage.h */; settings = {ATTRIBUTES = (Private, ); }; };
                086BBD0F136039C2008B15D8 /* Glyph.h in Headers */ = {isa = PBXBuildFile; fileRef = 086BBD0E136039C2008B15D8 /* Glyph.h */; settings = {ATTRIBUTES = (Private, ); }; };
                0873B86B136064EA00A522C2 /* GlyphPage.h in Headers */ = {isa = PBXBuildFile; fileRef = 0873B86A136064EA00A522C2 /* GlyphPage.h */; settings = {ATTRIBUTES = (Private, ); }; };
                088A0E0C126EF1DB00978F7A /* SVGPropertyTraits.h in Headers */ = {isa = PBXBuildFile; fileRef = 088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */; settings = {ATTRIBUTES = (Private, ); }; };
                088C2F7A12390081003D65CE /* SVGTextLayoutAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 088C2F7612390080003D65CE /* SVGTextLayoutAttributes.h */; };
                089582560E857A7E00F82C83 /* ImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 089582540E857A7E00F82C83 /* ImageLoader.h */; settings = {ATTRIBUTES = (Private, ); }; };
-               089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */; };
                08A484780E5272C500C3FE76 /* ScriptElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A484760E5272C500C3FE76 /* ScriptElement.h */; settings = {ATTRIBUTES = (Private, ); }; };
                08C7A2C710DC7462002D368B /* SVGNames.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 656581E909D1508D000E61D7 /* SVGNames.h */; };
                08C9251A0FCC7C4A00480DEC /* FilterEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 08C925180FCC7C4A00480DEC /* FilterEffect.h */; settings = {ATTRIBUTES = (Private, ); }; };
                83B9687B19F8AB83004EF7AF /* StyleBuilderConverter.h in Headers */ = {isa = PBXBuildFile; fileRef = 83B9687919F8AB83004EF7AF /* StyleBuilderConverter.h */; };
                83BB5C881D5D6F45005A71F4 /* AllDescendantsCollection.h in Headers */ = {isa = PBXBuildFile; fileRef = 83BB5C871D5D6F3A005A71F4 /* AllDescendantsCollection.h */; };
                83C05A5B1A686212007E5DEA /* StylePropertyShorthandFunctions.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C05A591A686212007E5DEA /* StylePropertyShorthandFunctions.h */; };
-               83C1D425178D5AB400141E68 /* SVGPathSegArcAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D413178D5AB400141E68 /* SVGPathSegArcAbs.h */; };
-               83C1D426178D5AB400141E68 /* SVGPathSegArcRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D414178D5AB400141E68 /* SVGPathSegArcRel.h */; };
-               83C1D427178D5AB400141E68 /* SVGPathSegCurvetoCubicAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D415178D5AB400141E68 /* SVGPathSegCurvetoCubicAbs.h */; };
-               83C1D428178D5AB400141E68 /* SVGPathSegCurvetoCubicRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D416178D5AB400141E68 /* SVGPathSegCurvetoCubicRel.h */; };
-               83C1D429178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D417178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothAbs.h */; };
-               83C1D42A178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D418178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothRel.h */; };
-               83C1D42B178D5AB400141E68 /* SVGPathSegCurvetoQuadraticAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D419178D5AB400141E68 /* SVGPathSegCurvetoQuadraticAbs.h */; };
-               83C1D42C178D5AB500141E68 /* SVGPathSegCurvetoQuadraticRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41A178D5AB400141E68 /* SVGPathSegCurvetoQuadraticRel.h */; };
-               83C1D42D178D5AB500141E68 /* SVGPathSegCurvetoQuadraticSmoothAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41B178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothAbs.h */; };
-               83C1D42E178D5AB500141E68 /* SVGPathSegCurvetoQuadraticSmoothRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41C178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothRel.h */; };
-               83C1D42F178D5AB500141E68 /* SVGPathSegLinetoAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41D178D5AB400141E68 /* SVGPathSegLinetoAbs.h */; };
-               83C1D430178D5AB500141E68 /* SVGPathSegLinetoHorizontalAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41E178D5AB400141E68 /* SVGPathSegLinetoHorizontalAbs.h */; };
-               83C1D431178D5AB500141E68 /* SVGPathSegLinetoHorizontalRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D41F178D5AB400141E68 /* SVGPathSegLinetoHorizontalRel.h */; };
-               83C1D432178D5AB500141E68 /* SVGPathSegLinetoRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D420178D5AB400141E68 /* SVGPathSegLinetoRel.h */; };
-               83C1D433178D5AB500141E68 /* SVGPathSegLinetoVerticalAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D421178D5AB400141E68 /* SVGPathSegLinetoVerticalAbs.h */; };
-               83C1D434178D5AB500141E68 /* SVGPathSegLinetoVerticalRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D422178D5AB400141E68 /* SVGPathSegLinetoVerticalRel.h */; };
-               83C1D435178D5AB500141E68 /* SVGPathSegMovetoAbs.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D423178D5AB400141E68 /* SVGPathSegMovetoAbs.h */; };
-               83C1D436178D5AB500141E68 /* SVGPathSegMovetoRel.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1D424178D5AB400141E68 /* SVGPathSegMovetoRel.h */; };
                83C1F5941EDF69D300410D27 /* QualifiedNameCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C1F5921EDF69D300410D27 /* QualifiedNameCache.h */; };
                83C45B8E1DC2B68A008871BA /* ValidationBubble.h in Headers */ = {isa = PBXBuildFile; fileRef = 83C45B8D1DC2B67C008871BA /* ValidationBubble.h */; settings = {ATTRIBUTES = (Private, ); }; };
                83C5795D1DA5C301006F9C86 /* ScrollLogicalPosition.h in Headers */ = {isa = PBXBuildFile; fileRef = 8350C3E71DA59B6200355424 /* ScrollLogicalPosition.h */; settings = {ATTRIBUTES = (Private, ); }; };
                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 */; };
-               B2227A620D00BF220071B782 /* SVGPathSegClosePath.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278CC0D00BF200071B782 /* SVGPathSegClosePath.h */; };
-               B2227A650D00BF220071B782 /* SVGPathSegCurvetoCubic.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278CF0D00BF200071B782 /* SVGPathSegCurvetoCubic.h */; };
-               B2227A690D00BF220071B782 /* SVGPathSegCurvetoCubicSmooth.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278D30D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.h */; };
-               B2227A6D0D00BF220071B782 /* SVGPathSegCurvetoQuadratic.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278D70D00BF200071B782 /* SVGPathSegCurvetoQuadratic.h */; };
-               B2227A780D00BF220071B782 /* SVGPathSegLinetoHorizontal.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278E20D00BF200071B782 /* SVGPathSegLinetoHorizontal.h */; };
-               B2227A7D0D00BF220071B782 /* SVGPathSegLinetoVertical.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278E70D00BF200071B782 /* SVGPathSegLinetoVertical.h */; };
                B2227A810D00BF220071B782 /* SVGPathSegList.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278EB0D00BF200071B782 /* SVGPathSegList.h */; };
                B2227A880D00BF220071B782 /* SVGPatternElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278F20D00BF210071B782 /* SVGPatternElement.h */; };
                B2227A8C0D00BF220071B782 /* SVGPointList.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278F60D00BF210071B782 /* SVGPointList.h */; };
                081EBF380FD34F4100DA7559 /* SVGFilterBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGFilterBuilder.cpp; sourceTree = "<group>"; };
                081EBF390FD34F4100DA7559 /* SVGFilterBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGFilterBuilder.h; sourceTree = "<group>"; };
                08250938128BD4D800E2ED8E /* SVGAnimatedTransformList.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedTransformList.h; sourceTree = "<group>"; };
-               082DE42C1292621600D923DF /* SVGPathSegWithContext.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegWithContext.h; sourceTree = "<group>"; };
                083DAEA20F01A7FB00342754 /* RenderTextControlMultiLine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTextControlMultiLine.cpp; sourceTree = "<group>"; };
                083DAEA30F01A7FB00342754 /* RenderTextControlMultiLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTextControlMultiLine.h; sourceTree = "<group>"; };
                083DAEA40F01A7FB00342754 /* RenderTextControlSingleLine.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderTextControlSingleLine.cpp; sourceTree = "<group>"; };
                085A15921289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedTransformListPropertyTearOff.h; sourceTree = "<group>"; };
                085B92B80EFDE73D00E6123C /* FormDataBuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FormDataBuilder.cpp; sourceTree = "<group>"; };
                085B92B90EFDE73D00E6123C /* FormDataBuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FormDataBuilder.h; sourceTree = "<group>"; };
-               0863951313B5FE5700BB344D /* SVGAnimatedPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedPath.cpp; sourceTree = "<group>"; };
-               0863951413B5FE5700BB344D /* SVGAnimatedPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPath.h; sourceTree = "<group>"; };
                08641D4512142F7D008DE9F6 /* RenderImageResourceStyleImage.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderImageResourceStyleImage.cpp; sourceTree = "<group>"; };
                08641D4612142F7D008DE9F6 /* RenderImageResourceStyleImage.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderImageResourceStyleImage.h; sourceTree = "<group>"; };
                086BBD0E136039C2008B15D8 /* Glyph.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Glyph.h; sourceTree = "<group>"; };
                088C2F7612390080003D65CE /* SVGTextLayoutAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTextLayoutAttributes.h; sourceTree = "<group>"; };
                089582530E857A7E00F82C83 /* ImageLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ImageLoader.cpp; sourceTree = "<group>"; };
                089582540E857A7E00F82C83 /* ImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ImageLoader.h; sourceTree = "<group>"; };
-               089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPathSegListPropertyTearOff.h; sourceTree = "<group>"; };
                08A484750E5272C500C3FE76 /* ScriptElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ScriptElement.cpp; sourceTree = "<group>"; };
                08A484760E5272C500C3FE76 /* ScriptElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptElement.h; sourceTree = "<group>"; };
                08C925170FCC7C4A00480DEC /* FilterEffect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FilterEffect.cpp; sourceTree = "<group>"; };
                55FA7FF4210FB688005AEFE7 /* SVGAttributeAccessor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAttributeAccessor.h; sourceTree = "<group>"; };
                55FA7FF6210FBE3E005AEFE7 /* SVGAttributeRegistry.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAttributeRegistry.h; sourceTree = "<group>"; };
                55FA7FFA2110ECD7005AEFE7 /* SVGZoomAndPanType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGZoomAndPanType.h; sourceTree = "<group>"; };
-               55FA7FFC2110F813005AEFE7 /* SVGAnimatedPathSegListPropertyTearOff.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedPathSegListPropertyTearOff.cpp; sourceTree = "<group>"; };
                55FA7FFE21110E6E005AEFE7 /* SVGAnimatedPropertyType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPropertyType.h; sourceTree = "<group>"; };
                570440571E53851600356601 /* CryptoAlgorithmAES_CFBMac.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CryptoAlgorithmAES_CFBMac.cpp; sourceTree = "<group>"; };
                570440591E53936200356601 /* JSAesCbcCfbParams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSAesCbcCfbParams.h; sourceTree = "<group>"; };
                72FB238622497AD5007E5AC7 /* SVGValuePropertyAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyAnimator.h; sourceTree = "<group>"; };
                72FB238722497B15007E5AC7 /* SVGValuePropertyListAnimatorImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyListAnimatorImpl.h; sourceTree = "<group>"; };
                72FB238822497B15007E5AC7 /* SVGValuePropertyListAnimator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGValuePropertyListAnimator.h; sourceTree = "<group>"; };
+               72FB2396224B07B9007E5AC7 /* SVGPathSegImpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegImpl.h; sourceTree = "<group>"; };
                7553CFE6108F473F00EA281E /* TimelineRecordFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TimelineRecordFactory.h; sourceTree = "<group>"; };
                7553CFE7108F473F00EA281E /* TimelineRecordFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = TimelineRecordFactory.cpp; sourceTree = "<group>"; };
                75793E800D0CE0B3007FC0AC /* MessageEvent.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = MessageEvent.cpp; sourceTree = "<group>"; };
                7C330A051DF9F95100D3395C /* JSPositionOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSPositionOptions.cpp; sourceTree = "<group>"; };
                7C330A061DF9F95100D3395C /* JSPositionOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSPositionOptions.h; sourceTree = "<group>"; };
                7C33F3601B4A050400502CAF /* JSDocumentFragmentCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDocumentFragmentCustom.cpp; sourceTree = "<group>"; };
-               7C39C3621DDA864900FEFB29 /* SVGLengthListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGLengthListValues.cpp; sourceTree = "<group>"; };
-               7C39C3631DDA864900FEFB29 /* SVGLengthListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGLengthListValues.h; sourceTree = "<group>"; };
                7C39C36C1DDB8BB000FEFB29 /* SVGTransformListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGTransformListValues.cpp; sourceTree = "<group>"; };
                7C39C36D1DDB8BB000FEFB29 /* SVGTransformListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGTransformListValues.h; sourceTree = "<group>"; };
-               7C39C36E1DDBA3E000FEFB29 /* SVGPathSegListValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegListValues.cpp; sourceTree = "<group>"; };
-               7C39C36F1DDBA3E000FEFB29 /* SVGPathSegListValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegListValues.h; sourceTree = "<group>"; };
-               7C39C3701DDBA44000FEFB29 /* SVGPathSegList.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegList.cpp; sourceTree = "<group>"; };
                7C3A91E51C963B8800D1A7E3 /* ClipboardAccessPolicy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClipboardAccessPolicy.h; sourceTree = "<group>"; };
                7C3B796F1908757B00B47A2D /* UserMessageHandler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = UserMessageHandler.cpp; sourceTree = "<group>"; };
                7C3B79701908757B00B47A2D /* UserMessageHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UserMessageHandler.h; sourceTree = "<group>"; };
                83BB5C871D5D6F3A005A71F4 /* AllDescendantsCollection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AllDescendantsCollection.h; sourceTree = "<group>"; };
                83C05A581A686212007E5DEA /* StylePropertyShorthandFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = StylePropertyShorthandFunctions.cpp; path = DerivedSources/WebCore/StylePropertyShorthandFunctions.cpp; sourceTree = BUILT_PRODUCTS_DIR; };
                83C05A591A686212007E5DEA /* StylePropertyShorthandFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = StylePropertyShorthandFunctions.h; path = DerivedSources/WebCore/StylePropertyShorthandFunctions.h; sourceTree = BUILT_PRODUCTS_DIR; };
-               83C1D413178D5AB400141E68 /* SVGPathSegArcAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegArcAbs.h; sourceTree = "<group>"; };
-               83C1D414178D5AB400141E68 /* SVGPathSegArcRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegArcRel.h; sourceTree = "<group>"; };
-               83C1D415178D5AB400141E68 /* SVGPathSegCurvetoCubicAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubicAbs.h; sourceTree = "<group>"; };
-               83C1D416178D5AB400141E68 /* SVGPathSegCurvetoCubicRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubicRel.h; sourceTree = "<group>"; };
-               83C1D417178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubicSmoothAbs.h; sourceTree = "<group>"; };
-               83C1D418178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubicSmoothRel.h; sourceTree = "<group>"; };
-               83C1D419178D5AB400141E68 /* SVGPathSegCurvetoQuadraticAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadraticAbs.h; sourceTree = "<group>"; };
-               83C1D41A178D5AB400141E68 /* SVGPathSegCurvetoQuadraticRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadraticRel.h; sourceTree = "<group>"; };
-               83C1D41B178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadraticSmoothAbs.h; sourceTree = "<group>"; };
-               83C1D41C178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadraticSmoothRel.h; sourceTree = "<group>"; };
-               83C1D41D178D5AB400141E68 /* SVGPathSegLinetoAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoAbs.h; sourceTree = "<group>"; };
-               83C1D41E178D5AB400141E68 /* SVGPathSegLinetoHorizontalAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoHorizontalAbs.h; sourceTree = "<group>"; };
-               83C1D41F178D5AB400141E68 /* SVGPathSegLinetoHorizontalRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoHorizontalRel.h; sourceTree = "<group>"; };
-               83C1D420178D5AB400141E68 /* SVGPathSegLinetoRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoRel.h; sourceTree = "<group>"; };
-               83C1D421178D5AB400141E68 /* SVGPathSegLinetoVerticalAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoVerticalAbs.h; sourceTree = "<group>"; };
-               83C1D422178D5AB400141E68 /* SVGPathSegLinetoVerticalRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoVerticalRel.h; sourceTree = "<group>"; };
-               83C1D423178D5AB400141E68 /* SVGPathSegMovetoAbs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegMovetoAbs.h; sourceTree = "<group>"; };
-               83C1D424178D5AB400141E68 /* SVGPathSegMovetoRel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegMovetoRel.h; sourceTree = "<group>"; };
                83C1F5911EDF69D300410D27 /* QualifiedNameCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = QualifiedNameCache.cpp; sourceTree = "<group>"; };
                83C1F5921EDF69D300410D27 /* QualifiedNameCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = QualifiedNameCache.h; sourceTree = "<group>"; };
                83C45B8B1DC2B663008871BA /* ValidationBubbleMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ValidationBubbleMac.mm; sourceTree = "<group>"; };
                B22278C40D00BF200071B782 /* SVGPathElement.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathElement.idl; sourceTree = "<group>"; };
                B22278C50D00BF200071B782 /* SVGPathSeg.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSeg.h; sourceTree = "<group>"; };
                B22278C60D00BF200071B782 /* SVGPathSeg.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSeg.idl; sourceTree = "<group>"; };
-               B22278C80D00BF200071B782 /* SVGPathSegArc.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegArc.h; sourceTree = "<group>"; };
                B22278C90D00BF200071B782 /* SVGPathSegArcAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegArcAbs.idl; sourceTree = "<group>"; };
                B22278CA0D00BF200071B782 /* SVGPathSegArcRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegArcRel.idl; sourceTree = "<group>"; };
-               B22278CC0D00BF200071B782 /* SVGPathSegClosePath.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegClosePath.h; sourceTree = "<group>"; };
                B22278CD0D00BF200071B782 /* SVGPathSegClosePath.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegClosePath.idl; sourceTree = "<group>"; };
-               B22278CF0D00BF200071B782 /* SVGPathSegCurvetoCubic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubic.h; sourceTree = "<group>"; };
                B22278D00D00BF200071B782 /* SVGPathSegCurvetoCubicAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoCubicAbs.idl; sourceTree = "<group>"; };
                B22278D10D00BF200071B782 /* SVGPathSegCurvetoCubicRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoCubicRel.idl; sourceTree = "<group>"; };
-               B22278D30D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoCubicSmooth.h; sourceTree = "<group>"; };
                B22278D40D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoCubicSmoothAbs.idl; sourceTree = "<group>"; };
                B22278D50D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoCubicSmoothRel.idl; sourceTree = "<group>"; };
-               B22278D70D00BF200071B782 /* SVGPathSegCurvetoQuadratic.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadratic.h; sourceTree = "<group>"; };
                B22278D80D00BF200071B782 /* SVGPathSegCurvetoQuadraticAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoQuadraticAbs.idl; sourceTree = "<group>"; };
                B22278D90D00BF200071B782 /* SVGPathSegCurvetoQuadraticRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoQuadraticRel.idl; sourceTree = "<group>"; };
                B22278DC0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoQuadraticSmoothAbs.idl; sourceTree = "<group>"; };
                B22278DD0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegCurvetoQuadraticSmoothRel.idl; sourceTree = "<group>"; };
                B22278E00D00BF200071B782 /* SVGPathSegLinetoAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoAbs.idl; sourceTree = "<group>"; };
-               B22278E20D00BF200071B782 /* SVGPathSegLinetoHorizontal.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoHorizontal.h; sourceTree = "<group>"; };
                B22278E30D00BF200071B782 /* SVGPathSegLinetoHorizontalAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoHorizontalAbs.idl; sourceTree = "<group>"; };
                B22278E40D00BF200071B782 /* SVGPathSegLinetoHorizontalRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoHorizontalRel.idl; sourceTree = "<group>"; };
                B22278E50D00BF200071B782 /* SVGPathSegLinetoRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoRel.idl; sourceTree = "<group>"; };
-               B22278E70D00BF200071B782 /* SVGPathSegLinetoVertical.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLinetoVertical.h; sourceTree = "<group>"; };
                B22278E80D00BF200071B782 /* SVGPathSegLinetoVerticalAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoVerticalAbs.idl; sourceTree = "<group>"; };
                B22278E90D00BF200071B782 /* SVGPathSegLinetoVerticalRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoVerticalRel.idl; sourceTree = "<group>"; };
                B22278EB0D00BF200071B782 /* SVGPathSegList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegList.h; sourceTree = "<group>"; };
                        children = (
                                5553592022441A16008F5EC9 /* SVGAnimatedDecoratedProperty.h */,
                                088A0DFB126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h */,
-                               55FA7FFC2110F813005AEFE7 /* SVGAnimatedPathSegListPropertyTearOff.cpp */,
-                               089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */,
                                55EE5357223B29F800FBA944 /* SVGAnimatedPrimitiveProperty.h */,
                                55BE025D223B29C40032F08A /* SVGAnimatedProperty.cpp */,
                                55EE5362223B2A2300FBA944 /* SVGAnimatedProperty.h */,
                                B22277E70D00BF1F0071B782 /* SVGAnimatedBoolean.idl */,
                                B22277E80D00BF1F0071B782 /* SVGAnimatedEnumeration.idl */,
                                B22277E90D00BF1F0071B782 /* SVGAnimatedInteger.idl */,
-                               4381763A13A697D4007D1187 /* SVGAnimatedLength.cpp */,
-                               089021A8126EF5DE0092D5EA /* SVGAnimatedLength.h */,
                                B22277EA0D00BF1F0071B782 /* SVGAnimatedLength.idl */,
-                               431A2FD613B7707A007791E4 /* SVGAnimatedLengthList.cpp */,
-                               089021AC126EF5E90092D5EA /* SVGAnimatedLengthList.h */,
                                B22277EB0D00BF1F0071B782 /* SVGAnimatedLengthList.idl */,
                                B22277EC0D00BF1F0071B782 /* SVGAnimatedNumber.idl */,
                                B22277ED0D00BF1F0071B782 /* SVGAnimatedNumberList.idl */,
-                               0863951313B5FE5700BB344D /* SVGAnimatedPath.cpp */,
-                               0863951413B5FE5700BB344D /* SVGAnimatedPath.h */,
                                B22277F40D00BF1F0071B782 /* SVGAnimatedPreserveAspectRatio.idl */,
                                B22277F50D00BF1F0071B782 /* SVGAnimatedRect.idl */,
                                B22277F60D00BF1F0071B782 /* SVGAnimatedString.idl */,
                                8476C9EE11DF6A5800555B02 /* SVGPathParser.h */,
                                B22278C50D00BF200071B782 /* SVGPathSeg.h */,
                                B22278C60D00BF200071B782 /* SVGPathSeg.idl */,
-                               B22278C80D00BF200071B782 /* SVGPathSegArc.h */,
-                               83C1D413178D5AB400141E68 /* SVGPathSegArcAbs.h */,
                                B22278C90D00BF200071B782 /* SVGPathSegArcAbs.idl */,
-                               83C1D414178D5AB400141E68 /* SVGPathSegArcRel.h */,
                                B22278CA0D00BF200071B782 /* SVGPathSegArcRel.idl */,
-                               B22278CC0D00BF200071B782 /* SVGPathSegClosePath.h */,
                                B22278CD0D00BF200071B782 /* SVGPathSegClosePath.idl */,
-                               B22278CF0D00BF200071B782 /* SVGPathSegCurvetoCubic.h */,
-                               83C1D415178D5AB400141E68 /* SVGPathSegCurvetoCubicAbs.h */,
                                B22278D00D00BF200071B782 /* SVGPathSegCurvetoCubicAbs.idl */,
-                               83C1D416178D5AB400141E68 /* SVGPathSegCurvetoCubicRel.h */,
                                B22278D10D00BF200071B782 /* SVGPathSegCurvetoCubicRel.idl */,
-                               B22278D30D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.h */,
-                               83C1D417178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothAbs.h */,
                                B22278D40D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothAbs.idl */,
-                               83C1D418178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothRel.h */,
                                B22278D50D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothRel.idl */,
-                               B22278D70D00BF200071B782 /* SVGPathSegCurvetoQuadratic.h */,
-                               83C1D419178D5AB400141E68 /* SVGPathSegCurvetoQuadraticAbs.h */,
                                B22278D80D00BF200071B782 /* SVGPathSegCurvetoQuadraticAbs.idl */,
-                               83C1D41A178D5AB400141E68 /* SVGPathSegCurvetoQuadraticRel.h */,
                                B22278D90D00BF200071B782 /* SVGPathSegCurvetoQuadraticRel.idl */,
-                               83C1D41B178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothAbs.h */,
                                B22278DC0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothAbs.idl */,
-                               83C1D41C178D5AB400141E68 /* SVGPathSegCurvetoQuadraticSmoothRel.h */,
                                B22278DD0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothRel.idl */,
-                               83C1D41D178D5AB400141E68 /* SVGPathSegLinetoAbs.h */,
+                               72FB2396224B07B9007E5AC7 /* SVGPathSegImpl.h */,
                                B22278E00D00BF200071B782 /* SVGPathSegLinetoAbs.idl */,
-                               B22278E20D00BF200071B782 /* SVGPathSegLinetoHorizontal.h */,
-                               83C1D41E178D5AB400141E68 /* SVGPathSegLinetoHorizontalAbs.h */,
                                B22278E30D00BF200071B782 /* SVGPathSegLinetoHorizontalAbs.idl */,
-                               83C1D41F178D5AB400141E68 /* SVGPathSegLinetoHorizontalRel.h */,
                                B22278E40D00BF200071B782 /* SVGPathSegLinetoHorizontalRel.idl */,
-                               83C1D420178D5AB400141E68 /* SVGPathSegLinetoRel.h */,
                                B22278E50D00BF200071B782 /* SVGPathSegLinetoRel.idl */,
-                               B22278E70D00BF200071B782 /* SVGPathSegLinetoVertical.h */,
-                               83C1D421178D5AB400141E68 /* SVGPathSegLinetoVerticalAbs.h */,
                                B22278E80D00BF200071B782 /* SVGPathSegLinetoVerticalAbs.idl */,
-                               83C1D422178D5AB400141E68 /* SVGPathSegLinetoVerticalRel.h */,
                                B22278E90D00BF200071B782 /* SVGPathSegLinetoVerticalRel.idl */,
-                               7C39C3701DDBA44000FEFB29 /* SVGPathSegList.cpp */,
                                B22278EB0D00BF200071B782 /* SVGPathSegList.h */,
                                B22278EC0D00BF210071B782 /* SVGPathSegList.idl */,
                                8476C9E311DF6A0B00555B02 /* SVGPathSegListBuilder.cpp */,
                                8476C9E411DF6A0B00555B02 /* SVGPathSegListBuilder.h */,
                                84B6B975120F13E500B8EFAF /* SVGPathSegListSource.cpp */,
                                84B6B976120F13E500B8EFAF /* SVGPathSegListSource.h */,
-                               7C39C36E1DDBA3E000FEFB29 /* SVGPathSegListValues.cpp */,
-                               7C39C36F1DDBA3E000FEFB29 /* SVGPathSegListValues.h */,
-                               83C1D423178D5AB400141E68 /* SVGPathSegMovetoAbs.h */,
                                B22278EF0D00BF210071B782 /* SVGPathSegMovetoAbs.idl */,
-                               83C1D424178D5AB400141E68 /* SVGPathSegMovetoRel.h */,
                                B22278F00D00BF210071B782 /* SVGPathSegMovetoRel.idl */,
-                               082DE42C1292621600D923DF /* SVGPathSegWithContext.h */,
                                84300BD7120C9AD40021954A /* SVGPathSource.h */,
                                8419D2B7120E0C7600141F8F /* SVGPathStringBuilder.cpp */,
                                8419D2B8120E0C7600141F8F /* SVGPathStringBuilder.h */,
                                24D912B813CA9A6900D21915 /* SVGAltGlyphItemElement.h in Headers */,
                                B22279770D00BF220071B782 /* SVGAngle.h in Headers */,
                                B222797A0D00BF220071B782 /* SVGAnimateColorElement.h in Headers */,
-                               089021A9126EF5DE0092D5EA /* SVGAnimatedLength.h in Headers */,
-                               089021AD126EF5E90092D5EA /* SVGAnimatedLengthList.h in Headers */,
                                088A0E04126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h in Headers */,
-                               0863951613B5FE5700BB344D /* SVGAnimatedPath.h in Headers */,
-                               089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */,
                                088A0E06126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h in Headers */,
                                088A0E08126EF1DB00978F7A /* SVGAnimatedPropertyTearOff.h in Headers */,
                                55FA7FFF21110E6E005AEFE7 /* SVGAnimatedPropertyType.h in Headers */,
                                B2227A590D00BF220071B782 /* SVGPathElement.h in Headers */,
                                8476C9F011DF6A5800555B02 /* SVGPathParser.h in Headers */,
                                B2227A5B0D00BF220071B782 /* SVGPathSeg.h in Headers */,
-                               B2227A5E0D00BF220071B782 /* SVGPathSegArc.h in Headers */,
-                               83C1D425178D5AB400141E68 /* SVGPathSegArcAbs.h in Headers */,
-                               83C1D426178D5AB400141E68 /* SVGPathSegArcRel.h in Headers */,
-                               B2227A620D00BF220071B782 /* SVGPathSegClosePath.h in Headers */,
-                               B2227A650D00BF220071B782 /* SVGPathSegCurvetoCubic.h in Headers */,
-                               83C1D427178D5AB400141E68 /* SVGPathSegCurvetoCubicAbs.h in Headers */,
-                               83C1D428178D5AB400141E68 /* SVGPathSegCurvetoCubicRel.h in Headers */,
-                               B2227A690D00BF220071B782 /* SVGPathSegCurvetoCubicSmooth.h in Headers */,
-                               83C1D429178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothAbs.h in Headers */,
-                               83C1D42A178D5AB400141E68 /* SVGPathSegCurvetoCubicSmoothRel.h in Headers */,
-                               B2227A6D0D00BF220071B782 /* SVGPathSegCurvetoQuadratic.h in Headers */,
-                               83C1D42B178D5AB400141E68 /* SVGPathSegCurvetoQuadraticAbs.h in Headers */,
-                               83C1D42C178D5AB500141E68 /* SVGPathSegCurvetoQuadraticRel.h in Headers */,
-                               83C1D42D178D5AB500141E68 /* SVGPathSegCurvetoQuadraticSmoothAbs.h in Headers */,
-                               83C1D42E178D5AB500141E68 /* SVGPathSegCurvetoQuadraticSmoothRel.h in Headers */,
-                               83C1D42F178D5AB500141E68 /* SVGPathSegLinetoAbs.h in Headers */,
-                               B2227A780D00BF220071B782 /* SVGPathSegLinetoHorizontal.h in Headers */,
-                               83C1D430178D5AB500141E68 /* SVGPathSegLinetoHorizontalAbs.h in Headers */,
-                               83C1D431178D5AB500141E68 /* SVGPathSegLinetoHorizontalRel.h in Headers */,
-                               83C1D432178D5AB500141E68 /* SVGPathSegLinetoRel.h in Headers */,
-                               B2227A7D0D00BF220071B782 /* SVGPathSegLinetoVertical.h in Headers */,
-                               83C1D433178D5AB500141E68 /* SVGPathSegLinetoVerticalAbs.h in Headers */,
-                               83C1D434178D5AB500141E68 /* SVGPathSegLinetoVerticalRel.h in Headers */,
                                B2227A810D00BF220071B782 /* SVGPathSegList.h in Headers */,
                                8476C9E611DF6A0B00555B02 /* SVGPathSegListBuilder.h in Headers */,
                                84B6B978120F13E500B8EFAF /* SVGPathSegListSource.h in Headers */,
-                               83C1D435178D5AB500141E68 /* SVGPathSegMovetoAbs.h in Headers */,
-                               83C1D436178D5AB500141E68 /* SVGPathSegMovetoRel.h in Headers */,
-                               082DE42D1292621600D923DF /* SVGPathSegWithContext.h in Headers */,
                                84300BD8120C9AD40021954A /* SVGPathSource.h in Headers */,
                                8419D2BA120E0C7600141F8F /* SVGPathStringBuilder.h in Headers */,
                                84300BD6120C9AAC0021954A /* SVGPathStringSource.h in Headers */,
index 86adb9d..08173ee 100644 (file)
 #include "JSSVGPathSegMovetoAbs.h"
 #include "JSSVGPathSegMovetoRel.h"
 #include "SVGPathSeg.h"
-#include "SVGPathSegArc.h"
-#include "SVGPathSegClosePath.h"
-#include "SVGPathSegCurvetoCubic.h"
-#include "SVGPathSegCurvetoCubicSmooth.h"
-#include "SVGPathSegCurvetoQuadratic.h"
-#include "SVGPathSegCurvetoQuadraticSmoothAbs.h"
-#include "SVGPathSegCurvetoQuadraticSmoothRel.h"
-#include "SVGPathSegLinetoAbs.h"
-#include "SVGPathSegLinetoHorizontal.h"
-#include "SVGPathSegLinetoRel.h"
-#include "SVGPathSegLinetoVertical.h"
-#include "SVGPathSegMovetoAbs.h"
-#include "SVGPathSegMovetoRel.h"
-
 
 namespace WebCore {
 using namespace JSC;
index b512264..dd55279 100644 (file)
@@ -619,6 +619,22 @@ sub IsSVGAnimatedType
     return $object->IsSVGAnimatedTypeName($type->name);
 }
 
+sub IsSVGPathSegTypeName
+{
+    my ($object, $typeName) = @_;
+
+    return $typeName =~ /^SVGPathSeg/;
+}
+
+sub IsSVGPathSegType
+{
+    my ($object, $type) = @_;
+
+    assert("Not a type") if ref($type) ne "IDLType";
+
+    return $object->IsSVGPathSegTypeName($type->name);
+}
+
 sub IsConstructorType
 {
     my ($object, $type) = @_;
index e8c396d..505c4f2 100644 (file)
@@ -2522,6 +2522,8 @@ sub GenerateHeader
 
     if ($codeGenerator->IsSVGAnimatedType($interface->type)) {
         $headerIncludes{"SVGAnimatedPropertyImpl.h"} = 1;
+    } elsif ($codeGenerator->IsSVGPathSegType($interface->type)) {
+        $headerIncludes{"SVGPathSegImpl.h"} = 1;
     } else {
         $headerIncludes{"$interfaceName.h"} = 1 if $hasParent && $interface->extendedAttributes->{JSGenerateToNativeObject};
         # Implementation class forward declaration
@@ -2573,7 +2575,7 @@ sub GenerateHeader
         push(@headerContent, "        return ptr;\n");
         push(@headerContent, "    }\n\n");  
     } else {
-        if (!$codeGenerator->IsSVGAnimatedType($interface->type)) {
+        if (!$codeGenerator->IsSVGAnimatedType($interface->type) && !$codeGenerator->IsSVGPathSegType($interface->type)) {
             AddIncludesForImplementationTypeInHeader($implType);
         }
         push(@headerContent, "    static $className* create(JSC::Structure* structure, JSDOMGlobalObject* globalObject, Ref<$implType>&& impl)\n");
index 02844b9..fe97674 100644 (file)
@@ -95,7 +95,7 @@ static Path pathFromLineElement(const SVGElement& element)
 
 static Path pathFromPathElement(const SVGElement& element)
 {
-    return downcast<SVGPathElement>(element).pathForByteStream();
+    return downcast<SVGPathElement>(element).path();
 }
 
 static Path pathFromPolygonElement(const SVGElement& element)
diff --git a/Source/WebCore/svg/SVGAnimatedPath.cpp b/Source/WebCore/svg/SVGAnimatedPath.cpp
deleted file mode 100644 (file)
index 20f495f..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2011, 2012. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGAnimatedPath.h"
-
-#include "SVGAnimateElementBase.h"
-#include "SVGAnimatedPathSegListPropertyTearOff.h"
-
-namespace WebCore {
-
-SVGAnimatedPathAnimator::SVGAnimatedPathAnimator(SVGAnimationElement* animationElement, SVGElement* contextElement)
-    : SVGAnimatedTypeAnimator(AnimatedPath, animationElement, contextElement)
-{
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedPathAnimator::constructFromString(const String& string)
-{
-    return SVGAnimatedType::create(SVGPropertyTraits<SVGPathByteStream>::fromString(string));
-}
-
-std::unique_ptr<SVGAnimatedType> SVGAnimatedPathAnimator::startAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    ASSERT(animatedTypes.size() >= 1);
-
-    // Build initial path byte stream.
-    auto animatedType = SVGAnimatedType::create<SVGPathByteStream>();
-    resetAnimValToBaseVal(animatedTypes, *animatedType);
-    return animatedType;
-}
-
-void SVGAnimatedPathAnimator::stopAnimValAnimation(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    stopAnimValAnimationForType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes);
-}
-
-void SVGAnimatedPathAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGPathByteStream* byteStream)
-{
-    RefPtr<SVGAnimatedPathSegListPropertyTearOff> property = castAnimatedPropertyToActualType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes[0].properties[0].get());
-    const auto& baseValue = property->currentBaseValue();
-
-    buildSVGPathByteStreamFromSVGPathSegListValues(baseValue, *byteStream, UnalteredParsing);
-
-    Vector<RefPtr<SVGAnimatedPathSegListPropertyTearOff>> result;
-
-    for (auto& type : animatedTypes) {
-        auto* segment = castAnimatedPropertyToActualType<SVGAnimatedPathSegListPropertyTearOff>(type.properties[0].get());
-        if (segment->isAnimating())
-            continue;
-        result.append(segment);
-    }
-
-    if (!result.isEmpty()) {
-        SVGElement::InstanceUpdateBlocker blocker(*property->contextElement());
-        for (auto& segment : result)
-            segment->animationStarted(byteStream, &baseValue);
-    }
-}
-
-void SVGAnimatedPathAnimator::resetAnimValToBaseVal(const SVGElementAnimatedPropertyList& animatedTypes, SVGAnimatedType& type)
-{
-    ASSERT(animatedTypes.size() >= 1);
-    ASSERT(type.type() == m_type);
-    resetAnimValToBaseVal(animatedTypes, &type.as<SVGPathByteStream>());
-}
-
-void SVGAnimatedPathAnimator::animValWillChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValWillChangeForType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes);
-}
-
-void SVGAnimatedPathAnimator::animValDidChange(const SVGElementAnimatedPropertyList& animatedTypes)
-{
-    animValDidChangeForType<SVGAnimatedPathSegListPropertyTearOff>(animatedTypes);
-}
-
-void SVGAnimatedPathAnimator::addAnimatedTypes(SVGAnimatedType* from, SVGAnimatedType* to)
-{
-    ASSERT(from->type() == AnimatedPath);
-    ASSERT(from->type() == to->type());
-
-    const auto& fromPath = from->as<SVGPathByteStream>();
-    auto& toPath = to->as<SVGPathByteStream>();
-    unsigned fromPathSize = fromPath.size();
-    if (!fromPathSize || fromPathSize != toPath.size())
-        return;
-    addToSVGPathByteStream(toPath, fromPath);
-}
-
-void SVGAnimatedPathAnimator::calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType* from, SVGAnimatedType* to, SVGAnimatedType* toAtEndOfDuration, SVGAnimatedType* animated)
-{
-    ASSERT(m_animationElement);
-    ASSERT(m_contextElement);
-
-    bool isToAnimation = m_animationElement->animationMode() == AnimationMode::To;
-    auto& animatedPath = animated->as<SVGPathByteStream>();
-
-    SVGPathByteStream underlyingPath;
-    if (isToAnimation)
-        underlyingPath = animatedPath;
-
-    const auto& fromPath = isToAnimation ? underlyingPath : from->as<SVGPathByteStream>();
-    const auto& toPath = to->as<SVGPathByteStream>();
-    const auto& toAtEndOfDurationPath = toAtEndOfDuration->as<SVGPathByteStream>();
-
-    // Cache the current animated value before the buildAnimatedSVGPathByteStream() clears animatedPath.
-    SVGPathByteStream lastAnimatedPath;
-    if (!fromPath.size() || (m_animationElement->isAdditive() && !isToAnimation))
-        lastAnimatedPath = animatedPath;
-
-    // Pass false to 'resizeAnimatedListIfNeeded' here, as the path animation is not a regular Vector<SVGXXX> type, but a SVGPathByteStream, that works differently.
-    if (!m_animationElement->adjustFromToListValues<SVGPathByteStream>(fromPath, toPath, animatedPath, percentage, false))
-        return;
-
-    buildAnimatedSVGPathByteStream(fromPath, toPath, animatedPath, percentage);
-
-    // Handle additive='sum'.
-    if (!lastAnimatedPath.isEmpty())
-        addToSVGPathByteStream(animatedPath, lastAnimatedPath);
-
-    // Handle accumulate='sum'.
-    if (m_animationElement->isAccumulated() && repeatCount)
-        addToSVGPathByteStream(animatedPath, toAtEndOfDurationPath, repeatCount);
-}
-
-float SVGAnimatedPathAnimator::calculateDistance(const String&, const String&)
-{
-    // FIXME: Support paced animations.
-    return -1;
-}
-
-}
diff --git a/Source/WebCore/svg/SVGAnimatedPath.h b/Source/WebCore/svg/SVGAnimatedPath.h
deleted file mode 100644 (file)
index b864ed3..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2011, 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGAnimatedPathSegListPropertyTearOff.h"
-#include "SVGAnimatedTypeAnimator.h"
-#include "SVGAttributeAccessor.h"
-
-namespace WebCore {
-
-class SVGAnimationElement;
-
-using SVGAnimatedPathSegList = SVGAnimatedPathSegListPropertyTearOff;
-using SVGAnimatedPathSegListAttribute = SVGAnimatedAttributeList<SVGAnimatedPathSegList>;
-
-class SVGAnimatedPathAnimator final : public SVGAnimatedTypeAnimator {
-public:
-    SVGAnimatedPathAnimator(SVGAnimationElement*, SVGElement*);
-
-    std::unique_ptr<SVGAnimatedType> constructFromString(const String&) override;
-    std::unique_ptr<SVGAnimatedType> startAnimValAnimation(const SVGElementAnimatedPropertyList&) override;
-    void stopAnimValAnimation(const SVGElementAnimatedPropertyList&) override;
-    void resetAnimValToBaseVal(const SVGElementAnimatedPropertyList&, SVGAnimatedType&) override;
-    void animValWillChange(const SVGElementAnimatedPropertyList&) override;
-    void animValDidChange(const SVGElementAnimatedPropertyList&) override;
-
-    void addAnimatedTypes(SVGAnimatedType*, SVGAnimatedType*) override;
-    void calculateAnimatedValue(float percentage, unsigned repeatCount, SVGAnimatedType*, SVGAnimatedType*, SVGAnimatedType*, SVGAnimatedType*) override;
-    float calculateDistance(const String& fromString, const String& toString) override;
-
-private:
-    void resetAnimValToBaseVal(const SVGElementAnimatedPropertyList&, SVGPathByteStream*);
-};
-
-} // namespace WebCore
index 85dfc04..6430b4d 100644 (file)
@@ -80,13 +80,8 @@ public:
 
     AnimatedPropertyType type() const
     {
-        static AnimatedPropertyType animatedTypes[] = {
-            AnimatedPath,
-            AnimatedTransformList
-        };
-
-        ASSERT(static_cast<size_t>(m_value.index()) < sizeof(animatedTypes) / sizeof(animatedTypes[0]));
-        return animatedTypes[m_value.index()];
+        ASSERT(!m_value.index());
+        return AnimatedTransformList;
     }
 
     String valueAsString() const
index 0374d4c..2cd8ac0 100644 (file)
@@ -19,7 +19,6 @@
 
 #pragma once
 
-#include "SVGAnimatedPath.h"
 #include "SVGAnimatedTransformList.h"
 
 namespace WebCore {
@@ -30,64 +29,17 @@ class SVGAnimatorFactory {
 public:
     static bool isSupportedAttributeType(AnimatedPropertyType attributeType)
     {
-        switch (attributeType) {
-        case AnimatedAngle:
-        case AnimatedBoolean:
-        case AnimatedColor:
-        case AnimatedEnumeration:
-        case AnimatedInteger:
-        case AnimatedIntegerOptionalInteger:
-        case AnimatedLength:
-        case AnimatedLengthList:
-        case AnimatedNumber:
-        case AnimatedNumberList:
-        case AnimatedNumberOptionalNumber:
-        case AnimatedPoints:
-        case AnimatedPreserveAspectRatio:
-        case AnimatedRect:
-        case AnimatedString:
-        case AnimatedUnknown:
-            break;
-
-        case AnimatedPath:
-        case AnimatedTransformList:
-            return true;
-        }
-
-        return false;
+        return attributeType == AnimatedTransformList;
     }
 
     static std::unique_ptr<SVGAnimatedTypeAnimator> create(SVGAnimationElement* animationElement, SVGElement* contextElement, AnimatedPropertyType attributeType)
     {
         ASSERT(animationElement);
         ASSERT(contextElement);
-
-        switch (attributeType) {
-        case AnimatedAngle:
-        case AnimatedBoolean:
-        case AnimatedColor:
-        case AnimatedEnumeration:
-        case AnimatedInteger:
-        case AnimatedIntegerOptionalInteger:
-        case AnimatedLength:
-        case AnimatedLengthList:
-        case AnimatedNumber:
-        case AnimatedNumberList:
-        case AnimatedNumberOptionalNumber:
-        case AnimatedPoints:
-        case AnimatedPreserveAspectRatio:
-        case AnimatedRect:
-        case AnimatedString:
-        case AnimatedUnknown:
-            break;
-
-        case AnimatedPath:
-            return std::make_unique<SVGAnimatedPathAnimator>(animationElement, contextElement);
-        case AnimatedTransformList:
+        ASSERT(attributeType == AnimatedTransformList);
+        
+        if (attributeType == AnimatedTransformList)
             return std::make_unique<SVGAnimatedTransformListAnimator>(animationElement, contextElement);
-        }
-
-        ASSERT_NOT_REACHED();
         return nullptr;
     }
 
index 395a104..6f0acac 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
- * Copyright (C) 2018 Apple Inc. All rights reserved.
+ * 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
@@ -49,6 +49,12 @@ public:
     typedef Data::const_iterator DataIterator;
 
     SVGPathByteStream() { }
+
+    SVGPathByteStream(const String& string)
+    {
+        buildSVGPathByteStreamFromString(string, *this, UnalteredParsing);
+    }
+
     SVGPathByteStream(const SVGPathByteStream& other)
     {
         *this = other;
@@ -92,24 +98,8 @@ public:
     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.
-    void resize(unsigned) { }
-
 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;
-    }
-    static Optional<SVGPathByteStream> parse(const QualifiedName&, const String&) { ASSERT_NOT_REACHED(); return { }; }
-    static String toString(const SVGPathByteStream&) { ASSERT_NOT_REACHED(); return emptyString(); }
-};
-
 } // namespace WebCore
index 40fbf27..07fc2a9 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- * Copyright (C) 2018 Apple Inc. All rights reserved.
+ * 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
 #include "SVGDocumentExtensions.h"
 #include "SVGMPathElement.h"
 #include "SVGNames.h"
-#include "SVGPathSegArcAbs.h"
-#include "SVGPathSegArcRel.h"
-#include "SVGPathSegClosePath.h"
-#include "SVGPathSegCurvetoCubicAbs.h"
-#include "SVGPathSegCurvetoCubicRel.h"
-#include "SVGPathSegCurvetoCubicSmoothAbs.h"
-#include "SVGPathSegCurvetoCubicSmoothRel.h"
-#include "SVGPathSegCurvetoQuadraticAbs.h"
-#include "SVGPathSegCurvetoQuadraticRel.h"
-#include "SVGPathSegCurvetoQuadraticSmoothAbs.h"
-#include "SVGPathSegCurvetoQuadraticSmoothRel.h"
-#include "SVGPathSegLinetoAbs.h"
-#include "SVGPathSegLinetoHorizontalAbs.h"
-#include "SVGPathSegLinetoHorizontalRel.h"
-#include "SVGPathSegLinetoRel.h"
-#include "SVGPathSegLinetoVerticalAbs.h"
-#include "SVGPathSegLinetoVerticalRel.h"
-#include "SVGPathSegList.h"
-#include "SVGPathSegMovetoAbs.h"
-#include "SVGPathSegMovetoRel.h"
 #include "SVGPathUtilities.h"
 #include "SVGPoint.h"
 #include <wtf/IsoMallocInlines.h>
-#include <wtf/NeverDestroyed.h>
 
 namespace WebCore {
 
@@ -61,7 +40,11 @@ inline SVGPathElement::SVGPathElement(const QualifiedName& tagName, Document& do
     , SVGExternalResourcesRequired(this)
 {
     ASSERT(hasTagName(SVGNames::pathTag));
-    registerAttributes();
+
+    static std::once_flag onceFlag;
+    std::call_once(onceFlag, [] {
+        PropertyRegistry::registerProperty<SVGNames::dAttr, &SVGPathElement::m_pathSegList>();
+    });
 }
 
 Ref<SVGPathElement> SVGPathElement::create(const QualifiedName& tagName, Document& document)
@@ -69,136 +52,11 @@ Ref<SVGPathElement> SVGPathElement::create(const QualifiedName& tagName, Documen
     return adoptRef(*new SVGPathElement(tagName, document));
 }
 
-float SVGPathElement::getTotalLength() const
-{
-    float totalLength = 0;
-    getTotalLengthOfSVGPathByteStream(pathByteStream(), totalLength);
-    return totalLength;
-}
-
-Ref<SVGPoint> SVGPathElement::getPointAtLength(float length) const
-{
-    FloatPoint point;
-    getPointAtLengthOfSVGPathByteStream(pathByteStream(), length, point);
-    return SVGPoint::create(point);
-}
-
-unsigned SVGPathElement::getPathSegAtLength(float length) const
-{
-    unsigned pathSeg = 0;
-    getSVGPathSegAtLengthFromSVGPathByteStream(pathByteStream(), length, pathSeg);
-    return pathSeg;
-}
-
-Ref<SVGPathSegClosePath> SVGPathElement::createSVGPathSegClosePath(SVGPathSegRole role)
-{
-    return SVGPathSegClosePath::create(*this, role);
-}
-
-Ref<SVGPathSegMovetoAbs> SVGPathElement::createSVGPathSegMovetoAbs(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegMovetoAbs::create(*this, role, x, y);
-}
-
-Ref<SVGPathSegMovetoRel> SVGPathElement::createSVGPathSegMovetoRel(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegMovetoRel::create(*this, role, x, y);
-}
-
-Ref<SVGPathSegLinetoAbs> SVGPathElement::createSVGPathSegLinetoAbs(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoAbs::create(*this, role, x, y);
-}
-
-Ref<SVGPathSegLinetoRel> SVGPathElement::createSVGPathSegLinetoRel(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoRel::create(*this, role, x, y);
-}
-
-Ref<SVGPathSegCurvetoCubicAbs> SVGPathElement::createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoCubicAbs::create(*this, role, x, y, x1, y1, x2, y2);
-}
-
-Ref<SVGPathSegCurvetoCubicRel> SVGPathElement::createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoCubicRel::create(*this, role, x, y, x1, y1, x2, y2);
-}
-
-Ref<SVGPathSegCurvetoQuadraticAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoQuadraticAbs::create(*this, role, x, y, x1, y1);
-}
-
-Ref<SVGPathSegCurvetoQuadraticRel> SVGPathElement::createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoQuadraticRel::create(*this, role, x, y, x1, y1);
-}
-
-Ref<SVGPathSegArcAbs> SVGPathElement::createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role)
-{
-    return SVGPathSegArcAbs::create(*this, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
-}
-
-Ref<SVGPathSegArcRel> SVGPathElement::createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role)
-{
-    return SVGPathSegArcRel::create(*this, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
-}
-
-Ref<SVGPathSegLinetoHorizontalAbs> SVGPathElement::createSVGPathSegLinetoHorizontalAbs(float x, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoHorizontalAbs::create(*this, role, x);
-}
-
-Ref<SVGPathSegLinetoHorizontalRel> SVGPathElement::createSVGPathSegLinetoHorizontalRel(float x, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoHorizontalRel::create(*this, role, x);
-}
-
-Ref<SVGPathSegLinetoVerticalAbs> SVGPathElement::createSVGPathSegLinetoVerticalAbs(float y, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoVerticalAbs::create(*this, role, y);
-}
-
-Ref<SVGPathSegLinetoVerticalRel> SVGPathElement::createSVGPathSegLinetoVerticalRel(float y, SVGPathSegRole role)
-{
-    return SVGPathSegLinetoVerticalRel::create(*this, role, y);
-}
-
-Ref<SVGPathSegCurvetoCubicSmoothAbs> SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoCubicSmoothAbs::create(*this, role, x, y, x2, y2);
-}
-
-Ref<SVGPathSegCurvetoCubicSmoothRel> SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoCubicSmoothRel::create(*this, role, x, y, x2, y2);
-}
-
-Ref<SVGPathSegCurvetoQuadraticSmoothAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoQuadraticSmoothAbs::create(*this, role, x, y);
-}
-
-Ref<SVGPathSegCurvetoQuadraticSmoothRel> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y, SVGPathSegRole role)
-{
-    return SVGPathSegCurvetoQuadraticSmoothRel::create(*this, role, x, y);
-}
-
-void SVGPathElement::registerAttributes()
-{
-    auto& registry = attributeRegistry();
-    if (!registry.isEmpty())
-        return;
-    registry.registerAttribute(SVGAnimatedCustomPathSegListAttributeAccessor::singleton<SVGNames::dAttr, &SVGPathElement::m_pathSegList>());
-}
-
 void SVGPathElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
 {
     if (name == SVGNames::dAttr) {
-        if (!buildSVGPathByteStreamFromString(value, m_pathByteStream, UnalteredParsing))
+        if (!m_pathSegList->baseVal()->parse(value))
             document().accessSVGExtensions().reportError("Problem parsing d=\"" + value + "\"");
-        m_cachedPath = WTF::nullopt;
         return;
     }
 
@@ -208,24 +66,15 @@ void SVGPathElement::parseAttribute(const QualifiedName& name, const AtomicStrin
 
 void SVGPathElement::svgAttributeChanged(const QualifiedName& attrName)
 {
-    if (isKnownAttribute(attrName)) {
+    if (attrName == SVGNames::dAttr) {
         InstanceInvalidationGuard guard(*this);
+        invalidateMPathDependencies();
 
-        RenderSVGPath* renderer = downcast<RenderSVGPath>(this->renderer());
-        if (attrName == SVGNames::dAttr) {
-            if (m_pathSegList.shouldSynchronize() && !lookupAnimatedProperty(m_pathSegList)->isAnimating()) {
-                SVGPathSegListValues newList(PathSegUnalteredRole);
-                buildSVGPathSegListValuesFromByteStream(m_pathByteStream, *this, newList, UnalteredParsing);
-                m_pathSegList.setValue(WTFMove(newList));
-            }
-
-            if (renderer)
-                renderer->setNeedsShapeUpdate();
-            invalidateMPathDependencies();
+        if (auto* renderer = downcast<RenderSVGPath>(this->renderer())) {
+            renderer->setNeedsShapeUpdate();
+            RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer);
         }
 
-        if (renderer)
-            RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer);
         return;
     }
 
@@ -258,104 +107,25 @@ void SVGPathElement::removedFromAncestor(RemovalType removalType, ContainerNode&
     invalidateMPathDependencies();
 }
 
-const SVGPathByteStream& SVGPathElement::pathByteStream() const
-{
-    auto property = lookupAnimatedProperty(m_pathSegList);
-    if (!property || !property->isAnimating())
-        return m_pathByteStream;
-    
-    if (auto* animatedPathByteStream = static_cast<SVGAnimatedPathSegListPropertyTearOff*>(property.get())->animatedPathByteStream())
-        return *animatedPathByteStream;
-
-    return m_pathByteStream;
-}
-    
-Path SVGPathElement::pathForByteStream() const
-{
-    const auto& pathByteStreamToUse = pathByteStream();
-
-    if (&pathByteStreamToUse == &m_pathByteStream) {
-        if (!m_cachedPath)
-            m_cachedPath = buildPathFromByteStream(m_pathByteStream);
-        return *m_cachedPath;
-    }
-    
-    return buildPathFromByteStream(pathByteStreamToUse);
-}
-
-RefPtr<SVGLegacyAnimatedProperty> SVGPathElement::lookupOrCreateDWrapper()
-{
-    return m_pathSegList.animatedProperty(attributeOwnerProxy());
-}
-
-void SVGPathElement::animatedPropertyWillBeDeleted()
-{
-    // m_pathSegList.shouldSynchronize is set to true when the 'd' wrapper for m_pathSegList
-    // is created and cached. We need to reset it back to false when this wrapper is deleted
-    // so we can be sure if shouldSynchronize is true, SVGAttributeAccessor::lookupAnimatedProperty()
-    // will return a valid cached 'd' wrapper for the m_pathSegList.
-    m_pathSegList.setShouldSynchronize(false);
-}
-
-Ref<SVGPathSegList> SVGPathElement::pathSegList()
-{
-    return static_pointer_cast<SVGAnimatedPathSegListPropertyTearOff>(lookupOrCreateDWrapper())->baseVal();
-}
-
-RefPtr<SVGPathSegList> SVGPathElement::normalizedPathSegList()
-{
-    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
-    return nullptr;
-}
-
-Ref<SVGPathSegList> SVGPathElement::animatedPathSegList()
-{
-    m_isAnimValObserved = true;
-    return static_pointer_cast<SVGAnimatedPathSegListPropertyTearOff>(lookupOrCreateDWrapper())->animVal();
-}
-
-RefPtr<SVGPathSegList> SVGPathElement::animatedNormalizedPathSegList()
+float SVGPathElement::getTotalLength() const
 {
-    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
-    return nullptr;
+    float totalLength = 0;
+    getTotalLengthOfSVGPathByteStream(pathByteStream(), totalLength);
+    return totalLength;
 }
 
-size_t SVGPathElement::approximateMemoryCost() const
+Ref<SVGPoint> SVGPathElement::getPointAtLength(float length) const
 {
-    // This is an approximation for path memory cost since the path is parsed on demand.
-    size_t pathMemoryCost = (m_pathByteStream.size() / 10) * sizeof(FloatPoint);
-    // We need to account for the memory which is allocated by the RenderSVGPath::m_path.
-    return sizeof(*this) + (renderer() ? pathMemoryCost * 2 + sizeof(RenderSVGPath) : pathMemoryCost);
+    FloatPoint point;
+    getPointAtLengthOfSVGPathByteStream(pathByteStream(), length, point);
+    return SVGPoint::create(point);
 }
 
-void SVGPathElement::pathSegListChanged(SVGPathSegRole role, ListModification listModification)
+unsigned SVGPathElement::getPathSegAtLength(float length) const
 {
-    switch (role) {
-    case PathSegNormalizedRole:
-        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
-        break;
-    case PathSegUnalteredRole: {
-        auto& pathSegList = m_pathSegList.value(false);
-        if (listModification == ListModificationAppend) {
-            ASSERT(!pathSegList.isEmpty());
-            appendSVGPathByteStreamFromSVGPathSeg(pathSegList.last().copyRef(), m_pathByteStream, UnalteredParsing);
-        } else
-            buildSVGPathByteStreamFromSVGPathSegListValues(pathSegList, m_pathByteStream, UnalteredParsing);
-        m_cachedPath = WTF::nullopt;
-        break;
-    }
-    case PathSegUndefinedRole:
-        return;
-    }
-
-    invalidateSVGAttributes();
-    
-    RenderSVGPath* renderer = downcast<RenderSVGPath>(this->renderer());
-    if (!renderer)
-        return;
-
-    renderer->setNeedsShapeUpdate();
-    RenderSVGResource::markForLayoutAndParentResourceInvalidation(*renderer);
+    unsigned pathSeg = 0;
+    getSVGPathSegAtLengthFromSVGPathByteStream(pathByteStream(), length, pathSeg);
+    return pathSeg;
 }
 
 FloatRect SVGPathElement::getBBox(StyleUpdateStrategy styleUpdateStrategy)
index 0e9ad2c..a5f5b91 100644 (file)
 #pragma once
 
 #include "Path.h"
-#include "SVGAnimatedPath.h"
 #include "SVGExternalResourcesRequired.h"
 #include "SVGGeometryElement.h"
 #include "SVGNames.h"
 #include "SVGPathByteStream.h"
-#include "SVGPathSegListValues.h"
+#include "SVGPathSegImpl.h"
 
 namespace WebCore {
 
-class SVGPathSegArcAbs;
-class SVGPathSegArcRel;
-class SVGPathSegClosePath;
-class SVGPathSegLinetoAbs;
-class SVGPathSegLinetoRel;
-class SVGPathSegMovetoAbs;
-class SVGPathSegMovetoRel;
-class SVGPathSegCurvetoCubicAbs;
-class SVGPathSegCurvetoCubicRel;
-class SVGPathSegLinetoVerticalAbs;
-class SVGPathSegLinetoVerticalRel;
-class SVGPathSegLinetoHorizontalAbs;
-class SVGPathSegLinetoHorizontalRel;
-class SVGPathSegCurvetoQuadraticAbs;
-class SVGPathSegCurvetoQuadraticRel;
-class SVGPathSegCurvetoCubicSmoothAbs;
-class SVGPathSegCurvetoCubicSmoothRel;
-class SVGPathSegCurvetoQuadraticSmoothAbs;
-class SVGPathSegCurvetoQuadraticSmoothRel;
 class SVGPathSegList;
 class SVGPoint;
 
@@ -58,74 +38,87 @@ class SVGPathElement final : public SVGGeometryElement, public SVGExternalResour
 public:
     static Ref<SVGPathElement> create(const QualifiedName&, Document&);
     
+    static Ref<SVGPathSegClosePath> createSVGPathSegClosePath() { return SVGPathSegClosePath::create(); }
+    static Ref<SVGPathSegMovetoAbs> createSVGPathSegMovetoAbs(float x, float y) { return SVGPathSegMovetoAbs::create(x, y); }
+    static Ref<SVGPathSegMovetoRel> createSVGPathSegMovetoRel(float x, float y) { return SVGPathSegMovetoRel::create(x, y); }
+    static Ref<SVGPathSegLinetoAbs> createSVGPathSegLinetoAbs(float x, float y) { return SVGPathSegLinetoAbs::create(x, y); }
+    static Ref<SVGPathSegLinetoRel> createSVGPathSegLinetoRel(float x, float y) { return SVGPathSegLinetoRel::create(x, y); }
+    static Ref<SVGPathSegCurvetoCubicAbs> createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2)
+    {
+        return SVGPathSegCurvetoCubicAbs::create(x, y, x1, y1, x2, y2);
+    }
+    static Ref<SVGPathSegCurvetoCubicRel> createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2)
+    {
+        return SVGPathSegCurvetoCubicRel::create(x, y, x1, y1, x2, y2);
+    }
+    static Ref<SVGPathSegCurvetoQuadraticAbs> createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1)
+    {
+        return SVGPathSegCurvetoQuadraticAbs::create(x, y, x1, y1);
+    }
+    static Ref<SVGPathSegCurvetoQuadraticRel> createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1)
+    {
+        return SVGPathSegCurvetoQuadraticRel::create(x, y, x1, y1);
+    }
+    static Ref<SVGPathSegArcAbs> createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
+    {
+        return SVGPathSegArcAbs::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+    }
+    static Ref<SVGPathSegArcRel> createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
+    {
+        return SVGPathSegArcRel::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+    }
+    static Ref<SVGPathSegLinetoHorizontalAbs> createSVGPathSegLinetoHorizontalAbs(float x) { return SVGPathSegLinetoHorizontalAbs::create(x); }
+    static Ref<SVGPathSegLinetoHorizontalRel> createSVGPathSegLinetoHorizontalRel(float x) { return SVGPathSegLinetoHorizontalRel::create(x); }
+    static Ref<SVGPathSegLinetoVerticalAbs> createSVGPathSegLinetoVerticalAbs(float y) { return SVGPathSegLinetoVerticalAbs::create(y); }
+    static Ref<SVGPathSegLinetoVerticalRel> createSVGPathSegLinetoVerticalRel(float y) { return SVGPathSegLinetoVerticalRel::create(y); }
+    static Ref<SVGPathSegCurvetoCubicSmoothAbs> createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2)
+    {
+        return SVGPathSegCurvetoCubicSmoothAbs::create(x, y, x2, y2);
+    }
+    static Ref<SVGPathSegCurvetoCubicSmoothRel> createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2)
+    {
+        return SVGPathSegCurvetoCubicSmoothRel::create(x, y, x2, y2);
+    }
+    static Ref<SVGPathSegCurvetoQuadraticSmoothAbs> createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y)
+    {
+        return SVGPathSegCurvetoQuadraticSmoothAbs::create(x, y);
+    }
+    static Ref<SVGPathSegCurvetoQuadraticSmoothRel> createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y)
+    {
+        return SVGPathSegCurvetoQuadraticSmoothRel::create(x, y);
+    }
+
     float getTotalLength() const final;
     Ref<SVGPoint> getPointAtLength(float distance) const final;
     unsigned getPathSegAtLength(float distance) const;
 
-    Ref<SVGPathSegClosePath> createSVGPathSegClosePath(SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegMovetoAbs> createSVGPathSegMovetoAbs(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegMovetoRel> createSVGPathSegMovetoRel(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoAbs> createSVGPathSegLinetoAbs(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoRel> createSVGPathSegLinetoRel(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoCubicAbs> createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoCubicRel> createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoQuadraticAbs> createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoQuadraticRel> createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegArcAbs> createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegArcRel> createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoHorizontalAbs> createSVGPathSegLinetoHorizontalAbs(float x, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoHorizontalRel> createSVGPathSegLinetoHorizontalRel(float x, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoVerticalAbs> createSVGPathSegLinetoVerticalAbs(float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegLinetoVerticalRel> createSVGPathSegLinetoVerticalRel(float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoCubicSmoothAbs> createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoCubicSmoothRel> createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoQuadraticSmoothAbs> createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-    Ref<SVGPathSegCurvetoQuadraticSmoothRel> createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y, SVGPathSegRole = PathSegUndefinedRole);
-
-    // Used in the bindings only.
-    Ref<SVGPathSegList> pathSegList();
-    Ref<SVGPathSegList> animatedPathSegList();
-    RefPtr<SVGPathSegList> normalizedPathSegList();
-    RefPtr<SVGPathSegList> animatedNormalizedPathSegList();
-
-    const SVGPathByteStream& pathByteStream() const;
-    Path pathForByteStream() const;
-
-    void pathSegListChanged(SVGPathSegRole, ListModification = ListModificationUnknown);
-
     FloatRect getBBox(StyleUpdateStrategy = AllowStyleUpdate) final;
 
-    bool isAnimValObserved() const { return m_isAnimValObserved; }
-
-    void animatedPropertyWillBeDeleted();
+    Ref<SVGPathSegList>& pathSegList() { return m_pathSegList->baseVal(); }
+    RefPtr<SVGPathSegList>& animatedPathSegList() { return m_pathSegList->animVal(); }
 
-    size_t approximateMemoryCost() const final;
+    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
+    RefPtr<SVGPathSegList> normalizedPathSegList() { return nullptr; }
+    RefPtr<SVGPathSegList> animatedNormalizedPathSegList() { return nullptr; }
 
-    const SVGPathSegListValues& pathSegList() const { return m_pathSegList.currentValue(attributeOwnerProxy()); }
-    RefPtr<SVGAnimatedPathSegList> pathSegListAnimated() { return m_pathSegList.animatedProperty(attributeOwnerProxy()); }
+    const SVGPathByteStream& pathByteStream() const { return m_pathSegList->currentPathByteStream(); }
+    Path path() const { return m_pathSegList->currentPath(); }
+    size_t approximateMemoryCost() const final { return m_pathSegList->approximateMemoryCost(); }
 
 private:
     SVGPathElement(const QualifiedName&, Document&);
 
     using AttributeOwnerProxy = SVGAttributeOwnerProxyImpl<SVGPathElement, SVGGeometryElement, SVGExternalResourcesRequired>;
-    static auto& attributeRegistry() { return AttributeOwnerProxy::attributeRegistry(); }
-    static void registerAttributes();
     const SVGAttributeOwnerProxy& attributeOwnerProxy() const final { return m_attributeOwnerProxy; }
 
     using PropertyRegistry = SVGPropertyOwnerRegistry<SVGPathElement, SVGGeometryElement, SVGExternalResourcesRequired>;
     const SVGPropertyRegistry& propertyRegistry() const final { return m_propertyRegistry; }
     
-    static bool isKnownAttribute(const QualifiedName& attributeName)
-    {
-        return AttributeOwnerProxy::isKnownAttribute(attributeName) || PropertyRegistry::isKnownAttribute(attributeName);
-    }
-
     void parseAttribute(const QualifiedName&, const AtomicString&) final;
     void svgAttributeChanged(const QualifiedName&) final;
 
     bool isValid() const final { return SVGTests::isValid(); }
     bool supportsMarkers() const final { return true; }
-    RefPtr<SVGLegacyAnimatedProperty> lookupOrCreateDWrapper();
 
     RenderPtr<RenderElement> createElementRenderer(RenderStyle&&, const RenderTreePosition&) final;
 
@@ -135,34 +128,9 @@ private:
     void invalidateMPathDependencies();
 
 private:
-    SVGPathByteStream m_pathByteStream;
-    mutable Optional<Path> m_cachedPath;
-    bool m_isAnimValObserved { false };
-
-    class SVGAnimatedCustomPathSegListAttribute : public SVGAnimatedPathSegListAttribute {
-    public:
-        SVGAnimatedCustomPathSegListAttribute(SVGPathElement& element)
-            : SVGAnimatedPathSegListAttribute(PathSegUnalteredRole)
-            , m_element(element)
-        {
-        }
-
-        SVGPathSegListValues& value(bool shouldBuildSegListValues = true)
-        {
-            if (shouldBuildSegListValues && m_property.isEmpty())
-                buildSVGPathSegListValuesFromByteStream(m_element.m_pathByteStream, m_element, m_property, UnalteredParsing);
-            return m_property;
-        }
-
-    private:
-        SVGPathElement& m_element;
-    };
-
-    using SVGAnimatedCustomPathSegListAttributeAccessor = SVGAnimatedAttributeAccessor<SVGPathElement, SVGAnimatedCustomPathSegListAttribute, AnimatedPath>;
-
     AttributeOwnerProxy m_attributeOwnerProxy { *this };
     PropertyRegistry m_propertyRegistry { *this };
-    SVGAnimatedCustomPathSegListAttribute m_pathSegList { *this };
+    Ref<SVGAnimatedPathSegList> m_pathSegList { SVGAnimatedPathSegList::create(this) };
 };
 
 } // namespace WebCore
index 22a4958..d62fe4f 100644 (file)
@@ -1,6 +1,7 @@
 /*
  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann@kde.org>
  * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
+ * Copyright (C) 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
@@ -20,7 +21,7 @@
 
 #pragma once
 
-#include <wtf/RefCounted.h>
+#include "SVGProperty.h"
 #include <wtf/text/WTFString.h>
 
 namespace WebCore {
@@ -48,15 +49,8 @@ enum SVGPathSegType {
     PathSegCurveToQuadraticSmoothRel = 19
 };
 
-enum SVGPathSegRole {
-    PathSegUnalteredRole = 0,
-    PathSegNormalizedRole = 1,
-    PathSegUndefinedRole = 2
-};
-
-class SVGPathSeg : public RefCounted<SVGPathSeg> {
+class SVGPathSeg : public SVGProperty {
 public:
-    SVGPathSeg() = default;
     virtual ~SVGPathSeg() = default;
 
     // Forward declare these enums in the w3c naming scheme, for IDL generation
@@ -85,6 +79,10 @@ public:
 
     virtual unsigned short pathSegType() const = 0;
     virtual String pathSegTypeAsLetter() const = 0;
+    virtual Ref<SVGPathSeg> clone() const = 0;
+
+protected:
+    using SVGProperty::SVGProperty;
 };
 
 } // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegArc.h b/Source/WebCore/svg/SVGPathSegArc.h
deleted file mode 100644 (file)
index a99b2a8..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegArc : public SVGPathSegWithContext {
-public:
-    SVGPathSegArc(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-        , m_y(y)
-        , m_r1(r1)
-        , m_r2(r2)
-        , m_angle(angle)
-        , m_largeArcFlag(largeArcFlag)
-        , m_sweepFlag(sweepFlag)
-    {
-    }
-
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-    float r1() const { return m_r1; }
-    void setR1(float r1)
-    {
-        m_r1 = r1;
-        commitChange();
-    }
-
-    float r2() const { return m_r2; }
-    void setR2(float r2)
-    {
-        m_r2 = r2;
-        commitChange();
-    }
-
-    float angle() const { return m_angle; }
-    void setAngle(float angle)
-    {
-        m_angle = angle;
-        commitChange();
-    }
-
-    bool largeArcFlag() const { return m_largeArcFlag; }
-    void setLargeArcFlag(bool largeArcFlag)
-    {
-        m_largeArcFlag = largeArcFlag;
-        commitChange();
-    }
-
-    bool sweepFlag() const { return m_sweepFlag; }
-    void setSweepFlag(bool sweepFlag)
-    {
-        m_sweepFlag = sweepFlag;
-        commitChange();
-    }
-
-private:
-    float m_x;
-    float m_y;
-    float m_r1;
-    float m_r2;
-    float m_angle;
-
-    bool m_largeArcFlag : 1;
-    bool m_sweepFlag : 1;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegArcAbs.h b/Source/WebCore/svg/SVGPathSegArcAbs.h
deleted file mode 100644 (file)
index a3f755e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegArc.h"
-
-namespace WebCore {
-
-class SVGPathSegArcAbs final : public SVGPathSegArc {
-public:
-    static Ref<SVGPathSegArcAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-    {
-        return adoptRef(*new SVGPathSegArcAbs(element, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag));
-    }
-
-private:
-    SVGPathSegArcAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-        : SVGPathSegArc(element, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_ARC_ABS; }
-    String pathSegTypeAsLetter() const final { return "A"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegArcRel.h b/Source/WebCore/svg/SVGPathSegArcRel.h
deleted file mode 100644 (file)
index 5feec67..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegArc.h"
-
-namespace WebCore {
-
-class SVGPathSegArcRel final : public SVGPathSegArc {
-public:
-    static Ref<SVGPathSegArcRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-    {
-        return adoptRef(*new SVGPathSegArcRel(element, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag));
-    }
-
-private:
-    SVGPathSegArcRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-        : SVGPathSegArc(element, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_ARC_REL; }
-    String pathSegTypeAsLetter() const final { return "a"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegClosePath.h b/Source/WebCore/svg/SVGPathSegClosePath.h
deleted file mode 100644 (file)
index 917d72b..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegClosePath final : public SVGPathSegWithContext {
-public:
-    static Ref<SVGPathSegClosePath> create(const SVGPathElement& element, SVGPathSegRole role)
-    {
-        return adoptRef(*new SVGPathSegClosePath(element, role));
-    }
-
-private:
-    SVGPathSegClosePath(const SVGPathElement& element, SVGPathSegRole role)
-        : SVGPathSegWithContext(element, role)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CLOSEPATH; }
-    String pathSegTypeAsLetter() const final { return "Z"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubic.h b/Source/WebCore/svg/SVGPathSegCurvetoCubic.h
deleted file mode 100644 (file)
index d6b853c..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubic : public SVGPathSegWithContext { 
-public:
-    SVGPathSegCurvetoCubic(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1, float x2, float y2)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-        , m_y(y)
-        , m_x1(x1)
-        , m_y1(y1)
-        , m_x2(x2)
-        , m_y2(y2)
-    {
-    }
-
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-    float x1() const { return m_x1; }
-    void setX1(float x1)
-    {
-        m_x1 = x1;
-        commitChange();
-    }
-
-    float y1() const { return m_y1; }
-    void setY1(float y1)
-    {
-        m_y1 = y1;
-        commitChange();
-    }
-
-    float x2() const { return m_x2; }
-    void setX2(float x2)
-    {
-        m_x2 = x2;
-        commitChange();
-    }
-
-    float y2() const { return m_y2; }
-    void setY2(float y2)
-    {
-        m_y2 = y2;
-        commitChange();
-    }
-
-private:
-    float m_x;
-    float m_y;
-    float m_x1;
-    float m_y1;
-    float m_x2;
-    float m_y2;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubicAbs.h b/Source/WebCore/svg/SVGPathSegCurvetoCubicAbs.h
deleted file mode 100644 (file)
index d4ff54c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoCubic.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubicAbs final : public SVGPathSegCurvetoCubic {
-public:
-    static Ref<SVGPathSegCurvetoCubicAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1, float x2, float y2)
-    {
-        return adoptRef(*new SVGPathSegCurvetoCubicAbs(element, role, x, y, x1, y1, x2, y2));
-    }
-
-private:
-    SVGPathSegCurvetoCubicAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1, float x2, float y2)
-        : SVGPathSegCurvetoCubic(element, role, x, y, x1, y1, x2, y2)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_ABS; }
-    String pathSegTypeAsLetter() const final { return "C"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubicRel.h b/Source/WebCore/svg/SVGPathSegCurvetoCubicRel.h
deleted file mode 100644 (file)
index 78a2d41..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoCubic.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubicRel final : public SVGPathSegCurvetoCubic {
-public:
-    static Ref<SVGPathSegCurvetoCubicRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1, float x2, float y2)
-    {
-        return adoptRef(*new SVGPathSegCurvetoCubicRel(element, role, x, y, x1, y1, x2, y2));
-    }
-
-private:
-    SVGPathSegCurvetoCubicRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1, float x2, float y2)
-        : SVGPathSegCurvetoCubic(element, role, x, y, x1, y1, x2, y2)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_REL; }
-    String pathSegTypeAsLetter() const final { return "c"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubicSmooth.h b/Source/WebCore/svg/SVGPathSegCurvetoCubicSmooth.h
deleted file mode 100644 (file)
index 4e60532..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubicSmooth : public SVGPathSegWithContext {
-public:
-    SVGPathSegCurvetoCubicSmooth(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x2, float y2)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-        , m_y(y)
-        , m_x2(x2)
-        , m_y2(y2)
-    {
-    }
-
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-    float x2() const { return m_x2; }
-    void setX2(float x2)
-    {
-        m_x2 = x2;
-        commitChange();
-    }
-
-    float y2() const { return m_y2; }
-    void setY2(float y2)
-    {
-        m_y2 = y2;
-        commitChange();
-    }
-
-private:
-    float m_x;
-    float m_y;
-    float m_x2;
-    float m_y2;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.h b/Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.h
deleted file mode 100644 (file)
index 98dd74c..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoCubicSmooth.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubicSmoothAbs final : public SVGPathSegCurvetoCubicSmooth {
-public:
-    static Ref<SVGPathSegCurvetoCubicSmoothAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x2, float y2)
-    {
-        return adoptRef(*new SVGPathSegCurvetoCubicSmoothAbs(element, role, x, y, x2, y2));
-    }
-
-private:
-    SVGPathSegCurvetoCubicSmoothAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x2, float y2)
-        : SVGPathSegCurvetoCubicSmooth(element, role, x, y, x2, y2)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; }
-    String pathSegTypeAsLetter() const final { return "S"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.h b/Source/WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.h
deleted file mode 100644 (file)
index 1b5d088..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoCubicSmooth.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoCubicSmoothRel final : public SVGPathSegCurvetoCubicSmooth {
-public:
-    static Ref<SVGPathSegCurvetoCubicSmoothRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x2, float y2)
-    {
-        return adoptRef(*new SVGPathSegCurvetoCubicSmoothRel(element, role, x, y, x2, y2));
-    }
-
-private:
-    SVGPathSegCurvetoCubicSmoothRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x2, float y2)
-        : SVGPathSegCurvetoCubicSmooth(element, role, x, y, x2, y2)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_SMOOTH_REL; }
-    String pathSegTypeAsLetter() const final { return "s"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoQuadratic.h b/Source/WebCore/svg/SVGPathSegCurvetoQuadratic.h
deleted file mode 100644 (file)
index 99435e0..0000000
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoQuadratic : public SVGPathSegWithContext { 
-public:
-    SVGPathSegCurvetoQuadratic(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-        , m_y(y)
-        , m_x1(x1)
-        , m_y1(y1)
-    {
-    }
-
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-    float x1() const { return m_x1; }
-    void setX1(float x1)
-    {
-        m_x1 = x1;
-        commitChange();
-    }
-
-    float y1() const { return m_y1; }
-    void setY1(float y1)
-    {
-        m_y1 = y1;
-        commitChange();
-    }
-
-private:
-    float m_x;
-    float m_y;
-    float m_x1;
-    float m_y1;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.h b/Source/WebCore/svg/SVGPathSegCurvetoQuadraticAbs.h
deleted file mode 100644 (file)
index dec36db..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoQuadratic.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoQuadraticAbs final : public SVGPathSegCurvetoQuadratic {
-public:
-    static Ref<SVGPathSegCurvetoQuadraticAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1)
-    {
-        return adoptRef(*new SVGPathSegCurvetoQuadraticAbs(element, role, x, y, x1, y1));
-    }
-
-private:
-    SVGPathSegCurvetoQuadraticAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1)
-        : SVGPathSegCurvetoQuadratic(element, role, x, y, x1, y1)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_ABS; }
-    String pathSegTypeAsLetter() const final { return "Q"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoQuadraticRel.h b/Source/WebCore/svg/SVGPathSegCurvetoQuadraticRel.h
deleted file mode 100644 (file)
index 7a0ca05..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegCurvetoQuadratic.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoQuadraticRel final : public SVGPathSegCurvetoQuadratic {
-public:
-    static Ref<SVGPathSegCurvetoQuadraticRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1)
-    {
-        return adoptRef(*new SVGPathSegCurvetoQuadraticRel(element, role, x, y, x1, y1));
-    }
-
-private:
-    SVGPathSegCurvetoQuadraticRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y, float x1, float y1)
-        : SVGPathSegCurvetoQuadratic(element, role, x, y, x1, y1)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_REL; }
-    String pathSegTypeAsLetter() const final { return "q"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.h b/Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.h
deleted file mode 100644 (file)
index 898fabb..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoQuadraticSmoothAbs final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegCurvetoQuadraticSmoothAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegCurvetoQuadraticSmoothAbs(element, role, x, y));
-    }
-
-private:
-    SVGPathSegCurvetoQuadraticSmoothAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; }
-    String pathSegTypeAsLetter() const final { return "T"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.h b/Source/WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.h
deleted file mode 100644 (file)
index e97a10d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegCurvetoQuadraticSmoothRel final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegCurvetoQuadraticSmoothRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegCurvetoQuadraticSmoothRel(element, role, x, y));
-    }
-
-private:
-    SVGPathSegCurvetoQuadraticSmoothRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; }
-    String pathSegTypeAsLetter() const final { return "t"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegImpl.h b/Source/WebCore/svg/SVGPathSegImpl.h
new file mode 100644 (file)
index 0000000..a636154
--- /dev/null
@@ -0,0 +1,222 @@
+/*
+ * Copyright (C) 2019 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 "SVGPathSegValue.h"
+
+namespace WebCore {
+
+class SVGPathSegClosePath final : public SVGPathSeg {
+public:
+    static Ref<SVGPathSegClosePath> create() { return adoptRef(*new SVGPathSegClosePath()); }
+private:
+    using SVGPathSeg::SVGPathSeg;
+    unsigned short pathSegType() const final { return PATHSEG_CLOSEPATH; }
+    String pathSegTypeAsLetter() const final { return "Z"; }
+    Ref<SVGPathSeg> clone() const final { return adoptRef(*new SVGPathSegClosePath()); }
+};
+
+class SVGPathSegLinetoHorizontalAbs final : public SVGPathSegLinetoHorizontal {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoHorizontalAbs>;
+private:
+    using SVGPathSegLinetoHorizontal::SVGPathSegLinetoHorizontal;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_HORIZONTAL_ABS; }
+    String pathSegTypeAsLetter() const final { return "H"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoHorizontalAbs>(); }
+};
+
+class SVGPathSegLinetoHorizontalRel final : public SVGPathSegLinetoHorizontal {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoHorizontalRel>;
+private:
+    using SVGPathSegLinetoHorizontal::SVGPathSegLinetoHorizontal;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_HORIZONTAL_REL; }
+    String pathSegTypeAsLetter() const final { return "h"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoHorizontalRel>(); }
+};
+
+class SVGPathSegLinetoVerticalAbs final : public SVGPathSegLinetoVertical {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoVerticalAbs>;
+private:
+    using SVGPathSegLinetoVertical::SVGPathSegLinetoVertical;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_VERTICAL_ABS; }
+    String pathSegTypeAsLetter() const final { return "V"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoVerticalAbs>(); }
+};
+
+class SVGPathSegLinetoVerticalRel final : public SVGPathSegLinetoVertical {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoVerticalRel>;
+private:
+    using SVGPathSegLinetoVertical::SVGPathSegLinetoVertical;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_VERTICAL_REL; }
+    String pathSegTypeAsLetter() const final { return "v"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoVerticalRel>(); }
+};
+
+class SVGPathSegMovetoAbs final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegMovetoAbs>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_MOVETO_ABS; }
+    String pathSegTypeAsLetter() const final { return "M"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegMovetoAbs>(); }
+};
+
+class SVGPathSegMovetoRel final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegMovetoRel>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_MOVETO_REL; }
+    String pathSegTypeAsLetter() const final { return "m"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegMovetoRel>(); }
+};
+
+class SVGPathSegLinetoAbs final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoAbs>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_ABS; }
+    String pathSegTypeAsLetter() const final { return "L"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoAbs>(); }
+};
+
+class SVGPathSegLinetoRel final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegLinetoRel>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_LINETO_REL; }
+    String pathSegTypeAsLetter() const final { return "l"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegLinetoRel>(); }
+};
+
+class SVGPathSegCurvetoQuadraticAbs final : public SVGPathSegCurvetoQuadratic {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoQuadraticAbs>;
+private:
+    using SVGPathSegCurvetoQuadratic::SVGPathSegCurvetoQuadratic;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_ABS; }
+    String pathSegTypeAsLetter() const final { return "Q"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoQuadraticAbs>(); }
+};
+
+class SVGPathSegCurvetoQuadraticRel final : public SVGPathSegCurvetoQuadratic {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoQuadraticRel>;
+private:
+    using SVGPathSegCurvetoQuadratic::SVGPathSegCurvetoQuadratic;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_REL; }
+    String pathSegTypeAsLetter() const final { return "q"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoQuadraticRel>(); }
+};
+
+class SVGPathSegCurvetoCubicAbs final : public SVGPathSegCurvetoCubic {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoCubicAbs>;
+private:
+    using SVGPathSegCurvetoCubic::SVGPathSegCurvetoCubic;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_ABS; }
+    String pathSegTypeAsLetter() const final { return "C"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoCubicAbs>(); }
+};
+
+class SVGPathSegCurvetoCubicRel final : public SVGPathSegCurvetoCubic {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoCubicRel>;
+private:
+    using SVGPathSegCurvetoCubic::SVGPathSegCurvetoCubic;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_REL; }
+    String pathSegTypeAsLetter() const final { return "c"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoCubicRel>(); }
+};
+
+class SVGPathSegArcAbs final : public SVGPathSegArc {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegArcAbs>;
+private:
+    using SVGPathSegArc::SVGPathSegArc;
+    unsigned short pathSegType() const final { return PATHSEG_ARC_ABS; }
+    String pathSegTypeAsLetter() const final { return "A"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegArcAbs>(); }
+};
+
+class SVGPathSegArcRel final : public SVGPathSegArc {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegArcRel>;
+private:
+    using SVGPathSegArc::SVGPathSegArc;
+    unsigned short pathSegType() const final { return PATHSEG_ARC_REL; }
+    String pathSegTypeAsLetter() const final { return "a"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegArcRel>(); }
+};
+
+class SVGPathSegCurvetoQuadraticSmoothAbs final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoQuadraticSmoothAbs>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS; }
+    String pathSegTypeAsLetter() const final { return "T"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoQuadraticSmoothAbs>(); }
+};
+
+class SVGPathSegCurvetoQuadraticSmoothRel final : public SVGPathSegSingleCoordinate {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoQuadraticSmoothRel>;
+private:
+    using SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL; }
+    String pathSegTypeAsLetter() const final { return "t"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoQuadraticSmoothRel>(); }
+};
+
+class SVGPathSegCurvetoCubicSmoothAbs final : public SVGPathSegCurvetoCubicSmooth {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoCubicSmoothAbs>;
+private:
+    using SVGPathSegCurvetoCubicSmooth::SVGPathSegCurvetoCubicSmooth;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_SMOOTH_ABS; }
+    String pathSegTypeAsLetter() const final { return "S"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoCubicSmoothAbs>(); }
+};
+
+class SVGPathSegCurvetoCubicSmoothRel final : public SVGPathSegCurvetoCubicSmooth {
+public:
+    constexpr static auto create = SVGPathSegValue::create<SVGPathSegCurvetoCubicSmoothRel>;
+private:
+    using SVGPathSegCurvetoCubicSmooth::SVGPathSegCurvetoCubicSmooth;
+    unsigned short pathSegType() const final { return PATHSEG_CURVETO_CUBIC_SMOOTH_REL; }
+    String pathSegTypeAsLetter() const final { return "s"; }
+    Ref<SVGPathSeg> clone() const final { return SVGPathSegValue::clone<SVGPathSegCurvetoCubicSmoothRel>(); }
+};
+
+}
diff --git a/Source/WebCore/svg/SVGPathSegLinetoAbs.h b/Source/WebCore/svg/SVGPathSegLinetoAbs.h
deleted file mode 100644 (file)
index 2addfaa..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoAbs final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegLinetoAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegLinetoAbs(element, role, x, y));
-    }
-
-private:
-    SVGPathSegLinetoAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_ABS; }
-    String pathSegTypeAsLetter() const final { return "L"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoHorizontal.h b/Source/WebCore/svg/SVGPathSegLinetoHorizontal.h
deleted file mode 100644 (file)
index 479845d..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoHorizontal : public SVGPathSegWithContext {
-public:
-    SVGPathSegLinetoHorizontal(const SVGPathElement& element, SVGPathSegRole role, float x)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-    {
-    }
-
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-private:
-    float m_x;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoHorizontalAbs.h b/Source/WebCore/svg/SVGPathSegLinetoHorizontalAbs.h
deleted file mode 100644 (file)
index f0457c1..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegLinetoHorizontal.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoHorizontalAbs final : public SVGPathSegLinetoHorizontal {
-public:
-    static Ref<SVGPathSegLinetoHorizontalAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x)
-    {
-        return adoptRef(*new SVGPathSegLinetoHorizontalAbs(element, role, x));
-    }
-
-private:
-    SVGPathSegLinetoHorizontalAbs(const SVGPathElement& element, SVGPathSegRole role, float x)
-        : SVGPathSegLinetoHorizontal(element, role, x)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_HORIZONTAL_ABS; }
-    String pathSegTypeAsLetter() const final { return "H"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoHorizontalRel.h b/Source/WebCore/svg/SVGPathSegLinetoHorizontalRel.h
deleted file mode 100644 (file)
index c0622ac..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegLinetoHorizontal.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoHorizontalRel final : public SVGPathSegLinetoHorizontal {
-public:
-    static Ref<SVGPathSegLinetoHorizontalRel> create(const SVGPathElement& element, SVGPathSegRole role, float x)
-    {
-        return adoptRef(*new SVGPathSegLinetoHorizontalRel(element, role, x));
-    }
-
-private:
-    SVGPathSegLinetoHorizontalRel(const SVGPathElement& element, SVGPathSegRole role, float x)
-        : SVGPathSegLinetoHorizontal(element, role, x)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_HORIZONTAL_REL; }
-    String pathSegTypeAsLetter() const final { return "h"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoRel.h b/Source/WebCore/svg/SVGPathSegLinetoRel.h
deleted file mode 100644 (file)
index dcdf483..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoRel final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegLinetoRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegLinetoRel(element, role, x, y));
-    }
-
-private:
-    SVGPathSegLinetoRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_REL; }
-    String pathSegTypeAsLetter() const final { return "l"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoVertical.h b/Source/WebCore/svg/SVGPathSegLinetoVertical.h
deleted file mode 100644 (file)
index 9d24d77..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoVertical : public SVGPathSegWithContext {
-public:
-    SVGPathSegLinetoVertical(const SVGPathElement& element, SVGPathSegRole role, float y)
-        : SVGPathSegWithContext(element, role)
-        , m_y(y)
-    {
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-private:
-    float m_y;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoVerticalAbs.h b/Source/WebCore/svg/SVGPathSegLinetoVerticalAbs.h
deleted file mode 100644 (file)
index d859a51..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegLinetoVertical.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoVerticalAbs final : public SVGPathSegLinetoVertical {
-public:
-    static Ref<SVGPathSegLinetoVerticalAbs> create(const SVGPathElement& element, SVGPathSegRole role, float y)
-    {
-        return adoptRef(*new SVGPathSegLinetoVerticalAbs(element, role, y));
-    }
-
-private:
-    SVGPathSegLinetoVerticalAbs(const SVGPathElement& element, SVGPathSegRole role, float y)
-        : SVGPathSegLinetoVertical(element, role, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_VERTICAL_ABS; }
-    String pathSegTypeAsLetter() const final { return "V"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegLinetoVerticalRel.h b/Source/WebCore/svg/SVGPathSegLinetoVerticalRel.h
deleted file mode 100644 (file)
index c180c7e..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegLinetoVertical.h"
-
-namespace WebCore {
-
-class SVGPathSegLinetoVerticalRel final : public SVGPathSegLinetoVertical {
-public:
-    static Ref<SVGPathSegLinetoVerticalRel> create(const SVGPathElement& element, SVGPathSegRole role, float y)
-    {
-        return adoptRef(*new SVGPathSegLinetoVerticalRel(element, role, y));
-    }
-
-private:
-    SVGPathSegLinetoVerticalRel(const SVGPathElement& element, SVGPathSegRole role, float y)
-        : SVGPathSegLinetoVertical(element, role, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_LINETO_VERTICAL_REL; }
-    String pathSegTypeAsLetter() const final { return "v"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegList.cpp b/Source/WebCore/svg/SVGPathSegList.cpp
deleted file mode 100644 (file)
index 6d4febd..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGPathSegList.h"
-
-#include "SVGAnimatedPathSegListPropertyTearOff.h"
-#include "SVGPathElement.h"
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-ExceptionOr<void> SVGPathSegList::clear()
-{
-    ASSERT(m_values);
-    if (m_values->isEmpty())
-        return { };
-    return Base::clearValues();
-}
-
-ExceptionOr<RefPtr<SVGPathSeg>> SVGPathSegList::getItem(unsigned index)
-{
-    return Base::getItemValues(index);
-}
-
-ExceptionOr<RefPtr<SVGPathSeg>> SVGPathSegList::replaceItem(Ref<SVGPathSeg>&& newItem, unsigned index)
-{
-    if (index < m_values->size())
-        m_values->clearItemContextAndRole(index);
-    return Base::replaceItemValues(WTFMove(newItem), index);
-}
-
-ExceptionOr<RefPtr<SVGPathSeg>> SVGPathSegList::removeItem(unsigned index)
-{
-    if (index < m_values->size())
-        m_values->clearItemContextAndRole(index);
-    auto result = Base::removeItemValues(index);
-    if (result.hasException())
-        return result;
-    return result.releaseReturnValue();
-}
-
-SVGPathElement* SVGPathSegList::contextElement() const
-{
-    SVGElement* contextElement = m_animatedProperty->contextElement();
-    ASSERT(contextElement);
-    return downcast<SVGPathElement>(contextElement);
-}
-
-bool SVGPathSegList::processIncomingListItemValue(const ListItemType& newItem, unsigned* indexToModify)
-{
-    SVGPathSegWithContext* newItemWithContext = static_cast<SVGPathSegWithContext*>(newItem.get());
-    RefPtr<SVGLegacyAnimatedProperty> animatedPropertyOfItem = newItemWithContext->animatedProperty();
-
-    // Alter the role, after calling animatedProperty(), as that may influence the returned animated property.
-    newItemWithContext->setContextAndRole(contextElement(), m_pathSegRole);
-
-    if (!animatedPropertyOfItem)
-        return true;
-
-    // newItem belongs to a SVGPathElement, but its associated SVGAnimatedProperty is not an animated list tear off.
-    // (for example: "pathElement.pathSegList.appendItem(pathElement.createSVGPathSegClosepath())")
-    if (!animatedPropertyOfItem->isAnimatedListTearOff())
-        return true;
-
-    // Spec: If newItem is already in a list, it is removed from its previous list before it is inserted into this list.
-    // 'newItem' is already living in another list. If it's not our list, synchronize the other lists wrappers after the removal.
-    bool livesInOtherList = animatedPropertyOfItem != m_animatedProperty;
-    RefPtr<SVGAnimatedPathSegListPropertyTearOff> propertyTearOff = static_pointer_cast<SVGAnimatedPathSegListPropertyTearOff>(animatedPropertyOfItem);
-    int indexToRemove = propertyTearOff->findItem(newItem.get());
-
-    // If newItem does not exist in the propertyTearOff baseVal() list, it has to be
-    // in its animVal() list and it has to be animating.
-    if (indexToRemove == -1) {
-        ASSERT(propertyTearOff->isAnimating());
-        ASSERT(propertyTearOff->animVal()->findItem(newItem.get()) != -1);
-        return false;
-    }
-
-    // Do not remove newItem if already in this list at the target index.
-    if (!livesInOtherList && indexToModify && static_cast<unsigned>(indexToRemove) == *indexToModify)
-        return false;
-
-    propertyTearOff->removeItemFromList(indexToRemove, livesInOtherList);
-
-    if (!indexToModify)
-        return true;
-
-    // If the item lived in our list, adjust the insertion index.
-    if (!livesInOtherList) {
-        unsigned& index = *indexToModify;
-        // Spec: If the item is already in this list, note that the index of the item to (replace|insert before) is before the removal of the item.
-        if (static_cast<unsigned>(indexToRemove) < index)
-            --index;
-    }
-
-    return true;
-}
-
-}
index a29d01c..c7fd5c5 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
- * Copyright (C) 2018 Apple Inc. All rights reserved.
+ * 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
 
 #pragma once
 
-#include "SVGAnimatedListPropertyTearOff.h"
-#include "SVGPathSegListValues.h"
+#include "Path.h"
+#include "SVGPathByteStream.h"
+#include "SVGPathSeg.h"
+#include "SVGPropertyList.h"
 
 namespace WebCore {
 
-class SVGPathElement;
+class SVGPathSegList final : public SVGPropertyList<SVGPathSeg> {
+    friend class SVGAnimatedPathSegListAnimator;
+    friend class SVGPathSegListBuilder;
+    friend class SVGPathSegListSource;
+
+    using Base = SVGPropertyList<SVGPathSeg>;
+    using Base::Base;
 
-class SVGPathSegList final : public SVGListProperty<SVGPathSegListValues> {
 public:
-    using Base = SVGListProperty<SVGPathSegListValues>;
-    using AnimatedListPropertyTearOff = SVGAnimatedListPropertyTearOff<SVGPathSegListValues>;
-    using ListItemType = SVGPropertyTraits<SVGPathSegListValues>::ListItemType;
+    static Ref<SVGPathSegList> create(SVGPropertyOwner* owner, SVGPropertyAccess access)
+    {
+        return adoptRef(*new SVGPathSegList(owner, access));
+    }
 
-    static Ref<SVGPathSegList> create(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole, SVGPathSegListValues& values, ListWrapperCache& wrappers)
+    static Ref<SVGPathSegList> create(const SVGPathSegList& other, SVGPropertyAccess access)
     {
-        return adoptRef(*new SVGPathSegList(animatedProperty, role, pathSegRole, values, wrappers));
+        return adoptRef(*new SVGPathSegList(other, access));
     }
 
-    static Ref<SVGPathSegList> create(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGPathSegListValues& values, ListWrapperCache& wrappers)
+    static Ref<SVGPathSegList> create(Ref<SVGPathSeg>&& newItem)
     {
-        ASSERT_NOT_REACHED();
-        return adoptRef(*new SVGPathSegList(animatedProperty, role, PathSegUndefinedRole, values, wrappers));
+        return adoptRef(*new SVGPathSegList(WTFMove(newItem)));
     }
 
-    int findItem(const ListItemType& item) const
+    SVGPathSegList& operator=(const SVGPathSegList& other)
     {
-        ASSERT(m_values);
+        pathByteStreamWillChange();
+        m_pathByteStream = other.pathByteStream();
+        return *this;
+    }
 
-        unsigned size = m_values->size();
-        for (size_t i = 0; i < size; ++i) {
-            if (item == m_values->at(i))
-                return i;
-        }
+    unsigned numberOfItems() const
+    {
+        const_cast<SVGPathSegList*>(this)->ensureItems();
+        return Base::numberOfItems();
+    }
 
-        return -1;
+    ExceptionOr<void> clear()
+    {
+        itemsWillChange();
+        return Base::clear();
     }
 
-    void removeItemFromList(size_t itemIndex, bool shouldSynchronizeWrappers)
+    ExceptionOr<Ref<SVGPathSeg>> getItem(unsigned index)
     {
-        ASSERT(m_values);
-        ASSERT_WITH_SECURITY_IMPLICATION(itemIndex < m_values->size());
+        ensureItems();
+        return Base::getItem(index);
+    }
 
-        m_values->remove(itemIndex);
+    ExceptionOr<Ref<SVGPathSeg>> initialize(Ref<SVGPathSeg>&& newItem)
+    {
+        itemsWillChange();
+        return Base::initialize(WTFMove(newItem));
+    }
 
-        if (shouldSynchronizeWrappers)
-            commitChange();
+    ExceptionOr<Ref<SVGPathSeg>> insertItemBefore(Ref<SVGPathSeg>&& newItem, unsigned index)
+    {
+        ensureItems();
+        itemsWillChange();
+        return Base::insertItemBefore(WTFMove(newItem), index);
     }
 
-    // SVGList API
-    ExceptionOr<void> clear();
+    ExceptionOr<Ref<SVGPathSeg>> replaceItem(Ref<SVGPathSeg>&& newItem, unsigned index)
+    {
+        ensureItems();
+        itemsWillChange();
+        return Base::replaceItem(WTFMove(newItem), index);
+    }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> initialize(Ref<SVGPathSeg>&& newItem)
+    ExceptionOr<Ref<SVGPathSeg>> removeItem(unsigned index)
     {
-        return Base::initializeValues(WTFMove(newItem));
+        ensureItems();
+        itemsWillChange();
+        return Base::removeItem(index);
     }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> getItem(unsigned index);
+    ExceptionOr<Ref<SVGPathSeg>> appendItem(Ref<SVGPathSeg>&& newItem)
+    {
+        ensureItems();
+        appendPathSegToPathByteStream(newItem);
+        clearPath();
+        return Base::appendItem(WTFMove(newItem));
+    }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> insertItemBefore(Ref<SVGPathSeg>&& newItem, unsigned index)
+    const SVGPathByteStream& pathByteStream() const { return const_cast<SVGPathSegList*>(this)->pathByteStream(); }
+    SVGPathByteStream& pathByteStream()
     {
-        return Base::insertItemBeforeValues(WTFMove(newItem), index);
+        ensurePathByteStream();
+        return m_pathByteStream;
     }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> replaceItem(Ref<SVGPathSeg>&&, unsigned index);
+    bool parse(const String& value)
+    {
+        pathByteStreamWillChange();
+        return buildSVGPathByteStreamFromString(value, m_pathByteStream, UnalteredParsing);
+    }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> removeItem(unsigned index);
+    Path path() const
+    {
+        if (!m_path)
+            m_path = buildPathFromByteStream(pathByteStream());
+        return *m_path;
+    }
 
-    ExceptionOr<RefPtr<SVGPathSeg>> appendItem(Ref<SVGPathSeg>&& newItem)
+    size_t approximateMemoryCost() const
     {
-        return Base::appendItemValues(WTFMove(newItem));
+        // This is an approximation for path memory cost since the path is parsed on demand.
+        size_t pathMemoryCost = (m_pathByteStream.size() / 10) * sizeof(FloatPoint);
+        // We need to account for the memory which is allocated by the m_path.
+        return m_path ? pathMemoryCost + sizeof(*m_path) : pathMemoryCost;
+    }
+
+    String valueAsString() const override
+    {
+        String value;
+        buildStringFromByteStream(pathByteStream(), value, UnalteredParsing);
+        return value;
     }
 
 private:
-    SVGPathSegList(AnimatedListPropertyTearOff& animatedProperty, SVGPropertyRole role, SVGPathSegRole pathSegRole, SVGPathSegListValues& values, ListWrapperCache& wrappers)
-        : SVGListProperty<SVGPathSegListValues>(role, values, &wrappers)
-        , m_animatedProperty(&animatedProperty)
-        , m_pathSegRole(pathSegRole)
+    SVGPathSegList(const SVGPathSegList& other, SVGPropertyAccess access)
+        : Base(other.owner(), access)
+        , m_pathByteStream(other.pathByteStream())
     {
     }
 
-    SVGPathElement* contextElement() const;
-    using Base::m_role;
+    // Used by appendPathSegToPathByteStream() to create a temporary SVGPathSegList with one item.
+    SVGPathSegList(Ref<SVGPathSeg>&& newItem)
+    {
+        append(WTFMove(newItem));
+    }
 
-    bool isReadOnly() const final
+    // Called when changing an item in the list.
+    void commitPropertyChange(SVGProperty* property) override
     {
-        if (m_role == AnimValRole)
-            return true;
-        if (m_animatedProperty && m_animatedProperty->isReadOnly())
-            return true;
-        return false;
+        itemsWillChange();
+        Base::commitPropertyChange(property);
     }
 
-    void commitChange() final
+    void ensureItems()
     {
-        ASSERT(m_values);
-        m_values->commitChange(*m_animatedProperty->contextElement(), ListModificationUnknown);
+        if (!m_items.isEmpty() || m_pathByteStream.isEmpty())
+            return;
+        buildSVGPathSegListFromByteStream(m_pathByteStream, *this, UnalteredParsing);
     }
 
-    void commitChange(ListModification listModification) final
+    void ensurePathByteStream()
     {
-        ASSERT(m_values);
-        m_values->commitChange(*m_animatedProperty->contextElement(), listModification);
+        if (!m_pathByteStream.isEmpty() || m_items.isEmpty())
+            return;
+        buildSVGPathByteStreamFromSVGPathSegList(*this, m_pathByteStream, UnalteredParsing);
     }
 
-    bool processIncomingListItemValue(const ListItemType& newItem, unsigned* indexToModify) final;
-    bool processIncomingListItemWrapper(Ref<ListItemTearOff>&, unsigned*) final
+    // Optimize appending an SVGPathSeg to the list. Instead of creating the whole
+    // byte stream, a temporary byte stream will be creating just for the new item
+    // and this temporary byte stream will be appended to m_pathByteStream.
+    void appendPathSegToPathByteStream(const Ref<SVGPathSeg>& item)
     {
-        ASSERT_NOT_REACHED();
-        return true;
+        if (m_pathByteStream.isEmpty())
+            return;
+
+        Ref<SVGPathSegList> pathSegList = SVGPathSegList::create(item.copyRef());
+        SVGPathByteStream pathSegStream;
+
+        if (!buildSVGPathByteStreamFromSVGPathSegList(pathSegList, pathSegStream, UnalteredParsing, false))
+            return;
+
+        m_pathByteStream.append(pathSegStream);
     }
 
-private:
-    RefPtr<AnimatedListPropertyTearOff> m_animatedProperty;
-    SVGPathSegRole m_pathSegRole;
+    void clearPathByteStream() { m_pathByteStream.clear(); }
+    void clearPath() { m_path = WTF::nullopt; }
+
+    void pathByteStreamWillChange()
+    {
+        clearItems();
+        clearPath();
+    }
+
+    void itemsWillChange()
+    {
+        clearPathByteStream();
+        clearPath();
+    }
+
+    SVGPathByteStream m_pathByteStream;
+    mutable Optional<Path> m_path;
 };
 
-} // namespace WebCore
+}
index 1558f80..deb8f3a 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org>
  * Copyright (C) 2007, 2009, 2015 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 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
 #include "config.h"
 #include "SVGPathSegListBuilder.h"
 
-#include "SVGPathElement.h"
-#include "SVGPathSegArcAbs.h"
-#include "SVGPathSegArcRel.h"
-#include "SVGPathSegClosePath.h"
-#include "SVGPathSegCurvetoCubicAbs.h"
-#include "SVGPathSegCurvetoCubicRel.h"
-#include "SVGPathSegCurvetoCubicSmoothAbs.h"
-#include "SVGPathSegCurvetoCubicSmoothRel.h"
-#include "SVGPathSegCurvetoQuadraticAbs.h"
-#include "SVGPathSegCurvetoQuadraticRel.h"
-#include "SVGPathSegCurvetoQuadraticSmoothAbs.h"
-#include "SVGPathSegCurvetoQuadraticSmoothRel.h"
-#include "SVGPathSegLinetoAbs.h"
-#include "SVGPathSegLinetoHorizontalAbs.h"
-#include "SVGPathSegLinetoHorizontalRel.h"
-#include "SVGPathSegLinetoRel.h"
-#include "SVGPathSegLinetoVerticalAbs.h"
-#include "SVGPathSegLinetoVerticalRel.h"
-#include "SVGPathSegListValues.h"
-#include "SVGPathSegMovetoAbs.h"
-#include "SVGPathSegMovetoRel.h"
+#include "SVGPathSegImpl.h"
+#include "SVGPathSegList.h"
 
 namespace WebCore {
 
-SVGPathSegListBuilder::SVGPathSegListBuilder(SVGPathElement& pathElement, SVGPathSegListValues& pathSegList, SVGPathSegRole role)
-    : m_pathElement(pathElement)
-    , m_pathSegList(pathSegList)
-    , m_pathSegRole(role)
+SVGPathSegListBuilder::SVGPathSegListBuilder(SVGPathSegList& pathSegList)
+    : m_pathSegList(pathSegList)
 {
 }
 
 void SVGPathSegListBuilder::moveTo(const FloatPoint& targetPoint, bool, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegMovetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegMovetoAbs::create(targetPoint.x(), targetPoint.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegMovetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegMovetoRel::create(targetPoint.x(), targetPoint.y()));
 }
 
 void SVGPathSegListBuilder::lineTo(const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoAbs::create(targetPoint.x(), targetPoint.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoRel::create(targetPoint.x(), targetPoint.y()));
 }
 
 void SVGPathSegListBuilder::lineToHorizontal(float x, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoHorizontalAbs(x, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoHorizontalAbs::create(x));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoHorizontalRel(x, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoHorizontalRel::create(x));
 }
 
 void SVGPathSegListBuilder::lineToVertical(float y, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoVerticalAbs(y, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoVerticalAbs::create(y));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegLinetoVerticalRel(y, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegLinetoVerticalRel::create(y));
 }
 
 void SVGPathSegListBuilder::curveToCubic(const FloatPoint& point1, const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoCubicAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoCubicAbs::create(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoCubicRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoCubicRel::create(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y()));
 }
 
 void SVGPathSegListBuilder::curveToCubicSmooth(const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoCubicSmoothAbs(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoCubicSmoothAbs::create(targetPoint.x(), targetPoint.y(), point2.x(), point2.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoCubicSmoothRel(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoCubicSmoothRel::create(targetPoint.x(), targetPoint.y(), point2.x(), point2.y()));
 }
 
 void SVGPathSegListBuilder::curveToQuadratic(const FloatPoint& point1, const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoQuadraticAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoQuadraticAbs::create(targetPoint.x(), targetPoint.y(), point1.x(), point1.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoQuadraticRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoQuadraticRel::create(targetPoint.x(), targetPoint.y(), point1.x(), point1.y()));
 }
 
 void SVGPathSegListBuilder::curveToQuadraticSmooth(const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoQuadraticSmoothAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoQuadraticSmoothAbs::create(targetPoint.x(), targetPoint.y()));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegCurvetoQuadraticSmoothRel(targetPoint.x(), targetPoint.y(), m_pathSegRole));
+        m_pathSegList.append(SVGPathSegCurvetoQuadraticSmoothRel::create(targetPoint.x(), targetPoint.y()));
 }
 
 void SVGPathSegListBuilder::arcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode)
 {
     if (mode == AbsoluteCoordinates)
-        m_pathSegList.append(m_pathElement.createSVGPathSegArcAbs(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegArcAbs::create(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag));
     else
-        m_pathSegList.append(m_pathElement.createSVGPathSegArcRel(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole));
+        m_pathSegList.append(SVGPathSegArcRel::create(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag));
 }
 
 void SVGPathSegListBuilder::closePath()
 {
-    m_pathSegList.append(m_pathElement.createSVGPathSegClosePath(m_pathSegRole));
+    m_pathSegList.append(SVGPathSegClosePath::create());
 }
 
 }
index eb1ab8b..257187d 100644 (file)
@@ -4,6 +4,7 @@
  * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org>
  * Copyright (C) 2007, 2009, 2015 Apple Inc. All rights reserved.
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 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
 
 #include "FloatPoint.h"
 #include "SVGPathConsumer.h"
-#include "SVGPathSegListValues.h"
 
 namespace WebCore {
 
-class SVGPathElement;
+class SVGPathSegList;
 
 class SVGPathSegListBuilder final : public SVGPathConsumer {
 public:
-    SVGPathSegListBuilder(SVGPathElement&, SVGPathSegListValues&, SVGPathSegRole);
+    SVGPathSegListBuilder(SVGPathSegList&);
 
 private:
     void incrementPathSegmentCount() final { }
@@ -53,9 +53,7 @@ private:
     void curveToQuadraticSmooth(const FloatPoint&, PathCoordinateMode) final;
     void arcTo(float, float, float, bool largeArcFlag, bool sweepFlag, const FloatPoint&, PathCoordinateMode) final;
 
-    SVGPathElement& m_pathElement;
-    SVGPathSegListValues& m_pathSegList;
-    SVGPathSegRole m_pathSegRole { PathSegUndefinedRole };
+    SVGPathSegList& m_pathSegList;
 };
 
 } // namespace WebCore
index 0cdd8af..d6df55f 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 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
 #include "config.h"
 #include "SVGPathSegListSource.h"
 
-#include "SVGPathSegArc.h"
-#include "SVGPathSegCurvetoCubic.h"
-#include "SVGPathSegCurvetoCubicSmooth.h"
-#include "SVGPathSegCurvetoQuadratic.h"
-#include "SVGPathSegLinetoHorizontal.h"
-#include "SVGPathSegLinetoVertical.h"
+#include "SVGPathSeg.h"
+#include "SVGPathSegList.h"
+#include "SVGPathSegValue.h"
 
 namespace WebCore {
 
-SVGPathSegListSource::SVGPathSegListSource(const SVGPathSegListValues& pathSegList)
+SVGPathSegListSource::SVGPathSegListSource(const SVGPathSegList& pathSegList)
     : m_pathSegList(pathSegList)
 {
     m_itemCurrent = 0;
index 506e7c0..50ebb8c 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010. All rights reserved.
+ * Copyright (C) 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
 
 #include "FloatPoint.h"
 #include "SVGPathSeg.h"
-#include "SVGPathSegListValues.h"
 #include "SVGPathSource.h"
 #include <wtf/RefPtr.h>
 
 namespace WebCore {
 
+class SVGPathSegList;
+
 class SVGPathSegListSource final : public SVGPathSource {
 public:
-    explicit SVGPathSegListSource(const SVGPathSegListValues&);
+    explicit SVGPathSegListSource(const SVGPathSegList&);
 
 private:
     bool hasMoreData() const final;
@@ -47,10 +49,10 @@ private:
     bool parseCurveToQuadraticSmoothSegment(FloatPoint&) final;
     bool parseArcToSegment(float&, float&, float&, bool&, bool&, FloatPoint&) final;
 
-    const SVGPathSegListValues& m_pathSegList;
+    const SVGPathSegList& m_pathSegList;
     RefPtr<SVGPathSeg> m_segment;
-    int m_itemCurrent;
-    int m_itemEnd;
+    size_t m_itemCurrent;
+    size_t m_itemEnd;
 };
 
 } // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegListValues.cpp b/Source/WebCore/svg/SVGPathSegListValues.cpp
deleted file mode 100644 (file)
index 621632c..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org>
- * Copyright (C) 2007 Eric Seidel <eric@webkit.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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-#include "SVGPathSegListValues.h"
-
-#include "SVGPathElement.h"
-#include "SVGPathSegWithContext.h"
-#include "SVGPathUtilities.h"
-
-namespace WebCore {
-
-String SVGPathSegListValues::valueAsString() const
-{
-    String pathString;
-    buildStringFromSVGPathSegListValues(*this, pathString, UnalteredParsing);
-    return pathString;
-}
-
-void SVGPathSegListValues::commitChange(SVGElement& contextElement, ListModification listModification)
-{
-    downcast<SVGPathElement>(contextElement).pathSegListChanged(m_role, listModification);
-}
-
-void SVGPathSegListValues::clearItemContextAndRole(unsigned index)
-{
-    auto& item = at(index);
-    static_cast<SVGPathSegWithContext&>(*item).setContextAndRole(nullptr, PathSegUndefinedRole);
-}
-    
-void SVGPathSegListValues::clearContextAndRoles()
-{
-    auto count = size();
-    while (count--)
-        clearItemContextAndRole(count);
-}
-    
-}
diff --git a/Source/WebCore/svg/SVGPathSegListValues.h b/Source/WebCore/svg/SVGPathSegListValues.h
deleted file mode 100644 (file)
index 8681e31..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
- * 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGListProperty.h"
-#include "SVGPathSeg.h"
-#include "SVGPropertyTraits.h"
-#include <wtf/Vector.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-class SVGElement;
-class SVGPathSegList;
-
-template<typename T> 
-class SVGPropertyTearOff;
-
-class SVGPathSegListValues : public Vector<RefPtr<SVGPathSeg>> {
-public:
-    using Base = Vector<RefPtr<SVGPathSeg>>;
-    
-    explicit SVGPathSegListValues(SVGPathSegRole role)
-        : m_role(role)
-    {
-    }
-    
-    SVGPathSegListValues(const SVGPathSegListValues&) = default;
-    SVGPathSegListValues(SVGPathSegListValues&&) = default;
-    
-    SVGPathSegListValues& operator=(const SVGPathSegListValues& other)
-    {
-        clearContextAndRoles();
-        return static_cast<SVGPathSegListValues&>(Base::operator=(other));
-    }
-
-    SVGPathSegListValues& operator=(SVGPathSegListValues&& other)
-    {
-        clearContextAndRoles();
-        return static_cast<SVGPathSegListValues&>(Base::operator=(WTFMove(other)));
-    }
-    
-    void clear()
-    {
-        clearContextAndRoles();
-        Base::clear();
-    }
-
-    String valueAsString() const;
-
-    void commitChange(SVGElement& contextElement, ListModification);
-    void clearItemContextAndRole(unsigned index);
-
-private:
-    void clearContextAndRoles();
-
-    SVGPathSegRole m_role;
-};
-
-template<> struct SVGPropertyTraits<SVGPathSegListValues> {
-    static SVGPathSegListValues initialValue() { return SVGPathSegListValues(PathSegUndefinedRole); }
-    static String toString(const SVGPathSegListValues& list) { return list.valueAsString(); }
-
-    using ListItemType = RefPtr<SVGPathSeg>;
-    using ListItemTearOff = SVGPropertyTearOff<RefPtr<SVGPathSeg>>;
-    using ListPropertyTearOff = SVGPathSegList;
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegMovetoAbs.h b/Source/WebCore/svg/SVGPathSegMovetoAbs.h
deleted file mode 100644 (file)
index 3db2e3d..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegMovetoAbs final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegMovetoAbs> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegMovetoAbs(element, role, x, y));
-    }
-
-private:
-    SVGPathSegMovetoAbs(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_MOVETO_ABS; }
-    String pathSegTypeAsLetter() const final { return "M"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegMovetoRel.h b/Source/WebCore/svg/SVGPathSegMovetoRel.h
deleted file mode 100644 (file)
index b748257..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2008 Rob Buis <buis@kde.org>
- * Copyright (C) 2013 Samsung Electronics. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathSegWithContext.h"
-
-namespace WebCore {
-
-class SVGPathSegMovetoRel final : public SVGPathSegSingleCoordinate {
-public:
-    static Ref<SVGPathSegMovetoRel> create(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-    {
-        return adoptRef(*new SVGPathSegMovetoRel(element, role, x, y));
-    }
-
-private:
-    SVGPathSegMovetoRel(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegSingleCoordinate(element, role, x, y)
-    {
-    }
-
-    unsigned short pathSegType() const final { return PATHSEG_MOVETO_REL; }
-    String pathSegTypeAsLetter() const final { return "m"; }
-};
-
-} // namespace WebCore
diff --git a/Source/WebCore/svg/SVGPathSegValue.h b/Source/WebCore/svg/SVGPathSegValue.h
new file mode 100644 (file)
index 0000000..b0844cd
--- /dev/null
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) 2019 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 "SVGPathSeg.h"
+
+namespace WebCore {
+
+template<class... Arguments>
+class SVGPathSegValue : public SVGPathSeg {
+public:
+    template<typename PathSegType>
+    static Ref<PathSegType> create(Arguments... arguments)
+    {
+        return adoptRef(*new PathSegType(std::forward<Arguments>(arguments)...));
+    }
+
+    template<typename PathSegType>
+    Ref<PathSegType> clone() const
+    {
+        return adoptRef(*new PathSegType(m_arguments));
+    }
+
+    SVGPathSegValue(Arguments... arguments)
+        : m_arguments(std::forward<Arguments>(arguments)...)
+    {
+    }
+
+    SVGPathSegValue(const std::tuple<Arguments...>& arguments)
+        : m_arguments(arguments)
+    {
+    }
+
+protected:
+    template<size_t I>
+    const auto& argument() const
+    {
+        return std::get<I>(m_arguments);
+    }
+
+    template<size_t I, typename ArgumentValue>
+    void setArgument(ArgumentValue value)
+    {
+        std::get<I>(m_arguments) = value;
+        commitChange();
+    }
+
+    std::tuple<Arguments...> m_arguments;
+};
+
+class SVGPathSegLinetoHorizontal : public SVGPathSegValue<float> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegLinetoVertical : public SVGPathSegValue<float> {
+public:
+    float y() const { return argument<0>(); }
+    void setY(float x) { setArgument<0>(x); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegSingleCoordinate : public SVGPathSegValue<float, float> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+    float y() const { return argument<1>(); }
+    void setY(float y) { setArgument<1>(y); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegCurvetoQuadratic : public SVGPathSegValue<float, float, float, float> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+    float y() const { return argument<1>(); }
+    void setY(float y) { setArgument<1>(y); }
+
+    float x1() const { return argument<2>(); }
+    void setX1(float x) { setArgument<2>(x); }
+
+    float y1() const { return argument<3>(); }
+    void setY1(float y) { setArgument<3>(y); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegCurvetoCubicSmooth : public SVGPathSegValue<float, float, float, float> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+    float y() const { return argument<1>(); }
+    void setY(float y) { setArgument<1>(y); }
+
+    float x2() const { return argument<2>(); }
+    void setX2(float x) { setArgument<2>(x); }
+
+    float y2() const { return argument<3>(); }
+    void setY2(float y) { setArgument<3>(y); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegCurvetoCubic : public SVGPathSegValue<float, float, float, float, float, float> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+    float y() const { return argument<1>(); }
+    void setY(float y) { setArgument<1>(y); }
+
+    float x1() const { return argument<2>(); }
+    void setX1(float x) { setArgument<2>(x); }
+
+    float y1() const { return argument<3>(); }
+    void setY1(float y) { setArgument<3>(y); }
+
+    float x2() const { return argument<4>(); }
+    void setX2(float x) { setArgument<4>(x); }
+
+    float y2() const { return argument<5>(); }
+    void setY2(float y) { setArgument<5>(y); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+class SVGPathSegArc : public SVGPathSegValue<float, float, float, float, float, bool, bool> {
+public:
+    float x() const { return argument<0>(); }
+    void setX(float x) { setArgument<0>(x); }
+
+    float y() const { return argument<1>(); }
+    void setY(float y) { setArgument<1>(y); }
+
+    float r1() const { return argument<2>(); }
+    void setR1(float r1) { setArgument<2>(r1); }
+
+    float r2() const { return argument<3>(); }
+    void setR2(float r2) { setArgument<3>(r2); }
+
+    float angle() const { return argument<4>(); }
+    void setAngle(float angle) { setArgument<4>(angle); }
+
+    bool largeArcFlag() const { return argument<5>(); }
+    void setLargeArcFlag(bool largeArcFlag) { setArgument<5>(largeArcFlag); }
+
+    bool sweepFlag() const { return argument<6>(); }
+    void setSweepFlag(bool sweepFlag) { setArgument<6>(sweepFlag); }
+
+private:
+    using SVGPathSegValue::SVGPathSegValue;
+};
+
+}
diff --git a/Source/WebCore/svg/SVGPathSegWithContext.h b/Source/WebCore/svg/SVGPathSegWithContext.h
deleted file mode 100644 (file)
index 1776f0c..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2010. 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGPathElement.h"
-
-namespace WebCore {
-
-class SVGPathSegWithContext : public SVGPathSeg {
-public:
-    SVGPathSegWithContext(const SVGPathElement& element, SVGPathSegRole role)
-        : m_role(role)
-        , m_element(makeWeakPtr(const_cast<SVGPathElement&>(element)))
-    {
-    }
-
-    RefPtr<SVGLegacyAnimatedProperty> animatedProperty() const
-    {
-        if (!m_element)
-            return nullptr;
-
-        switch (m_role) {
-        case PathSegUndefinedRole:
-            return nullptr;
-        case PathSegUnalteredRole:
-            return m_element->pathSegListAnimated();
-        case PathSegNormalizedRole:
-            // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
-            return nullptr;
-        };
-
-        return nullptr;
-    }
-
-    SVGPathElement* contextElement() const { return m_element.get(); }
-    SVGPathSegRole role() const { return m_role; }
-
-    void setContextAndRole(SVGPathElement* element, SVGPathSegRole role)
-    {
-        m_role = role;
-        m_element = makeWeakPtr(element);
-    }
-
-protected:
-    void commitChange()
-    {
-        if (!m_element || m_role == PathSegUndefinedRole)
-            return;
-        m_element->pathSegListChanged(m_role);
-    }
-
-private:
-    SVGPathSegRole m_role;
-    WeakPtr<SVGPathElement> m_element;
-};
-
-class SVGPathSegSingleCoordinate : public SVGPathSegWithContext { 
-public:
-    float x() const { return m_x; }
-    void setX(float x)
-    {
-        m_x = x;
-        commitChange();
-    }
-
-    float y() const { return m_y; }
-    void setY(float y)
-    {
-        m_y = y;
-        commitChange();
-    }
-
-protected:
-    SVGPathSegSingleCoordinate(const SVGPathElement& element, SVGPathSegRole role, float x, float y)
-        : SVGPathSegWithContext(element, role)
-        , m_x(x)
-        , m_y(y)
-    {
-    }
-
-private:
-    float m_x;
-    float m_y;
-};
-
-} // namespace WebCore
index cf9f014..e5746ca 100644 (file)
@@ -104,32 +104,14 @@ String buildStringFromPath(const Path& path)
     return builder.toString();
 }
 
-bool buildSVGPathByteStreamFromSVGPathSegListValues(const SVGPathSegListValues& list, SVGPathByteStream& result, PathParsingMode parsingMode)
+bool buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList& list, SVGPathByteStream& stream, PathParsingMode parsingMode, bool checkForInitialMoveTo)
 {
-    result.clear();
+    stream.clear();
     if (list.isEmpty())
         return true;
 
     SVGPathSegListSource source(list);
-    return SVGPathParser::parseToByteStream(source, result, parsingMode);
-}
-
-bool appendSVGPathByteStreamFromSVGPathSeg(RefPtr<SVGPathSeg>&& pathSeg, SVGPathByteStream& result, PathParsingMode parsingMode)
-{
-    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
-    ASSERT(parsingMode == UnalteredParsing);
-
-    SVGPathSegListValues appendedItemList(PathSegUnalteredRole);
-    appendedItemList.append(WTFMove(pathSeg));
-
-    SVGPathByteStream appendedByteStream;
-    SVGPathSegListSource source(appendedItemList);
-    bool ok = SVGPathParser::parseToByteStream(source, result, parsingMode, false);
-
-    if (ok)
-        result.append(appendedByteStream);
-
-    return ok;
+    return SVGPathParser::parseToByteStream(source, stream, parsingMode, checkForInitialMoveTo);
 }
 
 Path buildPathFromByteStream(const SVGPathByteStream& stream)
@@ -144,33 +126,23 @@ Path buildPathFromByteStream(const SVGPathByteStream& stream)
     return path;
 }
 
-bool buildSVGPathSegListValuesFromByteStream(const SVGPathByteStream& stream, SVGPathElement& element, SVGPathSegListValues& result, PathParsingMode parsingMode)
+bool buildSVGPathSegListFromByteStream(const SVGPathByteStream& stream, SVGPathSegList& list, PathParsingMode mode)
 {
     if (stream.isEmpty())
         return true;
 
-    SVGPathSegListBuilder builder(element, result, parsingMode == NormalizedParsing ? PathSegNormalizedRole : PathSegUnalteredRole);
+    SVGPathSegListBuilder builder(list);
     SVGPathByteStreamSource source(stream);
-    return SVGPathParser::parse(source, builder, parsingMode);
+    return SVGPathParser::parse(source, builder, mode);
 }
 
-bool buildStringFromByteStream(const SVGPathByteStream& stream, String& result, PathParsingMode parsingMode)
+bool buildStringFromByteStream(const SVGPathByteStream& stream, String& result, PathParsingMode parsingMode, bool checkForInitialMoveTo)
 {
     if (stream.isEmpty())
         return true;
 
     SVGPathByteStreamSource source(stream);
-    return SVGPathParser::parseToString(source, result, parsingMode);
-}
-
-bool buildStringFromSVGPathSegListValues(const SVGPathSegListValues& list, String& result, PathParsingMode parsingMode)
-{
-    result = String();
-    if (list.isEmpty())
-        return true;
-
-    SVGPathSegListSource source(list);
-    return SVGPathParser::parseToString(source, result, parsingMode);
+    return SVGPathParser::parseToString(source, result, parsingMode, checkForInitialMoveTo);
 }
 
 bool buildSVGPathByteStreamFromString(const String& d, SVGPathByteStream& result, PathParsingMode parsingMode)
index 216766e..490ff7c 100644 (file)
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) Research In Motion Limited 2010, 2012. All rights reserved.
- * Copyright (C) 2015 Apple Inc. All rights reserved.
+ * Copyright (C) 2015-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
@@ -28,28 +28,25 @@ namespace WebCore {
 class FloatPoint;
 class Path;
 class SVGPathByteStream;
-class SVGPathElement;
 class SVGPathSeg;
-class SVGPathSegListValues;
+class SVGPathSegList;
+
+// Path -> String
+String buildStringFromPath(const Path&);
 
 // String/SVGPathByteStream -> Path
 Path buildPathFromString(const String&);
 Path buildPathFromByteStream(const SVGPathByteStream&);
 
-// Path -> String
-String buildStringFromPath(const Path&);
-
-// SVGPathSegListValues/String -> SVGPathByteStream
-bool buildSVGPathByteStreamFromSVGPathSegListValues(const SVGPathSegListValues&, SVGPathByteStream& result, PathParsingMode);
-bool appendSVGPathByteStreamFromSVGPathSeg(RefPtr<SVGPathSeg>&&, SVGPathByteStream&, PathParsingMode);
+// SVGPathSegList/String -> SVGPathByteStream
+bool buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList&, SVGPathByteStream& result, PathParsingMode, bool checkForInitialMoveTo = true);
 bool buildSVGPathByteStreamFromString(const String&, SVGPathByteStream&, PathParsingMode);
 
-// SVGPathByteStream/SVGPathSegListValues -> String
-bool buildStringFromByteStream(const SVGPathByteStream&, String&, PathParsingMode);
-bool buildStringFromSVGPathSegListValues(const SVGPathSegListValues&, String&, PathParsingMode);
+// SVGPathByteStream -> String
+bool buildStringFromByteStream(const SVGPathByteStream&, String&, PathParsingMode, bool checkForInitialMoveTo = true);
 
-// SVGPathByteStream -> SVGPathSegListValues
-bool buildSVGPathSegListValuesFromByteStream(const SVGPathByteStream&, SVGPathElement&, SVGPathSegListValues&, PathParsingMode);
+// SVGPathByteStream -> SVGPathSegList
+bool buildSVGPathSegListFromByteStream(const SVGPathByteStream&, SVGPathSegList&, PathParsingMode);
 
 bool canBlendSVGPathByteStreams(const SVGPathByteStream& from, const SVGPathByteStream& to);
 
index 79fd2fc..65074b9 100644 (file)
@@ -25,7 +25,6 @@
 
 #pragma once
 
-#include "SVGPathByteStream.h"
 #include "SVGTransformListValues.h"
 
 #include <wtf/Variant.h>
@@ -33,7 +32,6 @@
 namespace WebCore {
 
 using SVGValueVariant = Variant<
-    SVGPathByteStream*,
     SVGTransformListValues*
 >;
 
diff --git a/Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp b/Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.cpp
deleted file mode 100644 (file)
index fd6e1f2..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.
- */
-
-#include "config.h"
-#include "SVGAnimatedPathSegListPropertyTearOff.h"
-
-#include "SVGPathElement.h"
-
-namespace WebCore {
-
-SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, SVGPathSegListValues& values)
-    : Base(contextElement, attributeName, animatedPropertyType, values)
-{
-    ASSERT(contextElement);
-    ASSERT(is<SVGPathElement>(contextElement));
-}
-
-SVGAnimatedPathSegListPropertyTearOff::~SVGAnimatedPathSegListPropertyTearOff()
-{
-    downcast<SVGPathElement>(contextElement())->animatedPropertyWillBeDeleted();
-}
-
-void SVGAnimatedPathSegListPropertyTearOff::animValDidChange()
-{
-    ASSERT(m_animatedPathByteStream);
-    auto pathElement = makeRefPtr(downcast<SVGPathElement>(contextElement()));
-
-    // If the animVal is observed from JS, we have to update it on each animation step.
-    // This is an expensive operation and only done if someone actually observes the animatedPathSegList() while an animation is running.
-    if (pathElement->isAnimValObserved()) {
-        auto& animatedList = currentAnimatedValue();
-        animatedList.clear();
-        buildSVGPathSegListValuesFromByteStream(*m_animatedPathByteStream, *pathElement, animatedList, UnalteredParsing);
-    }
-
-    Base::animValDidChange();
-}
-
-}
diff --git a/Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h b/Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h
deleted file mode 100644 (file)
index ba85993..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (C) Research In Motion Limited 2010, 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
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB.  If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#pragma once
-
-#include "SVGAnimatedListPropertyTearOff.h"
-#include "SVGPathByteStream.h"
-#include "SVGPathSegList.h"
-#include "SVGPathUtilities.h"
-
-namespace WebCore {
-
-class SVGAnimatedPathSegListPropertyTearOff final : public SVGAnimatedListPropertyTearOff<SVGPathSegListValues> {
-public:
-    using Base = SVGAnimatedListPropertyTearOff<SVGPathSegListValues>;
-
-    static Ref<SVGAnimatedPathSegListPropertyTearOff> create(SVGElement* contextElement, const QualifiedName& attributeName, AnimatedPropertyType animatedPropertyType, SVGPathSegListValues& values)
-    {
-        ASSERT(contextElement);
-        return adoptRef(*new SVGAnimatedPathSegListPropertyTearOff(contextElement, attributeName, animatedPropertyType, values));
-    }
-
-    Ref<ListPropertyTearOff> baseVal() final
-    {
-        if (m_baseVal)
-            return *static_cast<ListPropertyTearOff*>(m_baseVal.get());
-
-        auto property = SVGPathSegList::create(*this, BaseValRole, PathSegUnalteredRole, m_values, m_wrappers);
-        m_baseVal = makeWeakPtr(property.get());
-        return property;
-    }
-
-    Ref<ListPropertyTearOff> animVal() final
-    {
-        if (m_animVal)
-            return *static_cast<ListPropertyTearOff*>(m_animVal.get());
-
-        auto property = SVGPathSegList::create(*this, AnimValRole, PathSegUnalteredRole, m_values, m_wrappers);
-        m_animVal = makeWeakPtr(property.get());
-        return property;
-    }
-
-    int findItem(const RefPtr<SVGPathSeg>& segment)
-    {
-        return baseVal()->findItem(segment);
-    }
-
-    void removeItemFromList(size_t itemIndex, bool shouldSynchronizeWrappers)
-    {
-        baseVal()->removeItemFromList(itemIndex, shouldSynchronizeWrappers);
-    }
-
-    using Base::animationStarted;
-    void animationStarted(SVGPathByteStream* byteStream, const SVGPathSegListValues* baseValue)
-    {
-        ASSERT(byteStream);
-        ASSERT(baseValue);
-        ASSERT(!m_animatedPathByteStream);
-        m_animatedPathByteStream = byteStream;
-
-        // Pass shouldOwnValues=true, as the SVGPathSegListValues lifetime is solely managed by its tear off class.
-        auto* copy = new SVGPathSegListValues(*baseValue);
-        Base::animationStarted(copy, true);
-    }
-
-    void animationEnded()
-    {
-        ASSERT(m_animatedPathByteStream);
-        m_animatedPathByteStream = nullptr;
-        Base::animationEnded();
-    }
-
-    void animValDidChange();
-
-    SVGPathByteStream* animatedPathByteStream() const { return m_animatedPathByteStream; }
-
-private:
-    SVGAnimatedPathSegListPropertyTearOff(SVGElement*, const QualifiedName&, AnimatedPropertyType, SVGPathSegListValues&);
-    virtual ~SVGAnimatedPathSegListPropertyTearOff();
-
-    SVGPathByteStream* m_animatedPathByteStream { nullptr };
-};
-
-} // namespace WebCore
index a766a27..952f17b 100644 (file)
@@ -200,6 +200,28 @@ private:
 };
 
 template<typename OwnerType>
+class SVGAnimatedPathSegListAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPathSegList> {
+    using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPathSegList>;
+    using Base::property;
+
+public:
+    using Base::Base;
+    template<Ref<SVGAnimatedPathSegList> OwnerType::*property>
+    constexpr static const SVGMemberAccessor<OwnerType>& singleton() { return Base::template singleton<SVGAnimatedPathSegListAccessor, property>(); }
+
+private:
+    std::unique_ptr<SVGAttributeAnimator> createAnimator(OwnerType& owner, const QualifiedName& attributeName, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive) const final
+    {
+        return SVGAnimatedPathSegListAnimator::create(attributeName, property(owner), animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+    void appendAnimatedInstance(OwnerType& owner, SVGAttributeAnimator& animator) const final
+    {
+        static_cast<SVGAnimatedPathSegListAnimator&>(animator).appendAnimatedInstance(property(owner));
+    }
+};
+
+template<typename OwnerType>
 class SVGAnimatedPointListAccessor final : public SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPointList> {
     using Base = SVGAnimatedPropertyAccessor<OwnerType, SVGAnimatedPointList>;
     using Base::property;
index 95bcbd6..5636f71 100644 (file)
@@ -188,7 +188,7 @@ class SVGAnimatedNumberListAnimator final : public SVGAnimatedPropertyAnimator<S
 public:
     static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedNumberList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
     {
-        return std::unique_ptr<SVGAnimatedNumberListAnimator>(new SVGAnimatedNumberListAnimator(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive));
+        return std::make_unique<SVGAnimatedNumberListAnimator>(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive);
     }
     
 private:
@@ -197,7 +197,25 @@ private:
         m_function.progress(targetElement, percentage, repeatCount, m_animated->animVal());
     }
 };
-    
+
+class SVGAnimatedPathSegListAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedPathSegList, SVGAnimationPathSegListFunction> {
+    using Base = SVGAnimatedPropertyAnimator<SVGAnimatedPathSegList, SVGAnimationPathSegListFunction>;
+    using Base::Base;
+
+public:
+    static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedPathSegList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
+    {
+        return std::make_unique<SVGAnimatedPathSegListAnimator>(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive);
+    }
+
+private:
+    void progress(SVGElement* targetElement, float percentage, unsigned repeatCount) final
+    {
+        m_animated->animVal()->pathByteStreamWillChange();
+        m_function.progress(targetElement, percentage, repeatCount, m_animated->animVal()->pathByteStream());
+    }
+};
+
 class SVGAnimatedPointListAnimator final : public SVGAnimatedPropertyAnimator<SVGAnimatedPointList, SVGAnimationPointListFunction> {
     using Base = SVGAnimatedPropertyAnimator<SVGAnimatedPointList, SVGAnimationPointListFunction>;
     using Base::Base;
@@ -205,7 +223,7 @@ class SVGAnimatedPointListAnimator final : public SVGAnimatedPropertyAnimator<SV
 public:
     static auto create(const QualifiedName& attributeName, Ref<SVGAnimatedPointList>& animated, AnimationMode animationMode, CalcMode calcMode, bool isAccumulated, bool isAdditive)
     {
-        return std::unique_ptr<SVGAnimatedPointListAnimator>(new SVGAnimatedPointListAnimator(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive));
+        return std::make_unique<SVGAnimatedPointListAnimator>(attributeName, animated, animationMode, calcMode, isAccumulated, isAdditive);
     }
     
 private:
index fe2be1a..9eb6afb 100644 (file)
@@ -36,6 +36,7 @@
 #include "SVGLengthList.h"
 #include "SVGMarkerTypes.h"
 #include "SVGNumberList.h"
+#include "SVGPathSegList.h"
 #include "SVGPointList.h"
 #include "SVGPreserveAspectRatio.h"
 #include "SVGRect.h"
@@ -68,4 +69,32 @@ public:
     }
 };
 
+class SVGAnimatedPathSegList : public SVGAnimatedPropertyList<SVGPathSegList> {
+    using Base = SVGAnimatedPropertyList<SVGPathSegList>;
+    using Base::Base;
+
+public:
+    static Ref<SVGAnimatedPathSegList> create(SVGElement* contextElement)
+    {
+        return adoptRef(*new SVGAnimatedPathSegList(contextElement));
+    }
+
+    SVGPathByteStream& currentPathByteStream()
+    {
+        return isAnimating() ? animVal()->pathByteStream() : baseVal()->pathByteStream();
+    }
+
+    Path currentPath()
+    {
+        return isAnimating() ? animVal()->path() : baseVal()->path();
+    }
+
+    size_t approximateMemoryCost() const
+    {
+        if (isAnimating())
+            return baseVal()->approximateMemoryCost() + animVal()->approximateMemoryCost();
+        return baseVal()->approximateMemoryCost();
+    }
+};
+
 }
index 6dc5f6d..2aa4629 100644 (file)
@@ -26,6 +26,7 @@
 #pragma once
 
 #include "SVGAnimationAdditiveValueFunction.h"
+#include "SVGPathByteStream.h"
 #include "SVGPropertyTraits.h"
 
 namespace WebCore {
@@ -241,6 +242,55 @@ private:
     }
 };
 
+class SVGAnimationPathSegListFunction : public SVGAnimationAdditiveValueFunction<SVGPathByteStream> {
+public:
+    using Base = SVGAnimationAdditiveValueFunction<SVGPathByteStream>;
+    using Base::Base;
+
+    void setFromAndToValues(SVGElement*, const String& from, const String& to) override
+    {
+        m_from = SVGPathByteStream(from);
+        m_to = SVGPathByteStream(to);
+    }
+
+    void setToAtEndOfDurationValue(const String& toAtEndOfDuration) override
+    {
+        m_toAtEndOfDuration = SVGPathByteStream(toAtEndOfDuration);
+    }
+
+    void progress(SVGElement*, float percentage, unsigned repeatCount, SVGPathByteStream& animated)
+    {
+        SVGPathByteStream underlyingPath;
+        if (m_animationMode == AnimationMode::To)
+            underlyingPath = animated;
+
+        const SVGPathByteStream& from = m_animationMode == AnimationMode::To ? underlyingPath : m_from;
+
+        // Cache the current animated value before the buildAnimatedSVGPathByteStream() clears animatedPath.
+        SVGPathByteStream lastAnimated;
+        if (!from.size() || (m_isAdditive && m_animationMode != AnimationMode::To))
+            lastAnimated = animated;
+
+        buildAnimatedSVGPathByteStream(from, m_to, animated, percentage);
+
+        // Handle additive='sum'.
+        if (!lastAnimated.isEmpty())
+            addToSVGPathByteStream(animated, lastAnimated);
+
+        // Handle accumulate='sum'.
+        if (m_isAccumulated && repeatCount)
+            addToSVGPathByteStream(animated, toAtEndOfDuration(), repeatCount);
+    }
+
+private:
+    void addFromAndToValues(SVGElement*) override
+    {
+        if (!m_from.size() || m_from.size() != m_to.size())
+            return;
+        addToSVGPathByteStream(m_to, m_from);
+    }
+};
+
 class SVGAnimationRectFunction : public SVGAnimationAdditiveValueFunction<FloatRect> {
 public:
     using Base = SVGAnimationAdditiveValueFunction<FloatRect>;
index d1b93a2..e7f3037 100644 (file)
@@ -97,6 +97,12 @@ public:
         registerProperty(attributeName, SVGAnimatedAngleOrientAccessor<OwnerType>::template singleton<property1, property2>());
     }
 
+    template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPathSegList> OwnerType::*property>
+    static void registerProperty()
+    {
+        registerProperty(attributeName, SVGAnimatedPathSegListAccessor<OwnerType>::template singleton<property>());
+    }
+
     template<const LazyNeverDestroyed<const QualifiedName>& attributeName, Ref<SVGAnimatedPointList> OwnerType::*property>
     static void registerProperty()
     {