2010-11-18 Nikolas Zimmermann <nzimmermann@rim.com>
authorzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Nov 2010 13:42:45 +0000 (13:42 +0000)
committerzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 18 Nov 2010 13:42:45 +0000 (13:42 +0000)
        Reviewed by Dirk Schulze.

        Convert SVGPathSeg/SVGPathSegList to the new SVGPropertyTearOff concept
        https://bugs.webkit.org/show_bug.cgi?id=49580

        SVGPathElement.cloneNode loses generated pathSegList
        https://bugs.webkit.org/show_bug.cgi?id=43388

        SVG Path elements are not correctly updated through pathSegList manipulation on relative values
        https://bugs.webkit.org/show_bug.cgi?id=30219

        Changing an SVGPathSeg does not update a following Smooth Cubic Curveto
        https://bugs.webkit.org/show_bug.cgi?id=19741

        SVGPathElement should only build SVGPathSeg* list on demand
        https://bugs.webkit.org/show_bug.cgi?id=10827

        Tests: svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg
               svg/dom/SVGPathSegList-appendItem.xhtml
               svg/dom/SVGPathSegList-clear-and-initialize.xhtml
               svg/dom/SVGPathSegList-cloning.html
               svg/dom/SVGPathSegList-insertItemBefore.xhtml
               svg/dom/SVGPathSegList-removeItem.xhtml
               svg/dom/SVGPathSegList-replaceItem.xhtml
               svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml
               svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml
               svg/dom/SVGPathSegList-segment-modification.svg

        Convert SVGPathSeg*/SVGPathSegList to the new SVG(Animated)PropertyTearOff concept.
        Unlike all other SVG* types that use the SVGPropertyTearOff concept, SVGPathSegs are already refcounted,
        and don't need to be wrapped in SVGPropertyTearOff objects. The consequence is that SVGPathSegs need to track
        themselves to which list and path element they belong. Introduce new SVGAnimatedPathSegListPropertyTearOff
        and SVGPathSegListPropertyTearOff classes, that encapsulate the special needed for SVGPathSegList.

        Each SVGPathSeg now needs to store a RefPtr<SVGPathElement> - this makes it impossible to use SVGPathSegList
        to represent the 'd' attribute internally in SVGPathElement. SVGPathSegList is now only used in the SVG DOM bindings
        if someone explicitely requests 'pathElement.pathSegList' (eg. via JS). Switch to use SVGPathByteStream to store
        the 'd' attribute data in SVGPathElement, which is much more compact, and less memory intensive.
        Dirk already prepared SVGPathParserFactory some months ago, which allows easy conversion between
        String/Path/SVGPathSegList/SVGPathByteStream in all directions, including normalizing the lists, when requested.

        As consequence SVGPathSegList is now only built on demand, when explicitely requested. Using the SVGAnimatedProperty
        concept gives us 'd' attribute <-> SVGPathSegList synchronization for free, fixing several bugs, listed above.

        * Android.mk: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
        * CMakeLists.txt: Ditto.
        * DerivedSources.make: Remove SVGAnimatedPathData IDL generation.
        * GNUmakefile.am: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
        * WebCore.gyp/WebCore.gyp: Remove SVGAnimatedPathData IDL generation.
        * WebCore.gypi: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
        * WebCore.order: Remove no-longer existant SVGAnimatedPathData symbols.
        * WebCore.pro:  Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp / JSSVGPathSegCustom.* from build.
        * WebCore.vcproj/WebCore.vcproj: Ditto.
        * WebCore.xcodeproj/project.pbxproj: Ditto.
        * bindings/js/JSBindingsAllInOne.cpp: Remove JSSVGPathSegCustom.cpp from build.
        * bindings/js/JSDOMBinding.cpp: Adapt to toJS() changes, remove context parameter.
        (WebCore::setDOMException):
        * bindings/js/JSDOMBinding.h: Remove obsolete CREATE_SVG_OBJECT_WRAPPER macro, the context parameter is not existant anymore.
        * bindings/js/JSSVGPathSegCustom.cpp: Replace CREATE_SVG_OBJECT_WRAPPER by CREATE_DOM_OBJECT_WRAPPER. Remove context parameter/handling.
        (WebCore::toJS):
        * bindings/js/JSSVGPathSegListCustom.cpp: Removed.
        * bindings/scripts/CodeGenerator.pm: Map 'SVGPathSegList' IDL type to SVG 'SVGPathSegListPropertyTearOff' native type.
        * bindings/scripts/CodeGeneratorJS.pm: Remove IsSVGTypeNeedingContextParameter() methods and usages. Handle SVGPathSegListPropertyTearOff.
        * bindings/scripts/CodeGeneratorObjC.pm: Handle SVGPathSegListPropertyTearOff.
        * bindings/scripts/CodeGeneratorV8.pm: Remove IsSVGTypeNeedingContextParameter() methods and usages.
        * rendering/SVGRenderTreeAsText.cpp: Build path string from byte stream, not path segment list.
        (WebCore::operator<<):
        * svg/SVGAllInOne.cpp: Remove obsolete cpp files.
        * svg/SVGAnimatedPathData.cpp: Removed.
        * svg/SVGAnimatedPathData.h: Removed.
        * svg/SVGAnimatedPathData.idl: Removed.
        * svg/SVGPathElement.cpp: Build SVGPathList on demand. Use SVGPathByteStream to parse/store the 'd' attribute content.
        (WebCore::SVGPathElement::SVGPathElement):
        (WebCore::SVGPathElement::getPathSegAtLength): Use SVGPathByteStream, not SVGPathSegList to determine the getPathSegAtLength() information.
        (WebCore::SVGPathElement::createSVGPathSegClosePath): Pass SVGPathElement to SVGPathSeg and a SVGPathSegRole parameter and store it to track the list origin.
        (WebCore::SVGPathElement::createSVGPathSegMovetoAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegMovetoRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegArcAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegArcRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs): Ditto.
        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel): Ditto.
        (WebCore::SVGPathElement::parseMappedAttribute): Build SVGPathByteStream from 'd' attribute, not a SVGPathSegList.
        (WebCore::SVGPathElement::svgAttributeChanged): If a SVGPathSegList object has been built, synchronize it with the 'd' attribute.
        (WebCore::SVGPathElement::synchronizeProperty): Synchronize 'd' attribute with the SVGPathSegList, if needed.
        (WebCore::SVGPathElement::synchronizeD): Added.
        (WebCore::SVGPathElement::pathSegList): Use same trick as in SVGPolyElement to expose the 'pathSegList' / 'animatedPathSegList' object to the SVG DOM bindings.
        (WebCore::SVGPathElement::normalizedPathSegList): Ditto.
        (WebCore::SVGPathElement::animatedPathSegList): Ditto.
        (WebCore::SVGPathElement::animatedNormalizedPathSegList): Ditto.
        (WebCore::SVGPathElement::toPathData): Build 'Path' object from SVGPathByteStream, not from SVGPathSegList.
        (WebCore::SVGPathElement::pathSegListChanged): Used to synchronize the SVGPathSegLists and the d attribute, as well as any changes from any SVGPathSeg associated with this SVGPathElement.
        * svg/SVGPathElement.h: Add new accessors...
        (WebCore::SVGPathElement::pathByteStream): ... needed by SVGRenderTreeAsText.
        (WebCore::SVGPathElement::animatablePathSegList): ... needed by SVGPathSegListPropertyTearOff.
        * svg/SVGPathElement.idl: Merge SVGAnimatedPathData interface into SVGPathElement.
        * svg/SVGPathParserFactory.cpp: Cleanup SVGPathParserFactory, remove obsolete methods, now that SVGPathElement switched to using SVGPathByteStream internally.
        (WebCore::globalSVGPathSegListBuilder):
        (WebCore::SVGPathParserFactory::buildSVGPathByteStreamFromSVGPathSegList):
        (WebCore::SVGPathParserFactory::buildPathFromByteStream):
        (WebCore::SVGPathParserFactory::buildSVGPathSegListFromByteStream):
        (WebCore::SVGPathParserFactory::buildStringFromSVGPathSegList):
        (WebCore::SVGPathParserFactory::buildSVGPathByteStreamFromString):
        (WebCore::SVGPathParserFactory::buildAnimatedSVGPathByteStream):
        (WebCore::SVGPathParserFactory::getSVGPathSegAtLengthFromSVGPathByteStream):
        * svg/SVGPathParserFactory.h:
        * svg/SVGPathSeg.cpp: Removed.
        * svg/SVGPathSeg.h: Add new SVGPathSegRole enum, identifying to which list a path segment belongs.
        (WebCore::SVGPathSeg::SVGPathSeg):
        * svg/SVGPathSeg.idl: Reindented.
        * svg/SVGPathSegArc.cpp: Removed.
        * svg/SVGPathSegArc.h: All setters now call the commitChange() method.
        * svg/SVGPathSegArcAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegArcRel.idl: Ditto.
        * svg/SVGPathSegClosePath.cpp: Removed.
        * svg/SVGPathSegClosePath.h:
        * svg/SVGPathSegCurvetoCubic.cpp: Removed.
        * svg/SVGPathSegCurvetoCubic.h: All setters now call the commitChange() method.
        * svg/SVGPathSegCurvetoCubicAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegCurvetoCubicRel.idl: Ditto.
        * svg/SVGPathSegCurvetoCubicSmooth.cpp: Removed.
        * svg/SVGPathSegCurvetoCubicSmooth.h: All setters now call the commitChange() method.
        * svg/SVGPathSegCurvetoCubicSmoothAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegCurvetoCubicSmoothRel.idl: Ditto.
        * svg/SVGPathSegCurvetoQuadratic.cpp: Removed.
        * svg/SVGPathSegCurvetoQuadratic.h: All setters now call the commitChange() method.
        * svg/SVGPathSegCurvetoQuadraticAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegCurvetoQuadraticRel.idl: Ditto.
        * svg/SVGPathSegCurvetoQuadraticSmooth.cpp: Removed.
        * svg/SVGPathSegCurvetoQuadraticSmooth.h: All setters now call the commitChange() method.
        * svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegCurvetoQuadraticSmoothRel.idl: Ditto.
        * svg/SVGPathSegLineto.cpp: Removed.
        * svg/SVGPathSegLineto.h: All setters now call the commitChange() method.
        * svg/SVGPathSegLinetoAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegLinetoHorizontal.cpp: Removed.
        * svg/SVGPathSegLinetoHorizontal.h: All setters now call the commitChange() method.
        * svg/SVGPathSegLinetoHorizontalAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegLinetoHorizontalRel.idl: Ditto.
        * svg/SVGPathSegLinetoRel.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegLinetoVertical.cpp: Removed.
        * svg/SVGPathSegLinetoVertical.h: All setters now call the commitChange() method.
        * svg/SVGPathSegLinetoVerticalAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegLinetoVerticalRel.idl: Ditto.
        * svg/SVGPathSegList.cpp: Switch from SVGList<RefPtr<SVGPathSeg> > to a plain Vector<RefPtr<SVGPathSeg> >.
        (WebCore::SVGPathSegList::valueAsString): Utilize SVGPathParserFactory to build a String from a SVGPathSegList.
        (WebCore::SVGPathSegList::commitChange): Call SVGPathElement::pathSegListChanged().
        * svg/SVGPathSegList.h:
        (WebCore::SVGPathSegList::SVGPathSegList):
        * svg/SVGPathSegList.idl: Remove [JSCCustom] flags, no longer needed.
        * svg/SVGPathSegListBuilder.cpp: Adapt to SVGPathSegList API changes.
        (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: Ditto.
        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathElement):
        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathSegList):
        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathSegRole):
        (WebCore::SVGPathSegListBuilder::cleanup):
        * svg/SVGPathSegListSource.cpp: Ditto.
        (WebCore::SVGPathSegListSource::SVGPathSegListSource):
        (WebCore::SVGPathSegListSource::parseSVGSegmentType):
        (WebCore::SVGPathSegListSource::nextCommand):
        (WebCore::SVGPathSegListSource::parseMoveToSegment):
        (WebCore::SVGPathSegListSource::parseLineToSegment):
        (WebCore::SVGPathSegListSource::parseCurveToQuadraticSmoothSegment):
        * svg/SVGPathSegListSource.h: Ditto.
        (WebCore::SVGPathSegListSource::create):
        * svg/SVGPathSegMoveto.cpp: Removed.
        * svg/SVGPathSegMoveto.h: All setters now call the commitChange() method.
        * svg/SVGPathSegMovetoAbs.idl: Enable StrictTypeChecking.
        * svg/SVGPathSegMovetoRel.idl: Ditto.
        * svg/SVGPathSegWithContext.h: Added. This is the new base class for all SVGPathSeg derived types, that's associated with a SVGPathElement and a 'role' (normalized/unaltered segment list).
        (WebCore::SVGPathSegWithContext::SVGPathSegWithContext):
        (WebCore::SVGPathSegWithContext::animatedProperty):
        (WebCore::SVGPathSegWithContext::setContextAndRole):
        (WebCore::SVGPathSegWithContext::commitChange):
        (WebCore::SVGPathSegSingleCoordinate::x):
        (WebCore::SVGPathSegSingleCoordinate::setX):
        (WebCore::SVGPathSegSingleCoordinate::y):
        (WebCore::SVGPathSegSingleCoordinate::setY):
        (WebCore::SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate):
        * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Added.
        (WebCore::SVGAnimatedPathSegListPropertyTearOff::baseVal):
        (WebCore::SVGAnimatedPathSegListPropertyTearOff::animVal):
        (WebCore::SVGAnimatedPathSegListPropertyTearOff::removeItemFromList):
        (WebCore::SVGAnimatedPathSegListPropertyTearOff::create):
        (WebCore::SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff):
        * svg/properties/SVGPathSegListPropertyTearOff.cpp: Added.
        (WebCore::SVGPathSegListPropertyTearOff::clear): Added in the cpp file, not in the header, as it needs access to SVGPathSegWithContext, which we can't include from the header.
        (WebCore::SVGPathSegListPropertyTearOff::getItem): Ditto.
        (WebCore::SVGPathSegListPropertyTearOff::removeItem): Ditto.
        (WebCore::SVGPathSegListPropertyTearOff::contextElement): Needs access to SVGPathElement, that's why it lives in the cpp file.
        (WebCore::SVGPathSegListPropertyTearOff::processIncomingListItemValue): Needs access to SVGPathSegWithContext.
        * svg/properties/SVGPathSegListPropertyTearOff.h: Added.
        (WebCore::SVGPathSegListPropertyTearOff::create):
        (WebCore::SVGPathSegListPropertyTearOff::removeItemFromList):
        (WebCore::SVGPathSegListPropertyTearOff::numberOfItems):
        (WebCore::SVGPathSegListPropertyTearOff::initialize):
        (WebCore::SVGPathSegListPropertyTearOff::insertItemBefore):
        (WebCore::SVGPathSegListPropertyTearOff::replaceItem):
        (WebCore::SVGPathSegListPropertyTearOff::appendItem):
        (WebCore::SVGPathSegListPropertyTearOff::SVGPathSegListPropertyTearOff):
        (WebCore::SVGPathSegListPropertyTearOff::commitChange):
        (WebCore::SVGPathSegListPropertyTearOff::processIncomingListItemWrapper):

2010-11-18  Nikolas Zimmermann  <nzimmermann@rim.com>

        Reviewed by Dirk Schulze.

        Convert SVGPathSeg/SVGPathSegList to the new SVGPropertyTearOff concept
        https://bugs.webkit.org/show_bug.cgi?id=49580

        Add several new tests covering SVGPathSegList usage.

        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.checksum: Added.
        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png: Added.
        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.txt: Added.
        * platform/mac/svg/custom/svg-curve-with-relative-cordinates-expected.txt:
        * platform/mac/svg/dom/SVGPathSegList-appendItem-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.txt: Added.
        * platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-removeItem-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.txt: Added.
        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.checksum: Added.
        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png: Added.
        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.txt: Added.
        * svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg: Added.
        * svg/dom/SVGPathSegList-appendItem-expected.txt: Added.
        * svg/dom/SVGPathSegList-appendItem.xhtml: Added.
        * svg/dom/SVGPathSegList-clear-and-initialize-expected.txt: Added.
        * svg/dom/SVGPathSegList-clear-and-initialize.xhtml: Added.
        * svg/dom/SVGPathSegList-cloning.html: Added.
        * svg/dom/SVGPathSegList-insertItemBefore-expected.txt: Added.
        * svg/dom/SVGPathSegList-insertItemBefore.xhtml: Added.
        * svg/dom/SVGPathSegList-removeItem-expected.txt: Added.
        * svg/dom/SVGPathSegList-removeItem.xhtml: Added.
        * svg/dom/SVGPathSegList-replaceItem-expected.txt: Added.
        * svg/dom/SVGPathSegList-replaceItem.xhtml: Added.
        * svg/dom/SVGPathSegList-segment-modification.svg: Added.
        * svg/dom/SVGPathSegList-xml-dom-synchronization-expected.txt: Added.
        * svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml: Added.
        * svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml: Added.
        * svg/dom/fuzz-path-parser-expected.txt:
        * svg/dom/path-parser-expected.txt:
        * svg/dom/script-tests/path-parser.js:
        ():
        * svg/dom/svglist-exception-on-out-bounds-error-expected.txt:
        * svg/dom/svglist-exception-on-out-bounds-error.html:
        * svg/dom/svgpath-out-of-bounds-getPathSeg-expected.txt:

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

132 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/svg/custom/svg-curve-with-relative-cordinates-expected.txt
LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.txt [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.checksum [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png [new file with mode: 0644]
LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.txt [new file with mode: 0644]
LayoutTests/svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-appendItem-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-appendItem.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-cloning.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-insertItemBefore-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-insertItemBefore.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-removeItem-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-removeItem.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-replaceItem-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-replaceItem.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-segment-modification.svg [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml [new file with mode: 0644]
LayoutTests/svg/dom/fuzz-path-parser-expected.txt
LayoutTests/svg/dom/path-parser-expected.txt
LayoutTests/svg/dom/script-tests/path-parser.js
LayoutTests/svg/dom/svglist-exception-on-out-bounds-error-expected.txt
LayoutTests/svg/dom/svglist-exception-on-out-bounds-error.html
LayoutTests/svg/dom/svgpath-out-of-bounds-getPathSeg-expected.txt
WebCore/Android.mk
WebCore/CMakeLists.txt
WebCore/ChangeLog
WebCore/DerivedSources.make
WebCore/GNUmakefile.am
WebCore/WebCore.gyp/WebCore.gyp
WebCore/WebCore.gypi
WebCore/WebCore.order
WebCore/WebCore.pro
WebCore/WebCore.vcproj/WebCore.vcproj
WebCore/WebCore.xcodeproj/project.pbxproj
WebCore/bindings/js/JSBindingsAllInOne.cpp
WebCore/bindings/js/JSDOMBinding.cpp
WebCore/bindings/js/JSDOMBinding.h
WebCore/bindings/js/JSSVGPathSegCustom.cpp
WebCore/bindings/js/JSSVGPathSegListCustom.cpp [deleted file]
WebCore/bindings/scripts/CodeGenerator.pm
WebCore/bindings/scripts/CodeGeneratorJS.pm
WebCore/bindings/scripts/CodeGeneratorObjC.pm
WebCore/bindings/scripts/CodeGeneratorV8.pm
WebCore/rendering/SVGRenderTreeAsText.cpp
WebCore/svg/SVGAllInOne.cpp
WebCore/svg/SVGAnimatedPathData.cpp [deleted file]
WebCore/svg/SVGAnimatedPathData.h [deleted file]
WebCore/svg/SVGAnimatedPathData.idl [deleted file]
WebCore/svg/SVGPathElement.cpp
WebCore/svg/SVGPathElement.h
WebCore/svg/SVGPathElement.idl
WebCore/svg/SVGPathParserFactory.cpp
WebCore/svg/SVGPathParserFactory.h
WebCore/svg/SVGPathSeg.cpp [deleted file]
WebCore/svg/SVGPathSeg.h
WebCore/svg/SVGPathSeg.idl
WebCore/svg/SVGPathSegArc.cpp [deleted file]
WebCore/svg/SVGPathSegArc.h
WebCore/svg/SVGPathSegArcAbs.idl
WebCore/svg/SVGPathSegArcRel.idl
WebCore/svg/SVGPathSegClosePath.cpp [deleted file]
WebCore/svg/SVGPathSegClosePath.h
WebCore/svg/SVGPathSegCurvetoCubic.cpp [deleted file]
WebCore/svg/SVGPathSegCurvetoCubic.h
WebCore/svg/SVGPathSegCurvetoCubicAbs.idl
WebCore/svg/SVGPathSegCurvetoCubicRel.idl
WebCore/svg/SVGPathSegCurvetoCubicSmooth.cpp [deleted file]
WebCore/svg/SVGPathSegCurvetoCubicSmooth.h
WebCore/svg/SVGPathSegCurvetoCubicSmoothAbs.idl
WebCore/svg/SVGPathSegCurvetoCubicSmoothRel.idl
WebCore/svg/SVGPathSegCurvetoQuadratic.cpp [deleted file]
WebCore/svg/SVGPathSegCurvetoQuadratic.h
WebCore/svg/SVGPathSegCurvetoQuadraticAbs.idl
WebCore/svg/SVGPathSegCurvetoQuadraticRel.idl
WebCore/svg/SVGPathSegCurvetoQuadraticSmooth.cpp [deleted file]
WebCore/svg/SVGPathSegCurvetoQuadraticSmooth.h
WebCore/svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl
WebCore/svg/SVGPathSegCurvetoQuadraticSmoothRel.idl
WebCore/svg/SVGPathSegLineto.cpp [deleted file]
WebCore/svg/SVGPathSegLineto.h
WebCore/svg/SVGPathSegLinetoAbs.idl
WebCore/svg/SVGPathSegLinetoHorizontal.cpp [deleted file]
WebCore/svg/SVGPathSegLinetoHorizontal.h
WebCore/svg/SVGPathSegLinetoHorizontalAbs.idl
WebCore/svg/SVGPathSegLinetoHorizontalRel.idl
WebCore/svg/SVGPathSegLinetoRel.idl
WebCore/svg/SVGPathSegLinetoVertical.cpp [deleted file]
WebCore/svg/SVGPathSegLinetoVertical.h
WebCore/svg/SVGPathSegLinetoVerticalAbs.idl
WebCore/svg/SVGPathSegLinetoVerticalRel.idl
WebCore/svg/SVGPathSegList.cpp
WebCore/svg/SVGPathSegList.h
WebCore/svg/SVGPathSegList.idl
WebCore/svg/SVGPathSegListBuilder.cpp
WebCore/svg/SVGPathSegListBuilder.h
WebCore/svg/SVGPathSegListSource.cpp
WebCore/svg/SVGPathSegListSource.h
WebCore/svg/SVGPathSegMoveto.cpp [deleted file]
WebCore/svg/SVGPathSegMoveto.h
WebCore/svg/SVGPathSegMovetoAbs.idl
WebCore/svg/SVGPathSegMovetoRel.idl
WebCore/svg/SVGPathSegWithContext.h [new file with mode: 0644]
WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h [new file with mode: 0644]
WebCore/svg/properties/SVGPathSegListPropertyTearOff.cpp [new file with mode: 0644]
WebCore/svg/properties/SVGPathSegListPropertyTearOff.h [new file with mode: 0644]
WebKit/mac/ChangeLog
WebKit/mac/WebView/WebRenderLayer.mm

index 3c03d5b..2343ec4 100644 (file)
@@ -1,3 +1,61 @@
+2010-11-18  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        Reviewed by Dirk Schulze.
+
+        Convert SVGPathSeg/SVGPathSegList to the new SVGPropertyTearOff concept
+        https://bugs.webkit.org/show_bug.cgi?id=49580
+
+        Add several new tests covering SVGPathSegList usage.
+
+        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.checksum: Added.
+        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png: Added.
+        * platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.txt: Added.
+        * platform/mac/svg/custom/svg-curve-with-relative-cordinates-expected.txt:
+        * platform/mac/svg/dom/SVGPathSegList-appendItem-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-cloning-expected.txt: Added.
+        * platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-removeItem-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.txt: Added.
+        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.checksum: Added.
+        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png: Added.
+        * platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.txt: Added.
+        * svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg: Added.
+        * svg/dom/SVGPathSegList-appendItem-expected.txt: Added.
+        * svg/dom/SVGPathSegList-appendItem.xhtml: Added.
+        * svg/dom/SVGPathSegList-clear-and-initialize-expected.txt: Added.
+        * svg/dom/SVGPathSegList-clear-and-initialize.xhtml: Added.
+        * svg/dom/SVGPathSegList-cloning.html: Added.
+        * svg/dom/SVGPathSegList-insertItemBefore-expected.txt: Added.
+        * svg/dom/SVGPathSegList-insertItemBefore.xhtml: Added.
+        * svg/dom/SVGPathSegList-removeItem-expected.txt: Added.
+        * svg/dom/SVGPathSegList-removeItem.xhtml: Added.
+        * svg/dom/SVGPathSegList-replaceItem-expected.txt: Added.
+        * svg/dom/SVGPathSegList-replaceItem.xhtml: Added.
+        * svg/dom/SVGPathSegList-segment-modification.svg: Added.
+        * svg/dom/SVGPathSegList-xml-dom-synchronization-expected.txt: Added.
+        * svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml: Added.
+        * svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml: Added.
+        * svg/dom/fuzz-path-parser-expected.txt:
+        * svg/dom/path-parser-expected.txt:
+        * svg/dom/script-tests/path-parser.js:
+        ():
+        * svg/dom/svglist-exception-on-out-bounds-error-expected.txt:
+        * svg/dom/svglist-exception-on-out-bounds-error.html:
+        * svg/dom/svgpath-out-of-bounds-getPathSeg-expected.txt:
+
 2010-11-18  Anton Muhin  <antonm@chromium.org>
 
         Not reviewed, rebaselining fast/backgrounds/size/contain-and-cover.html
diff --git a/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.checksum b/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.checksum
new file mode 100644 (file)
index 0000000..856b928
--- /dev/null
@@ -0,0 +1 @@
+d0ddb1998d90b5296942f0e72b6b1061
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png b/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png
new file mode 100644 (file)
index 0000000..252ef68
Binary files /dev/null and b/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.txt b/LayoutTests/platform/mac/svg/W3C-SVG-1.1-SE/paths-dom-02-f-expected.txt
new file mode 100644 (file)
index 0000000..1feb275
--- /dev/null
@@ -0,0 +1,18 @@
+CONSOLE MESSAGE: line 267: Error: Problem parsing d=""
+layer at (0,0) size 480x360
+  RenderView at (0,0) size 480x360
+layer at (0,0) size 480x360
+  RenderSVGRoot {svg} at (0,0) size 480x360
+    RenderSVGHiddenContainer {defs} at (0,0) size 0x0
+    RenderSVGContainer {g} at (119,61) size 242x239
+      RenderSVGPath {path} at (119,61) size 242x239 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#0000FF]}] [data="M 250.261 208.191 C 256 300 224 300 229.739 208.191 C 175.122 282.21 150.609 261.641 214.019 195 C 124.601 216.595 119.045 185.081 210.456 174.791 C 128.077 133.856 144.077 106.144 220.716 157.019 C 183.923 72.7092 213.993 61.7646 240 150 C 266.007 61.7646 296.077 72.7092 259.284 157.019 C 335.923 106.144 351.923 133.856 269.544 174.791 C 360.955 185.081 355.399 216.595 265.981 195 C 329.391 261.641 304.878 282.21 250.261 208.191 Z"]
+    RenderSVGContainer {g} at (10,310) size 231x37
+      RenderSVGText {text} at (10,310) size 231x37 contains 1 chunk(s)
+        RenderSVGInlineText {#text} at (0,0) size 231x37
+          chunk 1 text run 1 at (10.00,340.00) startOffset 0 endOffset 16 width 231.00: "$Revision: 1.5 $"
+    RenderSVGPath {rect} at (0,0) size 480x360 [stroke={[type=SOLID] [color=#000000]}] [x=1.00] [y=1.00] [width=478.00] [height=358.00]
+    RenderSVGContainer {g} at (0,0) size 480x24
+      RenderSVGPath {rect} at (0,0) size 480x22 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [x=1.00] [y=1.00] [width=478.00] [height=20.00]
+      RenderSVGText {text} at (207,0) size 66x23 contains 1 chunk(s)
+        RenderSVGInlineText {#text} at (0,0) size 66x23
+          chunk 1 (middle anchor) text run 1 at (207.00,18.00) startOffset 0 endOffset 5 width 66.00: "DRAFT"
index cf5dae3..249ce92 100644 (file)
@@ -8,4 +8,4 @@ layer at (0,0) size 800x600
           text run at (0,0) width 349: "Here is an html paragraph. And below is a svg drawing"
       RenderBlock {DIV} at (0,34) size 784x400
         RenderSVGRoot {svg} at (48,57) size 340x310
-          RenderSVGPath {path} at (48,57) size 340x310 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 14.8649 27.5434 C 10.9361 23.4486 5.53039 20.9307 2.16163 16.2739 C 0.1954 13.4713 -0.27051 9.80295 0.40252 6.50142 C 1.50231 3.03806 4.88027 0.20151 8.61522 0.38648 C 11.4904 0.13255 14.1594 2.02987 15.543 4.44105 c 0.37594 0.23175 0.35941 2.21266 0.71868 1.07327 C 17.3118 2.6047 20.1552 0.48976 23.2581 0.39544 C 27.3718 0.07861 31.5625 3.22656 31.9769 7.4138 c 0.46508 3.14678 -0.04068 6.54082 -2.04024 9.1006 c -2.92245 3.93336 -7.42165 6.18284 -10.9046 9.53931 c -1.0882 0.79363 -2.28426 2.46524 -3.12799 2.94243 c -0.28088 -0.52741 -0.6413 -1.00829 -1.03915 -1.45272 Z"]
+          RenderSVGPath {path} at (48,57) size 340x310 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 14.8649 27.5434 C 10.9361 23.4486 5.53039 20.9307 2.16163 16.2739 C 0.1954 13.4713 -0.27051 9.80295 0.40252 6.50142 C 1.50231 3.03806 4.88027 0.20151 8.61522 0.38648 C 11.4904 0.13255 14.1594 2.02987 15.543 4.44105 C 15.919 4.6728 15.9025 6.65371 16.2617 5.51432 C 17.3118 2.6047 20.1552 0.48976 23.2581 0.39544 C 27.3718 0.07861 31.5625 3.22656 31.9769 7.4138 C 32.4419 10.5606 31.9362 13.9546 29.9366 16.5144 C 27.0142 20.4478 22.515 22.6972 19.032 26.0537 C 17.9438 26.8473 16.7477 28.519 15.904 28.9961 C 15.6231 28.4687 15.2627 27.9879 14.8649 27.5434 Z"]
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.checksum
new file mode 100644 (file)
index 0000000..7d62f77
--- /dev/null
@@ -0,0 +1 @@
+b0741ea3954a97f6350eade3873aec3b
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png
new file mode 100644 (file)
index 0000000..56b2476
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-appendItem-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.checksum
new file mode 100644 (file)
index 0000000..630e945
--- /dev/null
@@ -0,0 +1 @@
+15f1f1bee1df648b74f170a609a52c91
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png
new file mode 100644 (file)
index 0000000..01cec09
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-clear-and-initialize-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.checksum
new file mode 100644 (file)
index 0000000..5143299
--- /dev/null
@@ -0,0 +1 @@
+fd7678dd8df9f12286e26baf0507cdb4
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.png
new file mode 100644 (file)
index 0000000..ee631a2
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.txt b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-cloning-expected.txt
new file mode 100644 (file)
index 0000000..9eab518
--- /dev/null
@@ -0,0 +1,13 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 800x600
+  RenderBlock {HTML} at (0,0) size 800x600
+    RenderBody {BODY} at (8,8) size 784x584
+      RenderBlock {P} at (0,0) size 784x36
+        RenderText {#text} at (0,0) size 783x36
+          text run at (0,0) width 783: "Below is a JavaScript-generated svg drawing. You should see two red blobs: the left, a programmatically generated path and"
+          text run at (0,18) width 116: "the right, its clone."
+      RenderBlock {DIV} at (0,52) size 784x400
+        RenderSVGRoot {svg} at (26,188) size 374x164
+          RenderSVGPath {path} at (26,188) size 224x164 [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 10 10 L 25 15 L 110 75 L 120 90 L 42 42 Z"]
+          RenderSVGPath {path} at (176,188) size 224x164 [transform={m=((1.00,0.00)(0.00,1.00)) t=(75.00,0.00)}] [stroke={[type=SOLID] [color=#000000]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 10 10 L 25 15 L 110 75 L 120 90 L 42 42 Z"]
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.checksum
new file mode 100644 (file)
index 0000000..9e20823
--- /dev/null
@@ -0,0 +1 @@
+338a43f97d98410a01905b61101b04c7
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png
new file mode 100644 (file)
index 0000000..c6212b9
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-insertItemBefore-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.checksum
new file mode 100644 (file)
index 0000000..a455a56
--- /dev/null
@@ -0,0 +1 @@
+da5a4614bab6f5ef7fb6d021e062ca00
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png
new file mode 100644 (file)
index 0000000..2bda30f
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-removeItem-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.checksum
new file mode 100644 (file)
index 0000000..3cfa992
--- /dev/null
@@ -0,0 +1 @@
+36a012ee1a5fd8148b27e87386ee28ca
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png
new file mode 100644 (file)
index 0000000..59785e6
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-replaceItem-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.checksum
new file mode 100644 (file)
index 0000000..b579dcc
--- /dev/null
@@ -0,0 +1 @@
+20619e1b0dba942a7e96c7a785e71e54
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png
new file mode 100644 (file)
index 0000000..6008841
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.txt b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-segment-modification-expected.txt
new file mode 100644 (file)
index 0000000..dd7c9c7
--- /dev/null
@@ -0,0 +1,8 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 300x300
+  RenderSVGRoot {svg} at (10,6) size 245x74
+    RenderSVGPath {path} at (78,38) size 84x42 [stroke={[type=SOLID] [color=#000000] [stroke width=3.00]}] [data="M 80 40 C 80 40 120 80 160 40"]
+    RenderSVGText {text} at (10,6) size 245x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 245x18
+        chunk 1 text run 1 at (10.00,20.00) startOffset 0 endOffset 36 width 245.00: "There should be a smooth curve below"
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.checksum
new file mode 100644 (file)
index 0000000..51b7c29
--- /dev/null
@@ -0,0 +1 @@
+7a1153f9a5ef269a8071df8f211603f0
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png
new file mode 100644 (file)
index 0000000..79e5108
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.checksum b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.checksum
new file mode 100644 (file)
index 0000000..7afcdd7
--- /dev/null
@@ -0,0 +1 @@
+d671b3c8a0ad134b052156775db6b4a7
\ No newline at end of file
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png
new file mode 100644 (file)
index 0000000..c2d564d
Binary files /dev/null and b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.png differ
diff --git a/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.txt b/LayoutTests/platform/mac/svg/dom/SVGPathSegList-xml-dom-synchronization2-expected.txt
new file mode 100644 (file)
index 0000000..1ac2a06
--- /dev/null
@@ -0,0 +1,23 @@
+layer at (0,0) size 800x600
+  RenderView at (0,0) size 800x600
+layer at (0,0) size 600x500
+  RenderSVGRoot {svg} at (10,6) size 493x219
+    RenderSVGPath {path} at (46,103) size 128x122 [stroke={[type=SOLID] [color=#000000] [stroke width=5.00]}] [fill={[type=SOLID] [color=#FF0000]}] [data="M 50 150 L 95 107 L 145 157 L 169 221 L 100 200 Z"]
+    RenderSVGText {text} at (10,6) size 344x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 344x18
+        chunk 1 text run 1 at (10.00,20.00) startOffset 0 endOffset 52 width 344.00: "Right after loading, a segment is added to the path."
+    RenderSVGText {text} at (10,26) size 493x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 493x18
+        chunk 1 text run 1 at (10.00,40.00) startOffset 0 endOffset 72 width 493.00: "The path and its attribute should be updated to include the new segment."
+    RenderSVGText {text} at (10,56) size 65x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 65x18
+        chunk 1 text run 1 at (10.00,70.00) startOffset 0 endOffset 12 width 65.00: "\"d\" initial:"
+    RenderSVGText {text} at (90,56) size 212x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 212x18
+        chunk 1 text run 1 at (90.00,70.00) startOffset 0 endOffset 32 width 212.00: "M50,150 l45,-43 l24,64 l-69,-21z"
+    RenderSVGText {text} at (10,76) size 58x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 58x18
+        chunk 1 text run 1 at (10.00,90.00) startOffset 0 endOffset 10 width 58.00: "\"d\" after:"
+    RenderSVGText {text} at (90,76) size 283x18 contains 1 chunk(s)
+      RenderSVGInlineText {#text} at (0,0) size 283x18
+        chunk 1 text run 1 at (90.00,90.00) startOffset 0 endOffset 45 width 283.00: "M 50 150 l 45 -43 l 50 50 l 24 64 l -69 -21 Z"
diff --git a/LayoutTests/svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg b/LayoutTests/svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg
new file mode 100644 (file)
index 0000000..209ccf1
--- /dev/null
@@ -0,0 +1,279 @@
+<svg version="1.1" baseProfile="full" onload="CreatePath();setTimeout('AnimatePath();', 0);" id="svg-root"
+  width="100%" height="100%" viewBox="0 0 480 360"
+  xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+  <!--======================================================================-->
+  <!--=  SVG 1.1 2nd Edition Test Case                                     =-->
+  <!--======================================================================-->
+  <!--=  Copyright 2009 World Wide Web Consortium, (Massachusetts          =-->
+  <!--=  Institute of Technology, European Research Consortium for         =-->
+  <!--=  Informatics and Mathematics (ERCIM), Keio University).            =-->
+  <!--=  All Rights Reserved.                                              =-->
+  <!--=  See http://www.w3.org/Consortium/Legal/.                          =-->
+  <!--======================================================================-->
+  <d:SVGTestCase xmlns:d="http://www.w3.org/2000/02/svg/testsuite/description/"
+    template-version="1.4" reviewer="[reviewer]" author="ED" status="created"
+    version="$Revision: 1.5 $" testname="$RCSfile: paths-dom-02-f.svg,v $">
+    <d:testDescription xmlns="http://www.w3.org/1999/xhtml" href="http://www.w3.org/TR/SVG11/paths.html#DOMInterfaces">
+        <p>
+          This test is designed to test the PathSegList interface. At first a flower-like shape with 6 petals should be displayed.
+          The roundness and number of petals are then animated using script.
+        </p>
+    </d:testDescription>
+    <d:operatorScript xmlns="http://www.w3.org/1999/xhtml">
+      <p>
+        The roundness of the petals is animated from star-like sharp petals to softly rounded petals and back again, and is repeated like that until the animation stops.
+        The number of petals should increase one by one until the flower has a total of 12 petals, and then go back one by one until it has 6 petals, then increase again one by one until the flower has 9 petals.
+        Then the animation will stop. The rendered image should look exactly like the reference image.
+      </p>
+      <p>
+        If the flower is clicked after the animation has finished, it will restart the animation and repeat it for some time.
+      </p>
+    </d:operatorScript>
+    <d:passCriteria xmlns="http://www.w3.org/1999/xhtml">
+      <p>
+        [[Describe the pass criteria of the test here. The pass criteria is what
+        should be displayed when the test is run.]]
+      </p>
+    </d:passCriteria>
+  </d:SVGTestCase>
+  <title id="test-title">$RCSfile: paths-dom-02-f.svg,v $</title>
+  <defs>
+    <font-face font-family="SVGFreeSansASCII" unicode-range="U+0-7F">
+      <font-face-src>
+        <font-face-uri xlink:href="../resources/SVGFreeSans.svg#ascii"/>
+      </font-face-src>
+    </font-face>
+  </defs>
+  <g id="test-body-content" font-family="SVGFreeSansASCII,sans-serif" font-size="18">
+    <script><![CDATA[
+       if (window.layoutTestController)
+        layoutTestController.waitUntilDone();
+      var offset_angle = 90;
+      var current_shift = 0;
+      var shift_inc = 1;
+      var THRESHOLD = 60;
+      var segments_added = 0;
+      var seg_diff = 1;
+      var adjust_count = 0;
+      var anim_count = 0;
+      var adjust_count_max = 8;
+      var anim_count_max = 10;
+      var stopped = false;
+
+      function DegToRad(degs)
+      {
+      return (degs * Math.PI) / 180;
+      }
+
+      function CreatePath()
+      {
+      var pathelm = document.getElementById("mypath");
+      var pathlist = pathelm.pathSegList;
+
+      var move = pathelm.createSVGPathSegMovetoAbs(240 + 30 * Math.cos(DegToRad(offset_angle - 30)),
+      180 + 30 * Math.sin(DegToRad(offset_angle - 30)));
+      pathlist.appendItem(move);
+
+      var angle = offset_angle;
+      for (var i = 0; i < 6; i++)
+      {
+      var x, y, xcp, ycp;
+
+      x = 240 + 30 * Math.cos(DegToRad(angle + 30));
+      y = 180 + 30 * Math.sin(DegToRad(angle + 30));
+
+      xcp = 240 + 120 * Math.cos(DegToRad(angle));
+      ycp = 180 + 120 * Math.sin(DegToRad(angle));
+
+      var curve = pathelm.createSVGPathSegCurvetoCubicAbs(x, y,
+      xcp, ycp,
+      xcp, ycp);
+
+      pathlist.appendItem(curve);
+
+      angle += 60;
+      }
+
+      pathlist.appendItem(pathelm.createSVGPathSegClosePath());
+      setTimeout('AdjustPath()', 0);
+      }
+
+      function AddSegment()
+      {
+      var pathelm = document.getElementById("mypath");
+      var pathlist = pathelm.pathSegList;
+
+      var segments = pathlist.numberOfItems - 2; // Not MoveTo and Close
+      var angle = offset_angle;
+      var inc_angle = 360/(segments+1);
+      var shift_v_x, shift_v_y, xcp, ycp;
+
+      var move = pathlist.getItem(0);
+      move.x = 240 + 30 * Math.cos(DegToRad(offset_angle - inc_angle/2));
+      move.y = 180 + 30 * Math.sin(DegToRad(offset_angle - inc_angle/2));
+
+      for (var i = 0; i < segments; i++)
+      {
+      var curve = pathlist.getItem(1+i);
+
+      shift_v_x = current_shift * Math.cos(DegToRad(angle + 90));
+      shift_v_y = current_shift * Math.sin(DegToRad(angle + 90));
+
+      xcp = 240 + 120 * Math.cos(DegToRad(angle));
+      ycp = 180 + 120 * Math.sin(DegToRad(angle));
+
+      curve.x = 240 + 30 * Math.cos(DegToRad(angle + inc_angle/2));
+      curve.y = 180 + 30 * Math.sin(DegToRad(angle + inc_angle/2));
+
+      curve.x1 = xcp - shift_v_x;
+      curve.y1 = ycp - shift_v_y;
+
+      curve.x2 = xcp + shift_v_x;
+      curve.y2 = ycp + shift_v_y;
+
+      angle += inc_angle;
+      }
+
+      shift_v_x = current_shift * Math.cos(DegToRad(angle + 90));
+      shift_v_y = current_shift * Math.sin(DegToRad(angle + 90));
+
+      xcp = 240 + 120 * Math.cos(DegToRad(angle));
+      ycp = 180 + 120 * Math.sin(DegToRad(angle));
+
+      var x = 240 + 30 * Math.cos(DegToRad(angle + inc_angle/2));
+      var y = 180 + 30 * Math.sin(DegToRad(angle + inc_angle/2));
+
+      var curve = pathelm.createSVGPathSegCurvetoCubicAbs(x, y,
+      xcp - shift_v_x,
+      ycp - shift_v_y,
+      xcp + shift_v_x,
+      ycp + shift_v_y);
+
+      pathlist.insertItemBefore(curve, pathlist.numberOfItems-1);
+      }
+
+      function RemoveSegment()
+      {
+      var pathelm = document.getElementById("mypath");
+      var pathlist = pathelm.pathSegList;
+
+      var segments = pathlist.numberOfItems - 2; // Not MoveTo and Close
+      var angle = offset_angle;
+      var inc_angle = 360/(segments-1);
+      var shift_v_x, shift_v_y, xcp, ycp;
+
+      var move = pathlist.getItem(0);
+      move.x = 240 + 30 * Math.cos(DegToRad(offset_angle - inc_angle/2));
+      move.y = 180 + 30 * Math.sin(DegToRad(offset_angle - inc_angle/2));
+
+      for (var i = 0; i < segments-1; i++)
+      {
+      var curve = pathlist.getItem(1+i);
+
+      shift_v_x = current_shift * Math.cos(DegToRad(angle + 90));
+      shift_v_y = current_shift * Math.sin(DegToRad(angle + 90));
+
+      xcp = 240 + 120 * Math.cos(DegToRad(angle));
+      ycp = 180 + 120 * Math.sin(DegToRad(angle));
+
+      curve.x = 240 + 30 * Math.cos(DegToRad(angle + inc_angle/2));
+      curve.y = 180 + 30 * Math.sin(DegToRad(angle + inc_angle/2));
+
+      curve.x1 = xcp - shift_v_x;
+      curve.y1 = ycp - shift_v_y;
+
+      curve.x2 = xcp + shift_v_x;
+      curve.y2 = ycp + shift_v_y;
+
+      angle += inc_angle;
+      }
+
+      pathlist.removeItem(pathlist.numberOfItems-2);
+      }
+
+      function AdjustPath()
+      {
+      if (seg_diff > 0)
+      {
+      AddSegment();
+      }
+      else
+      {
+      RemoveSegment();
+      }
+
+      segments_added += seg_diff;
+
+      if (segments_added > 5)
+      seg_diff = -1;
+      else if (segments_added <= 0)
+      seg_diff = 1;
+
+      if(adjust_count < adjust_count_max)
+      {
+      adjust_count++;
+      setTimeout('AdjustPath()', 0);
+      }
+      }
+
+      function AnimatePath()
+      {
+      var pathelm = document.getElementById("mypath");
+      var pathlist = pathelm.pathSegList;
+
+      var segments = pathlist.numberOfItems - 2; // Not MoveTo and Close
+      var angle = offset_angle;
+      var inc_angle = 360/segments;
+      for (var i = 0; i < segments; i++)
+      {
+      var curve = pathlist.getItem(1+i);
+
+      var shift_v_x, shift_v_y, xcp, ycp;
+
+      shift_v_x = current_shift * Math.cos(DegToRad(angle + 90));
+      shift_v_y = current_shift * Math.sin(DegToRad(angle + 90));
+
+      xcp = 240 + 120 * Math.cos(DegToRad(angle));
+      ycp = 180 + 120 * Math.sin(DegToRad(angle));
+
+      curve.x1 = xcp - shift_v_x;
+      curve.y1 = ycp - shift_v_y;
+
+      curve.x2 = xcp + shift_v_x;
+      curve.y2 = ycp + shift_v_y;
+
+      angle += inc_angle;
+      }
+
+      current_shift += shift_inc;
+      if (current_shift >= THRESHOLD || current_shift < 0)
+      shift_inc = -shift_inc;
+
+      if(adjust_count >= adjust_count_max)
+      {
+      anim_count++;
+      }
+
+      if(anim_count < anim_count_max)
+      setTimeout('AnimatePath();', 0);
+      else {
+        document.getElementById("mypath").addEventListener("click", function func() { adjust_count_max=32768;anim_count_max=32768; AdjustPath(); AnimatePath(); }, false);
+        if (window.layoutTestController)
+          layoutTestController.notifyDone();
+      }
+      }
+
+    ]]></script>
+    <path d="" id="mypath" stroke="black" fill="blue"/>
+  </g>
+  <g font-family="SVGFreeSansASCII,sans-serif" font-size="32">
+    <text id="revision" x="10" y="340" stroke="none" fill="black">$Revision: 1.5 $</text>
+  </g>
+  <rect id="test-frame" x="1" y="1" width="478" height="358" fill="none" stroke="#000"/>
+  <!-- comment out this watermark once the test is approved -->
+  <g id="draft-watermark">
+    <rect x="1" y="1" width="478" height="20" fill="red" stroke="black" stroke-width="1"/>
+    <text font-family="SVGFreeSansASCII,sans-serif" font-weight="bold" font-size="20" x="240"
+      text-anchor="middle" y="18" stroke-width="0.5" stroke="black" fill="white">DRAFT</text>
+  </g>
+</svg>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-appendItem-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-appendItem-expected.txt
new file mode 100644 (file)
index 0000000..833738d
--- /dev/null
@@ -0,0 +1,75 @@
+This is a test of the SVGPathSegList::appendItem() API.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 3
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+
+Check initial 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 5
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 0
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.getItem(1).x is 50
+PASS path2.pathSegList.getItem(1).y is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(2).x is 100
+PASS path2.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(3).x is 100
+PASS path2.pathSegList.getItem(4).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path2.pathSegList.getItem(4).y is 100
+
+Negate x value of fourth segment in path2
+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]"
+
+Append second item from path2 to path1 list
+PASS path1.pathSegList.appendItem(path2.pathSegList.getItem(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
+
+Check final 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 4
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(3).x is 0
+PASS path1.pathSegList.getItem(3).y is 100
+
+Check final 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 4
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 0
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(1).x is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path2.pathSegList.getItem(2).y is 100
+PASS path2.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(3).x is -100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-appendItem.xhtml b/LayoutTests/svg/dom/SVGPathSegList-appendItem.xhtml
new file mode 100644 (file)
index 0000000..8e487a9
--- /dev/null
@@ -0,0 +1,104 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="250" height="250">
+    <g transform="translate(10, 10)">
+        <path id="path1" d="M 0 0 L 100 0 L 100 100" fill="green"/>
+        <path transform="translate(110, 0)" id="path2" d="M 0 0 L 50 100 h 100 h 100 v 100" fill="green"/>
+    </g>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test of the SVGPathSegList::appendItem() API.");
+
+    var svg = document.getElementById("svg");
+    var path1 = document.getElementById("path1");
+    var path2 = document.getElementById("path2");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "3");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    debug("");
+    debug("Check initial 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "5");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path2.pathSegList.getItem(1).x", "50");
+    shouldBe("path2.pathSegList.getItem(1).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(2).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(3).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(4).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBe("path2.pathSegList.getItem(4).y", "100");
+
+    debug("");
+    debug("Negate x value of fourth segment in path2");
+    shouldBe("path2.pathSegList.getItem(3).x = -path2.pathSegList.getItem(3).x", "-100");
+
+    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]");
+
+    debug("");
+    debug("Append second item from path2 to path1 list");
+    shouldBeEqualToString("path1.pathSegList.appendItem(path2.pathSegList.getItem(1)).toString()", "[object SVGPathSegLinetoAbs]");
+
+    debug("");
+    debug("Change last item of path1 list, that came from path2 list, assure it's updating path1");
+    shouldBe("path1.pathSegList.getItem(3).x -= 50", "0");
+
+    debug("");
+    debug("Check final 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(3).x", "0");
+    shouldBe("path1.pathSegList.getItem(3).y", "100");
+
+    debug("");
+    debug("Check final 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(1).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBe("path2.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(3).x", "-100");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize-expected.txt
new file mode 100644 (file)
index 0000000..aff0a50
--- /dev/null
@@ -0,0 +1,95 @@
+This is a test of the SVGPathSegList::appendItem() API.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 3
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 100
+PASS path1.pathSegList.getItem(0).y is 100
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+
+Check initial 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 3
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 50
+PASS path2.pathSegList.getItem(0).y is 50
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.getItem(1).x is 0
+PASS path2.pathSegList.getItem(1).y is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(2).x is 0
+PASS path2.pathSegList.getItem(2).y is 0
+
+Cache first item of path1 in local variable 'item0'
+PASS item0.x is 100
+PASS item0.y is 100
+
+Clear path1 segment list
+PASS path1.pathSegList.clear() is undefined.
+
+Verify that item0 is still alive, and can be modified
+PASS item0.x is 100
+PASS item0.y is 100
+PASS item0.x += 50 is 150
+PASS item0.y += 50 is 150
+
+Check intermediate list state of path1
+PASS path1.pathSegList.numberOfItems is 0
+PASS path1.pathSegList.getItem(0) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+
+Check intermediate list state of path2
+PASS path2.pathSegList.numberOfItems is 3
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 50
+PASS path2.pathSegList.getItem(0).y is 50
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.getItem(1).x is 0
+PASS path2.pathSegList.getItem(1).y is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(2).x is 0
+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]"
+
+Check intermediate list state of path1
+PASS path1.pathSegList.numberOfItems is 1
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 50
+PASS path1.pathSegList.getItem(0).y is 50
+
+Check intermediate list state of path2
+PASS path2.pathSegList.numberOfItems is 2
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 100
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(1).x is 0
+PASS path2.pathSegList.getItem(1).y is 0
+
+Initialize path2 list with item0
+PASS path2.pathSegList.initialize(item0).toString() is "[object SVGPathSegMovetoAbs]"
+
+Check final list state of path1
+PASS path1.pathSegList.numberOfItems is 1
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 50
+PASS path1.pathSegList.getItem(0).y is 50
+
+Check final list state of path2
+PASS path2.pathSegList.numberOfItems is 1
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 150
+PASS path2.pathSegList.getItem(0).y is 150
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize.xhtml b/LayoutTests/svg/dom/SVGPathSegList-clear-and-initialize.xhtml
new file mode 100644 (file)
index 0000000..956d88f
--- /dev/null
@@ -0,0 +1,130 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="250" height="250">
+    <g transform="translate(10, 10)">
+        <path id="path1" d="M 100 100 L 100 0 L 100 100" fill="green"/>
+        <path transform="translate(110, 0)" id="path2" d="M 50 50 L 0 100 M 0 0" fill="green"/>
+    </g>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test of the SVGPathSegList::appendItem() API.");
+
+    var svg = document.getElementById("svg");
+    var path1 = document.getElementById("path1");
+    var path2 = document.getElementById("path2");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "3");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "100");
+    shouldBe("path1.pathSegList.getItem(0).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    debug("");
+    debug("Check initial 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "3");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "50");
+    shouldBe("path2.pathSegList.getItem(0).y", "50");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path2.pathSegList.getItem(1).x", "0");
+    shouldBe("path2.pathSegList.getItem(1).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(2).x", "0");
+    shouldBe("path2.pathSegList.getItem(2).y", "0");
+
+    debug("");
+    debug("Cache first item of path1 in local variable 'item0'");
+    var item0 = path1.pathSegList.getItem(0);
+    shouldBe("item0.x", "100");
+    shouldBe("item0.y", "100");
+
+    debug("");
+    debug("Clear path1 segment list");
+    shouldBeUndefined("path1.pathSegList.clear()");
+
+    debug("");
+    debug("Verify that item0 is still alive, and can be modified");
+    shouldBe("item0.x", "100");
+    shouldBe("item0.y", "100");
+    shouldBe("item0.x += 50", "150");
+    shouldBe("item0.y += 50", "150");
+
+    debug("");
+    debug("Check intermediate list state of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "0");
+    shouldThrow("path1.pathSegList.getItem(0)");
+
+    debug("");
+    debug("Check intermediate list state of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "3");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "50");
+    shouldBe("path2.pathSegList.getItem(0).y", "50");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path2.pathSegList.getItem(1).x", "0");
+    shouldBe("path2.pathSegList.getItem(1).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(2).x", "0");
+    shouldBe("path2.pathSegList.getItem(2).y", "0");
+
+    debug("");
+    debug("Initialize path1 list with first item of path2");
+    shouldBeEqualToString("path1.pathSegList.initialize(path2.pathSegList.getItem(0)).toString()", "[object SVGPathSegMovetoAbs]");
+
+    debug("");
+    debug("Check intermediate list state of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "1");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "50");
+    shouldBe("path1.pathSegList.getItem(0).y", "50");
+
+    debug("");
+    debug("Check intermediate list state of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "2");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(1).x", "0");
+    shouldBe("path2.pathSegList.getItem(1).y", "0");
+
+    debug("");
+    debug("Initialize path2 list with item0");
+    shouldBeEqualToString("path2.pathSegList.initialize(item0).toString()", "[object SVGPathSegMovetoAbs]");
+
+    debug("");
+    debug("Check final list state of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "1");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "50");
+    shouldBe("path1.pathSegList.getItem(0).y", "50");
+
+    debug("");
+    debug("Check final list state of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "1");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "150");
+    shouldBe("path2.pathSegList.getItem(0).y", "150");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-cloning.html b/LayoutTests/svg/dom/SVGPathSegList-cloning.html
new file mode 100644 (file)
index 0000000..07041ea
--- /dev/null
@@ -0,0 +1,54 @@
+<html>
+<head>
+    <style type="text/css">
+      .cls1 {
+        stroke: black;
+        fill: rgb(0,128,255);
+        stroke-width: 1;
+      }
+    </style>
+
+<script type="text/javascript">
+function setup() {
+ var SHOW_BUG = true;
+ var SVGNS = 'http://www.w3.org/2000/svg';
+ var svg = document.createElementNS(SVGNS, "svg");
+ svg.width.baseVal.valueAsString = "400px";
+ svg.height.baseVal.valueAsString = "400px";
+ svg.viewBox.baseVal.x = 0;
+ svg.viewBox.baseVal.y = 0;
+ svg.viewBox.baseVal.width = 200;
+ svg.viewBox.baseVal.height = 90;
+ var path1 = document.createElementNS(SVGNS, "path");
+ if (SHOW_BUG) {
+     path1.pathSegList.appendItem(path1.createSVGPathSegMovetoAbs(10, 10));
+     path1.pathSegList.appendItem(path1.createSVGPathSegLinetoAbs(25, 15));
+     path1.pathSegList.appendItem(path1.createSVGPathSegLinetoAbs(110, 75));
+     path1.pathSegList.appendItem(path1.createSVGPathSegLinetoAbs(120, 90));
+     path1.pathSegList.appendItem(path1.createSVGPathSegLinetoAbs(42, 42));
+     path1.pathSegList.appendItem(path1.createSVGPathSegClosePath());
+ } else {
+     path1.setAttributeNS(null, 'd', "M 10 10 L 25 15 L 110 75 L 120 90 L 42 42 Z");
+ }
+ path1.style.setProperty("stroke", "black", "");
+ path1.style.setProperty("fill", "red", "");
+ var path2 = path1.cloneNode(true);
+ path2.setAttributeNS(null, 'transform', "translate(75, 0)");
+ var drawing = document.getElementById("drawing");
+ svg.appendChild(path1);
+ svg.appendChild(path2);
+ drawing.appendChild(svg);
+}
+</script>
+</head>
+<body onload="setup()">
+<p>Below is a JavaScript-generated svg drawing. You should see two red blobs: the left, a programmatically generated path and the right, its clone.</p>
+<div id="drawing"></div>
+</body>
+</html>
+
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-insertItemBefore-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-insertItemBefore-expected.txt
new file mode 100644 (file)
index 0000000..ca43b3d
--- /dev/null
@@ -0,0 +1,42 @@
+This is a test of the SVGPathSegList::insertItemBefore() API.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 4
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 0
+PASS path1.pathSegList.getItem(2).y is 100
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(3).x is 100
+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]"
+
+Check final 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 4
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(3).x is 0
+PASS path1.pathSegList.getItem(3).y is 100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-insertItemBefore.xhtml b/LayoutTests/svg/dom/SVGPathSegList-insertItemBefore.xhtml
new file mode 100644 (file)
index 0000000..8e536aa
--- /dev/null
@@ -0,0 +1,64 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="250" height="250">
+    <g transform="translate(10, 10)">
+        <path id="path1" d="M 0 0 L 100 0 L 0 100 L 100 100" fill="green"/>
+    </g>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test of the SVGPathSegList::insertItemBefore() API.");
+
+    var svg = document.getElementById("svg");
+    var path1 = document.getElementById("path1");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "0");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(3).x", "100");
+    shouldBe("path1.pathSegList.getItem(3).y", "100");
+
+    debug("");
+    debug("Insert fourth item at position three using insertItemBefore()");
+    shouldBeEqualToString("path1.pathSegList.insertItemBefore(path1.pathSegList.getItem(3), 2).toString()", "[object SVGPathSegLinetoAbs]");
+
+    debug("");
+    debug("Check final 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(3).x", "0");
+    shouldBe("path1.pathSegList.getItem(3).y", "100");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-removeItem-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-removeItem-expected.txt
new file mode 100644 (file)
index 0000000..1a8aed2
--- /dev/null
@@ -0,0 +1,44 @@
+This is a test of the SVGPathSegList::removeItem() API.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 5
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegClosePath]"
+PASS path1.pathSegList.getItem(4).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(4).x is 0
+PASS path1.pathSegList.getItem(4).y is 100
+
+Check initial 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 5
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 0
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(1).x is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegClosePath]"
+PASS path2.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path2.pathSegList.getItem(3).y is 100
+PASS path2.pathSegList.getItem(4).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(4).x is -100
+
+Remove fourth item of path1
+PASS path1.pathSegList.removeItem(3).toString() is "[object SVGPathSegClosePath]"
+
+Remove third item of path2
+PASS path2.pathSegList.removeItem(2).toString() is "[object SVGPathSegClosePath]"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-removeItem.xhtml b/LayoutTests/svg/dom/SVGPathSegList-removeItem.xhtml
new file mode 100644 (file)
index 0000000..95b33ea
--- /dev/null
@@ -0,0 +1,69 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="250" height="250">
+    <g transform="translate(10, 10)">
+        <path id="path1" d="M 0 0 L 100 0 L 100 100 z L 0 100" fill="green"/>
+        <path transform="translate(110, 0)" id="path2" d="M 0 0 h 100 z v 100 h -100" fill="green"/>
+    </g>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test of the SVGPathSegList::removeItem() API.");
+
+    var svg = document.getElementById("svg");
+    var path1 = document.getElementById("path1");
+    var path2 = document.getElementById("path2");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "5");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegClosePath]");
+    shouldBeEqualToString("path1.pathSegList.getItem(4).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(4).x", "0");
+    shouldBe("path1.pathSegList.getItem(4).y", "100");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "5");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(1).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegClosePath]");
+    shouldBeEqualToString("path2.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBe("path2.pathSegList.getItem(3).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(4).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(4).x", "-100");
+
+    debug("");
+    debug("Remove fourth item of path1");
+    shouldBeEqualToString("path1.pathSegList.removeItem(3).toString()", "[object SVGPathSegClosePath]");
+
+    debug("");
+    debug("Remove third item of path2");
+    shouldBeEqualToString("path2.pathSegList.removeItem(2).toString()", "[object SVGPathSegClosePath]");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-replaceItem-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-replaceItem-expected.txt
new file mode 100644 (file)
index 0000000..6b982aa
--- /dev/null
@@ -0,0 +1,75 @@
+This is a test of the SVGPathSegList::replaceItem() API.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 6
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 100
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 0
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(3).x is 100
+PASS path1.pathSegList.getItem(3).y is 100
+PASS path1.pathSegList.getItem(4).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path1.pathSegList.getItem(4).y is 100
+PASS path1.pathSegList.getItem(5).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(5).x is 0
+PASS path1.pathSegList.getItem(5).y is 100
+
+Check initial 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 4
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 0
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(1).x is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path2.pathSegList.getItem(2).x is 200
+PASS path2.pathSegList.getItem(2).y is 100
+PASS path2.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+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]"
+
+Replace third item of path2 with fourth item of path1
+PASS path2.pathSegList.replaceItem(path1.pathSegList.getItem(3), 2).toString() is "[object SVGPathSegLinetoVerticalRel]"
+
+Check final 'pathSegList' value of path1
+PASS path1.pathSegList.numberOfItems is 4
+PASS path1.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path1.pathSegList.getItem(0).x is 0
+PASS path1.pathSegList.getItem(0).y is 0
+PASS path1.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(1).x is 100
+PASS path1.pathSegList.getItem(1).y is 0
+PASS path1.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(2).x is 100
+PASS path1.pathSegList.getItem(2).y is 100
+PASS path1.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoAbs]"
+PASS path1.pathSegList.getItem(3).x is 0
+PASS path1.pathSegList.getItem(3).y is 100
+
+Check final 'pathSegList' value of path2
+PASS path2.pathSegList.numberOfItems is 4
+PASS path2.pathSegList.getItem(0).toString() is "[object SVGPathSegMovetoAbs]"
+PASS path2.pathSegList.getItem(0).x is 0
+PASS path2.pathSegList.getItem(0).y is 0
+PASS path2.pathSegList.getItem(1).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(1).x is 100
+PASS path2.pathSegList.getItem(2).toString() is "[object SVGPathSegLinetoVerticalRel]"
+PASS path2.pathSegList.getItem(2).y is 100
+PASS path2.pathSegList.getItem(3).toString() is "[object SVGPathSegLinetoHorizontalRel]"
+PASS path2.pathSegList.getItem(3).x is -100
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-replaceItem.xhtml b/LayoutTests/svg/dom/SVGPathSegList-replaceItem.xhtml
new file mode 100644 (file)
index 0000000..848ebc9
--- /dev/null
@@ -0,0 +1,102 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="250" height="250">
+    <g transform="translate(10, 10)">
+        <path id="path1" d="M 0 0 L 100 100 L 100 0 L 100 100 v 100 L 0 100" fill="green"/>
+        <path transform="translate(110, 0)" id="path2" d="M 0 0 h 100 L 200 100 h -100" fill="green"/>
+    </g>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test of the SVGPathSegList::replaceItem() API.");
+
+    var svg = document.getElementById("svg");
+    var path1 = document.getElementById("path1");
+    var path2 = document.getElementById("path2");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "6");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(3).x", "100");
+    shouldBe("path1.pathSegList.getItem(3).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(4).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBe("path1.pathSegList.getItem(4).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(5).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(5).x", "0");
+    shouldBe("path1.pathSegList.getItem(5).y", "100");
+
+    debug("");
+    debug("Check initial 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(1).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path2.pathSegList.getItem(2).x", "200");
+    shouldBe("path2.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(3).x", "-100");
+
+    debug("");
+    debug("Replace second item with third item of path1");
+    shouldBeEqualToString("path1.pathSegList.replaceItem(path1.pathSegList.getItem(2), 1).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]");
+
+    debug("");
+    debug("Check final 'pathSegList' value of path1");
+    shouldBe("path1.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path1.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path1.pathSegList.getItem(0).x", "0");
+    shouldBe("path1.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(1).x", "100");
+    shouldBe("path1.pathSegList.getItem(1).y", "0");
+    shouldBeEqualToString("path1.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(2).x", "100");
+    shouldBe("path1.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path1.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoAbs]");
+    shouldBe("path1.pathSegList.getItem(3).x", "0");
+    shouldBe("path1.pathSegList.getItem(3).y", "100");
+
+    debug("");
+    debug("Check final 'pathSegList' value of path2");
+    shouldBe("path2.pathSegList.numberOfItems", "4");
+    shouldBeEqualToString("path2.pathSegList.getItem(0).toString()", "[object SVGPathSegMovetoAbs]");
+    shouldBe("path2.pathSegList.getItem(0).x", "0");
+    shouldBe("path2.pathSegList.getItem(0).y", "0");
+    shouldBeEqualToString("path2.pathSegList.getItem(1).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(1).x", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(2).toString()", "[object SVGPathSegLinetoVerticalRel]");
+    shouldBe("path2.pathSegList.getItem(2).y", "100");
+    shouldBeEqualToString("path2.pathSegList.getItem(3).toString()", "[object SVGPathSegLinetoHorizontalRel]");
+    shouldBe("path2.pathSegList.getItem(3).x", "-100");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-segment-modification.svg b/LayoutTests/svg/dom/SVGPathSegList-segment-modification.svg
new file mode 100644 (file)
index 0000000..19fc427
--- /dev/null
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>\r
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink='http://www.w3.org/1999/xlink' width="300px" height="300px" viewBox="0 0 300 300" onload="test()">\r
+    <script type="text/ecmascript"><![CDATA[\r
+        if (window.layoutTestController)\r
+            layoutTestController.notifyDone();\r
+\r
+        function test() {\r
+            var smile = document.getElementById('smile');\r
+            var segList = smile.pathSegList;\r
+            var moveSeg = segList.getItem(0);    // This represents the M 80 40 segment (Move to)\r
+            var smoothCurveSeg = segList.getItem(1); // This represents the S 20 80 80 40 segment (Smooth Curveto)\r
+            setTimeout(function() {\r
+                moveSeg.x = 50;\r
+                moveSeg.y = 50;\r
+        \r
+                if (window.layoutTestController)\r
+                    layoutTestController.notifyDone();\r
+            }, 0);\r
+        }\r
+    ]]></script>\r
+    <path id="smile" d="M 80 40 S 120 80 160 40" stroke="black" stroke-width="3" fill="none"/>\r
+    <text x="10" y="20">There should be a smooth curve below</text>\r
+</svg>\r
diff --git a/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.txt b/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization-expected.txt
new file mode 100644 (file)
index 0000000..9c672da
--- /dev/null
@@ -0,0 +1,14 @@
+This is a test how SVGLengthList reacts to XML DOM modifications.
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+PASS path.pathSegList.numberOfItems is 3
+PASS path.getAttribute('d').formatDAttribute() is "M 200 0 L 100 0 L 100 100"
+PASS path.getAttribute('d').formatDAttribute() is "M 200 0 L 100 0 L 100 100 L 0 100"
+PASS path.getAttribute('d').formatDAttribute() is "M 100 0 L 100 0 L 100 100 L 0 100"
+PASS path.getAttribute('d').formatDAttribute() is "M 0 0 L 100 0 L 100 100 L 0 100"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml b/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml
new file mode 100644 (file)
index 0000000..2c25f83
--- /dev/null
@@ -0,0 +1,49 @@
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"/>
+<script>window.enablePixelTesting = true;</script>
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<svg id="svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200">
+    <path id="path" fill="green" transform="translate(10 10)" d="M 200 0 L 100 0 L 100 100"/>
+</svg>
+
+<p id="description"></p>
+<div id="console"></div>
+<script type="text/javascript">
+<![CDATA[
+    description("This is a test how SVGLengthList reacts to XML DOM modifications.");
+
+    // Extend String prototype, to offer a function, that formas the d attribute in the same way across browsers
+    String.prototype.formatDAttribute = function() {
+        return this.replace(/,/g, " ")          // Remove Firefox commas
+                   .replace(/([A-Z])/g, " $1 ") // "M 100 0L 50 0" -> " M 100 0 L 50 0"
+                   .replace(/^\s/, "")          // " M 100 0" -> "M 100 0" 
+                   .replace(/\s\s/g, " ");      // If there was already whitespace between coordinates & commands, fix it up again.      
+    }
+
+    var path = document.getElementById("path");
+    shouldBe("path.pathSegList.numberOfItems", "3");
+
+    // Check initial 'd' attribute value.
+    shouldBeEqualToString("path.getAttribute('d').formatDAttribute()", "M 200 0 L 100 0 L 100 100");
+
+    // Append one item, check 'd' attribute changed.
+    path.pathSegList.appendItem(path.createSVGPathSegLinetoAbs(0, 100));
+    shouldBeEqualToString("path.getAttribute('d').formatDAttribute()", "M 200 0 L 100 0 L 100 100 L 0 100");
+
+    // Modify first item, check 'd' attribute changed.
+    path.pathSegList.getItem(0).x -= 100;
+    shouldBeEqualToString("path.getAttribute('d').formatDAttribute()", "M 100 0 L 100 0 L 100 100 L 0 100");
+
+    // Modify first item, check 'd' attribute changed, now a green rectangle should be visible.
+    path.pathSegList.getItem(0).x -= 100;
+    shouldBeEqualToString("path.getAttribute('d').formatDAttribute()", "M 0 0 L 100 0 L 100 100 L 0 100");
+
+    successfullyParsed = true;
+]]>
+</script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml b/LayoutTests/svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml
new file mode 100644 (file)
index 0000000..52d72d3
--- /dev/null
@@ -0,0 +1,41 @@
+<?xml version="1.0" standalone="no"?>
+<svg width="600" height="500" xmlns="http://www.w3.org/2000/svg">
+  <script type="text/javascript">
+  <![CDATA[
+    if (window.layoutTestController)
+        layoutTestController.waitUntilDone();
+
+        window.onload = function() {
+            var path = document.getElementsByTagName('path')[0];
+            var start = document.getElementById('d_start');
+            var end = document.getElementById('d_end');
+
+            var start_d = path.getAttribute('d');
+            start.textContent = start_d;
+            var list = path.pathSegList;
+            var seg = path.createSVGPathSegLinetoRel(50, 50);
+
+            setTimeout(function() {
+                list.insertItemBefore(seg, 2); 
+                var end_d = path.getAttribute('d');
+                end.textContent = end_d;
+                if(start_d == end_d) {
+                    end.textContent += ' (failed)';
+                }
+
+                if (window.layoutTestController)
+                    layoutTestController.notifyDone();
+            }, 0);
+        }
+]]>
+</script>
+  <path d="M50,150 l45,-43 l24,64 l-69,-21z" fill="#FF0000" stroke="#000000" stroke-width="5"/>
+  <text x="10" y="20" style="font-weight:bold">Right after loading, a segment is added to the path.</text>
+  <text x="10" y="40" style="font-weight:bold">The path and its attribute should be updated to include the new segment.</text>
+  
+  <text x="10" y="70">"d" initial: </text>
+  <text id="d_start" x="90" y="70"></text>
+
+  <text x="10" y="90">"d" after: </text>
+  <text id="d_end" x="90" y="90"></text>
+</svg>
index 3e81df0..be07cdc 100644 (file)
@@ -207,255 +207,255 @@ This test fuzzes the path parser with semi-random attribute values and dumps the
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-Parsed as 4 command(s) [MCZL]: M1,1T4,1,zl5 3 a0,5,1,4,0,3 2,m6,C7,2,3,8,6,7,zt2,8 
-Parsed as 5 command(s) [MCCLC]: M1,1Q8,5 5 1 Q4,8,4,3,h4,q8 4,9,2,1 L4,0 l7 4 L1,0,q1,9,9,2 c5 5 2,8,1 1,q0,3 6,5,
-Parsed as 2 command(s) [ML]: M1,1h0 A6 5,5 4,1,5,3 H5 a8 8,0 0,9,8 3 a6,1,6,3 5,6,3,S1 9 5 1 7,
+Parsed as 4 command(s) [MTZl]: M1,1T4,1,zl5 3 a0,5,1,4,0,3 2,m6,C7,2,3,8,6,7,zt2,8 
+Parsed as 5 command(s) [MQQhq]: M1,1Q8,5 5 1 Q4,8,4,3,h4,q8 4,9,2,1 L4,0 l7 4 L1,0,q1,9,9,2 c5 5 2,8,1 1,q0,3 6,5,
+Parsed as 2 command(s) [Mh]: M1,1h0 A6 5,5 4,1,5,3 H5 a8 8,0 0,9,8 3 a6,1,6,3 5,6,3,S1 9 5 1 7,
 Parsed as 1 command(s) [M]: M1,1s6 3,8,h9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,s6,3,1,
-Parsed as 6 command(s) [MCLCCL]: M1,1t4 4 l6 6 a4 2,3,0,1,2 1,Q1,1,0,3,H8 C7,9 8 4,0 t5,2,H9,zHq1 5,9,T6 8,
+Parsed as 6 command(s) [MtlaQH]: M1,1t4 4 l6 6 a4 2,3,0,1,2 1,Q1,1,0,3,H8 C7,9 8 4,0 t5,2,H9,zHq1 5,9,T6 8,
 Parsed as 1 command(s) [M]: M1,1
-Parsed as 12 command(s) [MCZCZZCLLLCC]: M1,1t1 0 Zc3,8,8 7 3,4 zzQ5,3 4,4 H0 v8,v1,C0,1,6,2,5,4 q2 7 5 3 a7,4 7 9,7,2 9,ZL6 6,
-Parsed as 7 command(s) [MLCCCCC]: M1,1L5,9,t3 7 Q6 1 1,1 T3,0 s4 6 8 1,s8 3,8 9,a5 4 3 2,4,2 3,6 
-Parsed as 6 command(s) [MCLLCC]: M1,1t8 9,l3 5 l9,5 s6,9,2 9,T1 9 
+Parsed as 12 command(s) [MtZcZZQHvvCq]: M1,1t1 0 Zc3,8,8 7 3,4 zzQ5,3 4,4 H0 v8,v1,C0,1,6,2,5,4 q2 7 5 3 a7,4 7 9,7,2 9,ZL6 6,
+Parsed as 7 command(s) [MLtQTss]: M1,1L5,9,t3 7 Q6 1 1,1 T3,0 s4 6 8 1,s8 3,8 9,a5 4 3 2,4,2 3,6 
+Parsed as 6 command(s) [MtllsT]: M1,1t8 9,l3 5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
-Parsed as 2 command(s) [MC]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
-Parsed as 8 command(s) [MMCCCCCL]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
-Parsed as 7 command(s) [MCLZLMC]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
+Parsed as 2 command(s) [MT]: M1,1T8 5,A2 7 5,7 9 6 5,7,zC8,5,8 1,6 3 v8,zM7,8,q8,6 4 7,c9,6,4,9,2 1 c0 6,9 9,0 7,
+Parsed as 8 command(s) [MMqstQsV]: M1,1M7 7,q5,1 9 8,s4,9,0 7,t8,0,Q8 8 7,6,s0 8 5,7 V1 
+Parsed as 7 command(s) [MtlZhMs]: M1,1t7,1 l1 7,zh0 M3 1,s7,5 2,6 0 a0 0,6,8,5 6 5,m3 3 8 C9 0 2,2,5 3,s6 8 8 5,T4 8,L1 4 q0 1,2,3 l8,0 S8 3 1 3,Vc5 5,3,9,0,9 
 Parsed as 1 command(s) [M]: M1,1
 Parsed as 1 command(s) [M]: M1,1a4 5,7 3,5 9 8 7 S8 8 6 7 c2 8 4,1,4,1,c3 9,0,5,1,4,m3 2,0,S5,7,2,3,8,s7,4,8 2,T5,6,q0,3 2,6 A5 5 7 7 7,8,2 6,A8 0 3 5 2 3,3 v5 a6,3 7,7,9 4,3,H2 
-Parsed as 4 command(s) [MCCL]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
+Parsed as 4 command(s) [MTqv]: M1,1T1 1,q0,3 6,5,v0 m5,M6,2 q5,5 1 6,vS1,5 4 5,5,H4,s5 6,7 2,a9 9,8 4,3,1 0,c6,6 3,8,2,9 q5,5 1 4,4,h0 T5 t3,6 s8 5 8 2 zS0 7,7,
 Parsed as 1 command(s) [M]: M1,1A8 5 5,8 4 4 1 s6 9 4 2,v0,l2 L7,1,L0,3,H8 C7,9 8 4,0 t5,2,H9,zH
 Parsed as 1 command(s) [M]: M1,1A3,6,9,7,2,7 7,c1 1 1,0 7,7,l1 6 zH0,Zs0 5 0 0 zL8 4 7,zA8,8 5,9 2,6 4,l2 2,L9 4,V
-Parsed as 4 command(s) [MCCC]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
+Parsed as 4 command(s) [MQss]: M1,1Q2 9,4 1,s6,3 6,9,s6 0,0,6,1 zc2,1 7 0,1 4,Z2 A3,4 5,4,6,8,2 ZV5 t2 6,v8,t9,1 V5 l9,5 s6,9,2 9,T1 9 
 Parsed as 1 command(s) [M]: M1,1a9,2 6 1 2 2 2,za9 0 2 8,2,3,3 s5,8,8 1,HC5 8 5,8,4 2 c8 4 5 2 5 9,l3 9,H7 s6 2,0 0 a4 9,1 6,3,7,0,M6,
 Could not parse: 
 Could not parse: M
index 8f48efc..b27305b 100644 (file)
@@ -14,41 +14,41 @@ On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE
 
 
 PASS parsePath('M1,2') is 'M1,2'
-PASS parsePath('m1,2') is 'M1,2'
-PASS parsePath('M100,200 m3,4') is 'M100,200 M103,204'
+PASS parsePath('m1,2') is 'm1,2'
+PASS parsePath('M100,200 m3,4') is 'M100,200 m3,4'
 PASS parsePath('M100,200 L3,4') is 'M100,200 L3,4'
-PASS parsePath('M100,200 l3,4') is 'M100,200 L103,204'
-PASS parsePath('M100,200 H3') is 'M100,200 L3,200'
-PASS parsePath('M100,200 h3') is 'M100,200 L103,200'
-PASS parsePath('M100,200 V3') is 'M100,200 L100,3'
-PASS parsePath('M100,200 v3') is 'M100,200 L100,203'
+PASS parsePath('M100,200 l3,4') is 'M100,200 l3,4'
+PASS parsePath('M100,200 H3') is 'M100,200 H3'
+PASS parsePath('M100,200 h3') is 'M100,200 h3'
+PASS parsePath('M100,200 V3') is 'M100,200 V3'
+PASS parsePath('M100,200 v3') is 'M100,200 v3'
 PASS parsePath('M100,200 Z') is 'M100,200 Z'
 PASS parsePath('M100,200 z') is 'M100,200 Z'
 PASS parsePath('M100,200 C3,4,5,6,7,8') is 'M100,200 C3,4,5,6,7,8'
-PASS parsePath('M100,200 c3,4,5,6,7,8') is 'M100,200 C103,204,105,206,107,208'
-PASS parsePath('M100,200 S3,4,5,6') is 'M100,200 C100,200,3,4,5,6'
-PASS parsePath('M100,200 s3,4,5,6') is 'M100,200 C100,200,103,204,105,206'
-PASS parsePath('M100,200 Q3,4,5,6') is 'M100,200 C35.3,69.3,3.7,4.7,5,6'
-PASS parsePath('M100,200 q3,4,5,6') is 'M100,200 C102,202.7,103.7,204.7,105,206'
-PASS parsePath('M100,200 T3,4') is 'M100,200 C100,200,67.7,134.7,3,4'
-PASS parsePath('M100,200 t3,4') is 'M100,200 C100,200,101,201.3,103,204'
-PASS parsePath('M100,200 A3,4,5,0,0,6,7') is 'M100,200 C141.5,162.8,154.1,89.5,128.2,36.2 C102.2,-17.1,47.5,-30.2,6,7'
-PASS parsePath('M100,200 A3,4,5,1,0,6,7') is 'M100,200 C141.5,162.8,154.2,89.4,128.2,36.1 C102.2,-17.2,47.5,-30.2,6,7'
-PASS parsePath('M100,200 A3,4,5,0,1,6,7') is 'M100,200 C58.5,237.2,3.8,224.1,-22.2,170.8 C-48.1,117.5,-35.5,44.2,6,7'
-PASS parsePath('M100,200 A3,4,5,1,1,6,7') is 'M100,200 C58.5,237.2,3.8,224.2,-22.2,170.9 C-48.2,117.6,-35.5,44.2,6,7'
-PASS parsePath('M100,200 a3,4,5,0,0,6,7') is 'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'
-PASS parsePath('M100,200 a3,4,5,0,1,6,7') is 'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'
-PASS parsePath('M100,200 a3,4,5,1,0,6,7') is 'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'
-PASS parsePath('M100,200 a3,4,5,1,1,6,7') is 'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'
-PASS parsePath('M100,200 a3,4,5,006,7') is 'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'
-PASS parsePath('M100,200 a3,4,5,016,7') is 'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'
-PASS parsePath('M100,200 a3,4,5,106,7') is 'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'
-PASS parsePath('M100,200 a3,4,5,116,7') is 'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'
+PASS parsePath('M100,200 c3,4,5,6,7,8') is 'M100,200 c3,4,5,6,7,8'
+PASS parsePath('M100,200 S3,4,5,6') is 'M100,200 S3,4,5,6'
+PASS parsePath('M100,200 s3,4,5,6') is 'M100,200 s3,4,5,6'
+PASS parsePath('M100,200 Q3,4,5,6') is 'M100,200 Q3,4,5,6'
+PASS parsePath('M100,200 q3,4,5,6') is 'M100,200 q3,4,5,6'
+PASS parsePath('M100,200 T3,4') is 'M100,200 T3,4'
+PASS parsePath('M100,200 t3,4') is 'M100,200 t3,4'
+PASS parsePath('M100,200 A3,4,5,0,0,6,7') is 'M100,200 A3,4,5,0,0,6,7'
+PASS parsePath('M100,200 A3,4,5,1,0,6,7') is 'M100,200 A3,4,5,1,0,6,7'
+PASS parsePath('M100,200 A3,4,5,0,1,6,7') is 'M100,200 A3,4,5,0,1,6,7'
+PASS parsePath('M100,200 A3,4,5,1,1,6,7') is 'M100,200 A3,4,5,1,1,6,7'
+PASS parsePath('M100,200 a3,4,5,0,0,6,7') is 'M100,200 a3,4,5,0,0,6,7'
+PASS parsePath('M100,200 a3,4,5,0,1,6,7') is 'M100,200 a3,4,5,0,1,6,7'
+PASS parsePath('M100,200 a3,4,5,1,0,6,7') is 'M100,200 a3,4,5,1,0,6,7'
+PASS parsePath('M100,200 a3,4,5,1,1,6,7') is 'M100,200 a3,4,5,1,1,6,7'
+PASS parsePath('M100,200 a3,4,5,006,7') is 'M100,200 a3,4,5,0,0,6,7'
+PASS parsePath('M100,200 a3,4,5,016,7') is 'M100,200 a3,4,5,0,1,6,7'
+PASS parsePath('M100,200 a3,4,5,106,7') is 'M100,200 a3,4,5,1,0,6,7'
+PASS parsePath('M100,200 a3,4,5,116,7') is 'M100,200 a3,4,5,1,1,6,7'
 PASS parsePath('M100,200 a3,4,5,2,1,6,7') is 'M100,200'
 PASS parsePath('M100,200 a3,4,5,1,2,6,7') is 'M100,200'
-PASS parsePath('M100,200 a0,4,5,0,0,10,0 a4,0,5,0,0,0,10 a0,0,5,0,0,-10,0 z') is 'M100,200 L110,200 L110,210 L100,210 Z'
+PASS parsePath('M100,200 a0,4,5,0,0,10,0 a4,0,5,0,0,0,10 a0,0,5,0,0,-10,0 z') is 'M100,200 l10,0 l0,10 l-10,0 Z'
 PASS parsePath('M1,2,3,4') is 'M1,2 L3,4'
-PASS parsePath('m100,200,3,4') is 'M100,200 L103,204'
+PASS parsePath('m100,200,3,4') is 'm100,200 l3,4'
 PASS parsePath('M 100-200') is 'M100,-200'
 PASS parsePath('M 0.6.5') is 'M0.6,0.5'
 PASS parsePath(' M1,2') is 'M1,2'
index 60b6476..f835d9d 100644 (file)
@@ -4,21 +4,31 @@ var pathElement = document.createElementNS("http://www.w3.org/2000/svg", "path")
 
 var pathProperties = {
     "M": [ "x", "y" ],
+    "m": [ "x", "y" ],
     "L": [ "x", "y" ],
+    "l": [ "x", "y" ],
     "H": [ "x" ],
+    "h": [ "x" ],
     "V": [ "y" ],
+    "v": [ "y" ],
     "Z": [ ],
+    "z": [ ],
     "C": [ "x1", "y1", "x2", "y2", "x", "y" ],
+    "c": [ "x1", "y1", "x2", "y2", "x", "y" ],
     "S": [ "x2", "y2", "x", "y" ],
+    "s": [ "x2", "y2", "x", "y" ],
     "Q": [ "x1", "y1", "x", "y" ],
+    "q": [ "x1", "y1", "x", "y" ],
     "T": [ "x", "y" ],
+    "t": [ "x", "y" ],
     "A": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ],
+    "a": [ "r1", "r2", "angle", "largeArcFlag", "sweepFlag", "x", "y" ]
 };
 
 function printSegment(segment)
 {
     var letter = segment.pathSegTypeAsLetter;
-    var names = pathProperties[letter.toUpperCase()];
+    var names = pathProperties[letter];
     if (!names)
         return letter + "?";
     var string = letter;
@@ -57,42 +67,45 @@ function parsePath(string)
 }
 
 shouldBe("parsePath('M1,2')", "'M1,2'");
-shouldBe("parsePath('m1,2')", "'M1,2'");
-shouldBe("parsePath('M100,200 m3,4')", "'M100,200 M103,204'");
+shouldBe("parsePath('m1,2')", "'m1,2'");
+shouldBe("parsePath('M100,200 m3,4')", "'M100,200 m3,4'");
 shouldBe("parsePath('M100,200 L3,4')", "'M100,200 L3,4'");
-shouldBe("parsePath('M100,200 l3,4')", "'M100,200 L103,204'");
-shouldBe("parsePath('M100,200 H3')", "'M100,200 L3,200'");
-shouldBe("parsePath('M100,200 h3')", "'M100,200 L103,200'");
-shouldBe("parsePath('M100,200 V3')", "'M100,200 L100,3'");
-shouldBe("parsePath('M100,200 v3')", "'M100,200 L100,203'");
+shouldBe("parsePath('M100,200 l3,4')", "'M100,200 l3,4'");
+shouldBe("parsePath('M100,200 H3')", "'M100,200 H3'");
+shouldBe("parsePath('M100,200 h3')", "'M100,200 h3'");
+shouldBe("parsePath('M100,200 V3')", "'M100,200 V3'");
+shouldBe("parsePath('M100,200 v3')", "'M100,200 v3'");
 shouldBe("parsePath('M100,200 Z')", "'M100,200 Z'");
 shouldBe("parsePath('M100,200 z')", "'M100,200 Z'");
 shouldBe("parsePath('M100,200 C3,4,5,6,7,8')", "'M100,200 C3,4,5,6,7,8'");
-shouldBe("parsePath('M100,200 c3,4,5,6,7,8')", "'M100,200 C103,204,105,206,107,208'");
-shouldBe("parsePath('M100,200 S3,4,5,6')", "'M100,200 C100,200,3,4,5,6'");
-shouldBe("parsePath('M100,200 s3,4,5,6')", "'M100,200 C100,200,103,204,105,206'");
-shouldBe("parsePath('M100,200 Q3,4,5,6')", "'M100,200 C35.3,69.3,3.7,4.7,5,6'");
-shouldBe("parsePath('M100,200 q3,4,5,6')", "'M100,200 C102,202.7,103.7,204.7,105,206'");
-shouldBe("parsePath('M100,200 T3,4')", "'M100,200 C100,200,67.7,134.7,3,4'");
-shouldBe("parsePath('M100,200 t3,4')", "'M100,200 C100,200,101,201.3,103,204'");
-shouldBe("parsePath('M100,200 A3,4,5,0,0,6,7')", "'M100,200 C141.5,162.8,154.1,89.5,128.2,36.2 C102.2,-17.1,47.5,-30.2,6,7'");
-shouldBe("parsePath('M100,200 A3,4,5,1,0,6,7')", "'M100,200 C141.5,162.8,154.2,89.4,128.2,36.1 C102.2,-17.2,47.5,-30.2,6,7'");
-shouldBe("parsePath('M100,200 A3,4,5,0,1,6,7')", "'M100,200 C58.5,237.2,3.8,224.1,-22.2,170.8 C-48.1,117.5,-35.5,44.2,6,7'");
-shouldBe("parsePath('M100,200 A3,4,5,1,1,6,7')", "'M100,200 C58.5,237.2,3.8,224.2,-22.2,170.9 C-48.2,117.6,-35.5,44.2,6,7'");
-shouldBe("parsePath('M100,200 a3,4,5,0,0,6,7')", "'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,0,1,6,7')", "'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,1,0,6,7')", "'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,1,1,6,7')", "'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,006,7')", "'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,016,7')", "'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,106,7')", "'M100,200 C98.5,202.3,98.6,205.7,100.2,207.7 C101.9,209.6,104.5,209.3,106,207'");
-shouldBe("parsePath('M100,200 a3,4,5,116,7')", "'M100,200 C101.5,197.7,104.1,197.4,105.8,199.3 C107.4,201.3,107.5,204.7,106,207'");
+shouldBe("parsePath('M100,200 c3,4,5,6,7,8')", "'M100,200 c3,4,5,6,7,8'");
+shouldBe("parsePath('M100,200 S3,4,5,6')", "'M100,200 S3,4,5,6'");
+shouldBe("parsePath('M100,200 s3,4,5,6')", "'M100,200 s3,4,5,6'");
+shouldBe("parsePath('M100,200 Q3,4,5,6')", "'M100,200 Q3,4,5,6'");
+shouldBe("parsePath('M100,200 q3,4,5,6')", "'M100,200 q3,4,5,6'");
+shouldBe("parsePath('M100,200 T3,4')", "'M100,200 T3,4'");
+shouldBe("parsePath('M100,200 t3,4')", "'M100,200 t3,4'");
+shouldBe("parsePath('M100,200 A3,4,5,0,0,6,7')", "'M100,200 A3,4,5,0,0,6,7'");
+shouldBe("parsePath('M100,200 A3,4,5,1,0,6,7')", "'M100,200 A3,4,5,1,0,6,7'");
+shouldBe("parsePath('M100,200 A3,4,5,0,1,6,7')", "'M100,200 A3,4,5,0,1,6,7'");
+shouldBe("parsePath('M100,200 A3,4,5,1,1,6,7')", "'M100,200 A3,4,5,1,1,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,0,0,6,7')", "'M100,200 a3,4,5,0,0,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,0,1,6,7')", "'M100,200 a3,4,5,0,1,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,1,0,6,7')", "'M100,200 a3,4,5,1,0,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,1,1,6,7')", "'M100,200 a3,4,5,1,1,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,006,7')", "'M100,200 a3,4,5,0,0,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,016,7')", "'M100,200 a3,4,5,0,1,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,106,7')", "'M100,200 a3,4,5,1,0,6,7'");
+shouldBe("parsePath('M100,200 a3,4,5,116,7')", "'M100,200 a3,4,5,1,1,6,7'");
 shouldBe("parsePath('M100,200 a3,4,5,2,1,6,7')", "'M100,200'");
 shouldBe("parsePath('M100,200 a3,4,5,1,2,6,7')", "'M100,200'");
-shouldBe("parsePath('M100,200 a0,4,5,0,0,10,0 a4,0,5,0,0,0,10 a0,0,5,0,0,-10,0 z')", "'M100,200 L110,200 L110,210 L100,210 Z'");
+
+// FIXME: This uses 'If rx = 0 or ry = 0 then this arc is treated as a straight line segment (a "lineto") joining the endpoints.'
+// I think the SVG DOM should still show the arc segment, fix that!
+shouldBe("parsePath('M100,200 a0,4,5,0,0,10,0 a4,0,5,0,0,0,10 a0,0,5,0,0,-10,0 z')", "'M100,200 l10,0 l0,10 l-10,0 Z'");
 
 shouldBe("parsePath('M1,2,3,4')", "'M1,2 L3,4'");
-shouldBe("parsePath('m100,200,3,4')", "'M100,200 L103,204'");
+shouldBe("parsePath('m100,200,3,4')", "'m100,200 l3,4'");
 
 shouldBe("parsePath('M 100-200')", "'M100,-200'");
 shouldBe("parsePath('M 0.6.5')", "'M0.6,0.5'");
index 83af6bb..dda168c 100644 (file)
@@ -3,42 +3,42 @@ Tests that out of bounds accesses of SVGList correctly throw exceptions
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.getItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.insertItemBefore(null, i) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
-PASS svgList.insertItemBefore(seg, i) is seg
-PASS svgList.replaceItem(seg, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.replaceItem(null, i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
-PASS svgList.removeItem(i) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.getItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.insertItemBefore(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.insertItemBefore(seg, index) is seg
+PASS svgList.replaceItem(seg, index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
+PASS svgList.replaceItem(null, index) threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS svgList.removeItem(index) threw exception Error: INDEX_SIZE_ERR: DOM Exception 1.
 PASS successfullyParsed is true
 
 TEST COMPLETE
index 1a0d571..f30756a 100644 (file)
     var svgList = path.pathSegList;
     var indicesToTest = [-Infinity, NaN, -1, 0, 1, Infinity];
     for (var i = 0; i < indicesToTest.length; i++) {
-         shouldThrow("svgList.getItem(i)");
-         shouldThrow("svgList.insertItemBefore(null, i)");
+         var index = indicesToTest[i];
+         shouldThrow("svgList.getItem(index)");
+         shouldThrow("svgList.insertItemBefore(null, index)");
          var seg = path.createSVGPathSegClosePath();
-         shouldBe("svgList.insertItemBefore(seg, i)", "seg");
+         shouldBe("svgList.insertItemBefore(seg, index)", "seg");
          svgList.removeItem(0);
-         shouldThrow("svgList.replaceItem(seg, i)");
-         shouldThrow("svgList.replaceItem(null, i)");
-         shouldThrow("svgList.removeItem(i)");
+         shouldThrow("svgList.replaceItem(seg, index)");
+         shouldThrow("svgList.replaceItem(null, index)");
+         shouldThrow("svgList.removeItem(index)");
     }
     successfullyParsed = true;
 </script>
index f02ab55..bef59ec 100644 (file)
@@ -3,7 +3,7 @@ Tests that an exception is thrown if we try to get a pathSeg for a length out of
 On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
 
 
-PASS path.pathSegList.initialize(); threw exception Error: TYPE_MISMATCH_ERR: DOM Exception 17.
+PASS path.pathSegList.initialize(); threw exception SyntaxError: Not enough arguments.
 PASS path.getPathSegAtLength(0) is 0
 PASS path.insertItemBefore(null, 0) threw exception TypeError: 'undefined' is not a function (evaluating 'path.insertItemBefore(null, 0)').
 PASS path.replaceItem(null, 0) threw exception TypeError: 'undefined' is not a function (evaluating 'path.replaceItem(null, 0)').
index cc490ee..23c59b4 100644 (file)
@@ -861,7 +861,6 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
        svg/SVGAnimateElement.cpp \
        svg/SVGAnimateMotionElement.cpp \
        svg/SVGAnimateTransformElement.cpp \
-       svg/SVGAnimatedPathData.cpp \
        svg/SVGAnimationElement.cpp \
        svg/SVGCircleElement.cpp \
        svg/SVGClipPathElement.cpp \
@@ -940,20 +939,9 @@ LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \
        svg/SVGPathElement.cpp \
        svg/SVGPathParser.cpp \
        svg/SVGPathParserFactory.cpp \
-       svg/SVGPathSeg.cpp \
-       svg/SVGPathSegArc.cpp \
-       svg/SVGPathSegClosePath.cpp \
-       svg/SVGPathSegCurvetoCubic.cpp \
-       svg/SVGPathSegCurvetoCubicSmooth.cpp \
-       svg/SVGPathSegCurvetoQuadratic.cpp \
-       svg/SVGPathSegCurvetoQuadraticSmooth.cpp \
-       svg/SVGPathSegLineto.cpp \
-       svg/SVGPathSegLinetoHorizontal.cpp \
-       svg/SVGPathSegLinetoVertical.cpp \
        svg/SVGPathSegList.cpp \
        svg/SVGPathSegListBuilder.cpp \
        svg/SVGPathSegListSource.cpp \
-       svg/SVGPathSegMoveto.cpp \
        svg/SVGPathStringBuilder.cpp \
        svg/SVGPathStringSource.cpp \
        svg/SVGPathTraversalStateBuilder.cpp \
index 08f8809..a30caf9 100644 (file)
@@ -99,7 +99,6 @@ SET(WebCore_IDL_INCLUDES
 
 SET(WebCore_IDL_PURE_FILES
     svg/ElementTimeControl.idl
-    svg/SVGAnimatedPathData.idl
     svg/SVGExternalResourcesRequired.idl
     svg/SVGFilterPrimitiveStandardAttributes.idl
     svg/SVGFitToViewBox.idl
@@ -1714,7 +1713,6 @@ IF (ENABLE_SVG)
         bindings/js/JSSVGElementInstanceCustom.cpp
         bindings/js/JSSVGLengthCustom.cpp
         bindings/js/JSSVGPathSegCustom.cpp
-        bindings/js/JSSVGPathSegListCustom.cpp
         css/SVGCSSComputedStyleDeclaration.cpp
         css/SVGCSSParser.cpp
         css/SVGCSSStyleSelector.cpp
@@ -1778,7 +1776,6 @@ IF (ENABLE_SVG)
         svg/SVGAnimateElement.cpp
         svg/SVGAnimateMotionElement.cpp
         svg/SVGAnimateTransformElement.cpp
-        svg/SVGAnimatedPathData.cpp
         svg/SVGAnimationElement.cpp
         svg/SVGCircleElement.cpp
         svg/SVGClipPathElement.cpp
@@ -1858,20 +1855,9 @@ IF (ENABLE_SVG)
         svg/SVGPathElement.cpp
         svg/SVGPathParser.cpp
         svg/SVGPathParserFactory.cpp
-        svg/SVGPathSeg.cpp
-        svg/SVGPathSegArc.cpp
-        svg/SVGPathSegClosePath.cpp
-        svg/SVGPathSegCurvetoCubic.cpp
-        svg/SVGPathSegCurvetoCubicSmooth.cpp
-        svg/SVGPathSegCurvetoQuadratic.cpp
-        svg/SVGPathSegCurvetoQuadraticSmooth.cpp
-        svg/SVGPathSegLineto.cpp
-        svg/SVGPathSegLinetoHorizontal.cpp
-        svg/SVGPathSegLinetoVertical.cpp
         svg/SVGPathSegList.cpp
         svg/SVGPathSegListBuilder.cpp
         svg/SVGPathSegListSource.cpp
-        svg/SVGPathSegMoveto.cpp
         svg/SVGPathStringBuilder.cpp
         svg/SVGPathStringSource.cpp
         svg/SVGPathTraversalStateBuilder.cpp
@@ -1921,6 +1907,7 @@ IF (ENABLE_SVG)
         svg/graphics/filters/SVGFEImage.cpp
         svg/graphics/filters/SVGFilter.cpp
         svg/graphics/filters/SVGFilterBuilder.cpp
+        svg/properties/SVGPathSegListPropertyTearOff.cpp
     )
 ENDIF()
 
index e4d2274..f5ab3af 100644 (file)
@@ -1,3 +1,230 @@
+2010-11-18  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        Reviewed by Dirk Schulze.
+
+        Convert SVGPathSeg/SVGPathSegList to the new SVGPropertyTearOff concept
+        https://bugs.webkit.org/show_bug.cgi?id=49580
+
+        SVGPathElement.cloneNode loses generated pathSegList
+        https://bugs.webkit.org/show_bug.cgi?id=43388
+
+        SVG Path elements are not correctly updated through pathSegList manipulation on relative values
+        https://bugs.webkit.org/show_bug.cgi?id=30219
+
+        Changing an SVGPathSeg does not update a following Smooth Cubic Curveto
+        https://bugs.webkit.org/show_bug.cgi?id=19741
+
+        SVGPathElement should only build SVGPathSeg* list on demand
+        https://bugs.webkit.org/show_bug.cgi?id=10827
+
+        Tests: svg/W3C-SVG-1.1-SE/paths-dom-02-f.svg
+               svg/dom/SVGPathSegList-appendItem.xhtml
+               svg/dom/SVGPathSegList-clear-and-initialize.xhtml
+               svg/dom/SVGPathSegList-cloning.html
+               svg/dom/SVGPathSegList-insertItemBefore.xhtml
+               svg/dom/SVGPathSegList-removeItem.xhtml
+               svg/dom/SVGPathSegList-replaceItem.xhtml
+               svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml
+               svg/dom/SVGPathSegList-xml-dom-synchronization2.xhtml
+               svg/dom/SVGPathSegList-segment-modification.svg
+
+        Convert SVGPathSeg*/SVGPathSegList to the new SVG(Animated)PropertyTearOff concept.
+        Unlike all other SVG* types that use the SVGPropertyTearOff concept, SVGPathSegs are already refcounted,
+        and don't need to be wrapped in SVGPropertyTearOff objects. The consequence is that SVGPathSegs need to track
+        themselves to which list and path element they belong. Introduce new SVGAnimatedPathSegListPropertyTearOff
+        and SVGPathSegListPropertyTearOff classes, that encapsulate the special needed for SVGPathSegList.
+
+        Each SVGPathSeg now needs to store a RefPtr<SVGPathElement> - this makes it impossible to use SVGPathSegList
+        to represent the 'd' attribute internally in SVGPathElement. SVGPathSegList is now only used in the SVG DOM bindings
+        if someone explicitely requests 'pathElement.pathSegList' (eg. via JS). Switch to use SVGPathByteStream to store
+        the 'd' attribute data in SVGPathElement, which is much more compact, and less memory intensive.
+        Dirk already prepared SVGPathParserFactory some months ago, which allows easy conversion between
+        String/Path/SVGPathSegList/SVGPathByteStream in all directions, including normalizing the lists, when requested.
+
+        As consequence SVGPathSegList is now only built on demand, when explicitely requested. Using the SVGAnimatedProperty
+        concept gives us 'd' attribute <-> SVGPathSegList synchronization for free, fixing several bugs, listed above.
+
+        * Android.mk: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
+        * CMakeLists.txt: Ditto.
+        * DerivedSources.make: Remove SVGAnimatedPathData IDL generation.
+        * GNUmakefile.am: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
+        * WebCore.gyp/WebCore.gyp: Remove SVGAnimatedPathData IDL generation.
+        * WebCore.gypi: Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp from build.
+        * WebCore.order: Remove no-longer existant SVGAnimatedPathData symbols.
+        * WebCore.pro:  Remove obsolete SVGPathSeg*.cpp files and SVGAnimatedPathData.cpp / JSSVGPathSegCustom.* from build.
+        * WebCore.vcproj/WebCore.vcproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * bindings/js/JSBindingsAllInOne.cpp: Remove JSSVGPathSegCustom.cpp from build.
+        * bindings/js/JSDOMBinding.cpp: Adapt to toJS() changes, remove context parameter.
+        (WebCore::setDOMException):
+        * bindings/js/JSDOMBinding.h: Remove obsolete CREATE_SVG_OBJECT_WRAPPER macro, the context parameter is not existant anymore.
+        * bindings/js/JSSVGPathSegCustom.cpp: Replace CREATE_SVG_OBJECT_WRAPPER by CREATE_DOM_OBJECT_WRAPPER. Remove context parameter/handling.
+        (WebCore::toJS):
+        * bindings/js/JSSVGPathSegListCustom.cpp: Removed.
+        * bindings/scripts/CodeGenerator.pm: Map 'SVGPathSegList' IDL type to SVG 'SVGPathSegListPropertyTearOff' native type.
+        * bindings/scripts/CodeGeneratorJS.pm: Remove IsSVGTypeNeedingContextParameter() methods and usages. Handle SVGPathSegListPropertyTearOff.
+        * bindings/scripts/CodeGeneratorObjC.pm: Handle SVGPathSegListPropertyTearOff.
+        * bindings/scripts/CodeGeneratorV8.pm: Remove IsSVGTypeNeedingContextParameter() methods and usages.
+        * rendering/SVGRenderTreeAsText.cpp: Build path string from byte stream, not path segment list.
+        (WebCore::operator<<):
+        * svg/SVGAllInOne.cpp: Remove obsolete cpp files.
+        * svg/SVGAnimatedPathData.cpp: Removed.
+        * svg/SVGAnimatedPathData.h: Removed.
+        * svg/SVGAnimatedPathData.idl: Removed.
+        * svg/SVGPathElement.cpp: Build SVGPathList on demand. Use SVGPathByteStream to parse/store the 'd' attribute content.
+        (WebCore::SVGPathElement::SVGPathElement):
+        (WebCore::SVGPathElement::getPathSegAtLength): Use SVGPathByteStream, not SVGPathSegList to determine the getPathSegAtLength() information.
+        (WebCore::SVGPathElement::createSVGPathSegClosePath): Pass SVGPathElement to SVGPathSeg and a SVGPathSegRole parameter and store it to track the list origin.
+        (WebCore::SVGPathElement::createSVGPathSegMovetoAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegMovetoRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegArcAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegArcRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoHorizontalRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegLinetoVerticalRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs): Ditto.
+        (WebCore::SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel): Ditto.
+        (WebCore::SVGPathElement::parseMappedAttribute): Build SVGPathByteStream from 'd' attribute, not a SVGPathSegList.
+        (WebCore::SVGPathElement::svgAttributeChanged): If a SVGPathSegList object has been built, synchronize it with the 'd' attribute.
+        (WebCore::SVGPathElement::synchronizeProperty): Synchronize 'd' attribute with the SVGPathSegList, if needed.
+        (WebCore::SVGPathElement::synchronizeD): Added.
+        (WebCore::SVGPathElement::pathSegList): Use same trick as in SVGPolyElement to expose the 'pathSegList' / 'animatedPathSegList' object to the SVG DOM bindings.
+        (WebCore::SVGPathElement::normalizedPathSegList): Ditto.
+        (WebCore::SVGPathElement::animatedPathSegList): Ditto.
+        (WebCore::SVGPathElement::animatedNormalizedPathSegList): Ditto.
+        (WebCore::SVGPathElement::toPathData): Build 'Path' object from SVGPathByteStream, not from SVGPathSegList.
+        (WebCore::SVGPathElement::pathSegListChanged): Used to synchronize the SVGPathSegLists and the d attribute, as well as any changes from any SVGPathSeg associated with this SVGPathElement.
+        * svg/SVGPathElement.h: Add new accessors...
+        (WebCore::SVGPathElement::pathByteStream): ... needed by SVGRenderTreeAsText.
+        (WebCore::SVGPathElement::animatablePathSegList): ... needed by SVGPathSegListPropertyTearOff.
+        * svg/SVGPathElement.idl: Merge SVGAnimatedPathData interface into SVGPathElement.
+        * svg/SVGPathParserFactory.cpp: Cleanup SVGPathParserFactory, remove obsolete methods, now that SVGPathElement switched to using SVGPathByteStream internally.
+        (WebCore::globalSVGPathSegListBuilder):
+        (WebCore::SVGPathParserFactory::buildSVGPathByteStreamFromSVGPathSegList):
+        (WebCore::SVGPathParserFactory::buildPathFromByteStream):
+        (WebCore::SVGPathParserFactory::buildSVGPathSegListFromByteStream):
+        (WebCore::SVGPathParserFactory::buildStringFromSVGPathSegList):
+        (WebCore::SVGPathParserFactory::buildSVGPathByteStreamFromString):
+        (WebCore::SVGPathParserFactory::buildAnimatedSVGPathByteStream):
+        (WebCore::SVGPathParserFactory::getSVGPathSegAtLengthFromSVGPathByteStream):
+        * svg/SVGPathParserFactory.h:
+        * svg/SVGPathSeg.cpp: Removed.
+        * svg/SVGPathSeg.h: Add new SVGPathSegRole enum, identifying to which list a path segment belongs.
+        (WebCore::SVGPathSeg::SVGPathSeg):
+        * svg/SVGPathSeg.idl: Reindented.
+        * svg/SVGPathSegArc.cpp: Removed.
+        * svg/SVGPathSegArc.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegArcAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegArcRel.idl: Ditto.
+        * svg/SVGPathSegClosePath.cpp: Removed.
+        * svg/SVGPathSegClosePath.h:
+        * svg/SVGPathSegCurvetoCubic.cpp: Removed.
+        * svg/SVGPathSegCurvetoCubic.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegCurvetoCubicAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegCurvetoCubicRel.idl: Ditto.
+        * svg/SVGPathSegCurvetoCubicSmooth.cpp: Removed.
+        * svg/SVGPathSegCurvetoCubicSmooth.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegCurvetoCubicSmoothAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegCurvetoCubicSmoothRel.idl: Ditto.
+        * svg/SVGPathSegCurvetoQuadratic.cpp: Removed.
+        * svg/SVGPathSegCurvetoQuadratic.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegCurvetoQuadraticAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegCurvetoQuadraticRel.idl: Ditto.
+        * svg/SVGPathSegCurvetoQuadraticSmooth.cpp: Removed.
+        * svg/SVGPathSegCurvetoQuadraticSmooth.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegCurvetoQuadraticSmoothAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegCurvetoQuadraticSmoothRel.idl: Ditto.
+        * svg/SVGPathSegLineto.cpp: Removed.
+        * svg/SVGPathSegLineto.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegLinetoAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegLinetoHorizontal.cpp: Removed.
+        * svg/SVGPathSegLinetoHorizontal.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegLinetoHorizontalAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegLinetoHorizontalRel.idl: Ditto.
+        * svg/SVGPathSegLinetoRel.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegLinetoVertical.cpp: Removed.
+        * svg/SVGPathSegLinetoVertical.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegLinetoVerticalAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegLinetoVerticalRel.idl: Ditto.
+        * svg/SVGPathSegList.cpp: Switch from SVGList<RefPtr<SVGPathSeg> > to a plain Vector<RefPtr<SVGPathSeg> >.
+        (WebCore::SVGPathSegList::valueAsString): Utilize SVGPathParserFactory to build a String from a SVGPathSegList.
+        (WebCore::SVGPathSegList::commitChange): Call SVGPathElement::pathSegListChanged().
+        * svg/SVGPathSegList.h:
+        (WebCore::SVGPathSegList::SVGPathSegList):
+        * svg/SVGPathSegList.idl: Remove [JSCCustom] flags, no longer needed. 
+        * svg/SVGPathSegListBuilder.cpp: Adapt to SVGPathSegList API changes.
+        (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: Ditto.
+        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathElement):
+        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathSegList):
+        (WebCore::SVGPathSegListBuilder::setCurrentSVGPathSegRole):
+        (WebCore::SVGPathSegListBuilder::cleanup):
+        * svg/SVGPathSegListSource.cpp: Ditto.
+        (WebCore::SVGPathSegListSource::SVGPathSegListSource):
+        (WebCore::SVGPathSegListSource::parseSVGSegmentType):
+        (WebCore::SVGPathSegListSource::nextCommand):
+        (WebCore::SVGPathSegListSource::parseMoveToSegment):
+        (WebCore::SVGPathSegListSource::parseLineToSegment):
+        (WebCore::SVGPathSegListSource::parseCurveToQuadraticSmoothSegment):
+        * svg/SVGPathSegListSource.h: Ditto.
+        (WebCore::SVGPathSegListSource::create):
+        * svg/SVGPathSegMoveto.cpp: Removed.
+        * svg/SVGPathSegMoveto.h: All setters now call the commitChange() method.
+        * svg/SVGPathSegMovetoAbs.idl: Enable StrictTypeChecking.
+        * svg/SVGPathSegMovetoRel.idl: Ditto.
+        * svg/SVGPathSegWithContext.h: Added. This is the new base class for all SVGPathSeg derived types, that's associated with a SVGPathElement and a 'role' (normalized/unaltered segment list).
+        (WebCore::SVGPathSegWithContext::SVGPathSegWithContext):
+        (WebCore::SVGPathSegWithContext::animatedProperty):
+        (WebCore::SVGPathSegWithContext::setContextAndRole):
+        (WebCore::SVGPathSegWithContext::commitChange):
+        (WebCore::SVGPathSegSingleCoordinate::x):
+        (WebCore::SVGPathSegSingleCoordinate::setX):
+        (WebCore::SVGPathSegSingleCoordinate::y):
+        (WebCore::SVGPathSegSingleCoordinate::setY):
+        (WebCore::SVGPathSegSingleCoordinate::SVGPathSegSingleCoordinate):
+        * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Added. 
+        (WebCore::SVGAnimatedPathSegListPropertyTearOff::baseVal):
+        (WebCore::SVGAnimatedPathSegListPropertyTearOff::animVal):
+        (WebCore::SVGAnimatedPathSegListPropertyTearOff::removeItemFromList):
+        (WebCore::SVGAnimatedPathSegListPropertyTearOff::create):
+        (WebCore::SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff):
+        * svg/properties/SVGPathSegListPropertyTearOff.cpp: Added.
+        (WebCore::SVGPathSegListPropertyTearOff::clear): Added in the cpp file, not in the header, as it needs access to SVGPathSegWithContext, which we can't include from the header.
+        (WebCore::SVGPathSegListPropertyTearOff::getItem): Ditto.
+        (WebCore::SVGPathSegListPropertyTearOff::removeItem): Ditto.
+        (WebCore::SVGPathSegListPropertyTearOff::contextElement): Needs access to SVGPathElement, that's why it lives in the cpp file.
+        (WebCore::SVGPathSegListPropertyTearOff::processIncomingListItemValue): Needs access to SVGPathSegWithContext.
+        * svg/properties/SVGPathSegListPropertyTearOff.h: Added.
+        (WebCore::SVGPathSegListPropertyTearOff::create):
+        (WebCore::SVGPathSegListPropertyTearOff::removeItemFromList):
+        (WebCore::SVGPathSegListPropertyTearOff::numberOfItems):
+        (WebCore::SVGPathSegListPropertyTearOff::initialize):
+        (WebCore::SVGPathSegListPropertyTearOff::insertItemBefore):
+        (WebCore::SVGPathSegListPropertyTearOff::replaceItem):
+        (WebCore::SVGPathSegListPropertyTearOff::appendItem):
+        (WebCore::SVGPathSegListPropertyTearOff::SVGPathSegListPropertyTearOff):
+        (WebCore::SVGPathSegListPropertyTearOff::commitChange):
+        (WebCore::SVGPathSegListPropertyTearOff::processIncomingListItemWrapper):
+
 2010-11-18  Mario Sanchez Prada  <msanchez@igalia.com>
 
         Reviewed by Martin Robinson.
index 1b6a266..793e155 100644 (file)
@@ -329,7 +329,6 @@ DOM_CLASSES = \
     SVGAnimatedLengthList \
     SVGAnimatedNumber \
     SVGAnimatedNumberList \
-    SVGAnimatedPathData \
     SVGAnimatedPreserveAspectRatio \
     SVGAnimatedRect \
     SVGAnimatedString \
index 5dcc468..5dcbfc2 100644 (file)
@@ -795,7 +795,6 @@ webcore_sources += \
        WebCore/bindings/js/JSSVGElementInstanceCustom.cpp \
        WebCore/bindings/js/JSSVGLengthCustom.cpp \
        WebCore/bindings/js/JSSVGPathSegCustom.cpp \
-       WebCore/bindings/js/JSSVGPathSegListCustom.cpp \
        WebCore/bindings/js/JSSVGPODListCustom.h \
        WebCore/bindings/js/JSSVGPODTypeWrapper.h \
        WebCore/bindings/js/JSTextCustom.cpp \
@@ -3047,6 +3046,7 @@ webcore_sources += \
        WebCore/svg/LinearGradientAttributes.h \
        WebCore/svg/PatternAttributes.h \
        WebCore/svg/properties/SVGAnimatedListPropertyTearOff.h \
+       WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h \
        WebCore/svg/properties/SVGAnimatedProperty.h \
        WebCore/svg/properties/SVGAnimatedPropertyDescription.h \
        WebCore/svg/properties/SVGAnimatedPropertyMacros.h \
@@ -3056,6 +3056,8 @@ webcore_sources += \
        WebCore/svg/properties/SVGAnimatedTransformListPropertyTearOff.h \
        WebCore/svg/properties/SVGListProperty.h \
        WebCore/svg/properties/SVGListPropertyTearOff.h \
+       WebCore/svg/properties/SVGPathSegListPropertyTearOff.cpp \
+       WebCore/svg/properties/SVGPathSegListPropertyTearOff.h \
        WebCore/svg/properties/SVGProperty.h \
        WebCore/svg/properties/SVGPropertyTearOff.h \
        WebCore/svg/properties/SVGPropertyTraits.h \
@@ -3080,8 +3082,6 @@ webcore_sources += \
        WebCore/svg/SVGAnimatedLengthList.h \
        WebCore/svg/SVGAnimatedNumber.h \
        WebCore/svg/SVGAnimatedNumberList.h \
-       WebCore/svg/SVGAnimatedPathData.cpp \
-       WebCore/svg/SVGAnimatedPathData.h \
        WebCore/svg/SVGAnimatedPreserveAspectRatio.h \
        WebCore/svg/SVGAnimatedRect.h \
        WebCore/svg/SVGAnimatedString.h \
@@ -3257,25 +3257,15 @@ webcore_sources += \
        WebCore/svg/SVGPathParserFactory.cpp \
        WebCore/svg/SVGPathParserFactory.h \
        WebCore/svg/SVGPathParser.h \
-       WebCore/svg/SVGPathSegArc.cpp \
        WebCore/svg/SVGPathSegArc.h \
-       WebCore/svg/SVGPathSegClosePath.cpp \
        WebCore/svg/SVGPathSegClosePath.h \
-       WebCore/svg/SVGPathSeg.cpp \
-       WebCore/svg/SVGPathSegCurvetoCubic.cpp \
        WebCore/svg/SVGPathSegCurvetoCubic.h \
-       WebCore/svg/SVGPathSegCurvetoCubicSmooth.cpp \
        WebCore/svg/SVGPathSegCurvetoCubicSmooth.h \
-       WebCore/svg/SVGPathSegCurvetoQuadratic.cpp \
        WebCore/svg/SVGPathSegCurvetoQuadratic.h \
-       WebCore/svg/SVGPathSegCurvetoQuadraticSmooth.cpp \
        WebCore/svg/SVGPathSegCurvetoQuadraticSmooth.h \
        WebCore/svg/SVGPathSeg.h \
-       WebCore/svg/SVGPathSegLineto.cpp \
        WebCore/svg/SVGPathSegLineto.h \
-       WebCore/svg/SVGPathSegLinetoHorizontal.cpp \
        WebCore/svg/SVGPathSegLinetoHorizontal.h \
-       WebCore/svg/SVGPathSegLinetoVertical.cpp \
        WebCore/svg/SVGPathSegLinetoVertical.h \
        WebCore/svg/SVGPathSegListBuilder.cpp \
        WebCore/svg/SVGPathSegListBuilder.h \
@@ -3283,8 +3273,8 @@ webcore_sources += \
        WebCore/svg/SVGPathSegList.h \
        WebCore/svg/SVGPathSegListSource.cpp \
        WebCore/svg/SVGPathSegListSource.h \
-       WebCore/svg/SVGPathSegMoveto.cpp \
        WebCore/svg/SVGPathSegMoveto.h \
+       WebCore/svg/SVGPathSegWithContext.h \
        WebCore/svg/SVGPathSource.h \
        WebCore/svg/SVGPathStringBuilder.cpp \
        WebCore/svg/SVGPathStringBuilder.h \
@@ -4207,7 +4197,6 @@ webcore_built_sources += \
        DerivedSources/WebCore/JSSVGAnimatedNumber.h \
        DerivedSources/WebCore/JSSVGAnimatedNumberList.cpp \
        DerivedSources/WebCore/JSSVGAnimatedNumberList.h \
-       DerivedSources/WebCore/JSSVGAnimatedPathData.h \
        DerivedSources/WebCore/JSSVGAnimatedPreserveAspectRatio.cpp \
        DerivedSources/WebCore/JSSVGAnimatedPreserveAspectRatio.h \
        DerivedSources/WebCore/JSSVGAnimatedRect.cpp \
index 4792a2a..e8f343a 100644 (file)
       # Bindings with custom Objective-C implementations.
       '../page/AbstractView.idl',
 
-      # FIXME: I don't know why all of these are excluded.
-      # Extra SVG bindings to exclude.
+      # These bindings are excluded, as they're only used through inheritance and don't define constants that would need a constructor.
       '../svg/ElementTimeControl.idl',
-      '../svg/SVGAnimatedPathData.idl',
       '../svg/SVGExternalResourcesRequired.idl',
       '../svg/SVGFilterPrimitiveStandardAttributes.idl',
       '../svg/SVGFitToViewBox.idl',
index 4dfefc0..dbf8fc4 100644 (file)
             'svg/SVGAnimatedLengthList.idl',
             'svg/SVGAnimatedNumber.idl',
             'svg/SVGAnimatedNumberList.idl',
-            'svg/SVGAnimatedPathData.idl',
             'svg/SVGAnimatedPreserveAspectRatio.idl',
             'svg/SVGAnimatedRect.idl',
             'svg/SVGAnimatedString.idl',
             'svg/graphics/SVGImage.h',
             'svg/properties/SVGAnimatedPropertySynchronizer.h',
             'svg/properties/SVGAnimatedListPropertyTearOff.h',
+            'svg/properties/SVGAnimatedPathSegListPropertyTearOff.h',
             'svg/properties/SVGAnimatedProperty.h',
             'svg/properties/SVGAnimatedPropertyDescription.h',
             'svg/properties/SVGAnimatedPropertyMacros.h',
             'svg/properties/SVGAnimatedTransformListPropertyTearOff.h',
             'svg/properties/SVGListProperty.h',
             'svg/properties/SVGListPropertyTearOff.h',
+            'svg/properties/SVGPathSegListPropertyTearOff.cpp',
+            'svg/properties/SVGPathSegListPropertyTearOff.h',
             'svg/properties/SVGProperty.h',
             'svg/properties/SVGPropertyTearOff.h',
             'svg/properties/SVGPropertyTraits.h',
             'svg/SVGAnimatedLengthList.h',
             'svg/SVGAnimatedNumber.h',
             'svg/SVGAnimatedNumberList.h',
-            'svg/SVGAnimatedPathData.cpp',
-            'svg/SVGAnimatedPathData.h',
             'svg/SVGAnimatedPreserveAspectRatio.h',
             'svg/SVGAnimatedRect.h',
             'svg/SVGAnimatedString.h',
             'svg/SVGPathParser.h',
             'svg/SVGPathParserFactory.cpp',
             'svg/SVGPathParserFactory.h',
-            'svg/SVGPathSeg.cpp',
             'svg/SVGPathSeg.h',
-            'svg/SVGPathSegArc.cpp',
             'svg/SVGPathSegArc.h',
-            'svg/SVGPathSegClosePath.cpp',
             'svg/SVGPathSegClosePath.h',
-            'svg/SVGPathSegCurvetoCubic.cpp',
             'svg/SVGPathSegCurvetoCubic.h',
-            'svg/SVGPathSegCurvetoCubicSmooth.cpp',
             'svg/SVGPathSegCurvetoCubicSmooth.h',
-            'svg/SVGPathSegCurvetoQuadratic.cpp',
             'svg/SVGPathSegCurvetoQuadratic.h',
-            'svg/SVGPathSegCurvetoQuadraticSmooth.cpp',
             'svg/SVGPathSegCurvetoQuadraticSmooth.h',
-            'svg/SVGPathSegLineto.cpp',
             'svg/SVGPathSegLineto.h',
-            'svg/SVGPathSegLinetoHorizontal.cpp',
             'svg/SVGPathSegLinetoHorizontal.h',
-            'svg/SVGPathSegLinetoVertical.cpp',
             'svg/SVGPathSegLinetoVertical.h',
             'svg/SVGPathSegList.cpp',
             'svg/SVGPathSegList.h',
             'svg/SVGPathSegListBuilder.h',
             'svg/SVGPathSegListSource.cpp',
             'svg/SVGPathSegListSource.h',
-            'svg/SVGPathSegMoveto.cpp',
             'svg/SVGPathSegMoveto.h',
+            'svg/SVGPathSegWithContext.h',
             'svg/SVGPathSource.h',
             'svg/SVGPathStringBuilder.cpp',
             'svg/SVGPathStringBuilder.h',
index 76f3275..a31461c 100644 (file)
@@ -18669,7 +18669,6 @@ __ZN7WebCore24RenderSVGHiddenContainerC1EPNS_16SVGStyledElementE
 __ZN7WebCore24RenderSVGHiddenContainerC2EPNS_16SVGStyledElementE
 __ZN7WebCoreL15pathConstructorERKNS_13QualifiedNameEPNS_8DocumentEb
 __ZN7WebCore14SVGPathElementC1ERKNS_13QualifiedNameEPNS_8DocumentE
-__ZN7WebCore19SVGAnimatedPathDataC2Ev
 __ZN7WebCore14SVGPathElement20parseMappedAttributeEPNS_15MappedAttributeE
 __ZN7WebCore14SVGPathElement19svgAttributeChangedERKNS_13QualifiedNameE
 __ZNK7WebCore14SVGPathElement7isValidEv
@@ -18913,7 +18912,6 @@ __ZN7WebCore14SVGPathSegListD0Ev
 __ZN7WebCore19SVGPathSegMovetoAbsD0Ev
 __ZN7WebCore19SVGPathSegLinetoAbsD0Ev
 __ZN7WebCore19SVGPathSegClosePathD0Ev
-__ZN7WebCore19SVGAnimatedPathDataD2Ev
 __ZN3WTF6VectorINS_6RefPtrIN7WebCore14SVGPODListItemINS2_12SVGTransformEEEEELm0EE6shrinkEm
 __ZN7WebCore25SVGPathSegCurvetoCubicAbsD0Ev
 __ZN7WebCore15SVGTSpanElementD0Ev
index 3d0626a..8f6a772 100644 (file)
@@ -2356,6 +2356,7 @@ HEADERS += \
     svg/graphics/filters/SVGFilter.h \
     svg/graphics/SVGImage.h \
     svg/properties/SVGAnimatedListPropertyTearOff.h \
+    svg/properties/SVGAnimatedPathSegListPropertyTearOff.h \
     svg/properties/SVGAnimatedProperty.h \
     svg/properties/SVGAnimatedPropertyDescription.h \
     svg/properties/SVGAnimatedPropertyMacros.h \
@@ -2365,6 +2366,7 @@ HEADERS += \
     svg/properties/SVGAnimatedTransformListPropertyTearOff.h \
     svg/properties/SVGListProperty.h \
     svg/properties/SVGListPropertyTearOff.h \
+    svg/properties/SVGPathSegListPropertyTearOff.h \
     svg/properties/SVGProperty.h \
     svg/properties/SVGPropertyTearOff.h \
     svg/properties/SVGPropertyTraits.h \
@@ -2384,7 +2386,6 @@ HEADERS += \
     svg/SVGAnimatedLengthList.h \
     svg/SVGAnimatedNumber.h \
     svg/SVGAnimatedNumberList.h \
-    svg/SVGAnimatedPathData.h \
     svg/SVGAnimatedPreserveAspectRatio.h \
     svg/SVGAnimatedRect.h \
     svg/SVGAnimatedString.h \
@@ -3392,8 +3393,7 @@ contains(DEFINES, ENABLE_SVG=1) {
     # TODO: this-one-is-not-auto-added! FIXME! tmp/SVGElementFactory.cpp \
             bindings/js/JSSVGElementInstanceCustom.cpp \
             bindings/js/JSSVGLengthCustom.cpp \
-            bindings/js/JSSVGPathSegCustom.cpp \
-            bindings/js/JSSVGPathSegListCustom.cpp
+            bindings/js/JSSVGPathSegCustom.cpp
     }
 
     SOURCES += \
@@ -3428,7 +3428,6 @@ contains(DEFINES, ENABLE_SVG=1) {
         svg/SVGAltGlyphElement.cpp \
         svg/SVGAngle.cpp \
         svg/SVGAnimateColorElement.cpp \
-        svg/SVGAnimatedPathData.cpp \
         svg/SVGAnimateElement.cpp \
         svg/SVGAnimateMotionElement.cpp \
         svg/SVGAnimateTransformElement.cpp \
@@ -3509,20 +3508,9 @@ contains(DEFINES, ENABLE_SVG=1) {
         svg/SVGPathElement.cpp \
         svg/SVGPathParser.cpp \
         svg/SVGPathParserFactory.cpp \
-        svg/SVGPathSeg.cpp \
-        svg/SVGPathSegArc.cpp \
-        svg/SVGPathSegClosePath.cpp \
-        svg/SVGPathSegCurvetoCubic.cpp \
-        svg/SVGPathSegCurvetoCubicSmooth.cpp \
-        svg/SVGPathSegCurvetoQuadratic.cpp \
-        svg/SVGPathSegCurvetoQuadraticSmooth.cpp \
-        svg/SVGPathSegLineto.cpp \
-        svg/SVGPathSegLinetoHorizontal.cpp \
-        svg/SVGPathSegLinetoVertical.cpp \
         svg/SVGPathSegList.cpp \
         svg/SVGPathSegListBuilder.cpp \
         svg/SVGPathSegListSource.cpp \
-        svg/SVGPathSegMoveto.cpp \
         svg/SVGPathStringBuilder.cpp \
         svg/SVGPathStringSource.cpp \
         svg/SVGPathTraversalStateBuilder.cpp \
@@ -3572,6 +3560,7 @@ contains(DEFINES, ENABLE_SVG=1) {
         svg/graphics/filters/SVGFilter.cpp \
         svg/graphics/filters/SVGFilterBuilder.cpp \
         svg/graphics/SVGImage.cpp \
+        svg/properties/SVGPathSegListPropertyTearOff.cpp \
         rendering/RenderForeignObject.cpp \
         rendering/RenderSVGBlock.cpp \
         rendering/RenderSVGContainer.cpp \
index 6f85425..f9a7758 100644 (file)
                                >\r
                        </File>\r
                        <File\r
-                               RelativePath="..\svg\SVGAnimatedPathData.h"\r
-                               >\r
-                       </File>\r
-                       <File\r
                                RelativePath="..\svg\SVGAnimatedPreserveAspectRatio.h"\r
                                >\r
                        </File>\r
                                        >\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\svg\properties\SVGAnimatedPathSegListPropertyTearOff.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\svg\properties\SVGAnimatedProperty.h"\r
                                        >\r
                                </File>\r
                                        >\r
                                </File>\r
                                <File\r
+                                       RelativePath="..\svg\properties\SVGPathSegListPropertyTearOff.cpp"\r
+                                       >\r
+                               </File>\r
+                               <File\r
+                                       RelativePath="..\svg\properties\SVGPathSegListPropertyTearOff.h"\r
+                                       >\r
+                               </File>\r
+                               <File\r
                                        RelativePath="..\svg\properties\SVGProperty.h"\r
                                        >\r
                                </File>\r
index 8ac2d7e..3f7485c 100644 (file)
@@ -97,6 +97,7 @@
                082341C60FCF3A9500D75BD6 /* WMLSelectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 082341C40FCF3A9400D75BD6 /* WMLSelectElement.h */; };
                0823D159127AD6AC000EBC95 /* SVGAnimatedInteger.h in Headers */ = {isa = PBXBuildFile; fileRef = 0823D158127AD6AC000EBC95 /* SVGAnimatedInteger.h */; settings = {ATTRIBUTES = (Private, ); }; };
                08250939128BD4D800E2ED8E /* SVGAnimatedTransformList.h in Headers */ = {isa = PBXBuildFile; fileRef = 08250938128BD4D800E2ED8E /* SVGAnimatedTransformList.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               082DE42D1292621600D923DF /* SVGPathSegWithContext.h in Headers */ = {isa = PBXBuildFile; fileRef = 082DE42C1292621600D923DF /* SVGPathSegWithContext.h */; };
                082FCAC4110927CE00CC4821 /* JSSVGContextCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 082FCAC3110927CE00CC4821 /* JSSVGContextCache.h */; settings = {ATTRIBUTES = (Private, ); }; };
                083192AA112B43050083C3B9 /* RenderSVGResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 083192A7112B43050083C3B9 /* RenderSVGResource.h */; };
                083192AB112B43050083C3B9 /* RenderSVGResourceMasker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 083192A8112B43050083C3B9 /* RenderSVGResourceMasker.cpp */; };
                083DAEA70F01A7FB00342754 /* RenderTextControlMultiLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 083DAEA30F01A7FB00342754 /* RenderTextControlMultiLine.h */; };
                083DAEA80F01A7FB00342754 /* RenderTextControlSingleLine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 083DAEA40F01A7FB00342754 /* RenderTextControlSingleLine.cpp */; };
                083DAEA90F01A7FB00342754 /* RenderTextControlSingleLine.h in Headers */ = {isa = PBXBuildFile; fileRef = 083DAEA50F01A7FB00342754 /* RenderTextControlSingleLine.h */; };
+               084A0829128D7867002DB1F1 /* SVGPathSegListPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 084A0828128D7867002DB1F1 /* SVGPathSegListPropertyTearOff.h */; };
                084AEBE40FB505FA0038483E /* SelectElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 084AEBE20FB505FA0038483E /* SelectElement.cpp */; };
                084AEBE50FB505FA0038483E /* SelectElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 084AEBE30FB505FA0038483E /* SelectElement.h */; };
                084CE5CB0F27DADC00E6240E /* WMLOptGroupElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 084CE5C70F27DADC00E6240E /* WMLOptGroupElement.cpp */; };
                0897C14D0ED2EBA500AE06DB /* WMLBRElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 0897C14B0ED2EBA400AE06DB /* WMLBRElement.h */; };
                0897D97A0F007A4600411BB3 /* WMLMetaElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0897D9780F007A4600411BB3 /* WMLMetaElement.cpp */; };
                0897D97B0F007A4600411BB3 /* WMLMetaElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 0897D9790F007A4600411BB3 /* WMLMetaElement.h */; };
+               089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */; };
                08A484770E5272C500C3FE76 /* ScriptElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08A484750E5272C500C3FE76 /* ScriptElement.cpp */; };
                08A484780E5272C500C3FE76 /* ScriptElement.h in Headers */ = {isa = PBXBuildFile; fileRef = 08A484760E5272C500C3FE76 /* ScriptElement.h */; };
                08A48A6E0E86CF6D00E225DD /* JSSVGElementInstanceCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08A48A6D0E86CF6D00E225DD /* JSSVGElementInstanceCustom.cpp */; };
                08F2F0091213E61700DCEC48 /* RenderImageResource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08F2F0071213E61700DCEC48 /* RenderImageResource.cpp */; };
                08F2F00A1213E61700DCEC48 /* RenderImageResource.h in Headers */ = {isa = PBXBuildFile; fileRef = 08F2F0081213E61700DCEC48 /* RenderImageResource.h */; settings = {ATTRIBUTES = (Private, ); }; };
                08FE0BC5127E2AC1000C4FB5 /* SVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 08FE0BC4127E2AC1000C4FB5 /* SVGAnimatedPreserveAspectRatio.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               08FF102012950F5A00F00276 /* SVGPathSegListPropertyTearOff.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 08FF101F12950F5900F00276 /* SVGPathSegListPropertyTearOff.cpp */; };
                0A4844990CA44CB200B7BD48 /* SoftLinking.h in Headers */ = {isa = PBXBuildFile; fileRef = 0A4844980CA44CB200B7BD48 /* SoftLinking.h */; settings = {ATTRIBUTES = (Private, ); }; };
                0AFDAC3D10F5448C00E1F3D2 /* PluginViewBase.h in Headers */ = {isa = PBXBuildFile; fileRef = 0AFDAC3C10F5448C00E1F3D2 /* PluginViewBase.h */; settings = {ATTRIBUTES = (Private, ); }; };
                0B8C56D40F28627F000502E1 /* HTTPHeaderMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0B8C56D30F28627F000502E1 /* HTTPHeaderMap.cpp */; };
                85ACAA8E0A9B759C00671E90 /* DOMNodeList.mm in Sources */ = {isa = PBXBuildFile; fileRef = 85ACAA8A0A9B759C00671E90 /* DOMNodeList.mm */; };
                85ACABB00A9CAF8000671E90 /* DOMDocument.h in Headers */ = {isa = PBXBuildFile; fileRef = 85ACABAE0A9CAF8000671E90 /* DOMDocument.h */; settings = {ATTRIBUTES = (); }; };
                85ACABB10A9CAF8000671E90 /* DOMDocument.mm in Sources */ = {isa = PBXBuildFile; fileRef = 85ACABAF0A9CAF8000671E90 /* DOMDocument.mm */; };
-               85ACEF0C0ACDCCCF001214FF /* DOMSVGAnimatedPathData.h in Headers */ = {isa = PBXBuildFile; fileRef = 85ACEF060ACDCCCF001214FF /* DOMSVGAnimatedPathData.h */; };
                85ACEF0E0ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 85ACEF080ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.h */; };
                85ACEF0F0ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.mm in Sources */ = {isa = PBXBuildFile; fileRef = 85ACEF090ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.mm */; };
                85ACEF100ACDCCCF001214FF /* DOMSVGPreserveAspectRatio.h in Headers */ = {isa = PBXBuildFile; fileRef = 85ACEF0A0ACDCCCF001214FF /* DOMSVGPreserveAspectRatio.h */; };
                A8A909AC0CBCD6B50029B807 /* RenderSVGTransformableContainer.h in Headers */ = {isa = PBXBuildFile; fileRef = A8A909AA0CBCD6B50029B807 /* RenderSVGTransformableContainer.h */; };
                A8A909AD0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8A909AB0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp */; };
                A8BC04921214F69600B5F122 /* HTMLEntityTable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8BC04911214F69600B5F122 /* HTMLEntityTable.cpp */; };
-               A8BCFD05120A046100B5F122 /* SVGPathSeg.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8BCFD04120A046100B5F122 /* SVGPathSeg.cpp */; };
                A8C2280E11D4A59700D5A7D3 /* DocumentParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C2280D11D4A59700D5A7D3 /* DocumentParser.cpp */; };
                A8C228A111D5722E00D5A7D3 /* DecodedDataDocumentParser.h in Headers */ = {isa = PBXBuildFile; fileRef = A8C2289F11D5722E00D5A7D3 /* DecodedDataDocumentParser.h */; };
                A8C228A211D5722E00D5A7D3 /* DecodedDataDocumentParser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A8C228A011D5722E00D5A7D3 /* DecodedDataDocumentParser.cpp */; };
                A8E545A70CA9D1C20097D09B /* DOMSVGAnimatedStringInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544A90CA9D1C20097D09B /* DOMSVGAnimatedStringInternal.h */; };
                A8E545A90CA9D1C20097D09B /* DOMSVGAnimatedRectInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544AB0CA9D1C20097D09B /* DOMSVGAnimatedRectInternal.h */; };
                A8E545AB0CA9D1C20097D09B /* DOMSVGAnimatedPreserveAspectRatioInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544AD0CA9D1C20097D09B /* DOMSVGAnimatedPreserveAspectRatioInternal.h */; };
-               A8E545AE0CA9D1C20097D09B /* DOMSVGAnimatedPathData.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544B00CA9D1C20097D09B /* DOMSVGAnimatedPathData.h */; };
                A8E545AF0CA9D1C20097D09B /* DOMSVGAnimatedNumberListInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544B10CA9D1C20097D09B /* DOMSVGAnimatedNumberListInternal.h */; };
                A8E545B10CA9D1C20097D09B /* DOMSVGAnimatedNumberInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544B30CA9D1C20097D09B /* DOMSVGAnimatedNumberInternal.h */; };
                A8E545B30CA9D1C20097D09B /* DOMSVGAnimatedLengthListInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = A8E544B50CA9D1C20097D09B /* DOMSVGAnimatedLengthListInternal.h */; };
                A8F46A890CB20A9D003A9670 /* DOMSVGAnimateColorElement.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 850361280ACE007B001F3D9E /* DOMSVGAnimateColorElement.h */; };
                A8F46A8C0CB20A9D003A9670 /* DOMSVGSetElement.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 859D627F0AD888EE00012995 /* DOMSVGSetElement.h */; };
                A8F46A8E0CB20A9D003A9670 /* DOMSVGCircleElement.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 8503612A0ACE007B001F3D9E /* DOMSVGCircleElement.h */; };
-               A8F46A900CB20A9D003A9670 /* DOMSVGAnimatedPathData.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 85ACEF060ACDCCCF001214FF /* DOMSVGAnimatedPathData.h */; };
                A8F46A910CB20A9D003A9670 /* DOMSVGViewElement.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 859D62970AD888EF00012995 /* DOMSVGViewElement.h */; };
                A8F46A920CB20A9D003A9670 /* DOMSVGPathSegLinetoRel.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 85CE1A330ADAC473003BBDEA /* DOMSVGPathSegLinetoRel.h */; };
                A8F46A930CB20A9D003A9670 /* DOMSVGZoomEvent.h in Copy Generated Headers */ = {isa = PBXBuildFile; fileRef = 859D629A0AD888EF00012995 /* DOMSVGZoomEvent.h */; };
                B22279770D00BF220071B782 /* SVGAngle.h in Headers */ = {isa = PBXBuildFile; fileRef = B22277E10D00BF1F0071B782 /* SVGAngle.h */; settings = {ATTRIBUTES = (Private, ); }; };
                B22279790D00BF220071B782 /* SVGAnimateColorElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22277E30D00BF1F0071B782 /* SVGAnimateColorElement.cpp */; };
                B222797A0D00BF220071B782 /* SVGAnimateColorElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22277E40D00BF1F0071B782 /* SVGAnimateColorElement.h */; };
-               B22279840D00BF220071B782 /* SVGAnimatedPathData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22277EE0D00BF1F0071B782 /* SVGAnimatedPathData.cpp */; };
-               B22279850D00BF220071B782 /* SVGAnimatedPathData.h in Headers */ = {isa = PBXBuildFile; fileRef = B22277EF0D00BF1F0071B782 /* SVGAnimatedPathData.h */; };
                B222798F0D00BF220071B782 /* SVGAnimateElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22277F90D00BF1F0071B782 /* SVGAnimateElement.cpp */; };
                B22279900D00BF220071B782 /* SVGAnimateElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22277FA0D00BF1F0071B782 /* SVGAnimateElement.h */; };
                B22279920D00BF220071B782 /* SVGAnimateMotionElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22277FC0D00BF1F0071B782 /* SVGAnimateMotionElement.cpp */; };
                B2227A580D00BF220071B782 /* SVGPathElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278C20D00BF200071B782 /* SVGPathElement.cpp */; };
                B2227A590D00BF220071B782 /* SVGPathElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C30D00BF200071B782 /* SVGPathElement.h */; };
                B2227A5B0D00BF220071B782 /* SVGPathSeg.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C50D00BF200071B782 /* SVGPathSeg.h */; };
-               B2227A5D0D00BF220071B782 /* SVGPathSegArc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278C70D00BF200071B782 /* SVGPathSegArc.cpp */; };
                B2227A5E0D00BF220071B782 /* SVGPathSegArc.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278C80D00BF200071B782 /* SVGPathSegArc.h */; };
-               B2227A610D00BF220071B782 /* SVGPathSegClosePath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278CB0D00BF200071B782 /* SVGPathSegClosePath.cpp */; };
                B2227A620D00BF220071B782 /* SVGPathSegClosePath.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278CC0D00BF200071B782 /* SVGPathSegClosePath.h */; };
-               B2227A640D00BF220071B782 /* SVGPathSegCurvetoCubic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278CE0D00BF200071B782 /* SVGPathSegCurvetoCubic.cpp */; };
                B2227A650D00BF220071B782 /* SVGPathSegCurvetoCubic.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278CF0D00BF200071B782 /* SVGPathSegCurvetoCubic.h */; };
-               B2227A680D00BF220071B782 /* SVGPathSegCurvetoCubicSmooth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278D20D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.cpp */; };
                B2227A690D00BF220071B782 /* SVGPathSegCurvetoCubicSmooth.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278D30D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.h */; };
-               B2227A6C0D00BF220071B782 /* SVGPathSegCurvetoQuadratic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278D60D00BF200071B782 /* SVGPathSegCurvetoQuadratic.cpp */; };
                B2227A6D0D00BF220071B782 /* SVGPathSegCurvetoQuadratic.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278D70D00BF200071B782 /* SVGPathSegCurvetoQuadratic.h */; };
-               B2227A700D00BF220071B782 /* SVGPathSegCurvetoQuadraticSmooth.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278DA0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.cpp */; };
                B2227A710D00BF220071B782 /* SVGPathSegCurvetoQuadraticSmooth.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278DB0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.h */; };
-               B2227A740D00BF220071B782 /* SVGPathSegLineto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278DE0D00BF200071B782 /* SVGPathSegLineto.cpp */; };
                B2227A750D00BF220071B782 /* SVGPathSegLineto.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278DF0D00BF200071B782 /* SVGPathSegLineto.h */; };
-               B2227A770D00BF220071B782 /* SVGPathSegLinetoHorizontal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278E10D00BF200071B782 /* SVGPathSegLinetoHorizontal.cpp */; };
                B2227A780D00BF220071B782 /* SVGPathSegLinetoHorizontal.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278E20D00BF200071B782 /* SVGPathSegLinetoHorizontal.h */; };
-               B2227A7C0D00BF220071B782 /* SVGPathSegLinetoVertical.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278E60D00BF200071B782 /* SVGPathSegLinetoVertical.cpp */; };
                B2227A7D0D00BF220071B782 /* SVGPathSegLinetoVertical.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278E70D00BF200071B782 /* SVGPathSegLinetoVertical.h */; };
                B2227A800D00BF220071B782 /* SVGPathSegList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278EA0D00BF200071B782 /* SVGPathSegList.cpp */; };
                B2227A810D00BF220071B782 /* SVGPathSegList.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278EB0D00BF200071B782 /* SVGPathSegList.h */; };
-               B2227A830D00BF220071B782 /* SVGPathSegMoveto.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278ED0D00BF210071B782 /* SVGPathSegMoveto.cpp */; };
                B2227A840D00BF220071B782 /* SVGPathSegMoveto.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278EE0D00BF210071B782 /* SVGPathSegMoveto.h */; };
                B2227A870D00BF220071B782 /* SVGPatternElement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B22278F10D00BF210071B782 /* SVGPatternElement.cpp */; };
                B2227A880D00BF220071B782 /* SVGPatternElement.h in Headers */ = {isa = PBXBuildFile; fileRef = B22278F20D00BF210071B782 /* SVGPatternElement.h */; };
                B28C6A280D00C44800334AA4 /* SVGDocumentExtensions.h in Headers */ = {isa = PBXBuildFile; fileRef = B28C6A1F0D00C44800334AA4 /* SVGDocumentExtensions.h */; settings = {ATTRIBUTES = (Private, ); }; };
                B28C6A290D00C44800334AA4 /* SVGImageLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28C6A200D00C44800334AA4 /* SVGImageLoader.cpp */; };
                B28C6A2A0D00C44800334AA4 /* SVGImageLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = B28C6A210D00C44800334AA4 /* SVGImageLoader.h */; };
-               B297BC700B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B297BC6F0B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp */; };
                B2A015A80AF6CD53006BCE0E /* GraphicsContext.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2A015920AF6CD53006BCE0E /* GraphicsContext.cpp */; };
                B2A015A90AF6CD53006BCE0E /* GraphicsContext.h in Headers */ = {isa = PBXBuildFile; fileRef = B2A015930AF6CD53006BCE0E /* GraphicsContext.h */; settings = {ATTRIBUTES = (Private, ); }; };
                B2A015AA0AF6CD53006BCE0E /* GraphicsTypes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2A015940AF6CD53006BCE0E /* GraphicsTypes.cpp */; };
                                A80F3B8B0CCDCE24002DD990 /* DOMSVGAnimatedNumberInternal.h in Copy Generated Headers */,
                                A8F46AAF0CB20A9D003A9670 /* DOMSVGAnimatedNumberList.h in Copy Generated Headers */,
                                A80F3B700CCDCE24002DD990 /* DOMSVGAnimatedNumberListInternal.h in Copy Generated Headers */,
-                               A8F46A900CB20A9D003A9670 /* DOMSVGAnimatedPathData.h in Copy Generated Headers */,
                                A8F46B2E0CB20A9D003A9670 /* DOMSVGAnimatedPreserveAspectRatio.h in Copy Generated Headers */,
                                A80F3B7E0CCDCE24002DD990 /* DOMSVGAnimatedPreserveAspectRatioInternal.h in Copy Generated Headers */,
                                A8F46B1B0CB20A9D003A9670 /* DOMSVGAnimatedRect.h in Copy Generated Headers */,
                082341C40FCF3A9400D75BD6 /* WMLSelectElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLSelectElement.h; sourceTree = "<group>"; };
                0823D158127AD6AC000EBC95 /* SVGAnimatedInteger.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedInteger.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>"; };
                082FCAC3110927CE00CC4821 /* JSSVGContextCache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSSVGContextCache.h; sourceTree = "<group>"; };
                083192A7112B43050083C3B9 /* RenderSVGResource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGResource.h; sourceTree = "<group>"; };
                083192A8112B43050083C3B9 /* RenderSVGResourceMasker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGResourceMasker.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>"; };
                083DAEA50F01A7FB00342754 /* RenderTextControlSingleLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderTextControlSingleLine.h; sourceTree = "<group>"; };
+               084A0828128D7867002DB1F1 /* SVGPathSegListPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGPathSegListPropertyTearOff.h; sourceTree = "<group>"; };
                084AEBE20FB505FA0038483E /* SelectElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SelectElement.cpp; sourceTree = "<group>"; };
                084AEBE30FB505FA0038483E /* SelectElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SelectElement.h; sourceTree = "<group>"; };
                084CE5C70F27DADC00E6240E /* WMLOptGroupElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLOptGroupElement.cpp; sourceTree = "<group>"; };
                0897C14B0ED2EBA400AE06DB /* WMLBRElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLBRElement.h; sourceTree = "<group>"; };
                0897D9780F007A4600411BB3 /* WMLMetaElement.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLMetaElement.cpp; sourceTree = "<group>"; };
                0897D9790F007A4600411BB3 /* WMLMetaElement.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLMetaElement.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>"; };
                08A48A6D0E86CF6D00E225DD /* JSSVGElementInstanceCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGElementInstanceCustom.cpp; sourceTree = "<group>"; };
                08FB84B00ECE373300DC064E /* WMLElementFactory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WMLElementFactory.cpp; sourceTree = "<group>"; };
                08FB84B10ECE373300DC064E /* WMLElementFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WMLElementFactory.h; sourceTree = "<group>"; };
                08FE0BC4127E2AC1000C4FB5 /* SVGAnimatedPreserveAspectRatio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPreserveAspectRatio.h; sourceTree = "<group>"; };
+               08FF101F12950F5900F00276 /* SVGPathSegListPropertyTearOff.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegListPropertyTearOff.cpp; sourceTree = "<group>"; };
                0A4844980CA44CB200B7BD48 /* SoftLinking.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SoftLinking.h; sourceTree = "<group>"; };
                0AFDAC3C10F5448C00E1F3D2 /* PluginViewBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PluginViewBase.h; sourceTree = "<group>"; };
                0B8C56D30F28627F000502E1 /* HTTPHeaderMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPHeaderMap.cpp; sourceTree = "<group>"; };
                85ACAA8A0A9B759C00671E90 /* DOMNodeList.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMNodeList.mm; sourceTree = "<group>"; };
                85ACABAE0A9CAF8000671E90 /* DOMDocument.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOMDocument.h; sourceTree = "<group>"; };
                85ACABAF0A9CAF8000671E90 /* DOMDocument.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMDocument.mm; sourceTree = "<group>"; };
-               85ACEF060ACDCCCF001214FF /* DOMSVGAnimatedPathData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedPathData.h; sourceTree = "<group>"; };
                85ACEF080ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedPreserveAspectRatio.h; sourceTree = "<group>"; };
                85ACEF090ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.mm */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.objcpp; path = DOMSVGAnimatedPreserveAspectRatio.mm; sourceTree = "<group>"; };
                85ACEF0A0ACDCCCF001214FF /* DOMSVGPreserveAspectRatio.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = DOMSVGPreserveAspectRatio.h; sourceTree = "<group>"; };
                A8A909AA0CBCD6B50029B807 /* RenderSVGTransformableContainer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGTransformableContainer.h; sourceTree = "<group>"; };
                A8A909AB0CBCD6B50029B807 /* RenderSVGTransformableContainer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderSVGTransformableContainer.cpp; sourceTree = "<group>"; };
                A8BC04911214F69600B5F122 /* HTMLEntityTable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTMLEntityTable.cpp; sourceTree = "<group>"; };
-               A8BCFD04120A046100B5F122 /* SVGPathSeg.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSeg.cpp; sourceTree = "<group>"; };
                A8C2280D11D4A59700D5A7D3 /* DocumentParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DocumentParser.cpp; sourceTree = "<group>"; };
                A8C2289F11D5722E00D5A7D3 /* DecodedDataDocumentParser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DecodedDataDocumentParser.h; sourceTree = "<group>"; };
                A8C228A011D5722E00D5A7D3 /* DecodedDataDocumentParser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = DecodedDataDocumentParser.cpp; sourceTree = "<group>"; };
                A8E544A90CA9D1C20097D09B /* DOMSVGAnimatedStringInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedStringInternal.h; sourceTree = "<group>"; };
                A8E544AB0CA9D1C20097D09B /* DOMSVGAnimatedRectInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedRectInternal.h; sourceTree = "<group>"; };
                A8E544AD0CA9D1C20097D09B /* DOMSVGAnimatedPreserveAspectRatioInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedPreserveAspectRatioInternal.h; sourceTree = "<group>"; };
-               A8E544B00CA9D1C20097D09B /* DOMSVGAnimatedPathData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedPathData.h; sourceTree = "<group>"; };
                A8E544B10CA9D1C20097D09B /* DOMSVGAnimatedNumberListInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedNumberListInternal.h; sourceTree = "<group>"; };
                A8E544B30CA9D1C20097D09B /* DOMSVGAnimatedNumberInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedNumberInternal.h; sourceTree = "<group>"; };
                A8E544B50CA9D1C20097D09B /* DOMSVGAnimatedLengthListInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DOMSVGAnimatedLengthListInternal.h; sourceTree = "<group>"; };
                B22277EB0D00BF1F0071B782 /* SVGAnimatedLengthList.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedLengthList.idl; sourceTree = "<group>"; };
                B22277EC0D00BF1F0071B782 /* SVGAnimatedNumber.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedNumber.idl; sourceTree = "<group>"; };
                B22277ED0D00BF1F0071B782 /* SVGAnimatedNumberList.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedNumberList.idl; sourceTree = "<group>"; };
-               B22277EE0D00BF1F0071B782 /* SVGAnimatedPathData.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGAnimatedPathData.cpp; sourceTree = "<group>"; };
-               B22277EF0D00BF1F0071B782 /* SVGAnimatedPathData.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedPathData.h; sourceTree = "<group>"; };
-               B22277F00D00BF1F0071B782 /* SVGAnimatedPathData.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedPathData.idl; sourceTree = "<group>"; };
                B22277F40D00BF1F0071B782 /* SVGAnimatedPreserveAspectRatio.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedPreserveAspectRatio.idl; sourceTree = "<group>"; };
                B22277F50D00BF1F0071B782 /* SVGAnimatedRect.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedRect.idl; sourceTree = "<group>"; };
                B22277F60D00BF1F0071B782 /* SVGAnimatedString.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGAnimatedString.idl; 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>"; };
-               B22278C70D00BF200071B782 /* SVGPathSegArc.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegArc.cpp; 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>"; };
-               B22278CB0D00BF200071B782 /* SVGPathSegClosePath.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegClosePath.cpp; 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>"; };
-               B22278CE0D00BF200071B782 /* SVGPathSegCurvetoCubic.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegCurvetoCubic.cpp; 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>"; };
-               B22278D20D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegCurvetoCubicSmooth.cpp; 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>"; };
-               B22278D60D00BF200071B782 /* SVGPathSegCurvetoQuadratic.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegCurvetoQuadratic.cpp; 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>"; };
-               B22278DA0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegCurvetoQuadraticSmooth.cpp; sourceTree = "<group>"; };
                B22278DB0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegCurvetoQuadraticSmooth.h; 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>"; };
-               B22278DE0D00BF200071B782 /* SVGPathSegLineto.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegLineto.cpp; sourceTree = "<group>"; };
                B22278DF0D00BF200071B782 /* SVGPathSegLineto.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegLineto.h; sourceTree = "<group>"; };
                B22278E00D00BF200071B782 /* SVGPathSegLinetoAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegLinetoAbs.idl; sourceTree = "<group>"; };
-               B22278E10D00BF200071B782 /* SVGPathSegLinetoHorizontal.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegLinetoHorizontal.cpp; 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>"; };
-               B22278E60D00BF200071B782 /* SVGPathSegLinetoVertical.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegLinetoVertical.cpp; 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>"; };
                B22278EA0D00BF200071B782 /* SVGPathSegList.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegList.cpp; sourceTree = "<group>"; };
                B22278EB0D00BF200071B782 /* SVGPathSegList.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegList.h; sourceTree = "<group>"; };
                B22278EC0D00BF210071B782 /* SVGPathSegList.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegList.idl; sourceTree = "<group>"; };
-               B22278ED0D00BF210071B782 /* SVGPathSegMoveto.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGPathSegMoveto.cpp; sourceTree = "<group>"; };
                B22278EE0D00BF210071B782 /* SVGPathSegMoveto.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGPathSegMoveto.h; sourceTree = "<group>"; };
                B22278EF0D00BF210071B782 /* SVGPathSegMovetoAbs.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegMovetoAbs.idl; sourceTree = "<group>"; };
                B22278F00D00BF210071B782 /* SVGPathSegMovetoRel.idl */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = SVGPathSegMovetoRel.idl; sourceTree = "<group>"; };
                B28C6A200D00C44800334AA4 /* SVGImageLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = SVGImageLoader.cpp; sourceTree = "<group>"; };
                B28C6A210D00C44800334AA4 /* SVGImageLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = SVGImageLoader.h; sourceTree = "<group>"; };
                B28C6A260D00C44800334AA4 /* xlinkattrs.in */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = text; path = xlinkattrs.in; sourceTree = "<group>"; };
-               B297BC6F0B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JSSVGPathSegListCustom.cpp; sourceTree = "<group>"; };
                B2A015920AF6CD53006BCE0E /* GraphicsContext.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsContext.cpp; sourceTree = "<group>"; };
                B2A015930AF6CD53006BCE0E /* GraphicsContext.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = GraphicsContext.h; sourceTree = "<group>"; };
                B2A015940AF6CD53006BCE0E /* GraphicsTypes.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = GraphicsTypes.cpp; sourceTree = "<group>"; };
                        isa = PBXGroup;
                        children = (
                                088A0DFB126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h */,
+                               089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */,
                                088A0DFC126EF1DB00978F7A /* SVGAnimatedProperty.h */,
                                088A0DFD126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h */,
                                088A0DFE126EF1DB00978F7A /* SVGAnimatedPropertyMacros.h */,
                                085A15921289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h */,
                                0810764312828556007C63BA /* SVGListProperty.h */,
                                088A0E00126EF1DB00978F7A /* SVGListPropertyTearOff.h */,
+                               08FF101F12950F5900F00276 /* SVGPathSegListPropertyTearOff.cpp */,
+                               084A0828128D7867002DB1F1 /* SVGPathSegListPropertyTearOff.h */,
                                088A0E01126EF1DB00978F7A /* SVGProperty.h */,
                                088A0E02126EF1DB00978F7A /* SVGPropertyTearOff.h */,
                                088A0E03126EF1DB00978F7A /* SVGPropertyTraits.h */,
                                8502AB6C0AD438E600378540 /* DOMSVGAnimatedNumberList.h */,
                                8502AB6D0AD438E600378540 /* DOMSVGAnimatedNumberList.mm */,
                                A8E544B10CA9D1C20097D09B /* DOMSVGAnimatedNumberListInternal.h */,
-                               A8E544B00CA9D1C20097D09B /* DOMSVGAnimatedPathData.h */,
-                               85ACEF060ACDCCCF001214FF /* DOMSVGAnimatedPathData.h */,
                                85ACEF080ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.h */,
                                85ACEF090ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.mm */,
                                A8E544AD0CA9D1C20097D09B /* DOMSVGAnimatedPreserveAspectRatioInternal.h */,
                                B22277EC0D00BF1F0071B782 /* SVGAnimatedNumber.idl */,
                                08B35B16127B6A88005314DD /* SVGAnimatedNumberList.h */,
                                B22277ED0D00BF1F0071B782 /* SVGAnimatedNumberList.idl */,
-                               B22277EE0D00BF1F0071B782 /* SVGAnimatedPathData.cpp */,
-                               B22277EF0D00BF1F0071B782 /* SVGAnimatedPathData.h */,
-                               B22277F00D00BF1F0071B782 /* SVGAnimatedPathData.idl */,
                                08FE0BC4127E2AC1000C4FB5 /* SVGAnimatedPreserveAspectRatio.h */,
                                B22277F40D00BF1F0071B782 /* SVGAnimatedPreserveAspectRatio.idl */,
                                08C859BF1274575300A5728D /* SVGAnimatedRect.h */,
                                8476C9EE11DF6A5800555B02 /* SVGPathParser.h */,
                                84300BD1120C9A710021954A /* SVGPathParserFactory.cpp */,
                                84300BD2120C9A710021954A /* SVGPathParserFactory.h */,
-                               A8BCFD04120A046100B5F122 /* SVGPathSeg.cpp */,
                                B22278C50D00BF200071B782 /* SVGPathSeg.h */,
                                B22278C60D00BF200071B782 /* SVGPathSeg.idl */,
-                               B22278C70D00BF200071B782 /* SVGPathSegArc.cpp */,
                                B22278C80D00BF200071B782 /* SVGPathSegArc.h */,
                                B22278C90D00BF200071B782 /* SVGPathSegArcAbs.idl */,
                                B22278CA0D00BF200071B782 /* SVGPathSegArcRel.idl */,
-                               B22278CB0D00BF200071B782 /* SVGPathSegClosePath.cpp */,
                                B22278CC0D00BF200071B782 /* SVGPathSegClosePath.h */,
                                B22278CD0D00BF200071B782 /* SVGPathSegClosePath.idl */,
-                               B22278CE0D00BF200071B782 /* SVGPathSegCurvetoCubic.cpp */,
                                B22278CF0D00BF200071B782 /* SVGPathSegCurvetoCubic.h */,
                                B22278D00D00BF200071B782 /* SVGPathSegCurvetoCubicAbs.idl */,
                                B22278D10D00BF200071B782 /* SVGPathSegCurvetoCubicRel.idl */,
-                               B22278D20D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.cpp */,
                                B22278D30D00BF200071B782 /* SVGPathSegCurvetoCubicSmooth.h */,
                                B22278D40D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothAbs.idl */,
                                B22278D50D00BF200071B782 /* SVGPathSegCurvetoCubicSmoothRel.idl */,
-                               B22278D60D00BF200071B782 /* SVGPathSegCurvetoQuadratic.cpp */,
                                B22278D70D00BF200071B782 /* SVGPathSegCurvetoQuadratic.h */,
                                B22278D80D00BF200071B782 /* SVGPathSegCurvetoQuadraticAbs.idl */,
                                B22278D90D00BF200071B782 /* SVGPathSegCurvetoQuadraticRel.idl */,
-                               B22278DA0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.cpp */,
                                B22278DB0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmooth.h */,
                                B22278DC0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothAbs.idl */,
                                B22278DD0D00BF200071B782 /* SVGPathSegCurvetoQuadraticSmoothRel.idl */,
-                               B22278DE0D00BF200071B782 /* SVGPathSegLineto.cpp */,
                                B22278DF0D00BF200071B782 /* SVGPathSegLineto.h */,
                                B22278E00D00BF200071B782 /* SVGPathSegLinetoAbs.idl */,
-                               B22278E10D00BF200071B782 /* SVGPathSegLinetoHorizontal.cpp */,
                                B22278E20D00BF200071B782 /* SVGPathSegLinetoHorizontal.h */,
                                B22278E30D00BF200071B782 /* SVGPathSegLinetoHorizontalAbs.idl */,
                                B22278E40D00BF200071B782 /* SVGPathSegLinetoHorizontalRel.idl */,
                                B22278E50D00BF200071B782 /* SVGPathSegLinetoRel.idl */,
-                               B22278E60D00BF200071B782 /* SVGPathSegLinetoVertical.cpp */,
                                B22278E70D00BF200071B782 /* SVGPathSegLinetoVertical.h */,
                                B22278E80D00BF200071B782 /* SVGPathSegLinetoVerticalAbs.idl */,
                                B22278E90D00BF200071B782 /* SVGPathSegLinetoVerticalRel.idl */,
                                8476C9E411DF6A0B00555B02 /* SVGPathSegListBuilder.h */,
                                84B6B975120F13E500B8EFAF /* SVGPathSegListSource.cpp */,
                                84B6B976120F13E500B8EFAF /* SVGPathSegListSource.h */,
-                               B22278ED0D00BF210071B782 /* SVGPathSegMoveto.cpp */,
                                B22278EE0D00BF210071B782 /* SVGPathSegMoveto.h */,
                                B22278EF0D00BF210071B782 /* SVGPathSegMovetoAbs.idl */,
                                B22278F00D00BF210071B782 /* SVGPathSegMovetoRel.idl */,
+                               082DE42C1292621600D923DF /* SVGPathSegWithContext.h */,
                                84300BD7120C9AD40021954A /* SVGPathSource.h */,
                                8419D2B7120E0C7600141F8F /* SVGPathStringBuilder.cpp */,
                                8419D2B8120E0C7600141F8F /* SVGPathStringBuilder.h */,
                                08A48A6D0E86CF6D00E225DD /* JSSVGElementInstanceCustom.cpp */,
                                08E4FE450E2BD41400F4CAE0 /* JSSVGLengthCustom.cpp */,
                                B2C96D8C0B3AF2B7005E80EC /* JSSVGPathSegCustom.cpp */,
-                               B297BC6F0B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp */,
                                087D97BE10FB8D7700C00874 /* JSSVGPODListCustom.h */,
                                1A2C40AA0DEB55AA005AF19E /* JSTextCustom.cpp */,
                                516BB7920CE91E6800512F79 /* JSTreeWalkerCustom.cpp */,
                                8502AB720AD438E600378540 /* DOMSVGAnimatedNumberList.h in Headers */,
                                8502ABA70AD4396900378540 /* DOMSVGAnimatedNumberListInternal.h in Headers */,
                                A8E545AF0CA9D1C20097D09B /* DOMSVGAnimatedNumberListInternal.h in Headers */,
-                               85ACEF0C0ACDCCCF001214FF /* DOMSVGAnimatedPathData.h in Headers */,
-                               A8E545AE0CA9D1C20097D09B /* DOMSVGAnimatedPathData.h in Headers */,
                                85ACEF0E0ACDCCCF001214FF /* DOMSVGAnimatedPreserveAspectRatio.h in Headers */,
                                85ACEF180ACDCD1A001214FF /* DOMSVGAnimatedPreserveAspectRatioInternal.h in Headers */,
                                A8E545AB0CA9D1C20097D09B /* DOMSVGAnimatedPreserveAspectRatioInternal.h in Headers */,
                                A88FE3340E5EEE87008D8C0F /* GraphicsContextPrivate.h in Headers */,
                                0F580B0D0F12A2690051D689 /* GraphicsLayer.h in Headers */,
                                0F580B0E0F12A2690051D689 /* GraphicsLayerClient.h in Headers */,
+                               499B3C59128C641E00E726C2 /* GraphicsLayerMac.h in Headers */,
                                B2A015AB0AF6CD53006BCE0E /* GraphicsTypes.h in Headers */,
                                C50B561712119D23008B46E0 /* GroupSettings.h in Headers */,
                                7693BAD2106C2DCA007B0823 /* HaltablePlugin.h in Headers */,
                                F33F053E120B0DA500E5743A /* InspectorDebuggerAgent.h in Headers */,
                                7A24587C1021EAF4000A00AA /* InspectorDOMAgent.h in Headers */,
                                41F061740F5F00AC00A07EAC /* InspectorDOMStorageResource.h in Headers */,
+                               3888F6EF128C9889000CA8E0 /* InspectorFileSystemAgent.h in Headers */,
                                F344C7141125B82C00F26EEE /* InspectorFrontendClient.h in Headers */,
                                F344C75311294D9D00F26EEE /* InspectorFrontendClientLocal.h in Headers */,
                                7A0E770F10C00A8800A0276E /* InspectorFrontendHost.h in Headers */,
                                088A0E04126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h in Headers */,
                                08B35B13127B6A7C005314DD /* SVGAnimatedNumber.h in Headers */,
                                08B35B17127B6A88005314DD /* SVGAnimatedNumberList.h in Headers */,
-                               B22279850D00BF220071B782 /* SVGAnimatedPathData.h in Headers */,
+                               089A8E07128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h in Headers */,
                                08FE0BC5127E2AC1000C4FB5 /* SVGAnimatedPreserveAspectRatio.h in Headers */,
                                088A0E05126EF1DB00978F7A /* SVGAnimatedProperty.h in Headers */,
                                088A0E06126EF1DB00978F7A /* SVGAnimatedPropertyDescription.h in Headers */,
                                08C859C01274575400A5728D /* SVGAnimatedRect.h in Headers */,
                                08525E631278C00100A84778 /* SVGAnimatedStaticPropertyTearOff.h in Headers */,
                                084DB59B128008CC002A6D64 /* SVGAnimatedString.h in Headers */,
+                               08250939128BD4D800E2ED8E /* SVGAnimatedTransformList.h in Headers */,
                                085A15931289A8DD002710E3 /* SVGAnimatedTransformListPropertyTearOff.h in Headers */,
                                B22279900D00BF220071B782 /* SVGAnimateElement.h in Headers */,
                                B22279930D00BF220071B782 /* SVGAnimateMotionElement.h in Headers */,
                                B2227A7D0D00BF220071B782 /* SVGPathSegLinetoVertical.h in Headers */,
                                B2227A810D00BF220071B782 /* SVGPathSegList.h in Headers */,
                                8476C9E611DF6A0B00555B02 /* SVGPathSegListBuilder.h in Headers */,
+                               084A0829128D7867002DB1F1 /* SVGPathSegListPropertyTearOff.h in Headers */,
                                84B6B978120F13E500B8EFAF /* SVGPathSegListSource.h in Headers */,
                                B2227A840D00BF220071B782 /* SVGPathSegMoveto.h in Headers */,
+                               082DE42D1292621600D923DF /* SVGPathSegWithContext.h in Headers */,
                                84300BD8120C9AD40021954A /* SVGPathSource.h in Headers */,
                                8419D2BA120E0C7600141F8F /* SVGPathStringBuilder.h in Headers */,
                                84300BD6120C9AAC0021954A /* SVGPathStringSource.h in Headers */,
                                93F199ED08245E59001E9ABC /* XSLTProcessor.h in Headers */,
                                E1BE512E0CF6C512002EA959 /* XSLTUnicodeSort.h in Headers */,
                                97DD4D870FDF4D6E00ECF9A4 /* XSSAuditor.h in Headers */,
-                               499B3C59128C641E00E726C2 /* GraphicsLayerMac.h in Headers */,
-                               08250939128BD4D800E2ED8E /* SVGAnimatedTransformList.h in Headers */,
-                               3888F6EF128C9889000CA8E0 /* InspectorFileSystemAgent.h in Headers */,
                                BCB92D4F1293550B00C8387F /* FontBaseline.h in Headers */,
                                BCA257151293C010007A263D /* VerticalPositionCache.h in Headers */,
                                BCAE1FA712939DB7004CB026 /* ScrollAnimatorMac.h in Headers */,
                                B2ED97710B1F55CE00257D0F /* GraphicsContextCG.cpp in Sources */,
                                B277B4040B22F37C0004BEC6 /* GraphicsContextMac.mm in Sources */,
                                0F580B0C0F12A2690051D689 /* GraphicsLayer.cpp in Sources */,
+                               499B3C5A128C641E00E726C2 /* GraphicsLayerMac.mm in Sources */,
                                B2A015AA0AF6CD53006BCE0E /* GraphicsTypes.cpp in Sources */,
                                C50B561612119D23008B46E0 /* GroupSettings.cpp in Sources */,
                                F55B3DBF1251F12D003EF269 /* HiddenInputType.cpp in Sources */,
                                F33F053D120B0DA500E5743A /* InspectorDebuggerAgent.cpp in Sources */,
                                7A24587B1021EAF4000A00AA /* InspectorDOMAgent.cpp in Sources */,
                                41F061750F5F00AC00A07EAC /* InspectorDOMStorageResource.cpp in Sources */,
+                               3888F6EE128C9889000CA8E0 /* InspectorFileSystemAgent.cpp in Sources */,
                                4F4F5FFB11CBD2E100A186BF /* InspectorFrontend.cpp in Sources */,
                                F344C75811294FF600F26EEE /* InspectorFrontendClientLocal.cpp in Sources */,
                                7A0E770E10C00A8800A0276E /* InspectorFrontendHost.cpp in Sources */,
                                B2FA3DD60AB75A6F000E5AC4 /* JSSVGPathSegLinetoVerticalAbs.cpp in Sources */,
                                B2FA3DD80AB75A6F000E5AC4 /* JSSVGPathSegLinetoVerticalRel.cpp in Sources */,
                                B2FA3DDA0AB75A6F000E5AC4 /* JSSVGPathSegList.cpp in Sources */,
-                               B297BC700B3C14CF0045A590 /* JSSVGPathSegListCustom.cpp in Sources */,
                                B2FA3DDC0AB75A6F000E5AC4 /* JSSVGPathSegMovetoAbs.cpp in Sources */,
                                B2FA3DDE0AB75A6F000E5AC4 /* JSSVGPathSegMovetoRel.cpp in Sources */,
                                B2FA3DE00AB75A6F000E5AC4 /* JSSVGPatternElement.cpp in Sources */,
                                65653F2D0D9727D200CA9723 /* SVGAltGlyphElement.cpp in Sources */,
                                B22279760D00BF220071B782 /* SVGAngle.cpp in Sources */,
                                B22279790D00BF220071B782 /* SVGAnimateColorElement.cpp in Sources */,
-                               B22279840D00BF220071B782 /* SVGAnimatedPathData.cpp in Sources */,
                                B222798F0D00BF220071B782 /* SVGAnimateElement.cpp in Sources */,
                                B22279920D00BF220071B782 /* SVGAnimateMotionElement.cpp in Sources */,
                                B22279940D00BF220071B782 /* SVGAnimateTransformElement.cpp in Sources */,
                                B2227A580D00BF220071B782 /* SVGPathElement.cpp in Sources */,
                                8476C9EF11DF6A5800555B02 /* SVGPathParser.cpp in Sources */,
                                84300BD3120C9A710021954A /* SVGPathParserFactory.cpp in Sources */,
-                               A8BCFD05120A046100B5F122 /* SVGPathSeg.cpp in Sources */,
-                               B2227A5D0D00BF220071B782 /* SVGPathSegArc.cpp in Sources */,
-                               B2227A610D00BF220071B782 /* SVGPathSegClosePath.cpp in Sources */,
-                               B2227A640D00BF220071B782 /* SVGPathSegCurvetoCubic.cpp in Sources */,
-                               B2227A680D00BF220071B782 /* SVGPathSegCurvetoCubicSmooth.cpp in Sources */,
-                               B2227A6C0D00BF220071B782 /* SVGPathSegCurvetoQuadratic.cpp in Sources */,
-                               B2227A700D00BF220071B782 /* SVGPathSegCurvetoQuadraticSmooth.cpp in Sources */,
-                               B2227A740D00BF220071B782 /* SVGPathSegLineto.cpp in Sources */,
-                               B2227A770D00BF220071B782 /* SVGPathSegLinetoHorizontal.cpp in Sources */,
-                               B2227A7C0D00BF220071B782 /* SVGPathSegLinetoVertical.cpp in Sources */,
                                B2227A800D00BF220071B782 /* SVGPathSegList.cpp in Sources */,
                                8476C9E511DF6A0B00555B02 /* SVGPathSegListBuilder.cpp in Sources */,
                                84B6B977120F13E500B8EFAF /* SVGPathSegListSource.cpp in Sources */,
-                               B2227A830D00BF220071B782 /* SVGPathSegMoveto.cpp in Sources */,
                                8419D2B9120E0C7600141F8F /* SVGPathStringBuilder.cpp in Sources */,
                                84300BDA120C9AED0021954A /* SVGPathStringSource.cpp in Sources */,
                                84C5B2FA1216DC810088B53A /* SVGPathTraversalStateBuilder.cpp in Sources */,
                                93F19B0508245E59001E9ABC /* XSLTProcessorLibxslt.cpp in Sources */,
                                E1BE512D0CF6C512002EA959 /* XSLTUnicodeSort.cpp in Sources */,
                                97DD4D860FDF4D6E00ECF9A4 /* XSSAuditor.cpp in Sources */,
-                               499B3C5A128C641E00E726C2 /* GraphicsLayerMac.mm in Sources */,
-                               3888F6EE128C9889000CA8E0 /* InspectorFileSystemAgent.cpp in Sources */,
+                               08FF102012950F5A00F00276 /* SVGPathSegListPropertyTearOff.cpp in Sources */,
                                BCAE1FA612939DB7004CB026 /* ScrollAnimatorMac.cpp in Sources */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
index e46b050..a80b70e 100644 (file)
 #include "JSSVGElementInstanceCustom.cpp"
 #include "JSSVGLengthCustom.cpp"
 #include "JSSVGPathSegCustom.cpp"
-#include "JSSVGPathSegListCustom.cpp"
 #include "JSScriptProfileNodeCustom.cpp"
 #include "JSSharedWorkerCustom.cpp"
 #include "JSStorageCustom.cpp"
index e4cff4a..02daf93 100644 (file)
@@ -611,7 +611,7 @@ void setDOMException(ExecState* exec, ExceptionCode ec)
             break;
 #if ENABLE(SVG)
         case SVGExceptionType:
-            errorObject = toJS(exec, globalObject, SVGException::create(description).get(), 0 /* no context on purpose */);
+            errorObject = toJS(exec, globalObject, SVGException::create(description).get());
             break;
 #endif
 #if ENABLE(XPATH)
index 64a3dad..54e9cf6 100644 (file)
@@ -25,7 +25,6 @@
 #include "JSDOMGlobalObject.h"
 #include "JSDOMWrapper.h"
 #include "DOMWrapperWorld.h"
-#include "JSSVGContextCache.h"
 #include "Document.h"
 #include <runtime/Completion.h>
 #include <runtime/Lookup.h>
@@ -50,10 +49,6 @@ namespace WebCore {
 
     typedef int ExceptionCode;
 
-#if ENABLE(SVG)
-    class SVGElement;
-#endif
-
     // FIXME: This class should collapse into DOMObject once all DOMObjects are
     // updated to store a globalObject pointer.
     class DOMObjectWithGlobalPointer : public DOMObject {
@@ -185,28 +180,6 @@ namespace WebCore {
         return createDOMObjectWrapper<WrapperClass>(exec, globalObject, object);
     }
 
-#if ENABLE(SVG)
-    #define CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, className, object, context) createDOMObjectWrapper<JS##className>(exec, globalObject, static_cast<className*>(object), context)
-    template<class WrapperClass, class DOMClass> inline DOMObject* createDOMObjectWrapper(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, DOMClass* object, SVGElement* context)
-    {
-        DOMObject* wrapper = createDOMObjectWrapper<WrapperClass, DOMClass>(exec, globalObject, object);
-        ASSERT(wrapper);
-        if (context)
-            JSSVGContextCache::addWrapper(wrapper, context);
-        return wrapper;
-    }
-    template<class WrapperClass, class DOMClass> inline JSC::JSValue getDOMObjectWrapper(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, DOMClass* object, SVGElement* context)
-    {
-        if (!object)
-            return JSC::jsNull();
-        if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, object)) {
-            ASSERT(JSSVGContextCache::svgContextForDOMObject(wrapper) == context);
-            return wrapper;
-        }
-        return createDOMObjectWrapper<WrapperClass, DOMClass>(exec, globalObject, object, context);
-    }
-#endif
-
     #define CREATE_DOM_NODE_WRAPPER(exec, globalObject, className, object) createDOMNodeWrapper<JS##className>(exec, globalObject, static_cast<className*>(object))
     template<class WrapperClass, class DOMClass> inline JSNode* createDOMNodeWrapper(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, DOMClass* node)
     {
index eac2c4b..f0aa86b 100644 (file)
@@ -58,58 +58,56 @@ using namespace JSC;
 
 namespace WebCore {
 
-JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, SVGPathSeg* object, SVGElement* context)
+JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, SVGPathSeg* object)
 {
     if (!object)
         return jsNull();
 
-    if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, object)) {
-        ASSERT(JSSVGContextCache::svgContextForDOMObject(wrapper) == context);
+    if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, object))
         return wrapper;
-    }
 
     switch (object->pathSegType()) {
     case SVGPathSeg::PATHSEG_CLOSEPATH:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegClosePath, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegClosePath, object);
     case SVGPathSeg::PATHSEG_MOVETO_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegMovetoAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegMovetoAbs, object);
     case SVGPathSeg::PATHSEG_MOVETO_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegMovetoRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegMovetoRel, object);
     case SVGPathSeg::PATHSEG_LINETO_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoAbs, object);
     case SVGPathSeg::PATHSEG_LINETO_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoRel, object);
     case SVGPathSeg::PATHSEG_CURVETO_CUBIC_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicAbs, object);
     case SVGPathSeg::PATHSEG_CURVETO_CUBIC_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicRel, object);
     case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticAbs, object);
     case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticRel, object);
     case SVGPathSeg::PATHSEG_ARC_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegArcAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegArcAbs, object);
     case SVGPathSeg::PATHSEG_ARC_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegArcRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegArcRel, object);
     case SVGPathSeg::PATHSEG_LINETO_HORIZONTAL_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoHorizontalAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoHorizontalAbs, object);
     case SVGPathSeg::PATHSEG_LINETO_HORIZONTAL_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoHorizontalRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoHorizontalRel, object);
     case SVGPathSeg::PATHSEG_LINETO_VERTICAL_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoVerticalAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoVerticalAbs, object);
     case SVGPathSeg::PATHSEG_LINETO_VERTICAL_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoVerticalRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegLinetoVerticalRel, object);
     case SVGPathSeg::PATHSEG_CURVETO_CUBIC_SMOOTH_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicSmoothAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicSmoothAbs, object);
     case SVGPathSeg::PATHSEG_CURVETO_CUBIC_SMOOTH_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicSmoothRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoCubicSmoothRel, object);
     case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticSmoothAbs, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticSmoothAbs, object);
     case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticSmoothRel, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSegCurvetoQuadraticSmoothRel, object);
     case SVGPathSeg::PATHSEG_UNKNOWN:
     default:
-        return CREATE_SVG_OBJECT_WRAPPER(exec, globalObject, SVGPathSeg, object, context);
+        return CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGPathSeg, object);
     }
 }
 
diff --git a/WebCore/bindings/js/JSSVGPathSegListCustom.cpp b/WebCore/bindings/js/JSSVGPathSegListCustom.cpp
deleted file mode 100644 (file)
index 9767c1a..0000000
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2006, 2007, 2008 Nikolas Zimmermann <zimmermann@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.
- */
-
-#include "config.h"
-
-#if ENABLE(SVG)
-#include "JSSVGPathSegList.h"
-
-#include "Document.h"
-#include "Frame.h"
-#include "JSSVGContextCache.h"
-#include "JSSVGPathSeg.h"
-#include "SVGDocumentExtensions.h"
-#include "SVGElement.h"
-#include "SVGPathSegList.h"
-
-#include <wtf/Assertions.h>
-
-using namespace JSC;
-
-namespace WebCore {
-
-JSValue JSSVGPathSegList::clear(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-
-    SVGPathSegList* list = impl();
-    list->clear(ec);
-
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return jsUndefined();
-}
-
-JSValue JSSVGPathSegList::initialize(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-    SVGPathSeg* newItem = toSVGPathSeg(exec->argument(0));
-
-    SVGPathSegList* list = impl();
-
-    SVGPathSeg* obj = WTF::getPtr(list->initialize(newItem, ec));
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), obj, context);
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return result;
-}
-
-JSValue JSSVGPathSegList::getItem(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-
-    bool indexOk;
-    unsigned index = finiteInt32Value(exec->argument(0), exec, indexOk);
-    if (!indexOk) {
-        setDOMException(exec, TYPE_MISMATCH_ERR);
-        return jsUndefined();
-    }
-
-    SVGPathSegList* list = impl();
-    SVGPathSeg* obj = WTF::getPtr(list->getItem(index, ec));
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), obj, context);
-    setDOMException(exec, ec);
-    return result;
-}
-
-JSValue JSSVGPathSegList::insertItemBefore(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-    SVGPathSeg* newItem = toSVGPathSeg(exec->argument(0));
-
-    bool indexOk;
-    unsigned index = finiteInt32Value(exec->argument(1), exec, indexOk);
-    if (!indexOk) {
-        setDOMException(exec, TYPE_MISMATCH_ERR);
-        return jsUndefined();
-    }
-
-    SVGPathSegList* list = impl();
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->insertItemBefore(newItem, index, ec)), context);
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return result;
-}
-
-JSValue JSSVGPathSegList::replaceItem(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-    SVGPathSeg* newItem = toSVGPathSeg(exec->argument(0));
-    
-    bool indexOk;
-    unsigned index = finiteInt32Value(exec->argument(1), exec, indexOk);
-    if (!indexOk) {
-        setDOMException(exec, TYPE_MISMATCH_ERR);
-        return jsUndefined();
-    }
-
-    SVGPathSegList* list = impl();
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->replaceItem(newItem, index, ec)), context);
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return result;
-}
-
-JSValue JSSVGPathSegList::removeItem(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-    
-    bool indexOk;
-    unsigned index = finiteInt32Value(exec->argument(0), exec, indexOk);
-    if (!indexOk) {
-        setDOMException(exec, TYPE_MISMATCH_ERR);
-        return jsUndefined();
-    }
-
-    SVGPathSegList* list = impl();
-
-    RefPtr<SVGPathSeg> obj(list->removeItem(index, ec));
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), obj.get(), context);
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return result;
-}
-
-JSValue JSSVGPathSegList::appendItem(ExecState* exec)
-{
-    ExceptionCode ec = 0;
-    SVGPathSeg* newItem = toSVGPathSeg(exec->argument(0));
-
-    SVGPathSegList* list = impl();
-    SVGElement* context = JSSVGContextCache::svgContextForDOMObject(this);
-
-    JSValue result = toJS(exec, globalObject(), WTF::getPtr(list->appendItem(newItem, ec)), context);
-    setDOMException(exec, ec);
-
-    JSSVGContextCache::propagateSVGDOMChange(this, list->associatedAttributeName());
-    return result;
-}
-
-}
-
-#endif // ENABLE(SVG)
index 1e56b0c..42f3f1c 100644 (file)
@@ -75,6 +75,7 @@ my %svgTypeNeedingTearOff = (
     "SVGMatrix" => "SVGPropertyTearOff<SVGMatrix>",
     "SVGNumber" => "SVGPropertyTearOff<float>",
     "SVGNumberList" => "SVGListPropertyTearOff<SVGNumberList>",
+    "SVGPathSegList" => "SVGPathSegListPropertyTearOff",
     "SVGPoint" => "SVGPropertyTearOff<FloatPoint>",
     "SVGPointList" => "SVGListPropertyTearOff<SVGPointList>",
     "SVGPreserveAspectRatio" => "SVGPropertyTearOff<SVGPreserveAspectRatio>",
index ea32615..542b67a 100644 (file)
@@ -316,25 +316,6 @@ sub AddClassForwardIfNeeded
     }
 }
 
-# FIXME: This method will go away once all SVG animated properties are converted to the new scheme.
-sub IsSVGTypeNeedingContextParameter
-{
-    # FIXME: This function will be removed, as soon the PODType concept is gone, and all SVG datatypes use the new style JS bindings.
-
-    my $implClassName = shift;
-
-    return 0 unless $implClassName =~ /SVG/;
-    return 0 if $implClassName =~ /Element/;
-    return 0 if $codeGenerator->IsSVGAnimatedType($implClassName);
-    return 0 if $codeGenerator->IsSVGTypeNeedingTearOff($implClassName);
-
-    my @noContextNeeded = ("SVGColor", "SVGDocument", "SVGPaint", "SVGZoomEvent");
-    foreach (@noContextNeeded) {
-        return 0 if $implClassName eq $_;
-    }
-    return 1;
-}
-
 sub HashValueForClassAndName
 {
     my $class = shift;
@@ -937,8 +918,6 @@ sub GenerateHeader
     if (!$hasParent || $dataNode->extendedAttributes->{"GenerateToJS"} || $dataNode->extendedAttributes->{"CustomToJS"}) {
         if ($svgPropertyType) {
             push(@headerContent, "JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, $implType*);\n");
-        } elsif (IsSVGTypeNeedingContextParameter($implClassName)) {
-            push(@headerContent, "JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, $implType*, SVGElement* context);\n");
         } else {
             push(@headerContent, "JSC::JSValue toJS(JSC::ExecState*, JSDOMGlobalObject*, $implType*);\n");
         }
@@ -1461,8 +1440,6 @@ sub GenerateImplementation
             } else {
                 push(@implContent, "    forgetDOMObject(this, impl());\n");
             }
-
-            push(@implContent, "    JSSVGContextCache::forgetWrapper(this);\n") if IsSVGTypeNeedingContextParameter($implClassName);
         }
 
         push(@implContent, "}\n\n");
@@ -1793,9 +1770,6 @@ sub GenerateImplementation
                                 push(@implContent, ", ec") if @{$attribute->setterExceptions};
                                 push(@implContent, ");\n");
                                 push(@implContent, "    setDOMException(exec, ec);\n") if @{$attribute->setterExceptions};
-                                if (IsSVGTypeNeedingContextParameter($implClassName)) {
-                                    push(@implContent, "    JSSVGContextCache::propagateSVGDOMChange(castedThis, imp->associatedAttributeName());\n");
-                                }
                             }
                         }
                         
@@ -2115,16 +2089,12 @@ sub GenerateImplementation
     if ((!$hasParent or $dataNode->extendedAttributes->{"GenerateToJS"}) and !$dataNode->extendedAttributes->{"CustomToJS"}) {
         if ($svgPropertyType) {
             push(@implContent, "JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, $implType* object)\n");
-        } elsif ($podType or IsSVGTypeNeedingContextParameter($implClassName)) {
-            push(@implContent, "JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, $implType* object, SVGElement* context)\n");
         } else {
             push(@implContent, "JSC::JSValue toJS(JSC::ExecState* exec, JSDOMGlobalObject* globalObject, $implType* object)\n");
         }
         push(@implContent, "{\n");
         if ($svgPropertyType) {
             push(@implContent, "    return getDOMObjectWrapper<$className, $implType>(exec, globalObject, object);\n");
-        } elsif (IsSVGTypeNeedingContextParameter($implClassName)) {
-            push(@implContent, "    return getDOMObjectWrapper<$className>(exec, globalObject, object, context);\n");
         } else {
             push(@implContent, "    return getDOMObjectWrapper<$className>(exec, globalObject, object);\n");
         }
@@ -2425,6 +2395,11 @@ sub GetSVGPropertyTypes
         $headerIncludes{"$svgWrappedNativeType.h"} = 1;
         $headerIncludes{"SVGAnimatedListPropertyTearOff.h"} = 1;
         $headerIncludes{"SVGTransformListPropertyTearOff.h"} = 1;
+    } elsif ($svgNativeType =~ /SVGPathSegListPropertyTearOff/) {
+        $svgListPropertyType = $svgWrappedNativeType;
+        $headerIncludes{"$svgWrappedNativeType.h"} = 1;
+        $headerIncludes{"SVGAnimatedListPropertyTearOff.h"} = 1;
+        $headerIncludes{"SVGPathSegListPropertyTearOff.h"} = 1;
     }
 
     return ($svgPropertyType, $svgListPropertyType, $svgNativeType);
@@ -2553,11 +2528,6 @@ sub NativeToJSValue
 
     return $value if $codeGenerator->IsSVGAnimatedType($type);
 
-    if (IsSVGTypeNeedingContextParameter($type)) {
-        my $contextPtr = IsSVGTypeNeedingContextParameter($implClassName) ? "JSSVGContextCache::svgContextForDOMObject(castedThis)" : "imp";
-        return "toJS(exec, $globalObject, WTF::getPtr($value), $contextPtr)";
-    }
-
     if ($signature->extendedAttributes->{"ReturnsNew"}) {        
         return "toJSNewlyCreated(exec, $globalObject, WTF::getPtr($value))";
     }
@@ -2594,7 +2564,7 @@ sub NativeToJSValue
         } elsif ($tearOffType =~ /SVGStaticListPropertyTearOff/) {
             my $extraImp = "GetOwnerElementForType<$implClassName, IsDerivedFromSVGElement<$implClassName>::value>::ownerElement(imp), ";
             $value = "${tearOffType}::create($extraImp$value)";
-        } elsif (not $tearOffType =~ /SVGPointList/) {
+        } elsif (not $tearOffType =~ /SVG(Point|PathSeg)List/) {
             $value = "${tearOffType}::create($value)";
         }
     }
index 50334a2..979b71e 100644 (file)
@@ -673,6 +673,9 @@ sub GetSVGPropertyTypes
     } elsif ($svgNativeType =~ /SVGTransformListPropertyTearOff/) {
         $svgListPropertyType = "WebCore::$svgWrappedNativeType";
         $svgListPropertyType =~ s/</\<WebCore::/;
+    } elsif ($svgNativeType =~ /SVGPathSegListPropertyTearOff/) {
+        $svgListPropertyType = "WebCore::$svgWrappedNativeType";
+        $svgListPropertyType =~ s/</\<WebCore::/;
     }
 
     return ($svgPropertyType, $svgListPropertyType, $svgNativeType);
@@ -1004,6 +1007,7 @@ sub GenerateHeader
         if ($svgListPropertyType) {
             push(@internalHeaderContent, "#import <WebCore/SVGAnimatedListPropertyTearOff.h>\n\n");
             push(@internalHeaderContent, "#import <WebCore/SVGTransformListPropertyTearOff.h>\n\n") if $svgListPropertyType =~ /SVGTransformList/;
+            push(@internalHeaderContent, "#import <WebCore/SVGPathSegListPropertyTearOff.h>\n\n") if $svgListPropertyType =~ /SVGPathSegList/;
         }
         push(@internalHeaderContent, $interfaceAvailabilityVersionCheck) if length $interfaceAvailabilityVersion;
 
@@ -1310,13 +1314,13 @@ sub GenerateImplementation
                         my $updateMethod = "&${implClassNameWithNamespace}::update" . $codeGenerator->WK_ucfirst($getter);
                         $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create(IMPL, $getterContentHead$getterContentTail, $updateMethod";
                         $getterContentTail .= "))";
+                    } elsif ($idlTypeWithNamespace =~ /SVG(Point|PathSeg)List/) {
+                        $getterContentHead = "kit(WTF::getPtr($getterContentHead";
+                        $getterContentTail .= "))";
                     } elsif ($idlTypeWithNamespace =~ /SVGStaticListPropertyTearOff/) {
                         my $extraImp = "WebCore::GetOwnerElementForType<$implClassNameWithNamespace, WebCore::IsDerivedFromSVGElement<$implClassNameWithNamespace>::value>::ownerElement(IMPL), ";
                         $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($extraImp$getterContentHead";
                         $getterContentTail .= ")))";
-                    } elsif ($idlTypeWithNamespace =~ /SVGPointList/) {
-                        $getterContentHead = "kit(WTF::getPtr($getterContentHead";
-                        $getterContentTail .= "))";
                     } else {
                         $getterContentHead = "kit(WTF::getPtr(${idlTypeWithNamespace}::create($getterContentHead";
                         $getterContentTail .= ")))";
index 26c1dc7..d811ef8 100644 (file)
@@ -679,18 +679,9 @@ sub GenerateNormalAttrGetter
     my $interfaceName = shift;
 
     my $attrExt = $attribute->signature->extendedAttributes;
-
     my $attrName = $attribute->signature->name;
-
     my $attrType = GetTypeFromSignature($attribute->signature);
-
     my $nativeType = GetNativeTypeFromSignature($attribute->signature, -1);
-    my $skipContext = 0;
-
-    # Special case: SVGZoomEvent's attributes are all read-only
-    if ($implClassName eq "SVGZoomEvent") {
-        $skipContext = 1;
-    }
 
     my $getterStringUsesImp = $implClassName ne "SVGNumber";
     my $svgNativeType = $codeGenerator->GetSVGTypeNeedingTearOff($implClassName);
@@ -834,14 +825,6 @@ END
         return;
     }
 
-    if (IsSVGTypeNeedingContextParameter($attrType) && !$skipContext) {
-        push(@implContentDecls, GenerateSVGContextRetrieval($implClassName, "    "));
-        # The templating associated with passing withSVGContext()'s return value directly into toV8 can get compilers confused,
-        # so just manually set the return value to a PassRefPtr of the expected type.
-        push(@implContentDecls, "    PassRefPtr<$attrType> resultAsPassRefPtr = V8Proxy::withSVGContext($result, context);\n");
-        $result = "resultAsPassRefPtr";
-    }
-
     if ($codeGenerator->IsSVGAnimatedType($implClassName) and $codeGenerator->IsSVGTypeNeedingTearOff($attrType)) {
         $implIncludes{"V8$attrType.h"} = 1;
         my $svgNativeType = $codeGenerator->GetSVGTypeNeedingTearOff($attrType);
@@ -879,7 +862,7 @@ END
         } elsif ($tearOffType =~ /SVGStaticListPropertyTearOff/) {
             my $extraImp = "GetOwnerElementForType<$implClassName, IsDerivedFromSVGElement<$implClassName>::value>::ownerElement(imp), ";
             push(@implContentDecls, "    return toV8(WTF::getPtr(${tearOffType}::create($extraImp$result)));\n");
-        } elsif ($tearOffType =~ /SVGPointList/) {
+        } elsif ($tearOffType =~ /SVG(Point|PathSeg)List/) {
             push(@implContentDecls, "    return toV8(WTF::getPtr($result));\n");
         } else {
             push(@implContentDecls, "    return toV8(WTF::getPtr(${tearOffType}::create($result)));\n");
@@ -1036,10 +1019,6 @@ END
         } else {
             push(@implContentDecls, "    wrapper->commitChange();\n");
         }
-    } elsif (IsSVGTypeNeedingContextParameter($implClassName)) {
-        $implIncludes{"SVGElement.h"} = 1;
-        push(@implContentDecls, "    if (SVGElement* context = V8Proxy::svgContext(imp))\n");
-        push(@implContentDecls, "        context->svgAttributeChanged(imp->associatedAttributeName());\n");
     }
 
     push(@implContentDecls, "    return;\n");
@@ -2720,23 +2699,6 @@ sub GenerateFunctionCallString()
         return $result;
     }
 
-    my $generatedSVGContextRetrieval = 0;
-    # If the return type needs an SVG context, output it
-    if (IsSVGTypeNeedingContextParameter($returnType)) {
-        $result .= GenerateSVGContextAssignment($implClassName, $return . ".get()", $indent);
-        $generatedSVGContextRetrieval = 1;
-    }
-
-    if (IsSVGTypeNeedingContextParameter($implClassName) && $implClassName =~ /List$/ && IsSVGListMutator($name)) {
-        if (!$generatedSVGContextRetrieval) {
-            $result .= GenerateSVGContextRetrieval($implClassName, $indent);
-            $generatedSVGContextRetrieval = 1;
-        }
-
-        $result .= $indent . "context->svgAttributeChanged(imp->associatedAttributeName());\n";
-        $implIncludes{"SVGElement.h"} = 1;
-    }
-
     # If the implementing class is a POD type, commit changes
     if ($codeGenerator->IsSVGTypeNeedingTearOff($implClassName) and not $implClassName =~ /List$/) {
         $result .= $indent . "wrapper->commitChange();\n";
@@ -3206,64 +3168,6 @@ sub WriteData
     }
 }
 
-# FIXME: This method will go away once all SVG animated properties are converted to the new scheme.
-sub IsSVGTypeNeedingContextParameter
-{
-    my $implClassName = shift;
-
-    return 0 unless $implClassName =~ /SVG/;
-    return 0 if $implClassName =~ /Element/;
-    return 0 if $codeGenerator->IsSVGAnimatedType($implClassName);
-    return 0 if $codeGenerator->IsSVGTypeNeedingTearOff($implClassName);
-
-    my @noContextNeeded = ("SVGColor", "SVGDocument", "SVGPaintType", "SVGPaint", "SVGZoomEvent");
-    foreach (@noContextNeeded) {
-        return 0 if $implClassName eq $_;
-    }
-    return 1;
-}
-
-# FIXME: This method will go away once all SVG animated properties are converted to the new scheme.
-sub GenerateSVGContextAssignment
-{
-    my $srcType = shift;
-    my $value = shift;
-    my $indent = shift;
-
-    $result = GenerateSVGContextRetrieval($srcType, $indent);
-    $result .= $indent . "V8Proxy::setSVGContext($value, context);\n";
-
-    return $result;
-}
-
-# FIXME: This method will go away once all SVG animated properties are converted to the new scheme.
-sub GenerateSVGContextRetrieval
-{
-    my $srcType = shift;
-    my $indent = shift;
-
-    my $contextDecl = "imp";
-    if (IsSVGTypeNeedingContextParameter($srcType)) {
-        $contextDecl = "V8Proxy::svgContext($contextDecl)";
-    }
-
-    return $indent . "SVGElement* context = $contextDecl;\n";
-}
-
-sub IsSVGListMutator
-{
-    my $functionName = shift;
-
-    return 1 if $functionName eq "clear";
-    return 1 if $functionName eq "initialize";
-    return 1 if $functionName eq "insertItemBefore";
-    return 1 if $functionName eq "replaceItem";
-    return 1 if $functionName eq "removeItem";
-    return 1 if $functionName eq "appendItem";
-
-    return 0;
-}
-
 sub GetVisibleInterfaceName
 {
     my $interfaceName = shift;
index b9a854d..4e47ec8 100644 (file)
@@ -415,7 +415,8 @@ static TextStream& operator<<(TextStream& ts, const RenderSVGPath& path)
     } else if (svgElement->hasTagName(SVGNames::pathTag)) {
         SVGPathElement* element = static_cast<SVGPathElement*>(svgElement);
         String pathString;
-        SVGPathParserFactory::self()->buildStringFromSVGPathSegList(element->pathSegList(), pathString, UnalteredParsing);
+        // FIXME: We should switch to UnalteredParsing here - this will affect the path dumping output of dozens of tests.
+        SVGPathParserFactory::self()->buildStringFromByteStream(element->pathByteStream(), pathString, NormalizedParsing);
         writeNameAndQuotedValue(ts, "data", pathString);
     } else
         ASSERT_NOT_REACHED();
index e01af2c..65e0d3a 100644 (file)
@@ -30,7 +30,6 @@
 #include "SVGAltGlyphElement.cpp"
 #include "SVGAngle.cpp"
 #include "SVGAnimateColorElement.cpp"
-#include "SVGAnimatedPathData.cpp"
 #include "SVGAnimateElement.cpp"
 #include "SVGAnimateMotionElement.cpp"
 #include "SVGAnimateTransformElement.cpp"
 #include "SVGPathElement.cpp"
 #include "SVGPathParser.cpp"
 #include "SVGPathParserFactory.cpp"
-#include "SVGPathSeg.cpp"
-#include "SVGPathSegArc.cpp"
-#include "SVGPathSegClosePath.cpp"
-#include "SVGPathSegCurvetoCubic.cpp"
-#include "SVGPathSegCurvetoCubicSmooth.cpp"
-#include "SVGPathSegCurvetoQuadratic.cpp"
-#include "SVGPathSegCurvetoQuadraticSmooth.cpp"
-#include "SVGPathSegLineto.cpp"
-#include "SVGPathSegLinetoHorizontal.cpp"
-#include "SVGPathSegLinetoVertical.cpp"
-#include "SVGPathSegList.cpp"
 #include "SVGPathSegListBuilder.cpp"
 #include "SVGPathSegListSource.cpp"
-#include "SVGPathSegMoveto.cpp"
 #include "SVGPathStringBuilder.cpp"
 #include "SVGPathStringSource.cpp"
 #include "SVGPathTraversalStateBuilder.cpp"
diff --git a/WebCore/svg/SVGAnimatedPathData.cpp b/WebCore/svg/SVGAnimatedPathData.cpp
deleted file mode 100644 (file)
index 6f54888..0000000
+++ /dev/null
@@ -1 +0,0 @@
-// This file is now intentionally empty. Delete it after removing it from all the build systems and project files.
diff --git a/WebCore/svg/SVGAnimatedPathData.h b/WebCore/svg/SVGAnimatedPathData.h
deleted file mode 100644 (file)
index 5ff66d3..0000000
+++ /dev/null
@@ -1,45 +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.
- */
-
-#ifndef SVGAnimatedPathData_h
-#define SVGAnimatedPathData_h
-
-#if ENABLE(SVG)
-
-namespace WebCore {
-
-    class SVGPathSegList;
-
-    class SVGAnimatedPathData {
-    public:
-        virtual ~SVGAnimatedPathData() { }
-
-        virtual SVGPathSegList* pathSegList() const = 0;
-        virtual SVGPathSegList* normalizedPathSegList() const = 0;
-        virtual SVGPathSegList* animatedPathSegList() const = 0;
-        virtual SVGPathSegList* animatedNormalizedPathSegList() const = 0;
-    };
-
-} // namespace WebCore
-
-#endif // ENABLE(SVG)
-#endif
-
-// vim:ts=4:noet
diff --git a/WebCore/svg/SVGAnimatedPathData.idl b/WebCore/svg/SVGAnimatedPathData.idl
deleted file mode 100644 (file)
index eae1340..0000000
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2006 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. 
- */
-
-module svg {
-
-    interface [Conditional=SVG, ObjCProtocol, OmitConstructor] SVGAnimatedPathData {
-        readonly attribute SVGPathSegList   pathSegList;
-        readonly attribute SVGPathSegList   normalizedPathSegList;
-        readonly attribute SVGPathSegList   animatedPathSegList;
-        readonly attribute SVGPathSegList   animatedNormalizedPathSegList;
-    };
-
-}
index 8f8bef9..f9432ce 100644 (file)
@@ -26,7 +26,6 @@
 #include "Attribute.h"
 #include "RenderSVGPath.h"
 #include "RenderSVGResource.h"
-#include "SVGNames.h"
 #include "SVGPathParserFactory.h"
 #include "SVGPathSegArc.h"
 #include "SVGPathSegClosePath.h"
@@ -38,6 +37,7 @@
 #include "SVGPathSegLinetoHorizontal.h"
 #include "SVGPathSegLinetoVertical.h"
 #include "SVGPathSegList.h"
+#include "SVGPathSegListPropertyTearOff.h"
 #include "SVGPathSegListBuilder.h"
 #include "SVGPathSegMoveto.h"
 #include "SVGSVGElement.h"
@@ -46,6 +46,8 @@ namespace WebCore {
 
 inline SVGPathElement::SVGPathElement(const QualifiedName& tagName, Document* document)
     : SVGStyledTransformableElement(tagName, document)
+    , m_pathByteStream(SVGPathByteStream::create())
+    , m_pathSegList(PathSegUnalteredRole)
 {
 }
 
@@ -75,112 +77,110 @@ unsigned long SVGPathElement::getPathSegAtLength(float length)
 {
     SVGPathParserFactory* factory = SVGPathParserFactory::self();
     unsigned long pathSeg = 0;
-    factory->getSVGPathSegAtLengthFromSVGPathSegList(pathSegList(), length, pathSeg);
+    factory->getSVGPathSegAtLengthFromSVGPathByteStream(m_pathByteStream.get(), length, pathSeg);
     return pathSeg;
 }
 
-PassRefPtr<SVGPathSegClosePath> SVGPathElement::createSVGPathSegClosePath()
+PassRefPtr<SVGPathSegClosePath> SVGPathElement::createSVGPathSegClosePath(SVGPathSegRole role)
 {
-    return SVGPathSegClosePath::create();
+    return SVGPathSegClosePath::create(this, role);
 }
 
-PassRefPtr<SVGPathSegMovetoAbs> SVGPathElement::createSVGPathSegMovetoAbs(float x, float y)
+PassRefPtr<SVGPathSegMovetoAbs> SVGPathElement::createSVGPathSegMovetoAbs(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegMovetoAbs::create(x, y);
+    return SVGPathSegMovetoAbs::create(this, role, x, y);
 }
 
-PassRefPtr<SVGPathSegMovetoRel> SVGPathElement::createSVGPathSegMovetoRel(float x, float y)
+PassRefPtr<SVGPathSegMovetoRel> SVGPathElement::createSVGPathSegMovetoRel(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegMovetoRel::create(x, y);
+    return SVGPathSegMovetoRel::create(this, role, x, y);
 }
 
-PassRefPtr<SVGPathSegLinetoAbs> SVGPathElement::createSVGPathSegLinetoAbs(float x, float y)
+PassRefPtr<SVGPathSegLinetoAbs> SVGPathElement::createSVGPathSegLinetoAbs(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoAbs::create(x, y);
+    return SVGPathSegLinetoAbs::create(this, role, x, y);
 }
 
-PassRefPtr<SVGPathSegLinetoRel> SVGPathElement::createSVGPathSegLinetoRel(float x, float y)
+PassRefPtr<SVGPathSegLinetoRel> SVGPathElement::createSVGPathSegLinetoRel(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoRel::create(x, y);
+    return SVGPathSegLinetoRel::create(this, role, x, y);
 }
 
-PassRefPtr<SVGPathSegCurvetoCubicAbs> SVGPathElement::createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2)
+PassRefPtr<SVGPathSegCurvetoCubicAbs> SVGPathElement::createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoCubicAbs::create(x, y, x1, y1, x2, y2);
+    return SVGPathSegCurvetoCubicAbs::create(this, role, x, y, x1, y1, x2, y2);
 }
 
-PassRefPtr<SVGPathSegCurvetoCubicRel> SVGPathElement::createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2)
+PassRefPtr<SVGPathSegCurvetoCubicRel> SVGPathElement::createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoCubicRel::create(x, y, x1, y1, x2, y2);
+    return SVGPathSegCurvetoCubicRel::create(this, role, x, y, x1, y1, x2, y2);
 }
 
-PassRefPtr<SVGPathSegCurvetoQuadraticAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1)
+PassRefPtr<SVGPathSegCurvetoQuadraticAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoQuadraticAbs::create(x, y, x1, y1);
+    return SVGPathSegCurvetoQuadraticAbs::create(this, role, x, y, x1, y1);
 }
 
-PassRefPtr<SVGPathSegCurvetoQuadraticRel> SVGPathElement::createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1)
+PassRefPtr<SVGPathSegCurvetoQuadraticRel> SVGPathElement::createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoQuadraticRel::create(x, y, x1, y1);
+    return SVGPathSegCurvetoQuadraticRel::create(this, role, x, y, x1, y1);
 }
 
-PassRefPtr<SVGPathSegArcAbs> SVGPathElement::createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
+PassRefPtr<SVGPathSegArcAbs> SVGPathElement::createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role)
 {
-    return SVGPathSegArcAbs::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+    return SVGPathSegArcAbs::create(this, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 }
 
-PassRefPtr<SVGPathSegArcRel> SVGPathElement::createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
+PassRefPtr<SVGPathSegArcRel> SVGPathElement::createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role)
 {
-    return SVGPathSegArcRel::create(x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+    return SVGPathSegArcRel::create(this, role, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 }
 
-PassRefPtr<SVGPathSegLinetoHorizontalAbs> SVGPathElement::createSVGPathSegLinetoHorizontalAbs(float x)
+PassRefPtr<SVGPathSegLinetoHorizontalAbs> SVGPathElement::createSVGPathSegLinetoHorizontalAbs(float x, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoHorizontalAbs::create(x);
+    return SVGPathSegLinetoHorizontalAbs::create(this, role, x);
 }
 
-PassRefPtr<SVGPathSegLinetoHorizontalRel> SVGPathElement::createSVGPathSegLinetoHorizontalRel(float x)
+PassRefPtr<SVGPathSegLinetoHorizontalRel> SVGPathElement::createSVGPathSegLinetoHorizontalRel(float x, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoHorizontalRel::create(x);
+    return SVGPathSegLinetoHorizontalRel::create(this, role, x);
 }
 
-PassRefPtr<SVGPathSegLinetoVerticalAbs> SVGPathElement::createSVGPathSegLinetoVerticalAbs(float y)
+PassRefPtr<SVGPathSegLinetoVerticalAbs> SVGPathElement::createSVGPathSegLinetoVerticalAbs(float y, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoVerticalAbs::create(y);
+    return SVGPathSegLinetoVerticalAbs::create(this, role, y);
 }
 
-PassRefPtr<SVGPathSegLinetoVerticalRel> SVGPathElement::createSVGPathSegLinetoVerticalRel(float y)
+PassRefPtr<SVGPathSegLinetoVerticalRel> SVGPathElement::createSVGPathSegLinetoVerticalRel(float y, SVGPathSegRole role)
 {
-    return SVGPathSegLinetoVerticalRel::create(y);
+    return SVGPathSegLinetoVerticalRel::create(this, role, y);
 }
 
-PassRefPtr<SVGPathSegCurvetoCubicSmoothAbs> SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2)
+PassRefPtr<SVGPathSegCurvetoCubicSmoothAbs> SVGPathElement::createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoCubicSmoothAbs::create(x, y, x2, y2);
+    return SVGPathSegCurvetoCubicSmoothAbs::create(this, role, x, y, x2, y2);
 }
 
-PassRefPtr<SVGPathSegCurvetoCubicSmoothRel> SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2)
+PassRefPtr<SVGPathSegCurvetoCubicSmoothRel> SVGPathElement::createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoCubicSmoothRel::create(x, y, x2, y2);
+    return SVGPathSegCurvetoCubicSmoothRel::create(this, role, x, y, x2, y2);
 }
 
-PassRefPtr<SVGPathSegCurvetoQuadraticSmoothAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y)
+PassRefPtr<SVGPathSegCurvetoQuadraticSmoothAbs> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoQuadraticSmoothAbs::create(x, y);
+    return SVGPathSegCurvetoQuadraticSmoothAbs::create(this, role, x, y);
 }
 
-PassRefPtr<SVGPathSegCurvetoQuadraticSmoothRel> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y)
+PassRefPtr<SVGPathSegCurvetoQuadraticSmoothRel> SVGPathElement::createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y, SVGPathSegRole role)
 {
-    return SVGPathSegCurvetoQuadraticSmoothRel::create(x, y);
+    return SVGPathSegCurvetoQuadraticSmoothRel::create(this, role, x, y);
 }
 
 void SVGPathElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::dAttr) {
-        ExceptionCode ec;
-        pathSegList()->clear(ec);
         SVGPathParserFactory* factory = SVGPathParserFactory::self();
-        if (!factory->buildSVGPathSegListFromString(attr->value(), pathSegList(), NormalizedParsing))
+        if (!factory->buildSVGPathByteStreamFromString(attr->value(), m_pathByteStream, UnalteredParsing))
             document()->accessSVGExtensions()->reportError("Problem parsing d=\"" + attr->value() + "\"");
     } else if (attr->name() == SVGNames::pathLengthAttr) {
         setPathLengthBaseValue(attr->value().toFloat());
@@ -205,15 +205,26 @@ void SVGPathElement::svgAttributeChanged(const QualifiedName& attrName)
         return;
 
     RenderSVGPath* renderer = static_cast<RenderSVGPath*>(this->renderer());
-    if (!renderer)
-        return;
 
     if (attrName == SVGNames::dAttr) {
+        if (m_animatablePathSegList) {
+            SVGPathSegList newList(PathSegUnalteredRole);
+            SVGPathParserFactory* factory = SVGPathParserFactory::self();
+            factory->buildSVGPathSegListFromByteStream(m_pathByteStream.get(), this, newList, UnalteredParsing);
+            m_pathSegList.value = newList;
+        }
+
+        if (!renderer)
+            return;
+
         renderer->setNeedsPathUpdate();
         RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
         return;
     }
 
+    if (!renderer)
+        return;
+
     if (SVGStyledTransformableElement::isKnownAttribute(attrName)) {
         renderer->setNeedsTransformUpdate();
         RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
@@ -231,40 +242,67 @@ void SVGPathElement::synchronizeProperty(const QualifiedName& attrName)
     SVGStyledTransformableElement::synchronizeProperty(attrName);
 
     if (attrName == anyQName()) {
+        synchronizeD();
         synchronizePathLength();
         synchronizeExternalResourcesRequired();
         return;
     }
 
-    if (attrName == SVGNames::pathLengthAttr)
+    if (attrName == SVGNames::dAttr)
+        synchronizeD();
+    else if (attrName == SVGNames::pathLengthAttr)
         synchronizePathLength();
     else if (SVGExternalResourcesRequired::isKnownAttribute(attrName))
         synchronizeExternalResourcesRequired();
 }
 
-SVGPathSegList* SVGPathElement::pathSegList() const
+void SVGPathElement::synchronizeD()
 {
-    if (!m_pathSegList)
-        m_pathSegList = SVGPathSegList::create(SVGNames::dAttr);
+    if (!m_pathSegList.shouldSynchronize)
+        return;
 
-    return m_pathSegList.get();
+    SVGAnimatedPropertySynchronizer<true>::synchronize(this, SVGNames::dAttr, m_pathSegList.value.valueAsString());
 }
 
-SVGPathSegList* SVGPathElement::normalizedPathSegList() const
+SVGPathSegListPropertyTearOff* SVGPathElement::pathSegList()
 {
-    // TODO
-    return 0;
+    if (!m_animatablePathSegList) {
+        m_pathSegList.shouldSynchronize = true;
+
+        SVGPathParserFactory* factory = SVGPathParserFactory::self();
+        factory->buildSVGPathSegListFromByteStream(m_pathByteStream.get(), this, m_pathSegList.value, UnalteredParsing);
+
+        m_animatablePathSegList = SVGAnimatedProperty::lookupOrCreateWrapper<SVGAnimatedPathSegListPropertyTearOff, SVGPathSegList>
+                                 (this, SVGNames::dAttr, SVGNames::dAttr.localName(), m_pathSegList.value);
+    }
+
+    return static_cast<SVGPathSegListPropertyTearOff*>(m_animatablePathSegList->baseVal(PathSegUnalteredRole));
 }
 
-SVGPathSegList* SVGPathElement::animatedPathSegList() const
+SVGPathSegListPropertyTearOff* SVGPathElement::normalizedPathSegList()
 {
-    // TODO
+    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
     return 0;
 }
 
-SVGPathSegList* SVGPathElement::animatedNormalizedPathSegList() const
+SVGPathSegListPropertyTearOff* SVGPathElement::animatedPathSegList()
 {
-    // TODO
+    if (!m_animatablePathSegList) {
+        m_pathSegList.shouldSynchronize = true;
+
+        SVGPathParserFactory* factory = SVGPathParserFactory::self();
+        factory->buildSVGPathSegListFromByteStream(m_pathByteStream.get(), this, m_pathSegList.value, UnalteredParsing);
+
+        m_animatablePathSegList = SVGAnimatedProperty::lookupOrCreateWrapper<SVGAnimatedPathSegListPropertyTearOff, SVGPathSegList>
+                                 (this, SVGNames::dAttr, SVGNames::dAttr.localName(), m_pathSegList.value);
+    }
+
+    return static_cast<SVGPathSegListPropertyTearOff*>(m_animatablePathSegList->animVal(PathSegUnalteredRole));
+}
+
+SVGPathSegListPropertyTearOff* SVGPathElement::animatedNormalizedPathSegList()
+{
+    // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
     return 0;
 }
 
@@ -273,7 +311,33 @@ void SVGPathElement::toPathData(Path& path) const
     ASSERT(path.isEmpty());
 
     SVGPathParserFactory* factory = SVGPathParserFactory::self();
-    factory->buildPathFromSVGPathSegList(pathSegList(), path);
+    factory->buildPathFromByteStream(m_pathByteStream.get(), path);
+}
+
+void SVGPathElement::pathSegListChanged(SVGPathSegRole role)
+{
+    SVGPathParserFactory* factory = SVGPathParserFactory::self();
+
+    switch (role) {
+    case PathSegNormalizedRole:
+        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=15412 - Implement normalized path segment lists!
+        break;
+    case PathSegUnalteredRole:
+        m_pathByteStream->clear();
+        factory->buildSVGPathByteStreamFromSVGPathSegList(m_pathSegList.value, m_pathByteStream, UnalteredParsing);
+        break;
+    case PathSegUndefinedRole:
+        return;
+    }
+
+    invalidateSVGAttributes();
+
+    RenderSVGPath* renderer = static_cast<RenderSVGPath*>(this->renderer());
+    if (!renderer)
+        return;
+
+    renderer->setNeedsPathUpdate();
+    RenderSVGResource::markForLayoutAndParentResourceInvalidation(renderer);
 }
 
 }
index 91d55b1..0590dea 100644 (file)
 #define SVGPathElement_h
 
 #if ENABLE(SVG)
-#include "SVGAnimatedPathData.h"
+#include "SVGAnimatedPathSegListPropertyTearOff.h"
 #include "SVGAnimatedPropertyMacros.h"
 #include "SVGExternalResourcesRequired.h"
 #include "SVGLangSpace.h"
+#include "SVGPathByteStream.h"
 #include "SVGStyledTransformableElement.h"
 #include "SVGTests.h"
 
 namespace WebCore {
 
-    class SVGPathSeg;
-    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 SVGPathElement : public SVGStyledTransformableElement,
-                           public SVGTests,
-                           public SVGLangSpace,
-                           public SVGExternalResourcesRequired,
-                           public SVGAnimatedPathData {
-    public:
-        static PassRefPtr<SVGPathElement> create(const QualifiedName&, Document*);
-        
-        float getTotalLength();
-        FloatPoint getPointAtLength(float distance);
-        unsigned long getPathSegAtLength(float distance);
-
-        static PassRefPtr<SVGPathSegClosePath> createSVGPathSegClosePath();
-        static PassRefPtr<SVGPathSegMovetoAbs> createSVGPathSegMovetoAbs(float x, float y);
-        static PassRefPtr<SVGPathSegMovetoRel> createSVGPathSegMovetoRel(float x, float y);
-        static PassRefPtr<SVGPathSegLinetoAbs> createSVGPathSegLinetoAbs(float x, float y);
-        static PassRefPtr<SVGPathSegLinetoRel> createSVGPathSegLinetoRel(float x, float y);
-        static PassRefPtr<SVGPathSegCurvetoCubicAbs> createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2);
-        static PassRefPtr<SVGPathSegCurvetoCubicRel> createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2);
-        static PassRefPtr<SVGPathSegCurvetoQuadraticAbs> createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1);
-        static PassRefPtr<SVGPathSegCurvetoQuadraticRel> createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1);
-        static PassRefPtr<SVGPathSegArcAbs> createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag);
-        static PassRefPtr<SVGPathSegArcRel> createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag);
-        static PassRefPtr<SVGPathSegLinetoHorizontalAbs> createSVGPathSegLinetoHorizontalAbs(float x);
-        static PassRefPtr<SVGPathSegLinetoHorizontalRel> createSVGPathSegLinetoHorizontalRel(float x);
-        static PassRefPtr<SVGPathSegLinetoVerticalAbs> createSVGPathSegLinetoVerticalAbs(float y);
-        static PassRefPtr<SVGPathSegLinetoVerticalRel> createSVGPathSegLinetoVerticalRel(float y);
-        static PassRefPtr<SVGPathSegCurvetoCubicSmoothAbs> createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2);
-        static PassRefPtr<SVGPathSegCurvetoCubicSmoothRel> createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2);
-        static PassRefPtr<SVGPathSegCurvetoQuadraticSmoothAbs> createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y);
-        static PassRefPtr<SVGPathSegCurvetoQuadraticSmoothRel> createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y);
-
-        // Derived from: 'SVGAnimatedPathData'
-        virtual SVGPathSegList* pathSegList() const;
-        virtual SVGPathSegList* normalizedPathSegList() const;
-        virtual SVGPathSegList* animatedPathSegList() const;
-        virtual SVGPathSegList* animatedNormalizedPathSegList() const;
-
-        virtual void toPathData(Path&) const;
-
-    private:
-        SVGPathElement(const QualifiedName&, Document*);
-
-        virtual bool isValid() const { return SVGTests::isValid(); }
-
-        virtual void parseMappedAttribute(Attribute*);
-        virtual void svgAttributeChanged(const QualifiedName&);
-        virtual void synchronizeProperty(const QualifiedName&);
-
-        virtual bool supportsMarkers() const { return true; }
-
-        mutable RefPtr<SVGPathSegList> m_pathSegList;
-
-        DECLARE_ANIMATED_STATIC_PROPERTY_NEW(SVGPathElement, SVGNames::pathLengthAttr, float, PathLength, pathLength)
-
-        // SVGExternalResourcesRequired
-        DECLARE_ANIMATED_STATIC_PROPERTY_NEW(SVGPathElement, SVGNames::externalResourcesRequiredAttr, bool, ExternalResourcesRequired, externalResourcesRequired)
-    };
+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 SVGPathElement : public SVGStyledTransformableElement,
+                       public SVGTests,
+                       public SVGLangSpace,
+                       public SVGExternalResourcesRequired {
+public:
+    static PassRefPtr<SVGPathElement> create(const QualifiedName&, Document*);
+    
+    float getTotalLength();
+    FloatPoint getPointAtLength(float distance);
+    unsigned long getPathSegAtLength(float distance);
+
+    PassRefPtr<SVGPathSegClosePath> createSVGPathSegClosePath(SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegMovetoAbs> createSVGPathSegMovetoAbs(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegMovetoRel> createSVGPathSegMovetoRel(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoAbs> createSVGPathSegLinetoAbs(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoRel> createSVGPathSegLinetoRel(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoCubicAbs> createSVGPathSegCurvetoCubicAbs(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoCubicRel> createSVGPathSegCurvetoCubicRel(float x, float y, float x1, float y1, float x2, float y2, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoQuadraticAbs> createSVGPathSegCurvetoQuadraticAbs(float x, float y, float x1, float y1, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoQuadraticRel> createSVGPathSegCurvetoQuadraticRel(float x, float y, float x1, float y1, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegArcAbs> createSVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegArcRel> createSVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoHorizontalAbs> createSVGPathSegLinetoHorizontalAbs(float x, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoHorizontalRel> createSVGPathSegLinetoHorizontalRel(float x, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoVerticalAbs> createSVGPathSegLinetoVerticalAbs(float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegLinetoVerticalRel> createSVGPathSegLinetoVerticalRel(float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoCubicSmoothAbs> createSVGPathSegCurvetoCubicSmoothAbs(float x, float y, float x2, float y2, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoCubicSmoothRel> createSVGPathSegCurvetoCubicSmoothRel(float x, float y, float x2, float y2, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoQuadraticSmoothAbs> createSVGPathSegCurvetoQuadraticSmoothAbs(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+    PassRefPtr<SVGPathSegCurvetoQuadraticSmoothRel> createSVGPathSegCurvetoQuadraticSmoothRel(float x, float y, SVGPathSegRole role = PathSegUndefinedRole);
+
+    // Used in the bindings only.
+    SVGPathSegListPropertyTearOff* pathSegList();
+    SVGPathSegListPropertyTearOff* animatedPathSegList();
+    SVGPathSegListPropertyTearOff* normalizedPathSegList();
+    SVGPathSegListPropertyTearOff* animatedNormalizedPathSegList();
+
+    SVGPathByteStream* pathByteStream() const { return m_pathByteStream.get(); }
+    SVGAnimatedProperty* animatablePathSegList() const { return m_animatablePathSegList.get(); }
+
+    virtual void toPathData(Path&) const;
+    void pathSegListChanged(SVGPathSegRole);
+
+private:
+    SVGPathElement(const QualifiedName&, Document*);
+
+    virtual bool isValid() const { return SVGTests::isValid(); }
+
+    virtual void parseMappedAttribute(Attribute*);
+    virtual void synchronizeProperty(const QualifiedName&);
+    virtual void svgAttributeChanged(const QualifiedName&);
+    virtual bool supportsMarkers() const { return true; }
+
+    DECLARE_ANIMATED_STATIC_PROPERTY_NEW(SVGPathElement, SVGNames::pathLengthAttr, float, PathLength, pathLength)
+
+    // SVGExternalResourcesRequired
+    DECLARE_ANIMATED_STATIC_PROPERTY_NEW(SVGPathElement, SVGNames::externalResourcesRequiredAttr, bool, ExternalResourcesRequired, externalResourcesRequired)
+
+    void synchronizeD();
+
+protected:
+    OwnPtr<SVGPathByteStream> m_pathByteStream;
+    mutable SVGSynchronizableAnimatedProperty<SVGPathSegList> m_pathSegList;
+    RefPtr<SVGAnimatedPathSegListPropertyTearOff> m_animatablePathSegList;
+};
 
 } // namespace WebCore
 
index 1c1dca7..00a9d85 100644 (file)
@@ -31,8 +31,7 @@ module svg {
                                                  SVGLangSpace,
                                                  SVGExternalResourcesRequired,
                                                  SVGStylable,
-                                                 SVGTransformable,
-                                                 SVGAnimatedPathData {
+                                                 SVGTransformable {
         readonly attribute SVGAnimatedNumber pathLength;
 
         float getTotalLength();
@@ -107,6 +106,11 @@ module svg {
                                                                                       in float y);
         SVGPathSegCurvetoQuadraticSmoothRel createSVGPathSegCurvetoQuadraticSmoothRel(in float x, 
                                                                                       in float y);
+
+        readonly attribute SVGPathSegList pathSegList;
+        readonly attribute SVGPathSegList normalizedPathSegList;
+        readonly attribute SVGPathSegList animatedPathSegList;
+        readonly attribute SVGPathSegList animatedNormalizedPathSegList;
     };
 
 }
index e707c20..deb0307 100644 (file)
@@ -27,6 +27,7 @@
 #include "SVGPathBuilder.h"
 #include "SVGPathByteStreamBuilder.h"
 #include "SVGPathByteStreamSource.h"
+#include "SVGPathElement.h"
 #include "SVGPathParser.h"
 #include "SVGPathSegListBuilder.h"
 #include "SVGPathSegListSource.h"
@@ -46,13 +47,15 @@ static SVGPathBuilder* globalSVGPathBuilder(Path& result)
     return s_builder;
 }
 
-static SVGPathSegListBuilder* globalSVGPathSegListBuilder(SVGPathSegList* result)
+static SVGPathSegListBuilder* globalSVGPathSegListBuilder(SVGPathElement* element, SVGPathSegRole role, SVGPathSegList& result)
 {
     static SVGPathSegListBuilder* s_builder = 0;
     if (!s_builder)
         s_builder = new SVGPathSegListBuilder;
 
+    s_builder->setCurrentSVGPathElement(element);
     s_builder->setCurrentSVGPathSegList(result);
+    s_builder->setCurrentSVGPathSegRole(role);
     return s_builder;
 }
 
@@ -137,59 +140,43 @@ bool SVGPathParserFactory::buildPathFromString(const String& d, Path& result)
     return ok;
 }
 
-bool SVGPathParserFactory::buildPathFromByteStream(SVGPathByteStream* stream, Path& result)
+bool SVGPathParserFactory::buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList& list, OwnPtr<SVGPathByteStream>& result, PathParsingMode parsingMode)
 {
-    ASSERT(stream);
-    if (stream->isEmpty())
+    result = SVGPathByteStream::create();
+    if (list.isEmpty())
         return false;
 
-    SVGPathBuilder* builder = globalSVGPathBuilder(result);
+    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(result.get());
 
-    OwnPtr<SVGPathByteStreamSource> source = SVGPathByteStreamSource::create(stream);
+    OwnPtr<SVGPathSegListSource> source = SVGPathSegListSource::create(list);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
-    bool ok = parser->parsePathDataFromSource(NormalizedParsing);
+    bool ok = parser->parsePathDataFromSource(parsingMode);
     parser->cleanup();
     return ok;
 }
 
-bool SVGPathParserFactory::buildPathFromSVGPathSegList(SVGPathSegList* pathSegList, Path& result)
+bool SVGPathParserFactory::buildPathFromByteStream(SVGPathByteStream* stream, Path& result)
 {
-    ASSERT(pathSegList);
-    if (!pathSegList->numberOfItems())
+    ASSERT(stream);
+    if (stream->isEmpty())
         return false;
 
     SVGPathBuilder* builder = globalSVGPathBuilder(result);
 
-    OwnPtr<SVGPathSegListSource> source = SVGPathSegListSource::create(pathSegList);
+    OwnPtr<SVGPathByteStreamSource> source = SVGPathByteStreamSource::create(stream);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
     bool ok = parser->parsePathDataFromSource(NormalizedParsing);
     parser->cleanup();
     return ok;
 }
 
-bool SVGPathParserFactory::buildSVGPathSegListFromString(const String& d, SVGPathSegList* result, PathParsingMode parsingMode)
-{
-    ASSERT(result);
-    if (d.isEmpty())
-        return false;
-
-    SVGPathSegListBuilder* builder = globalSVGPathSegListBuilder(result);
-
-    OwnPtr<SVGPathStringSource> source = SVGPathStringSource::create(d);
-    SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
-    bool ok = parser->parsePathDataFromSource(parsingMode);
-    parser->cleanup();
-    return ok;
-}
-
-bool SVGPathParserFactory::buildSVGPathSegListFromByteStream(SVGPathByteStream* stream, SVGPathSegList* result, PathParsingMode parsingMode)
+bool SVGPathParserFactory::buildSVGPathSegListFromByteStream(SVGPathByteStream* stream, SVGPathElement* element, SVGPathSegList& result, PathParsingMode parsingMode)
 {
     ASSERT(stream);
-    ASSERT(result);
     if (stream->isEmpty())
         return false; 
 
-    SVGPathSegListBuilder* builder = globalSVGPathSegListBuilder(result);
+    SVGPathSegListBuilder* builder = globalSVGPathSegListBuilder(element, parsingMode == NormalizedParsing ? PathSegNormalizedRole : PathSegUnalteredRole, result);
 
     OwnPtr<SVGPathByteStreamSource> source = SVGPathByteStreamSource::create(stream);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
@@ -214,15 +201,15 @@ bool SVGPathParserFactory::buildStringFromByteStream(SVGPathByteStream* stream,
     return ok;
 }
 
-bool SVGPathParserFactory::buildStringFromSVGPathSegList(SVGPathSegList* pathSegList, String& result, PathParsingMode parsingMode)
+bool SVGPathParserFactory::buildStringFromSVGPathSegList(const SVGPathSegList& list, String& result, PathParsingMode parsingMode)
 {
-    ASSERT(pathSegList);
-    if (!pathSegList->numberOfItems())
-        return false; 
+    result = String();
+    if (list.isEmpty())
+        return false;
 
     SVGPathStringBuilder* builder = globalSVGPathStringBuilder();
 
-    OwnPtr<SVGPathSegListSource> source = SVGPathSegListSource::create(pathSegList);
+    OwnPtr<SVGPathSegListSource> source = SVGPathSegListSource::create(list);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
     bool ok = parser->parsePathDataFromSource(parsingMode);
     result = builder->result();
@@ -232,16 +219,15 @@ bool SVGPathParserFactory::buildStringFromSVGPathSegList(SVGPathSegList* pathSeg
 
 bool SVGPathParserFactory::buildSVGPathByteStreamFromString(const String& d, OwnPtr<SVGPathByteStream>& result, PathParsingMode parsingMode)
 {
+    result = SVGPathByteStream::create();
     if (d.isEmpty())
         return false;
 
-    OwnPtr<SVGPathByteStream> stream = SVGPathByteStream::create();
-    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(stream.get());
+    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(result.get());
 
     OwnPtr<SVGPathStringSource> source = SVGPathStringSource::create(d);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
     bool ok = parser->parsePathDataFromSource(parsingMode);
-    result = stream.release();
     parser->cleanup();
     return ok;
 }
@@ -250,31 +236,30 @@ bool SVGPathParserFactory::buildAnimatedSVGPathByteStream(SVGPathByteStream* fro
 {
     ASSERT(fromStream);
     ASSERT(toStream);
+    result = SVGPathByteStream::create();
     if (fromStream->isEmpty() || toStream->isEmpty())
         return false;
 
-    OwnPtr<SVGPathByteStream> stream = SVGPathByteStream::create();
-    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(stream.get());
+    SVGPathByteStreamBuilder* builder = globalSVGPathByteStreamBuilder(result.get());
 
     OwnPtr<SVGPathByteStreamSource> fromSource = SVGPathByteStreamSource::create(fromStream);
     OwnPtr<SVGPathByteStreamSource> toSource = SVGPathByteStreamSource::create(toStream);
     SVGPathBlender* blender = globalSVGPathBlender();
     bool ok = blender->blendAnimatedPath(progress, fromSource.get(), toSource.get(), builder);
-    result = stream.release();
     blender->cleanup();
     return ok;
 }
 
-bool SVGPathParserFactory::getSVGPathSegAtLengthFromSVGPathSegList(SVGPathSegList* pathSegList, float length, unsigned long& pathSeg)
+bool SVGPathParserFactory::getSVGPathSegAtLengthFromSVGPathByteStream(SVGPathByteStream* stream, float length, unsigned long& pathSeg)
 {
-    ASSERT(pathSegList);
-    if (!pathSegList->numberOfItems())
-        return false; 
+    ASSERT(stream);
+    if (stream->isEmpty())
+        return false;
 
     PathTraversalState traversalState(PathTraversalState::TraversalSegmentAtLength);
     SVGPathTraversalStateBuilder* builder = globalSVGPathTraversalStateBuilder(traversalState, length);
 
-    OwnPtr<SVGPathSegListSource> source = SVGPathSegListSource::create(pathSegList);
+    OwnPtr<SVGPathByteStreamSource> source = SVGPathByteStreamSource::create(stream);
     SVGPathParser* parser = globalSVGPathParser(source.get(), builder);
     bool ok = parser->parsePathDataFromSource(NormalizedParsing);
     pathSeg = builder->pathSegmentIndex();
index b8a2dd5..5ae5e8a 100644 (file)
 
 namespace WebCore {
 
+class SVGPathElement;
+
 class SVGPathParserFactory {
 public:
     static SVGPathParserFactory* self();
 
+    // String/SVGPathByteStream -> Path
     bool buildPathFromString(const String&, Path&);
     bool buildPathFromByteStream(SVGPathByteStream*, Path&);
-    bool buildPathFromSVGPathSegList(SVGPathSegList*, Path&);
 
-    bool buildSVGPathSegListFromString(const String&, SVGPathSegList*, PathParsingMode);
-    bool buildSVGPathSegListFromByteStream(SVGPathByteStream*, SVGPathSegList*, PathParsingMode);
+    // SVGPathSegList/String -> SVGPathByteStream
+    bool buildSVGPathByteStreamFromSVGPathSegList(const SVGPathSegList&, OwnPtr<SVGPathByteStream>&, PathParsingMode);
+    bool buildSVGPathByteStreamFromString(const String&, OwnPtr<SVGPathByteStream>&, PathParsingMode);
 
+    // SVGPathByteStream/SVGPathSegList -> String
     bool buildStringFromByteStream(SVGPathByteStream*, String&, PathParsingMode);
-    bool buildStringFromSVGPathSegList(SVGPathSegList*, String&, PathParsingMode);
+    bool buildStringFromSVGPathSegList(const SVGPathSegList&, String&, PathParsingMode);
 
-    bool buildSVGPathByteStreamFromString(const String&, OwnPtr<SVGPathByteStream>&, PathParsingMode);
+    // SVGPathByteStream -> SVGPathSegList
+    bool buildSVGPathSegListFromByteStream(SVGPathByteStream*, SVGPathElement*, SVGPathSegList&, PathParsingMode);
 
     bool buildAnimatedSVGPathByteStream(SVGPathByteStream*, SVGPathByteStream*, OwnPtr<SVGPathByteStream>&, float);
-
-    bool getSVGPathSegAtLengthFromSVGPathSegList(SVGPathSegList*, float, unsigned long&);
+    bool getSVGPathSegAtLengthFromSVGPathByteStream(SVGPathByteStream*, float length, unsigned long& pathSeg);
 
 private:
     SVGPathParserFactory();
diff --git a/WebCore/svg/SVGPathSeg.cpp b/WebCore/svg/SVGPathSeg.cpp
deleted file mode 100644 (file)
index 5939976..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (C) 2010 Google, 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"
-#if ENABLE(SVG)
-#include "SVGPathSeg.h"
-
-#include "SVGNames.h"
-
-namespace WebCore {
-
-const QualifiedName& SVGPathSeg::associatedAttributeName() const
-{
-    return SVGNames::dAttr;
-}
-
-} // namespace WebCore
-#endif // ENABLE(SVG)
index a2cf261..4fce0c3 100644 (file)
@@ -22,8 +22,7 @@
 #define SVGPathSeg_h
 
 #if ENABLE(SVG)
-#include <wtf/Forward.h>
-#include <wtf/RefCounted.h>
+#include <wtf/text/WTFString.h>
 
 namespace WebCore {
 
@@ -50,10 +49,15 @@ enum SVGPathSegType {
     PathSegCurveToQuadraticSmoothRel = 19
 };
 
-class QualifiedName;
+enum SVGPathSegRole {
+    PathSegUnalteredRole = 0,
+    PathSegNormalizedRole = 1,
+    PathSegUndefinedRole = 2
+};
 
 class SVGPathSeg : public RefCounted<SVGPathSeg> {
 public:
+    SVGPathSeg() { }
     virtual ~SVGPathSeg() { }
 
     // Forward declare these enums in the w3c naming scheme, for IDL generation
@@ -80,31 +84,8 @@ public:
         PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = PathSegCurveToQuadraticSmoothRel
     };
 
-
     virtual unsigned short pathSegType() const = 0;
     virtual String pathSegTypeAsLetter() const = 0;
-
-    const QualifiedName& associatedAttributeName() const;
-};
-
-class SVGPathSegSingleCoord : public SVGPathSeg { 
-public:
-    void setX(float x) { m_x = x; }
-    float x() const { return m_x; }
-
-    void setY(float y) { m_y = y; }
-    float y() const { return m_y; }
-
-protected:
-    SVGPathSegSingleCoord(float x, float y)
-        : m_x(x)
-        , m_y(y)
-    {
-    }
-
-private:
-    float m_x;
-    float m_y;
 };
 
 } // namespace WebCore
index 8641a48..f46518c 100644 (file)
@@ -28,29 +28,29 @@ module svg {
 
     interface [Conditional=SVG, CustomToJS, Polymorphic] SVGPathSeg {
         // Path Segment Types
-        const unsigned short PATHSEG_UNKNOWN                      = 0;
-        const unsigned short PATHSEG_CLOSEPATH                    = 1;
-        const unsigned short PATHSEG_MOVETO_ABS                   = 2;
-        const unsigned short PATHSEG_MOVETO_REL                   = 3;
-        const unsigned short PATHSEG_LINETO_ABS                   = 4;
-        const unsigned short PATHSEG_LINETO_REL                   = 5;
-        const unsigned short PATHSEG_CURVETO_CUBIC_ABS            = 6;
-        const unsigned short PATHSEG_CURVETO_CUBIC_REL            = 7;
-        const unsigned short PATHSEG_CURVETO_QUADRATIC_ABS        = 8;
-        const unsigned short PATHSEG_CURVETO_QUADRATIC_REL        = 9;
-        const unsigned short PATHSEG_ARC_ABS                      = 10;
-        const unsigned short PATHSEG_ARC_REL                      = 11;
-        const unsigned short PATHSEG_LINETO_HORIZONTAL_ABS        = 12;
-        const unsigned short PATHSEG_LINETO_HORIZONTAL_REL        = 13;
-        const unsigned short PATHSEG_LINETO_VERTICAL_ABS          = 14;
-        const unsigned short PATHSEG_LINETO_VERTICAL_REL          = 15;
-        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_ABS     = 16;
-        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_REL     = 17;
+        const unsigned short PATHSEG_UNKNOWN = 0;
+        const unsigned short PATHSEG_CLOSEPATH = 1;
+        const unsigned short PATHSEG_MOVETO_ABS = 2;
+        const unsigned short PATHSEG_MOVETO_REL = 3;
+        const unsigned short PATHSEG_LINETO_ABS = 4;
+        const unsigned short PATHSEG_LINETO_REL = 5;
+        const unsigned short PATHSEG_CURVETO_CUBIC_ABS = 6;
+        const unsigned short PATHSEG_CURVETO_CUBIC_REL = 7;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_ABS = 8;
+        const unsigned short PATHSEG_CURVETO_QUADRATIC_REL = 9;
+        const unsigned short PATHSEG_ARC_ABS = 10;
+        const unsigned short PATHSEG_ARC_REL = 11;
+        const unsigned short PATHSEG_LINETO_HORIZONTAL_ABS = 12;
+        const unsigned short PATHSEG_LINETO_HORIZONTAL_REL = 13;
+        const unsigned short PATHSEG_LINETO_VERTICAL_ABS = 14;
+        const unsigned short PATHSEG_LINETO_VERTICAL_REL = 15;
+        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_ABS = 16;
+        const unsigned short PATHSEG_CURVETO_CUBIC_SMOOTH_REL = 17;
         const unsigned short PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS = 18;
         const unsigned short PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL = 19;
 
-        readonly attribute unsigned short       pathSegType;
-        readonly attribute DOMString            pathSegTypeAsLetter;
+        readonly attribute unsigned short pathSegType;
+        readonly attribute DOMString pathSegTypeAsLetter;
     };
 
 }
diff --git a/WebCore/svg/SVGPathSegArc.cpp b/WebCore/svg/SVGPathSegArc.cpp
deleted file mode 100644 (file)
index f606905..0000000
+++ /dev/null
@@ -1,42 +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.
- */
-
-#include "config.h"
-
-#if ENABLE(SVG)
-#include "SVGPathSegArc.h"
-
-namespace WebCore {
-
-SVGPathSegArcAbs::SVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-    : SVGPathSegArc(x, y, r1, r2, angle, largeArcFlag, sweepFlag)
-{
-}
-
-SVGPathSegArcRel::SVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-    : SVGPathSegArc(x, y, r1, r2, angle, largeArcFlag, sweepFlag)
-{
-}
-
-}
-
-#endif // ENABLE(SVG)
-
-// vim:ts=4:noet
index 5d5c332..e835bc3 100644 (file)
 #define SVGPathSegArc_h
 
 #if ENABLE(SVG)
-
-#include "PlatformString.h"
-#include "SVGPathSeg.h"
+#include "SVGPathSegWithContext.h"
 
 namespace WebCore {
 
-    class SVGPathSegArc : public SVGPathSeg {
-    public:
-        SVGPathSegArc(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-            : m_x(x)
-            , m_y(y)
-            , m_r1(r1)
-            , m_r2(r2)
-            , m_angle(angle)
-            , m_largeArcFlag(largeArcFlag)
-            , m_sweepFlag(sweepFlag)
-        {
-        }
-
-        void setX(float x) { m_x = x; }
-        float x() const { return m_x; }
-
-        void setY(float y) { m_y = y; }
-        float y() const { return m_y; }
-
-        void setR1(float r1) { m_r1 = r1; }
-        float r1() const { return m_r1; }
-
-        void setR2(float r2) { m_r2 = r2; }
-        float r2() const { return m_r2; }
-
-        void setAngle(float angle) { m_angle = angle; }
-        float angle() const { return m_angle; }
-
-        void setLargeArcFlag(bool largeArcFlag) { m_largeArcFlag = largeArcFlag; }
-        bool largeArcFlag() const { return m_largeArcFlag; }
-
-        void setSweepFlag(bool sweepFlag) { m_sweepFlag = sweepFlag; }
-        bool sweepFlag() const { return m_sweepFlag; }
-
-    private:
-        float m_x;
-        float m_y;
-        float m_r1;
-        float m_r2;
-        float m_angle;
-
-        bool m_largeArcFlag    : 1;
-        bool m_sweepFlag : 1;
-    };
-
-    class SVGPathSegArcAbs : public SVGPathSegArc {
-    public:
-        static PassRefPtr<SVGPathSegArcAbs> create(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-        {
-            return adoptRef(new SVGPathSegArcAbs(x, y, r1, r2, angle, largeArcFlag, sweepFlag));
-        }
-
-    private:
-        SVGPathSegArcAbs(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag);
-
-        virtual unsigned short pathSegType() const { return PATHSEG_ARC_ABS; }
-        virtual String pathSegTypeAsLetter() const { return "A"; }
-    };
-
-    class SVGPathSegArcRel : public SVGPathSegArc {
-    public:
-        static PassRefPtr<SVGPathSegArcRel> create(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag)
-        {
-            return adoptRef(new SVGPathSegArcRel(x, y, r1, r2, angle, largeArcFlag, sweepFlag));
-        }
-
-    private:
-        SVGPathSegArcRel(float x, float y, float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag);
-
-        virtual unsigned short pathSegType() const { return PATHSEG_ARC_REL; }