2011-05-18 Nikolas Zimmermann <nzimmermann@rim.com>
authorzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 May 2011 15:35:36 +0000 (15:35 +0000)
committerzimmermann@webkit.org <zimmermann@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Wed, 18 May 2011 15:35:36 +0000 (15:35 +0000)
        Reviewed by Rob Buis.

        All animated SVG enum properties are now ints
        https://bugs.webkit.org/show_bug.cgi?id=10749

        Add tests for all elements using SVGAnimatedEnumeration in the SVG DOM API.

        * platform/mac/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.png: Update result, progression.
        * svg/dom/SVGAnimatedEnumeration-SVGClipPathElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFilterElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGGradientElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGMaskElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGPatternElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGTextContentElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGTextPathElement-expected.txt: Added.
        * svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html: Added.
        * svg/dom/SVGAnimatedEnumeration-expected.txt:
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFilterElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGGradientElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGMaskElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGPatternElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js: Added.
        * svg/dom/script-tests/SVGAnimatedEnumeration.js:
        * svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.txt:
        * svg/dynamic-updates/script-tests/SVGTextElement-svgdom-lengthAdjust-prop.js:
        (executeTest):
        * svg/filters/feBlend-invalid-mode-expected.txt:
        * svg/filters/feComponentTransfer-style-crash-expected.txt:
        * svg/filters/feComponentTransfer-style-crash.xhtml:
        * svg/filters/feDisplacementMap-crash-test-expected.txt:
        * svg/filters/feDisplacementMap-crash-test.xhtml:

2011-05-18  Nikolas Zimmermann  <nzimmermann@rim.com>

        Reviewed by Rob Buis.

        All animated SVG enum properties are now ints
        https://bugs.webkit.org/show_bug.cgi?id=10749

        DECLARE/DEFINE_ANIMATED_ENUMERATION created fooBaseVal()/setFooBaseVal() methods that take int parameters, and stored all enum types as integers.
        Modify the SVG DOM API to store real enums, and get rid of any int<->enum conversions. It's now impossible to change any enum values to undefined
        types, which is the root of several filter security bugs in the past, that were fixed by adding workarounds.
        (Usual workaround: svgAttributeChanged(): if fooAttr has been changed from SVG DOM, and if it's an enum, check whether the enum is in range, or fix it up.)

        Using a type-safe internal representation for these enum values we can get rid of ugly int<->enum conversions.
        A lot of parseMappedAttribute() functions duplicated the code for parsing enum values (eg. userSpaceOnUse/objectBoundingBox unit values, in pattern/filter/mask/etc..)
        Add dozens of new SVGPropertyTraits<EnumType> specializations for all enums we expose to JS, and offer static fromString/toString conversion methods in single places.
        Use the new SVGPropertyTraits everywhere in svg/.

        This also fixes SVG DOM <-> XML DOM synchronization for SVGAnimatedEnumeration types.
        Example: <clipPath clipPathUnits="objectBoundingBox">
        myClipPath.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE;
        alert(myClipPath.getAttribute('clipPathUnits')); <- without this patch it says "1", now it says "userSpaceOnUse" as expected, and as other browsers do.
        We're now properly converting the enum values to strings.

        Add testcases for all SVGAnimatedEnumeration objects used in the SVG DOM API. Found several small bugs:
        - SVGFEConvolveMatrix 'edgeMode' SVG DOM <-> XML DOM synchronization was not working, because of a typo: s/operatorAttr/edgeModeAttr
        - SVGFEConvolveMatrix was missing an synchronizeProperty() implementation, disabling SVG <-> XML DOM synchronization completly.

        Tests: svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html
               svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html
               svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html
               svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html
               svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html
               svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html
               svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html
               svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html
               svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html

        Fixes existing svg/dynamic-update/SVGTextContentElement-svgdom-lengthAdjust-prop.html where I found the bug initially.

        * GNUmakefile.list.am: Add svg/properties/SVGAnimatedEnumerationPropertyTearOff.h to build.
        * WebCore.gypi: Ditto.
        * WebCore.pro: Ditto.
        * WebCore.vcproj/WebCore.vcproj: Ditto.
        * WebCore.xcodeproj/project.pbxproj: Ditto.
        * bindings/scripts/CodeGeneratorV8.pm: Add V8 magic, to avoid ambigious conversion warning in toV8(PassRefPtr<SVGAnimatedEnumeration>).
        * platform/graphics/GraphicsTypes.h: Cleanup GradientSpreadMethod, as the SVG dependency is gone.
        * platform/graphics/filters/FEBlend.cpp:
        (WebCore::FEBlend::apply): Turn early-returns (introduce in security patches a while ago) into ASSERTs, as the underlying bug has been fixed.
        * platform/graphics/filters/FEDisplacementMap.cpp:
        (WebCore::FEDisplacementMap::apply): Ditto.
        * rendering/svg/RenderSVGResourceClipper.h: Remove toUnitType() usage, the clipPathUnits() provided by SVGClipPathElement have the correct enum type now.
        (WebCore::RenderSVGResourceClipper::clipPathUnits):
        * rendering/svg/RenderSVGResourceFilter.h: Remove toUnitType() usage, the filterUnits()/primitiveUnits() provided by SVGFilterElement have the correct enum type now.
        (WebCore::RenderSVGResourceFilter::filterUnits):
        (WebCore::RenderSVGResourceFilter::primitiveUnits):
        * rendering/svg/RenderSVGResourceGradient.cpp: Add helper method platformSpreadMethodFromSVGType() converting from SVGGradientElement::SVGSpreadMethodType to GradientSpreadMethod (platform).
        (WebCore::RenderSVGResourceGradient::applyResource):
        * rendering/svg/RenderSVGResourceGradient.h: Ditto.
        * rendering/svg/RenderSVGResourceLinearGradient.cpp:
        (WebCore::RenderSVGResourceLinearGradient::buildGradient): Use platformSpreadMethodFromSVGType().
        * rendering/svg/RenderSVGResourceMarker.h: Remove toUnitType() usage, the markerUnits() provided by SVGMarkerElement have the correct enum type now.
        (WebCore::RenderSVGResourceMarker::markerUnits):
        * rendering/svg/RenderSVGResourceMasker.h: Remove toUnitType() usage, the maskUnits()/maskContentUnits() provided by SVGMaskElement have the correct enum type now.
        (WebCore::RenderSVGResourceMasker::maskUnits):
        (WebCore::RenderSVGResourceMasker::maskContentUnits):
        * rendering/svg/RenderSVGResourceRadialGradient.cpp:
        (WebCore::RenderSVGResourceRadialGradient::buildGradient): Use platformSpreadMethodFromSVGType().
        * rendering/svg/SVGRenderTreeAsText.cpp:
        (WebCore::operator<<): Use SVGPropertyTraits<SomeSVGEnumType>::toString() to convert from enum to string, remove code duplication.
        (WebCore::writeCommonGradientProperties):
        * rendering/svg/SVGTextChunkBuilder.cpp:
        (WebCore::SVGTextChunkBuilder::addTextChunk): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * rendering/svg/SVGTextLayoutEngine.cpp:
        (WebCore::SVGTextLayoutEngine::parentDefinesTextLength): Ditto.
        (WebCore::SVGTextLayoutEngine::beginTextPathLayout): Ditto.
        * svg/GradientAttributes.h: Change spread method type from platform GradientSpreadMethod to SVGSpreadMethodType.
        (WebCore::GradientAttributes::GradientAttributes):
        (WebCore::GradientAttributes::spreadMethod):
        (WebCore::GradientAttributes::setSpreadMethod):
        * svg/SVGAnimatedBoolean.idl: Enable potential exception raising on baseVal setting for the primitive types.
        * svg/SVGAnimatedEnumeration.h: Switch from generic SVGAnimatedStaticPropertyTearOff<int> to new SVGAnimatedEnumerationPropertyTearOff<EnumType>.
        * svg/SVGAnimatedEnumeration.idl: Enable potential exception raising on baseVal setting for the primitive types.
                                          Only SVGAnimatedEnumeration makes use of this if the assigned value is out of range.
        * svg/SVGAnimatedInteger.idl: Ditto.
        * svg/SVGAnimatedNumber.idl: Ditto.
        * svg/SVGAnimatedString.idl: Ditto.
        * svg/SVGClipPathElement.cpp:
        (WebCore::SVGClipPathElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
        * svg/SVGClipPathElement.h:
        * svg/SVGComponentTransferFunctionElement.cpp:
        (WebCore::SVGComponentTransferFunctionElement::SVGComponentTransferFunctionElement): Initialize type to identity, not unknown, as per spec.
        (WebCore::SVGComponentTransferFunctionElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
        (WebCore::SVGComponentTransferFunctionElement::transferFunction): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * svg/SVGComponentTransferFunctionElement.h: Remove svgAttributeChanged() method, that verified the enum value is not out of range.
                                                     It's not possible anymore for these values to go out of range.
        * svg/SVGFEBlendElement.cpp:
        (WebCore::SVGFEBlendElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<BlendModeType>::fromString(attr->value()).
        (WebCore::SVGFEBlendElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFEBlendElement::build): Ditto.
        * svg/SVGFEBlendElement.h: Add SVGPropertyTraits<BlendModeType> specializations.
        * svg/SVGFEColorMatrixElement.cpp:
        (WebCore::SVGFEColorMatrixElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<ColorMatrixType>::fromString(attr->value()).
        (WebCore::SVGFEColorMatrixElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now..
        (WebCore::SVGFEColorMatrixElement::build): Ditto.
        * svg/SVGFEColorMatrixElement.h: Add SVGPropertyTraits<ColorMatrixType> specializations.
        * svg/SVGFECompositeElement.cpp:
        (WebCore::SVGFECompositeElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<CompositeOperationType>::fromString(attr->value()).
        (WebCore::SVGFECompositeElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFECompositeElement::build): Ditto.
        * svg/SVGFECompositeElement.h: Add SVGPropertyTraits<CompositeOperationType> specializations.
        * svg/SVGFEConvolveMatrixElement.cpp: Fix typo, edgeMode needs to be associated with SVGNames::edgeModeAttr, not SVGNames::operatorAttr.
        (WebCore::SVGFEConvolveMatrixElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EdgeModeType>::fromString(attr->value()).
        (WebCore::SVGFEConvolveMatrixElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFEConvolveMatrixElement::synchronizeProperty): Add missing synchronizeProperty() implementation, otherwhise SVG DOM <-> XML DOM is not in sync.
        (WebCore::SVGFEConvolveMatrixElement::build): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * svg/SVGFEConvolveMatrixElement.h: Add SVGPropertyTraits<EdgeModeType> specializations.
        * svg/SVGFEDisplacementMapElement.cpp:
        (WebCore::SVGFEDisplacementMapElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<ChannelSelectorType>::fromString(attr->value()).
        (WebCore::SVGFEDisplacementMapElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFEDisplacementMapElement::svgAttributeChanged): Remove range validation for enum types, they are always in range now.
        (WebCore::SVGFEDisplacementMapElement::build): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * svg/SVGFEDisplacementMapElement.h: Add SVGPropertyTraits<ChannelSelectorType> specializations.
        * svg/SVGFEMorphologyElement.cpp:
        (WebCore::SVGFEMorphologyElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<MorphologyOperatorType>::fromString(attr->value()).
        (WebCore::SVGFEMorphologyElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFEMorphologyElement::build): Ditto.
        * svg/SVGFEMorphologyElement.h: Add SVGPropertyTraits<MorphologyOperatorType> specializations.
        * svg/SVGFETurbulenceElement.cpp:
        (WebCore::SVGFETurbulenceElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGStitchOptions/TurbulenceType>::fromString(attr->value()).
        (WebCore::SVGFETurbulenceElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        (WebCore::SVGFETurbulenceElement::build): Ditto.
        * svg/SVGFETurbulenceElement.h: Add SVGPropertyTraits<SVGStitchOptions/TurbulenceType> specializations.
        * svg/SVGFilterElement.cpp:
        (WebCore::SVGFilterElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGUnitType>::fromString(attr->value()).
        * svg/SVGFilterElement.h:
        * svg/SVGGradientElement.cpp:
        (WebCore::SVGGradientElement::SVGGradientElement): Missing spread method default initialization: set it to 'pad' as per spec.
        (WebCore::SVGGradientElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGUnitType/SVGSpreadMethodType>::fromString(attr->value()).
        * svg/SVGGradientElement.h: Add SVGPropertyTraits<SVGSpreadMethodType> specializations.
        * svg/SVGLinearGradientElement.cpp:
        (WebCore::SVGLinearGradientElement::collectGradientAttributes): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * svg/SVGMarkerElement.cpp:
        (WebCore::SVGMarkerElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
        (WebCore::SVGMarkerElement::synchronizeOrientType): Add a custom synchronization method, that handles orientType/orientAngle -> orientAttr synchronization, which is special
                                                            as it depends on to other SVG DOM objects (SVGAnimatedAngle and SVGAnimatedEnumeration). All covered by new tests.
        (WebCore::SVGMarkerElement::orientTypeAnimated): Custom tear off creation method, which would usually be generated by the DECLARE_ANIMATED_... macros.
        * svg/SVGMarkerElement.h: Add SVGPropertyTraits<SVGMarkerUnitsType/SVGMarkerOrientType> specializations.
        (WebCore::SVGMarkerElement::orientType): Add custom property handling for the 'orientType' SVGAnimatedEnumeration object, as it has special demands, based on 'orientAngle'.
        (WebCore::SVGMarkerElement::orientTypeBaseValue): Ditto.
        (WebCore::SVGMarkerElement::setOrientTypeBaseValue): Ditto.
        * svg/SVGMaskElement.cpp:
        (WebCore::SVGMaskElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
        * svg/SVGMaskElement.h:
        * svg/SVGPatternElement.cpp:
        (WebCore::SVGPatternElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
        * svg/SVGPatternElement.h:
        * svg/SVGRadialGradientElement.cpp:
        (WebCore::SVGRadialGradientElement::collectGradientAttributes): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
        * svg/SVGTextContentElement.cpp:
        (WebCore::SVGTextContentElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGLengthAdjustType>::fromString(attr->value()).
        * svg/SVGTextContentElement.h: Add SVGPropertyTraits<SVGLengthAdjustType> specializations.
        * svg/SVGTextPathElement.cpp:
        (WebCore::SVGTextPathElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGTextPathMethodType/SVGTextPathSpacingType>::fromString(attr->value()).
        * svg/SVGTextPathElement.h: Add SVGPropertyTraits<SVGTextPathMethodType/SVGTextPathSpacingType> specializations.
        * svg/SVGUnitTypes.h: Add SVGPropertyTraits<SVGUnitType> specializations.
        * svg/properties/SVGAnimatedEnumerationPropertyTearOff.h: Added. SVGAnimatedEnumerationPropertyTearOff inherits from SVGAnimatedStaticPropertyTearOff<int>.
                                                                  SVGAnimatedEnumeration remains a typedef to SVGAnimatedStaticPropertyTearOff<int>, to have a common base
                                                                  class for all enum types. This special tear off object, overrides setBaseVal, to verify the incoming int
                                                                  is within the enum range, otherwhise raise an SVG DOM exception. This makes it impossible to make any of
                                                                  the enums go out of range anymore (which lead to security bugs in the past).
        (WebCore::SVGAnimatedEnumerationPropertyTearOff::setBaseVal):
        (WebCore::SVGAnimatedEnumerationPropertyTearOff::create):
        (WebCore::SVGAnimatedEnumerationPropertyTearOff::SVGAnimatedEnumerationPropertyTearOff):
        * svg/properties/SVGAnimatedStaticPropertyTearOff.h:
        (WebCore::SVGAnimatedStaticPropertyTearOff::setBaseVal): Made this method virtual, to SVGAnimatedEnumerationPropertyTearOff can override the default behaviour. Also added an ExceptionCode param.
        (WebCore::SVGAnimatedStaticPropertyTearOff::~SVGAnimatedStaticPropertyTearOff):

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

124 files changed:
LayoutTests/ChangeLog
LayoutTests/platform/mac/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.png
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement-expected.txt [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html [new file with mode: 0644]
LayoutTests/svg/dom/SVGAnimatedEnumeration-expected.txt
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFilterElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGGradientElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMaskElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGPatternElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js [new file with mode: 0644]
LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration.js
LayoutTests/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.txt
LayoutTests/svg/dynamic-updates/script-tests/SVGTextElement-svgdom-lengthAdjust-prop.js
LayoutTests/svg/filters/feBlend-invalid-mode-expected.txt
LayoutTests/svg/filters/feComponentTransfer-style-crash-expected.txt
LayoutTests/svg/filters/feComponentTransfer-style-crash.xhtml
LayoutTests/svg/filters/feDisplacementMap-crash-test-expected.txt
LayoutTests/svg/filters/feDisplacementMap-crash-test.xhtml
Source/WebCore/ChangeLog
Source/WebCore/GNUmakefile.list.am
Source/WebCore/WebCore.gypi
Source/WebCore/WebCore.pro
Source/WebCore/WebCore.vcproj/WebCore.vcproj
Source/WebCore/WebCore.xcodeproj/project.pbxproj
Source/WebCore/bindings/scripts/CodeGeneratorV8.pm
Source/WebCore/platform/graphics/GraphicsTypes.h
Source/WebCore/platform/graphics/filters/FEBlend.cpp
Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp
Source/WebCore/rendering/svg/RenderSVGResourceClipper.h
Source/WebCore/rendering/svg/RenderSVGResourceFilter.h
Source/WebCore/rendering/svg/RenderSVGResourceGradient.cpp
Source/WebCore/rendering/svg/RenderSVGResourceGradient.h
Source/WebCore/rendering/svg/RenderSVGResourceLinearGradient.cpp
Source/WebCore/rendering/svg/RenderSVGResourceMarker.h
Source/WebCore/rendering/svg/RenderSVGResourceMasker.h
Source/WebCore/rendering/svg/RenderSVGResourceRadialGradient.cpp
Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp
Source/WebCore/rendering/svg/SVGTextChunkBuilder.cpp
Source/WebCore/rendering/svg/SVGTextLayoutEngine.cpp
Source/WebCore/svg/GradientAttributes.h
Source/WebCore/svg/SVGAnimatedBoolean.idl
Source/WebCore/svg/SVGAnimatedEnumeration.h
Source/WebCore/svg/SVGAnimatedEnumeration.idl
Source/WebCore/svg/SVGAnimatedInteger.idl
Source/WebCore/svg/SVGAnimatedNumber.idl
Source/WebCore/svg/SVGAnimatedString.idl
Source/WebCore/svg/SVGClipPathElement.cpp
Source/WebCore/svg/SVGClipPathElement.h
Source/WebCore/svg/SVGComponentTransferFunctionElement.cpp
Source/WebCore/svg/SVGComponentTransferFunctionElement.h
Source/WebCore/svg/SVGFEBlendElement.cpp
Source/WebCore/svg/SVGFEBlendElement.h
Source/WebCore/svg/SVGFEColorMatrixElement.cpp
Source/WebCore/svg/SVGFEColorMatrixElement.h
Source/WebCore/svg/SVGFECompositeElement.cpp
Source/WebCore/svg/SVGFECompositeElement.h
Source/WebCore/svg/SVGFEConvolveMatrixElement.cpp
Source/WebCore/svg/SVGFEConvolveMatrixElement.h
Source/WebCore/svg/SVGFEDisplacementMapElement.cpp
Source/WebCore/svg/SVGFEDisplacementMapElement.h
Source/WebCore/svg/SVGFEMorphologyElement.cpp
Source/WebCore/svg/SVGFEMorphologyElement.h
Source/WebCore/svg/SVGFETurbulenceElement.cpp
Source/WebCore/svg/SVGFETurbulenceElement.h
Source/WebCore/svg/SVGFilterElement.cpp
Source/WebCore/svg/SVGFilterElement.h
Source/WebCore/svg/SVGGradientElement.cpp
Source/WebCore/svg/SVGGradientElement.h
Source/WebCore/svg/SVGLinearGradientElement.cpp
Source/WebCore/svg/SVGMarkerElement.cpp
Source/WebCore/svg/SVGMarkerElement.h
Source/WebCore/svg/SVGMaskElement.cpp
Source/WebCore/svg/SVGMaskElement.h
Source/WebCore/svg/SVGPatternElement.cpp
Source/WebCore/svg/SVGPatternElement.h
Source/WebCore/svg/SVGRadialGradientElement.cpp
Source/WebCore/svg/SVGTextContentElement.cpp
Source/WebCore/svg/SVGTextContentElement.h
Source/WebCore/svg/SVGTextPathElement.cpp
Source/WebCore/svg/SVGTextPathElement.h
Source/WebCore/svg/SVGUnitTypes.h
Source/WebCore/svg/properties/SVGAnimatedEnumerationPropertyTearOff.h [new file with mode: 0644]
Source/WebCore/svg/properties/SVGAnimatedStaticPropertyTearOff.h

index d97946d..8619b23 100644 (file)
@@ -1,3 +1,72 @@
+2011-05-18  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        Reviewed by Rob Buis.
+
+        All animated SVG enum properties are now ints
+        https://bugs.webkit.org/show_bug.cgi?id=10749
+
+        Add tests for all elements using SVGAnimatedEnumeration in the SVG DOM API.
+
+        * platform/mac/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.png: Update result, progression.
+        * svg/dom/SVGAnimatedEnumeration-SVGClipPathElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFilterElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGGradientElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGMaskElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGPatternElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGTextContentElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGTextPathElement-expected.txt: Added.
+        * svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html: Added.
+        * svg/dom/SVGAnimatedEnumeration-expected.txt:
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGFilterElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGGradientElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGMaskElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGPatternElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js: Added.
+        * svg/dom/script-tests/SVGAnimatedEnumeration.js:
+        * svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.txt:
+        * svg/dynamic-updates/script-tests/SVGTextElement-svgdom-lengthAdjust-prop.js:
+        (executeTest):
+        * svg/filters/feBlend-invalid-mode-expected.txt:
+        * svg/filters/feComponentTransfer-style-crash-expected.txt:
+        * svg/filters/feComponentTransfer-style-crash.xhtml:
+        * svg/filters/feDisplacementMap-crash-test-expected.txt:
+        * svg/filters/feDisplacementMap-crash-test.xhtml:
+
 2011-05-18  Kinuko Yasuda  <kinuko@chromium.org>
 
         Reviewed by David Levin.
index 56c5c2f..154f267 100644 (file)
Binary files a/LayoutTests/platform/mac/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.png and b/LayoutTests/platform/mac/svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop-expected.png differ
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement-expected.txt
new file mode 100644 (file)
index 0000000..bd34df7
--- /dev/null
@@ -0,0 +1,35 @@
+This test checks the use of SVGAnimatedEnumeration within SVGClipPathElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'clipPathUnits' value
+PASS clipPathElement.clipPathUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(clipPathElement.clipPathUnits.baseVal) is "number"
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS clipPathElement.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS clipPathElement.getAttribute('clipPathUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS clipPathElement.clipPathUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS clipPathElement.getAttribute('clipPathUnits') is "objectBoundingBox"
+PASS clipPathElement.clipPathUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS clipPathElement.getAttribute('clipPathUnits') is "objectBoundingBox"
+PASS clipPathElement.clipPathUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS clipPathElement.getAttribute('clipPathUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS clipPathElement.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS clipPathElement.getAttribute('clipPathUnits') is "userSpaceOnUse"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html
new file mode 100644 (file)
index 0000000..46f163d
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement-expected.txt
new file mode 100644 (file)
index 0000000..250d064
--- /dev/null
@@ -0,0 +1,50 @@
+This test checks the use of SVGAnimatedEnumeration within SVGComponentTransferFunctionElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'type' value
+PASS feFuncRElement.type.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feFuncRElement.type.baseVal) is "number"
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY
+
+Switch to 'table'
+PASS feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE
+PASS feFuncRElement.getAttribute('type') is "table"
+
+Switch to 'discrete'
+PASS feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE
+PASS feFuncRElement.getAttribute('type') is "discrete"
+
+Switch to 'linear'
+PASS feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR
+PASS feFuncRElement.getAttribute('type') is "linear"
+
+Switch to 'gamma'
+PASS feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
+PASS feFuncRElement.getAttribute('type') is "gamma"
+
+Try setting invalid values
+PASS feFuncRElement.type.baseVal = 6 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
+PASS feFuncRElement.getAttribute('type') is "gamma"
+PASS feFuncRElement.type.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
+PASS feFuncRElement.getAttribute('type') is "gamma"
+PASS feFuncRElement.type.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA
+PASS feFuncRElement.getAttribute('type') is "gamma"
+
+Switch to 'identity'
+PASS feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY
+PASS feFuncRElement.type.baseVal is SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY
+PASS feFuncRElement.getAttribute('type') is "identity"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html
new file mode 100644 (file)
index 0000000..eacaa8f
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement-expected.txt
new file mode 100644 (file)
index 0000000..39af2ca
--- /dev/null
@@ -0,0 +1,50 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFEBlendElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'mode' value
+PASS feBlendElement.mode.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feBlendElement.mode.baseVal) is "number"
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL
+
+Switch to 'multiply'
+PASS feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY is SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY
+PASS feBlendElement.getAttribute('mode') is "multiply"
+
+Switch to 'screen'
+PASS feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN is SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN
+PASS feBlendElement.getAttribute('mode') is "screen"
+
+Switch to 'darken'
+PASS feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN is SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN
+PASS feBlendElement.getAttribute('mode') is "darken"
+
+Switch to 'lighten'
+PASS feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN is SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN
+PASS feBlendElement.getAttribute('mode') is "lighten"
+
+Try setting invalid values
+PASS feBlendElement.mode.baseVal = 6 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN
+PASS feBlendElement.getAttribute('mode') is "lighten"
+PASS feBlendElement.mode.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN
+PASS feBlendElement.getAttribute('mode') is "lighten"
+PASS feBlendElement.mode.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN
+PASS feBlendElement.getAttribute('mode') is "lighten"
+
+Switch to 'normal'
+PASS feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL is SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL
+PASS feBlendElement.mode.baseVal is SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL
+PASS feBlendElement.getAttribute('mode') is "normal"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html
new file mode 100644 (file)
index 0000000..ed36ee6
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement-expected.txt
new file mode 100644 (file)
index 0000000..e66e703
--- /dev/null
@@ -0,0 +1,45 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFEColorMatrixElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'type; value
+PASS feColorMatrixElement.type.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feColorMatrixElement.type.baseVal) is "number"
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX
+
+Switch to 'saturate'
+PASS feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE
+PASS feColorMatrixElement.getAttribute('type') is "saturate"
+
+Switch to 'hueRotate'
+PASS feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE
+PASS feColorMatrixElement.getAttribute('type') is "hueRotate"
+
+Switch to 'luminanceToAlpha'
+PASS feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
+PASS feColorMatrixElement.getAttribute('type') is "luminanceToAlpha"
+
+Try setting invalid values
+PASS feColorMatrixElement.type.baseVal = 5 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
+PASS feColorMatrixElement.getAttribute('type') is "luminanceToAlpha"
+PASS feColorMatrixElement.type.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
+PASS feColorMatrixElement.getAttribute('type') is "luminanceToAlpha"
+PASS feColorMatrixElement.type.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA
+PASS feColorMatrixElement.getAttribute('type') is "luminanceToAlpha"
+
+Switch to 'matrix'
+PASS feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX
+PASS feColorMatrixElement.type.baseVal is SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX
+PASS feColorMatrixElement.getAttribute('type') is "matrix"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html
new file mode 100644 (file)
index 0000000..ce16fb2
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement-expected.txt
new file mode 100644 (file)
index 0000000..64b27e1
--- /dev/null
@@ -0,0 +1,55 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFECompositeElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'operator' value
+PASS feCompositeElement.operator.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feCompositeElement.operator.baseVal) is "number"
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER
+
+Switch to 'in'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN
+PASS feCompositeElement.getAttribute('operator') is "in"
+
+Switch to 'out'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT
+PASS feCompositeElement.getAttribute('operator') is "out"
+
+Switch to 'atop'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP
+PASS feCompositeElement.getAttribute('operator') is "atop"
+
+Switch to 'xor'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR
+PASS feCompositeElement.getAttribute('operator') is "xor"
+
+Switch to 'arithmetic'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
+PASS feCompositeElement.getAttribute('operator') is "arithmetic"
+
+Try setting invalid values
+PASS feCompositeElement.operator.baseVal = 7 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
+PASS feCompositeElement.getAttribute('operator') is "arithmetic"
+PASS feCompositeElement.operator.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
+PASS feCompositeElement.getAttribute('operator') is "arithmetic"
+PASS feCompositeElement.operator.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC
+PASS feCompositeElement.getAttribute('operator') is "arithmetic"
+
+Switch to 'over'
+PASS feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER
+PASS feCompositeElement.operator.baseVal is SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER
+PASS feCompositeElement.getAttribute('operator') is "over"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html
new file mode 100644 (file)
index 0000000..3fc7c60
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement-expected.txt
new file mode 100644 (file)
index 0000000..7b49932
--- /dev/null
@@ -0,0 +1,40 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFEConvolveMatrixElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'edgeMode' value
+PASS feConvolveMatrixElement.edgeMode.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feConvolveMatrixElement.edgeMode.baseVal) is "number"
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE
+
+Switch to 'wrap'
+PASS feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP is SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "wrap"
+
+Switch to 'none'
+PASS feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE is SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "none"
+
+Try setting invalid values
+PASS feConvolveMatrixElement.edgeMode.baseVal = 4 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "none"
+PASS feConvolveMatrixElement.edgeMode.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "none"
+PASS feConvolveMatrixElement.edgeMode.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "none"
+
+Switch to 'duplicate'
+PASS feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE is SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE
+PASS feConvolveMatrixElement.edgeMode.baseVal is SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE
+PASS feConvolveMatrixElement.getAttribute('edgeMode') is "duplicate"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html
new file mode 100644 (file)
index 0000000..a21fc54
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement-expected.txt
new file mode 100644 (file)
index 0000000..d5fff2a
--- /dev/null
@@ -0,0 +1,81 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFEDisplacementMapElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'xChannelSelector' value
+PASS feDisplacementMapElement.xChannelSelector.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feDisplacementMapElement.xChannelSelector.baseVal) is "number"
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+
+Switch to 'G'
+PASS feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_G is SVGFEDisplacementMapElement.SVG_CHANNEL_G
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_G
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "G"
+
+Switch to 'B'
+PASS feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_B is SVGFEDisplacementMapElement.SVG_CHANNEL_B
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_B
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "B"
+
+Switch to 'A'
+PASS feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_A is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "A"
+
+Try setting invalid values
+PASS feDisplacementMapElement.xChannelSelector.baseVal = 5 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "A"
+PASS feDisplacementMapElement.xChannelSelector.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "A"
+PASS feDisplacementMapElement.xChannelSelector.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "A"
+
+Switch to 'R'
+PASS feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_R is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+PASS feDisplacementMapElement.xChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+PASS feDisplacementMapElement.getAttribute('xChannelSelector') is "R"
+
+Check initial 'yChannelSelector' value
+PASS feDisplacementMapElement.yChannelSelector.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feDisplacementMapElement.yChannelSelector.baseVal) is "number"
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+
+Switch to 'G'
+PASS feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_G is SVGFEDisplacementMapElement.SVG_CHANNEL_G
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_G
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "G"
+
+Switch to 'B'
+PASS feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_B is SVGFEDisplacementMapElement.SVG_CHANNEL_B
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_B
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "B"
+
+Switch to 'A'
+PASS feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_A is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "A"
+
+Try setting invalid values
+PASS feDisplacementMapElement.yChannelSelector.baseVal = 5 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "A"
+PASS feDisplacementMapElement.yChannelSelector.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "A"
+PASS feDisplacementMapElement.yChannelSelector.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_A
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "A"
+
+Switch to 'R'
+PASS feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_R is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+PASS feDisplacementMapElement.yChannelSelector.baseVal is SVGFEDisplacementMapElement.SVG_CHANNEL_R
+PASS feDisplacementMapElement.getAttribute('yChannelSelector') is "R"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html
new file mode 100644 (file)
index 0000000..2a92d74
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement-expected.txt
new file mode 100644 (file)
index 0000000..4eb4d5b
--- /dev/null
@@ -0,0 +1,35 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFEMorphologyElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'operator' value
+PASS feMorphologyElement.operator.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feMorphologyElement.operator.baseVal) is "number"
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE
+
+Switch to 'dilate'
+PASS feMorphologyElement.operator.baseVal = SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE
+PASS feMorphologyElement.getAttribute('operator') is "dilate"
+
+Try setting invalid values
+PASS feMorphologyElement.operator.baseVal = 4 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE
+PASS feMorphologyElement.getAttribute('operator') is "dilate"
+PASS feMorphologyElement.operator.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE
+PASS feMorphologyElement.getAttribute('operator') is "dilate"
+PASS feMorphologyElement.operator.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE
+PASS feMorphologyElement.getAttribute('operator') is "dilate"
+
+Switch to 'erode'
+PASS feMorphologyElement.operator.baseVal = SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE
+PASS feMorphologyElement.operator.baseVal is SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE
+PASS feMorphologyElement.getAttribute('operator') is "erode"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html
new file mode 100644 (file)
index 0000000..f5d5adc
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement-expected.txt
new file mode 100644 (file)
index 0000000..456d15f
--- /dev/null
@@ -0,0 +1,61 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFETurbulenceElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'type' value
+PASS feTurbulenceElement.type.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feTurbulenceElement.type.baseVal) is "number"
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE
+
+Switch to 'turbulence'
+PASS feTurbulenceElement.type.baseVal = SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE
+PASS feTurbulenceElement.getAttribute('type') is "turbulence"
+
+Try setting invalid values
+PASS feTurbulenceElement.type.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE
+PASS feTurbulenceElement.getAttribute('type') is "turbulence"
+PASS feTurbulenceElement.type.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE
+PASS feTurbulenceElement.getAttribute('type') is "turbulence"
+PASS feTurbulenceElement.type.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE
+PASS feTurbulenceElement.getAttribute('type') is "turbulence"
+
+Switch to 'fractalNoise'
+PASS feTurbulenceElement.type.baseVal = SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE
+PASS feTurbulenceElement.type.baseVal is SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE
+PASS feTurbulenceElement.getAttribute('type') is "fractalNoise"
+
+Check initial 'stitchTiles' value
+PASS feTurbulenceElement.stitchTiles.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(feTurbulenceElement.stitchTiles.baseVal) is "number"
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH
+
+Switch to 'noStitch'
+PASS feTurbulenceElement.stitchTiles.baseVal = SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH is SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH
+PASS feTurbulenceElement.getAttribute('stitchTiles') is "noStitch"
+
+Try setting invalid values
+PASS feTurbulenceElement.stitchTiles.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH
+PASS feTurbulenceElement.getAttribute('stitchTiles') is "noStitch"
+PASS feTurbulenceElement.stitchTiles.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH
+PASS feTurbulenceElement.getAttribute('stitchTiles') is "noStitch"
+PASS feTurbulenceElement.stitchTiles.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH
+PASS feTurbulenceElement.getAttribute('stitchTiles') is "noStitch"
+
+Switch to 'stitch'
+PASS feTurbulenceElement.stitchTiles.baseVal = SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH is SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH
+PASS feTurbulenceElement.stitchTiles.baseVal is SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH
+PASS feTurbulenceElement.getAttribute('stitchTiles') is "stitch"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html
new file mode 100644 (file)
index 0000000..6068ed7
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement-expected.txt
new file mode 100644 (file)
index 0000000..3e4a58f
--- /dev/null
@@ -0,0 +1,61 @@
+This test checks the use of SVGAnimatedEnumeration within SVGFilterElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'filterUnits' value
+PASS filterElement.filterUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(filterElement.filterUnits.baseVal) is "number"
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS filterElement.filterUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('filterUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS filterElement.filterUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('filterUnits') is "objectBoundingBox"
+PASS filterElement.filterUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('filterUnits') is "objectBoundingBox"
+PASS filterElement.filterUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('filterUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS filterElement.filterUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS filterElement.filterUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS filterElement.getAttribute('filterUnits') is "userSpaceOnUse"
+
+Check initial 'primitiveUnits' value
+PASS filterElement.primitiveUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(filterElement.primitiveUnits.baseVal) is "number"
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS filterElement.primitiveUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('primitiveUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS filterElement.primitiveUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('primitiveUnits') is "objectBoundingBox"
+PASS filterElement.primitiveUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('primitiveUnits') is "objectBoundingBox"
+PASS filterElement.primitiveUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS filterElement.getAttribute('primitiveUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS filterElement.primitiveUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS filterElement.primitiveUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS filterElement.getAttribute('primitiveUnits') is "userSpaceOnUse"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html
new file mode 100644 (file)
index 0000000..7936de6
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGFilterElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement-expected.txt
new file mode 100644 (file)
index 0000000..6baa980
--- /dev/null
@@ -0,0 +1,66 @@
+This test checks the use of SVGAnimatedEnumeration within SVGGradientElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'gradientUnits' value
+PASS gradientElement.gradientUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(gradientElement.gradientUnits.baseVal) is "number"
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS gradientElement.getAttribute('gradientUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS gradientElement.gradientUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS gradientElement.getAttribute('gradientUnits') is "objectBoundingBox"
+PASS gradientElement.gradientUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS gradientElement.getAttribute('gradientUnits') is "objectBoundingBox"
+PASS gradientElement.gradientUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS gradientElement.getAttribute('gradientUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS gradientElement.gradientUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS gradientElement.getAttribute('gradientUnits') is "userSpaceOnUse"
+
+Check initial 'spreadMethod' value
+PASS gradientElement.spreadMethod.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(gradientElement.spreadMethod.baseVal) is "number"
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_PAD
+
+Switch to 'reflect' value
+PASS gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REFLECT is SVGGradientElement.SVG_SPREADMETHOD_REFLECT
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_REFLECT
+PASS gradientElement.getAttribute('spreadMethod') is "reflect"
+
+Switch to 'repeat' value
+PASS gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REPEAT is SVGGradientElement.SVG_SPREADMETHOD_REPEAT
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_REPEAT
+PASS gradientElement.getAttribute('spreadMethod') is "repeat"
+
+Try setting invalid values
+PASS gradientElement.spreadMethod.baseVal = 4 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_REPEAT
+PASS gradientElement.getAttribute('spreadMethod') is "repeat"
+PASS gradientElement.spreadMethod.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_REPEAT
+PASS gradientElement.getAttribute('spreadMethod') is "repeat"
+PASS gradientElement.spreadMethod.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_REPEAT
+PASS gradientElement.getAttribute('spreadMethod') is "repeat"
+
+Switch to 'pad'
+PASS gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_PAD is SVGGradientElement.SVG_SPREADMETHOD_PAD
+PASS gradientElement.spreadMethod.baseVal is SVGGradientElement.SVG_SPREADMETHOD_PAD
+PASS gradientElement.getAttribute('spreadMethod') is "pad"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html
new file mode 100644 (file)
index 0000000..16c2ec3
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGGradientElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement-expected.txt
new file mode 100644 (file)
index 0000000..8f8a6f6
--- /dev/null
@@ -0,0 +1,118 @@
+This test checks the use of SVGAnimatedEnumeration within SVGMarkerElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'markerUnits' value
+PASS markerElement.markerUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(markerElement.markerUnits.baseVal) is "number"
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE
+
+Switch to 'strokeWidth'
+PASS markerElement.markerUnits.baseVal = SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH is SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH
+PASS markerElement.getAttribute('markerUnits') is "strokeWidth"
+
+Try setting invalid values
+PASS markerElement.markerUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH
+PASS markerElement.getAttribute('markerUnits') is "strokeWidth"
+PASS markerElement.markerUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH
+PASS markerElement.getAttribute('markerUnits') is "strokeWidth"
+PASS markerElement.markerUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH
+PASS markerElement.getAttribute('markerUnits') is "strokeWidth"
+
+Switch to 'userSpaceOnUse'
+PASS markerElement.markerUnits.baseVal = SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE is SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE
+PASS markerElement.markerUnits.baseVal is SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE
+PASS markerElement.getAttribute('markerUnits') is "userSpaceOnUse"
+
+Check initial 'orient' value
+PASS markerElement.orientType.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(markerElement.orientType.baseVal) is "number"
+PASS markerElement.orientAngle.baseVal.value is 0
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_UNSPECIFIED
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+
+Switch to 'Pi/2 rad' value - via setOrientToAngle()
+PASS anglePiHalfRad = svgElement.createSVGAngle(); anglePiHalfRad.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD, (Math.PI / 2).toFixed(2)) is undefined.
+PASS markerElement.setOrientToAngle(anglePiHalfRad) is undefined.
+PASS markerElement.orientAngle.baseVal.value.toFixed(1) is "90.0"
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_RAD
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "1.57rad"
+
+Switch to 'auto' value - via setOrientToAuto()
+PASS markerElement.setOrientToAuto() is undefined.
+PASS markerElement.orientAngle.baseVal.value is 0
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_UNSPECIFIED
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.getAttribute('orient') is "auto"
+
+Switch to '20deg' value - via setOrientToAngle()
+PASS angle20deg = svgElement.createSVGAngle(); angle20deg.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 20) is undefined.
+PASS markerElement.setOrientToAngle(angle20deg) is undefined.
+PASS markerElement.orientAngle.baseVal.value is 20
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_DEG
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "20deg"
+
+Switch to '10deg' value
+PASS markerElement.orientAngle.baseVal.value = 10 is 10
+PASS markerElement.orientAngle.baseVal.value is 10
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_DEG
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "10deg"
+
+Switch to 'auto' value - by modifying orientType, this shouldn't change the orientAngle, but change the 'orient' attribute
+PASS markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.orientAngle.baseVal.value is 10
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_DEG
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.getAttribute('orient') is "auto"
+
+Switch to '10deg' value - by modifying orientType to be angle again, the 10deg should be preserved in the orientAngle, and the 'orient' attribute should change
+PASS markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.orientAngle.baseVal.value is 10
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_DEG
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "10deg"
+
+Try setting invalid values
+PASS markerElement.orientType.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "10deg"
+PASS markerElement.orientType.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "10deg"
+PASS markerElement.orientType.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "10deg"
+
+Switch back to 'auto' value
+PASS markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.orientAngle.baseVal.value is 10
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_DEG
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.getAttribute('orient') is "auto"
+
+Switch to '100grad' value - only touch orientAngle, shouldn't change orientType nor the 'orient' attribute
+PASS markerElement.orientAngle.baseVal.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD, 100) is undefined.
+PASS markerElement.orientAngle.baseVal.value is 90
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_GRAD
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_AUTO
+PASS markerElement.getAttribute('orient') is "auto"
+
+Finish switching to '100grad' value - by modifying the orientType to angle
+PASS markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.orientAngle.baseVal.value is 90
+PASS markerElement.orientAngle.baseVal.unitType is SVGAngle.SVG_ANGLETYPE_GRAD
+PASS markerElement.orientType.baseVal is SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE
+PASS markerElement.getAttribute('orient') is "100grad"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html
new file mode 100644 (file)
index 0000000..97d17e5
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement-expected.txt
new file mode 100644 (file)
index 0000000..dcf93e2
--- /dev/null
@@ -0,0 +1,61 @@
+This test checks the use of SVGAnimatedEnumeration within SVGPatternElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'patternUnits' value
+PASS patternElement.patternUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(patternElement.patternUnits.baseVal) is "number"
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS patternElement.patternUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS patternElement.patternUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternUnits') is "objectBoundingBox"
+PASS patternElement.patternUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternUnits') is "objectBoundingBox"
+PASS patternElement.patternUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS patternElement.patternUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS patternElement.patternUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS patternElement.getAttribute('patternUnits') is "userSpaceOnUse"
+
+Check initial 'patternContentUnits' value
+PASS patternElement.patternContentUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(patternElement.patternContentUnits.baseVal) is "number"
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS patternElement.patternContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternContentUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS patternElement.patternContentUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternContentUnits') is "objectBoundingBox"
+PASS patternElement.patternContentUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternContentUnits') is "objectBoundingBox"
+PASS patternElement.patternContentUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS patternElement.getAttribute('patternContentUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS patternElement.patternContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS patternElement.patternContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS patternElement.getAttribute('patternContentUnits') is "userSpaceOnUse"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html
new file mode 100644 (file)
index 0000000..d561626
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGPatternElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement-expected.txt
new file mode 100644 (file)
index 0000000..eb3471c
--- /dev/null
@@ -0,0 +1,61 @@
+This test checks the use of SVGAnimatedEnumeration within SVGMaskElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'maskUnits' value
+PASS maskElement.maskUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(maskElement.maskUnits.baseVal) is "number"
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS maskElement.maskUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
+PASS maskElement.maskUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
+PASS maskElement.maskUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS maskElement.maskUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS maskElement.getAttribute('maskUnits') is "userSpaceOnUse"
+
+Check initial 'maskContentUnits' value
+PASS maskElement.maskContentUnits.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(maskElement.maskContentUnits.baseVal) is "number"
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+
+Switch to 'objectBoundingBox'
+PASS maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
+
+Try setting invalid values
+PASS maskElement.maskContentUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
+PASS maskElement.maskContentUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
+PASS maskElement.maskContentUnits.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
+PASS maskElement.getAttribute('maskContentUnits') is "objectBoundingBox"
+
+Switch to 'userSpaceOnUse'
+PASS maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS maskElement.maskContentUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS maskElement.getAttribute('maskContentUnits') is "userSpaceOnUse"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html
new file mode 100644 (file)
index 0000000..f8e730f
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGMaskElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement-expected.txt
new file mode 100644 (file)
index 0000000..5bd9c28
--- /dev/null
@@ -0,0 +1,35 @@
+This test checks the use of SVGAnimatedEnumeration within SVGTextContentElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'lengthAdjust' value
+PASS textContentElement.lengthAdjust.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(textContentElement.lengthAdjust.baseVal) is "number"
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACING
+
+Switch to 'spacingAndGlyphs'
+PASS textContentElement.lengthAdjust.baseVal = SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
+PASS textContentElement.getAttribute('lengthAdjust') is "spacingAndGlyphs"
+
+Try setting invalid values
+PASS textContentElement.lengthAdjust.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
+PASS textContentElement.getAttribute('lengthAdjust') is "spacingAndGlyphs"
+PASS textContentElement.lengthAdjust.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
+PASS textContentElement.getAttribute('lengthAdjust') is "spacingAndGlyphs"
+PASS textContentElement.lengthAdjust.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
+PASS textContentElement.getAttribute('lengthAdjust') is "spacingAndGlyphs"
+
+Switch to 'spacing'
+PASS textContentElement.lengthAdjust.baseVal = SVGTextContentElement.LENGTHADJUST_SPACING is SVGTextContentElement.LENGTHADJUST_SPACING
+PASS textContentElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACING
+PASS textContentElement.getAttribute('lengthAdjust') is "spacing"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html
new file mode 100644 (file)
index 0000000..3503b80
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement-expected.txt b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement-expected.txt
new file mode 100644 (file)
index 0000000..c6e73f9
--- /dev/null
@@ -0,0 +1,61 @@
+This test checks the use of SVGAnimatedEnumeration within SVGTextPathElement
+
+On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE".
+
+
+
+Check initial 'method' value
+PASS textPathElement.method.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(textPathElement.method.baseVal) is "number"
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN
+
+Switch to 'stretch'
+PASS textPathElement.method.baseVal = SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH is SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH
+PASS textPathElement.getAttribute('method') is "stretch"
+
+Try setting invalid values
+PASS textPathElement.method.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH
+PASS textPathElement.getAttribute('method') is "stretch"
+PASS textPathElement.method.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH
+PASS textPathElement.getAttribute('method') is "stretch"
+PASS textPathElement.method.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH
+PASS textPathElement.getAttribute('method') is "stretch"
+
+Switch to 'align'
+PASS textPathElement.method.baseVal = SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN is SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN
+PASS textPathElement.method.baseVal is SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN
+PASS textPathElement.getAttribute('method') is "align"
+
+Check initial 'spacing' value
+PASS textPathElement.spacing.toString() is "[object SVGAnimatedEnumeration]"
+PASS typeof(textPathElement.spacing.baseVal) is "number"
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO
+
+Switch to 'exact'
+PASS textPathElement.spacing.baseVal = SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT is SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT
+PASS textPathElement.getAttribute('spacing') is "exact"
+
+Try setting invalid values
+PASS textPathElement.spacing.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT
+PASS textPathElement.getAttribute('spacing') is "exact"
+PASS textPathElement.spacing.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT
+PASS textPathElement.getAttribute('spacing') is "exact"
+PASS textPathElement.spacing.baseVal = 0 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT
+PASS textPathElement.getAttribute('spacing') is "exact"
+
+Switch to 'auto'
+PASS textPathElement.spacing.baseVal = SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO is SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO
+PASS textPathElement.spacing.baseVal is SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO
+PASS textPathElement.getAttribute('spacing') is "auto"
+PASS successfullyParsed is true
+
+TEST COMPLETE
+
diff --git a/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html b/LayoutTests/svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html
new file mode 100644 (file)
index 0000000..5087b84
--- /dev/null
@@ -0,0 +1,13 @@
+<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
+<html>
+<head>
+<link rel="stylesheet" href="../../fast/js/resources/js-test-style.css">
+<script src="../../fast/js/resources/js-test-pre.js"></script>
+</head>
+<body>
+<p id="description"></p>
+<div id="console"></div>
+<script src="script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js"></script>
+<script src="../../fast/js/resources/js-test-post.js"></script>
+</body>
+</html>
index 79ae25a..ec829cc 100644 (file)
@@ -10,21 +10,20 @@ PASS typeof(clipPathElement.clipPathUnits.baseVal) is "number"
 PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
 
 Check that enumerations are static, caching value in a local variable and modifying it, should have no effect
-PASS enumRef is SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN
+PASS enumRef is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
 PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
 
 Check assigning various valid and invalid values
-FAIL clipPathElement.clipPathUnits.baseVal = 3 should throw an exception. Was 3.
-PASS clipPathElement.clipPathUnits.baseVal = 2 is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
-FAIL clipPathElement.clipPathUnits.baseVal = -1 should throw an exception. Was -1.
-PASS clipPathElement.clipPathUnits.baseVal = 'aString' is 'aString'
-PASS clipPathElement.clipPathUnits.baseVal is 0
-PASS clipPathElement.clipPathUnits.baseVal = 2 is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
-PASS clipPathElement.clipPathUnits.baseVal = clipPathElement is clipPathElement
-PASS clipPathElement.clipPathUnits.baseVal is 0
+PASS clipPathElement.clipPathUnits.baseVal = 3 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS clipPathElement.clipPathUnits.baseVal = -1 threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS clipPathElement.clipPathUnits.baseVal = '1' is "1"
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
+PASS clipPathElement.clipPathUnits.baseVal = 'aString' threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
+PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE
 PASS clipPathElement.clipPathUnits.baseVal = 2 is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
-
-Check that the clipPathUnits value remained objectBBox
+PASS clipPathElement.clipPathUnits.baseVal = clipPathElement threw exception Error: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1.
 PASS clipPathElement.clipPathUnits.baseVal is SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX
 PASS successfullyParsed is true
 
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGClipPathElement.js
new file mode 100644 (file)
index 0000000..ac34c12
--- /dev/null
@@ -0,0 +1,38 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGClipPathElement");
+
+var clipPathElement = document.createElementNS("http://www.w3.org/2000/svg", "clipPath");
+clipPathElement.setAttribute("clipPathUnits", "userSpaceOnUse");
+
+debug("");
+debug("Check initial 'clipPathUnits' value");
+shouldBeEqualToString("clipPathElement.clipPathUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(clipPathElement.clipPathUnits.baseVal)", "number");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("clipPathElement.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("clipPathElement.getAttribute('clipPathUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("clipPathElement.clipPathUnits.baseVal = 3");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("clipPathElement.getAttribute('clipPathUnits')", "objectBoundingBox");
+
+shouldThrow("clipPathElement.clipPathUnits.baseVal = -1");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("clipPathElement.getAttribute('clipPathUnits')", "objectBoundingBox");
+
+shouldThrow("clipPathElement.clipPathUnits.baseVal = 0");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("clipPathElement.getAttribute('clipPathUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("clipPathElement.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("clipPathElement.getAttribute('clipPathUnits')", "userSpaceOnUse");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.js
new file mode 100644 (file)
index 0000000..af872af
--- /dev/null
@@ -0,0 +1,56 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGComponentTransferFunctionElement");
+
+var feFuncRElement = document.createElementNS("http://www.w3.org/2000/svg", "feFuncR");
+feFuncRElement.setAttribute("type", "identity");
+
+debug("");
+debug("Check initial 'type' value");
+shouldBeEqualToString("feFuncRElement.type.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feFuncRElement.type.baseVal)", "number");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY");
+
+debug("");
+debug("Switch to 'table'");
+shouldBe("feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_TABLE");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "table");
+
+debug("");
+debug("Switch to 'discrete'");
+shouldBe("feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_DISCRETE");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "discrete");
+
+debug("");
+debug("Switch to 'linear'");
+shouldBe("feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_LINEAR");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "linear");
+
+debug("");
+debug("Switch to 'gamma'");
+shouldBe("feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "gamma");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feFuncRElement.type.baseVal = 6");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "gamma");
+
+shouldThrow("feFuncRElement.type.baseVal = -1");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "gamma");
+
+shouldThrow("feFuncRElement.type.baseVal = 0");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_GAMMA");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "gamma");
+
+debug("");
+debug("Switch to 'identity'");
+shouldBe("feFuncRElement.type.baseVal = SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY");
+shouldBe("feFuncRElement.type.baseVal", "SVGComponentTransferFunctionElement.SVG_FECOMPONENTTRANSFER_TYPE_IDENTITY");
+shouldBeEqualToString("feFuncRElement.getAttribute('type')", "identity");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEBlendElement.js
new file mode 100644 (file)
index 0000000..2cd8756
--- /dev/null
@@ -0,0 +1,56 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFEBlendElement");
+
+var feBlendElement = document.createElementNS("http://www.w3.org/2000/svg", "feBlend");
+feBlendElement.setAttribute("mode", "normal");
+
+debug("");
+debug("Check initial 'mode' value");
+shouldBeEqualToString("feBlendElement.mode.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feBlendElement.mode.baseVal)", "number");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL");
+
+debug("");
+debug("Switch to 'multiply'");
+shouldBe("feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY", "SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_MULTIPLY");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "multiply");
+
+debug("");
+debug("Switch to 'screen'");
+shouldBe("feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN", "SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_SCREEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "screen");
+
+debug("");
+debug("Switch to 'darken'");
+shouldBe("feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN", "SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_DARKEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "darken");
+
+debug("");
+debug("Switch to 'lighten'");
+shouldBe("feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN", "SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "lighten");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feBlendElement.mode.baseVal = 6");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "lighten");
+
+shouldThrow("feBlendElement.mode.baseVal = -1");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "lighten");
+
+shouldThrow("feBlendElement.mode.baseVal = 0");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_LIGHTEN");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "lighten");
+
+debug("");
+debug("Switch to 'normal'");
+shouldBe("feBlendElement.mode.baseVal = SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL", "SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL");
+shouldBe("feBlendElement.mode.baseVal", "SVGFEBlendElement.SVG_FEBLEND_MODE_NORMAL");
+shouldBeEqualToString("feBlendElement.getAttribute('mode')", "normal");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEColorMatrixElement.js
new file mode 100644 (file)
index 0000000..265aae3
--- /dev/null
@@ -0,0 +1,50 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFEColorMatrixElement");
+
+var feColorMatrixElement = document.createElementNS("http://www.w3.org/2000/svg", "feColorMatrix");
+feColorMatrixElement.setAttribute("type", "matrix");
+
+debug("");
+debug("Check initial 'type; value");
+shouldBeEqualToString("feColorMatrixElement.type.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feColorMatrixElement.type.baseVal)", "number");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX");
+
+debug("");
+debug("Switch to 'saturate'");
+shouldBe("feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_SATURATE");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "saturate");
+
+debug("");
+debug("Switch to 'hueRotate'");
+shouldBe("feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_HUEROTATE");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "hueRotate");
+
+debug("");
+debug("Switch to 'luminanceToAlpha'");
+shouldBe("feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "luminanceToAlpha");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feColorMatrixElement.type.baseVal = 5");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "luminanceToAlpha");
+
+shouldThrow("feColorMatrixElement.type.baseVal = -1");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "luminanceToAlpha");
+
+shouldThrow("feColorMatrixElement.type.baseVal = 0");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_LUMINANCETOALPHA");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "luminanceToAlpha");
+
+debug("");
+debug("Switch to 'matrix'");
+shouldBe("feColorMatrixElement.type.baseVal = SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX");
+shouldBe("feColorMatrixElement.type.baseVal", "SVGFEColorMatrixElement.SVG_FECOLORMATRIX_TYPE_MATRIX");
+shouldBeEqualToString("feColorMatrixElement.getAttribute('type')", "matrix");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFECompositeElement.js
new file mode 100644 (file)
index 0000000..d57a9ce
--- /dev/null
@@ -0,0 +1,62 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFECompositeElement");
+
+var feCompositeElement = document.createElementNS("http://www.w3.org/2000/svg", "feComposite");
+feCompositeElement.setAttribute("operator", "over");
+
+debug("");
+debug("Check initial 'operator' value");
+shouldBeEqualToString("feCompositeElement.operator.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feCompositeElement.operator.baseVal)", "number");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER");
+
+debug("");
+debug("Switch to 'in'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_IN");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "in");
+
+debug("");
+debug("Switch to 'out'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OUT");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "out");
+
+debug("");
+debug("Switch to 'atop'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ATOP");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "atop");
+
+debug("");
+debug("Switch to 'xor'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_XOR");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "xor");
+
+debug("");
+debug("Switch to 'arithmetic'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "arithmetic");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feCompositeElement.operator.baseVal = 7");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "arithmetic");
+
+shouldThrow("feCompositeElement.operator.baseVal = -1");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "arithmetic");
+
+shouldThrow("feCompositeElement.operator.baseVal = 0");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_ARITHMETIC");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "arithmetic");
+
+debug("");
+debug("Switch to 'over'");
+shouldBe("feCompositeElement.operator.baseVal = SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER");
+shouldBe("feCompositeElement.operator.baseVal", "SVGFECompositeElement.SVG_FECOMPOSITE_OPERATOR_OVER");
+shouldBeEqualToString("feCompositeElement.getAttribute('operator')", "over");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.js
new file mode 100644 (file)
index 0000000..3e1f8bc
--- /dev/null
@@ -0,0 +1,44 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFEConvolveMatrixElement");
+
+var feConvolveMatrixElement = document.createElementNS("http://www.w3.org/2000/svg", "feConvolveMatrix");
+feConvolveMatrixElement.setAttribute("edgeMode", "duplicate");
+
+debug("");
+debug("Check initial 'edgeMode' value");
+shouldBeEqualToString("feConvolveMatrixElement.edgeMode.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feConvolveMatrixElement.edgeMode.baseVal)", "number");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE");
+
+debug("");
+debug("Switch to 'wrap'");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_WRAP");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "wrap");
+
+debug("");
+debug("Switch to 'none'");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "none");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feConvolveMatrixElement.edgeMode.baseVal = 4");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "none");
+
+shouldThrow("feConvolveMatrixElement.edgeMode.baseVal = -1");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "none");
+
+shouldThrow("feConvolveMatrixElement.edgeMode.baseVal = 0");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_NONE");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "none");
+
+debug("");
+debug("Switch to 'duplicate'");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal = SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE");
+shouldBe("feConvolveMatrixElement.edgeMode.baseVal", "SVGFEConvolveMatrixElement.SVG_EDGEMODE_DUPLICATE");
+shouldBeEqualToString("feConvolveMatrixElement.getAttribute('edgeMode')", "duplicate");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.js
new file mode 100644 (file)
index 0000000..031e4f0
--- /dev/null
@@ -0,0 +1,97 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFEDisplacementMapElement");
+
+var feDisplacementMapElement = document.createElementNS("http://www.w3.org/2000/svg", "feDisplacementMap");
+feDisplacementMapElement.setAttribute("xChannelSelector", "R");
+feDisplacementMapElement.setAttribute("yChannelSelector", "R");
+
+// xChannelSelector
+debug("");
+debug("Check initial 'xChannelSelector' value");
+shouldBeEqualToString("feDisplacementMapElement.xChannelSelector.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feDisplacementMapElement.xChannelSelector.baseVal)", "number");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+
+debug("");
+debug("Switch to 'G'");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_G", "SVGFEDisplacementMapElement.SVG_CHANNEL_G");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_G");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "G");
+
+debug("");
+debug("Switch to 'B'");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_B", "SVGFEDisplacementMapElement.SVG_CHANNEL_B");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_B");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "B");
+
+debug("");
+debug("Switch to 'A'");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_A", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "A");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feDisplacementMapElement.xChannelSelector.baseVal = 5");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "A");
+
+shouldThrow("feDisplacementMapElement.xChannelSelector.baseVal = -1");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "A");
+
+shouldThrow("feDisplacementMapElement.xChannelSelector.baseVal = 0");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "A");
+
+debug("");
+debug("Switch to 'R'");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_R", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+shouldBe("feDisplacementMapElement.xChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('xChannelSelector')", "R");
+
+// yChannelSelector
+debug("");
+debug("Check initial 'yChannelSelector' value");
+shouldBeEqualToString("feDisplacementMapElement.yChannelSelector.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feDisplacementMapElement.yChannelSelector.baseVal)", "number");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+
+debug("");
+debug("Switch to 'G'");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_G", "SVGFEDisplacementMapElement.SVG_CHANNEL_G");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_G");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "G");
+
+debug("");
+debug("Switch to 'B'");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_B", "SVGFEDisplacementMapElement.SVG_CHANNEL_B");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_B");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "B");
+
+debug("");
+debug("Switch to 'A'");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_A", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "A");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feDisplacementMapElement.yChannelSelector.baseVal = 5");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "A");
+
+shouldThrow("feDisplacementMapElement.yChannelSelector.baseVal = -1");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "A");
+
+shouldThrow("feDisplacementMapElement.yChannelSelector.baseVal = 0");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_A");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "A");
+
+debug("");
+debug("Switch to 'R'");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal = SVGFEDisplacementMapElement.SVG_CHANNEL_R", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+shouldBe("feDisplacementMapElement.yChannelSelector.baseVal", "SVGFEDisplacementMapElement.SVG_CHANNEL_R");
+shouldBeEqualToString("feDisplacementMapElement.getAttribute('yChannelSelector')", "R");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFEMorphologyElement.js
new file mode 100644 (file)
index 0000000..90ddf73
--- /dev/null
@@ -0,0 +1,38 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFEMorphologyElement");
+
+var feMorphologyElement = document.createElementNS("http://www.w3.org/2000/svg", "feMorphology");
+feMorphologyElement.setAttribute("operator", "erode");
+
+debug("");
+debug("Check initial 'operator' value");
+shouldBeEqualToString("feMorphologyElement.operator.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feMorphologyElement.operator.baseVal)", "number");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE");
+
+debug("");
+debug("Switch to 'dilate'");
+shouldBe("feMorphologyElement.operator.baseVal = SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE");
+shouldBeEqualToString("feMorphologyElement.getAttribute('operator')", "dilate");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feMorphologyElement.operator.baseVal = 4");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE");
+shouldBeEqualToString("feMorphologyElement.getAttribute('operator')", "dilate");
+
+shouldThrow("feMorphologyElement.operator.baseVal = -1");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE");
+shouldBeEqualToString("feMorphologyElement.getAttribute('operator')", "dilate");
+
+shouldThrow("feMorphologyElement.operator.baseVal = 0");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_DILATE");
+shouldBeEqualToString("feMorphologyElement.getAttribute('operator')", "dilate");
+
+debug("");
+debug("Switch to 'erode'");
+shouldBe("feMorphologyElement.operator.baseVal = SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE");
+shouldBe("feMorphologyElement.operator.baseVal", "SVGFEMorphologyElement.SVG_MORPHOLOGY_OPERATOR_ERODE");
+shouldBeEqualToString("feMorphologyElement.getAttribute('operator')", "erode");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFETurbulenceElement.js
new file mode 100644 (file)
index 0000000..a8dd050
--- /dev/null
@@ -0,0 +1,73 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFETurbulenceElement");
+
+var feTurbulenceElement = document.createElementNS("http://www.w3.org/2000/svg", "feTurbulence");
+feTurbulenceElement.setAttribute("type", "fractalNoise");
+feTurbulenceElement.setAttribute("stitchTiles", "stitch");
+
+// type
+debug("");
+debug("Check initial 'type' value");
+shouldBeEqualToString("feTurbulenceElement.type.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feTurbulenceElement.type.baseVal)", "number");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE");
+
+debug("");
+debug("Switch to 'turbulence'");
+shouldBe("feTurbulenceElement.type.baseVal = SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('type')", "turbulence");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feTurbulenceElement.type.baseVal = 3");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('type')", "turbulence");
+
+shouldThrow("feTurbulenceElement.type.baseVal = -1");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('type')", "turbulence");
+
+shouldThrow("feTurbulenceElement.type.baseVal = 0");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_TURBULENCE");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('type')", "turbulence");
+
+debug("");
+debug("Switch to 'fractalNoise'");
+shouldBe("feTurbulenceElement.type.baseVal = SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE");
+shouldBe("feTurbulenceElement.type.baseVal", "SVGFETurbulenceElement.SVG_TURBULENCE_TYPE_FRACTALNOISE");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('type')", "fractalNoise");
+
+// stitchTiles
+debug("");
+debug("Check initial 'stitchTiles' value");
+shouldBeEqualToString("feTurbulenceElement.stitchTiles.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(feTurbulenceElement.stitchTiles.baseVal)", "number");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH");
+
+debug("");
+debug("Switch to 'noStitch'");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal = SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH", "SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('stitchTiles')", "noStitch");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("feTurbulenceElement.stitchTiles.baseVal = 3");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('stitchTiles')", "noStitch");
+
+shouldThrow("feTurbulenceElement.stitchTiles.baseVal = -1");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('stitchTiles')", "noStitch");
+
+shouldThrow("feTurbulenceElement.stitchTiles.baseVal = 0");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_NOSTITCH");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('stitchTiles')", "noStitch");
+
+debug("");
+debug("Switch to 'stitch'");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal = SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH", "SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH");
+shouldBe("feTurbulenceElement.stitchTiles.baseVal", "SVGFETurbulenceElement.SVG_STITCHTYPE_STITCH");
+shouldBeEqualToString("feTurbulenceElement.getAttribute('stitchTiles')", "stitch");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFilterElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGFilterElement.js
new file mode 100644 (file)
index 0000000..a622e54
--- /dev/null
@@ -0,0 +1,74 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGFilterElement");
+
+var filterElement = document.createElementNS("http://www.w3.org/2000/svg", "filter");
+filterElement.setAttribute("filterUnits", "userSpaceOnUse");
+filterElement.setAttribute("primitiveUnits", "userSpaceOnUse");
+
+// filterUnits
+debug("");
+debug("Check initial 'filterUnits' value");
+shouldBeEqualToString("filterElement.filterUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(filterElement.filterUnits.baseVal)", "number");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("filterElement.filterUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('filterUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("filterElement.filterUnits.baseVal = 3");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('filterUnits')", "objectBoundingBox");
+
+shouldThrow("filterElement.filterUnits.baseVal = -1");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('filterUnits')", "objectBoundingBox");
+
+shouldThrow("filterElement.filterUnits.baseVal = 0");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('filterUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("filterElement.filterUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("filterElement.filterUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("filterElement.getAttribute('filterUnits')", "userSpaceOnUse");
+
+// primitiveUnits
+debug("");
+debug("Check initial 'primitiveUnits' value");
+shouldBeEqualToString("filterElement.primitiveUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(filterElement.primitiveUnits.baseVal)", "number");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("filterElement.primitiveUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('primitiveUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("filterElement.primitiveUnits.baseVal = 3");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('primitiveUnits')", "objectBoundingBox");
+
+shouldThrow("filterElement.primitiveUnits.baseVal = -1");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('primitiveUnits')", "objectBoundingBox");
+
+shouldThrow("filterElement.primitiveUnits.baseVal = 0");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("filterElement.getAttribute('primitiveUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("filterElement.primitiveUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("filterElement.primitiveUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("filterElement.getAttribute('primitiveUnits')", "userSpaceOnUse");
+
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGGradientElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGGradientElement.js
new file mode 100644 (file)
index 0000000..b55e915
--- /dev/null
@@ -0,0 +1,79 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGGradientElement");
+
+var gradientElement = document.createElementNS("http://www.w3.org/2000/svg", "linearGradient");
+gradientElement.setAttribute("gradientUnits", "userSpaceOnUse");
+gradientElement.setAttribute("spreadMethod", "pad");
+
+// gradientUnits
+debug("");
+debug("Check initial 'gradientUnits' value");
+shouldBeEqualToString("gradientElement.gradientUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(gradientElement.gradientUnits.baseVal)", "number");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("gradientElement.getAttribute('gradientUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("gradientElement.gradientUnits.baseVal = 3");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("gradientElement.getAttribute('gradientUnits')", "objectBoundingBox");
+
+shouldThrow("gradientElement.gradientUnits.baseVal = -1");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("gradientElement.getAttribute('gradientUnits')", "objectBoundingBox");
+
+shouldThrow("gradientElement.gradientUnits.baseVal = 0");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("gradientElement.getAttribute('gradientUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("gradientElement.gradientUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("gradientElement.gradientUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("gradientElement.getAttribute('gradientUnits')", "userSpaceOnUse");
+
+// spreadMethod
+debug("");
+debug("Check initial 'spreadMethod' value");
+shouldBeEqualToString("gradientElement.spreadMethod.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(gradientElement.spreadMethod.baseVal)", "number");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_PAD");
+
+debug("");
+debug("Switch to 'reflect' value");
+shouldBe("gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REFLECT", "SVGGradientElement.SVG_SPREADMETHOD_REFLECT");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_REFLECT");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "reflect");
+
+debug("");
+debug("Switch to 'repeat' value");
+shouldBe("gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_REPEAT", "SVGGradientElement.SVG_SPREADMETHOD_REPEAT");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_REPEAT");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "repeat");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("gradientElement.spreadMethod.baseVal = 4");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_REPEAT");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "repeat");
+
+shouldThrow("gradientElement.spreadMethod.baseVal = -1");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_REPEAT");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "repeat");
+
+shouldThrow("gradientElement.spreadMethod.baseVal = 0");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_REPEAT");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "repeat");
+
+debug("");
+debug("Switch to 'pad'");
+shouldBe("gradientElement.spreadMethod.baseVal = SVGGradientElement.SVG_SPREADMETHOD_PAD", "SVGGradientElement.SVG_SPREADMETHOD_PAD");
+shouldBe("gradientElement.spreadMethod.baseVal", "SVGGradientElement.SVG_SPREADMETHOD_PAD");
+shouldBeEqualToString("gradientElement.getAttribute('spreadMethod')", "pad");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMarkerElement.js
new file mode 100644 (file)
index 0000000..a99beee
--- /dev/null
@@ -0,0 +1,139 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGMarkerElement");
+
+var markerElement = document.createElementNS("http://www.w3.org/2000/svg", "marker");
+markerElement.setAttribute("markerUnits", "userSpaceOnUse");
+markerElement.setAttribute("orient", "auto");
+
+var svgElement = document.createElementNS("http://www.w3.org/2000/svg", "svg");
+
+// markerUnits
+debug("");
+debug("Check initial 'markerUnits' value");
+shouldBeEqualToString("markerElement.markerUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(markerElement.markerUnits.baseVal)", "number");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'strokeWidth'");
+shouldBe("markerElement.markerUnits.baseVal = SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH", "SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH");
+shouldBeEqualToString("markerElement.getAttribute('markerUnits')", "strokeWidth");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("markerElement.markerUnits.baseVal = 3");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH");
+shouldBeEqualToString("markerElement.getAttribute('markerUnits')", "strokeWidth");
+
+shouldThrow("markerElement.markerUnits.baseVal = -1");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH");
+shouldBeEqualToString("markerElement.getAttribute('markerUnits')", "strokeWidth");
+
+shouldThrow("markerElement.markerUnits.baseVal = 0");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_STROKEWIDTH");
+shouldBeEqualToString("markerElement.getAttribute('markerUnits')", "strokeWidth");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("markerElement.markerUnits.baseVal = SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE", "SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE");
+shouldBe("markerElement.markerUnits.baseVal", "SVGMarkerElement.SVG_MARKERUNITS_USERSPACEONUSE");
+shouldBeEqualToString("markerElement.getAttribute('markerUnits')", "userSpaceOnUse");
+
+// orientType
+debug("");
+debug("Check initial 'orient' value");
+shouldBeEqualToString("markerElement.orientType.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(markerElement.orientType.baseVal)", "number");
+shouldBe("markerElement.orientAngle.baseVal.value", "0");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+
+debug("");
+debug("Switch to 'Pi/2 rad' value - via setOrientToAngle()");
+shouldBeUndefined("anglePiHalfRad = svgElement.createSVGAngle(); anglePiHalfRad.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_RAD, (Math.PI / 2).toFixed(2))");
+shouldBeUndefined("markerElement.setOrientToAngle(anglePiHalfRad)");
+shouldBeEqualToString("markerElement.orientAngle.baseVal.value.toFixed(1)", "90.0");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_RAD");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", (Math.PI / 2).toFixed(2) + "rad");
+
+debug("");
+debug("Switch to 'auto' value - via setOrientToAuto()");
+shouldBeUndefined("markerElement.setOrientToAuto()");
+shouldBe("markerElement.orientAngle.baseVal.value", "0");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_UNSPECIFIED");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "auto");
+
+debug("");
+debug("Switch to '20deg' value - via setOrientToAngle()");
+shouldBeUndefined("angle20deg = svgElement.createSVGAngle(); angle20deg.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_DEG, 20)");
+shouldBeUndefined("markerElement.setOrientToAngle(angle20deg)");
+shouldBe("markerElement.orientAngle.baseVal.value", "20");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "20deg");
+
+debug("");
+debug("Switch to '10deg' value");
+shouldBe("markerElement.orientAngle.baseVal.value = 10", "10");
+shouldBe("markerElement.orientAngle.baseVal.value", "10");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "10deg");
+
+debug("");
+debug("Switch to 'auto' value - by modifying orientType, this shouldn't change the orientAngle, but change the 'orient' attribute");
+shouldBe("markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBe("markerElement.orientAngle.baseVal.value", "10");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "auto");
+
+debug("");
+debug("Switch to '10deg' value - by modifying orientType to be angle again, the 10deg should be preserved in the orientAngle, and the 'orient' attribute should change");
+shouldBe("markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBe("markerElement.orientAngle.baseVal.value", "10");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "10deg");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("markerElement.orientType.baseVal = 3");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "10deg");
+
+shouldThrow("markerElement.orientType.baseVal = -1");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "10deg");
+
+shouldThrow("markerElement.orientType.baseVal = 0");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "10deg");
+
+debug("");
+debug("Switch back to 'auto' value");
+shouldBe("markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_AUTO", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBe("markerElement.orientAngle.baseVal.value", "10");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_DEG");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "auto");
+
+debug("");
+debug("Switch to '100grad' value - only touch orientAngle, shouldn't change orientType nor the 'orient' attribute");
+shouldBeUndefined("markerElement.orientAngle.baseVal.newValueSpecifiedUnits(SVGAngle.SVG_ANGLETYPE_GRAD, 100)");
+shouldBe("markerElement.orientAngle.baseVal.value", "90");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_GRAD");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_AUTO");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "auto");
+
+debug("");
+debug("Finish switching to '100grad' value - by modifying the orientType to angle");
+shouldBe("markerElement.orientType.baseVal = SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBe("markerElement.orientAngle.baseVal.value", "90");
+shouldBe("markerElement.orientAngle.baseVal.unitType", "SVGAngle.SVG_ANGLETYPE_GRAD");
+shouldBe("markerElement.orientType.baseVal", "SVGMarkerElement.SVG_MARKER_ORIENT_ANGLE");
+shouldBeEqualToString("markerElement.getAttribute('orient')", "100grad");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMaskElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGMaskElement.js
new file mode 100644 (file)
index 0000000..9db907d
--- /dev/null
@@ -0,0 +1,73 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGMaskElement");
+
+var maskElement = document.createElementNS("http://www.w3.org/2000/svg", "mask");
+maskElement.setAttribute("maskUnits", "userSpaceOnUse");
+maskElement.setAttribute("maskContentUnits", "userSpaceOnUse");
+
+// maskUnits
+debug("");
+debug("Check initial 'maskUnits' value");
+shouldBeEqualToString("maskElement.maskUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(maskElement.maskUnits.baseVal)", "number");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("maskElement.maskUnits.baseVal = 3");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskUnits')", "objectBoundingBox");
+
+shouldThrow("maskElement.maskUnits.baseVal = -1");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskUnits')", "objectBoundingBox");
+
+shouldThrow("maskElement.maskUnits.baseVal = 0");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("maskElement.maskUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("maskElement.maskUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("maskElement.getAttribute('maskUnits')", "userSpaceOnUse");
+
+// maskContentUnits
+debug("");
+debug("Check initial 'maskContentUnits' value");
+shouldBeEqualToString("maskElement.maskContentUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(maskElement.maskContentUnits.baseVal)", "number");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskContentUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("maskElement.maskContentUnits.baseVal = 3");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskContentUnits')", "objectBoundingBox");
+
+shouldThrow("maskElement.maskContentUnits.baseVal = -1");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskContentUnits')", "objectBoundingBox");
+
+shouldThrow("maskElement.maskContentUnits.baseVal = 0");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("maskElement.getAttribute('maskContentUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("maskElement.maskContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("maskElement.maskContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("maskElement.getAttribute('maskContentUnits')", "userSpaceOnUse");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGPatternElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGPatternElement.js
new file mode 100644 (file)
index 0000000..be28dc0
--- /dev/null
@@ -0,0 +1,73 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGPatternElement");
+
+var patternElement = document.createElementNS("http://www.w3.org/2000/svg", "pattern");
+patternElement.setAttribute("patternUnits", "userSpaceOnUse");
+patternElement.setAttribute("patternContentUnits", "userSpaceOnUse");
+
+// patternUnits
+debug("");
+debug("Check initial 'patternUnits' value");
+shouldBeEqualToString("patternElement.patternUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(patternElement.patternUnits.baseVal)", "number");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("patternElement.patternUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("patternElement.patternUnits.baseVal = 3");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternUnits')", "objectBoundingBox");
+
+shouldThrow("patternElement.patternUnits.baseVal = -1");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternUnits')", "objectBoundingBox");
+
+shouldThrow("patternElement.patternUnits.baseVal = 0");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("patternElement.patternUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("patternElement.patternUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("patternElement.getAttribute('patternUnits')", "userSpaceOnUse");
+
+// patternContentUnits
+debug("");
+debug("Check initial 'patternContentUnits' value");
+shouldBeEqualToString("patternElement.patternContentUnits.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(patternElement.patternContentUnits.baseVal)", "number");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+debug("");
+debug("Switch to 'objectBoundingBox'");
+shouldBe("patternElement.patternContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternContentUnits')", "objectBoundingBox");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("patternElement.patternContentUnits.baseVal = 3");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternContentUnits')", "objectBoundingBox");
+
+shouldThrow("patternElement.patternContentUnits.baseVal = -1");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternContentUnits')", "objectBoundingBox");
+
+shouldThrow("patternElement.patternContentUnits.baseVal = 0");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("patternElement.getAttribute('patternContentUnits')", "objectBoundingBox");
+
+debug("");
+debug("Switch to 'userSpaceOnUse'");
+shouldBe("patternElement.patternContentUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBe("patternElement.patternContentUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldBeEqualToString("patternElement.getAttribute('patternContentUnits')", "userSpaceOnUse");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextContentElement.js
new file mode 100644 (file)
index 0000000..408fdea
--- /dev/null
@@ -0,0 +1,38 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGTextContentElement");
+
+var textContentElement = document.createElementNS("http://www.w3.org/2000/svg", "text");
+textContentElement.setAttribute("lengthAdjust", "spacing");
+
+debug("");
+debug("Check initial 'lengthAdjust' value");
+shouldBeEqualToString("textContentElement.lengthAdjust.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(textContentElement.lengthAdjust.baseVal)", "number");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACING");
+
+debug("");
+debug("Switch to 'spacingAndGlyphs'");
+shouldBe("textContentElement.lengthAdjust.baseVal = SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
+shouldBeEqualToString("textContentElement.getAttribute('lengthAdjust')", "spacingAndGlyphs");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("textContentElement.lengthAdjust.baseVal = 3");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
+shouldBeEqualToString("textContentElement.getAttribute('lengthAdjust')", "spacingAndGlyphs");
+
+shouldThrow("textContentElement.lengthAdjust.baseVal = -1");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
+shouldBeEqualToString("textContentElement.getAttribute('lengthAdjust')", "spacingAndGlyphs");
+
+shouldThrow("textContentElement.lengthAdjust.baseVal = 0");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
+shouldBeEqualToString("textContentElement.getAttribute('lengthAdjust')", "spacingAndGlyphs");
+
+debug("");
+debug("Switch to 'spacing'");
+shouldBe("textContentElement.lengthAdjust.baseVal = SVGTextContentElement.LENGTHADJUST_SPACING", "SVGTextContentElement.LENGTHADJUST_SPACING");
+shouldBe("textContentElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACING");
+shouldBeEqualToString("textContentElement.getAttribute('lengthAdjust')", "spacing");
+
+successfullyParsed = true;
diff --git a/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js b/LayoutTests/svg/dom/script-tests/SVGAnimatedEnumeration-SVGTextPathElement.js
new file mode 100644 (file)
index 0000000..e00cddb
--- /dev/null
@@ -0,0 +1,73 @@
+description("This test checks the use of SVGAnimatedEnumeration within SVGTextPathElement");
+
+var textPathElement = document.createElementNS("http://www.w3.org/2000/svg", "textPath");
+textPathElement.setAttribute("method", "align");
+textPathElement.setAttribute("spacing", "auto");
+
+// method
+debug("");
+debug("Check initial 'method' value");
+shouldBeEqualToString("textPathElement.method.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(textPathElement.method.baseVal)", "number");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN");
+
+debug("");
+debug("Switch to 'stretch'");
+shouldBe("textPathElement.method.baseVal = SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH", "SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH");
+shouldBeEqualToString("textPathElement.getAttribute('method')", "stretch");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("textPathElement.method.baseVal = 3");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH");
+shouldBeEqualToString("textPathElement.getAttribute('method')", "stretch");
+
+shouldThrow("textPathElement.method.baseVal = -1");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH");
+shouldBeEqualToString("textPathElement.getAttribute('method')", "stretch");
+
+shouldThrow("textPathElement.method.baseVal = 0");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_STRETCH");
+shouldBeEqualToString("textPathElement.getAttribute('method')", "stretch");
+
+debug("");
+debug("Switch to 'align'");
+shouldBe("textPathElement.method.baseVal = SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN", "SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN");
+shouldBe("textPathElement.method.baseVal", "SVGTextPathElement.TEXTPATH_METHODTYPE_ALIGN");
+shouldBeEqualToString("textPathElement.getAttribute('method')", "align");
+
+// spacing
+debug("");
+debug("Check initial 'spacing' value");
+shouldBeEqualToString("textPathElement.spacing.toString()", "[object SVGAnimatedEnumeration]");
+shouldBeEqualToString("typeof(textPathElement.spacing.baseVal)", "number");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO");
+
+debug("");
+debug("Switch to 'exact'");
+shouldBe("textPathElement.spacing.baseVal = SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT");
+shouldBeEqualToString("textPathElement.getAttribute('spacing')", "exact");
+
+debug("");
+debug("Try setting invalid values");
+shouldThrow("textPathElement.spacing.baseVal = 3");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT");
+shouldBeEqualToString("textPathElement.getAttribute('spacing')", "exact");
+
+shouldThrow("textPathElement.spacing.baseVal = -1");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT");
+shouldBeEqualToString("textPathElement.getAttribute('spacing')", "exact");
+
+shouldThrow("textPathElement.spacing.baseVal = 0");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_EXACT");
+shouldBeEqualToString("textPathElement.getAttribute('spacing')", "exact");
+
+debug("");
+debug("Switch to 'auto'");
+shouldBe("textPathElement.spacing.baseVal = SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO");
+shouldBe("textPathElement.spacing.baseVal", "SVGTextPathElement.TEXTPATH_SPACINGTYPE_AUTO");
+shouldBeEqualToString("textPathElement.getAttribute('spacing')", "auto");
+
+successfullyParsed = true;
index bcd89a2..f45156a 100644 (file)
@@ -11,25 +11,27 @@ shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_US
 debug("");
 debug("Check that enumerations are static, caching value in a local variable and modifying it, should have no effect");
 var enumRef = clipPathElement.clipPathUnits.baseVal;
-enumRef = SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN;
-shouldBe("enumRef", "SVGUnitTypes.SVG_UNIT_TYPE_UNKNOWN");
+enumRef = SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
+shouldBe("enumRef", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
 shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
 
 debug("");
 debug("Check assigning various valid and invalid values");
-shouldThrow("clipPathElement.clipPathUnits.baseVal = 3"); // FIXME: Doesn't throw in WebKit, we're not clamping to the allowed range.
-shouldBe("clipPathElement.clipPathUnits.baseVal = 2", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
-shouldThrow("clipPathElement.clipPathUnits.baseVal = -1"); // FIXME: Doesn't throw in WebKit, we're not clamping to the allowed range.
+shouldThrow("clipPathElement.clipPathUnits.baseVal = 3");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+shouldThrow("clipPathElement.clipPathUnits.baseVal = -1");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
 // ECMA-262, 9.7, "ToUint16"
-shouldBe("clipPathElement.clipPathUnits.baseVal = 'aString'", "'aString'");
-shouldBe("clipPathElement.clipPathUnits.baseVal", "0");
-shouldBe("clipPathElement.clipPathUnits.baseVal = 2", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
-shouldBe("clipPathElement.clipPathUnits.baseVal = clipPathElement", "clipPathElement");
-shouldBe("clipPathElement.clipPathUnits.baseVal", "0");
-shouldBe("clipPathElement.clipPathUnits.baseVal = 2", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldBeEqualToString("clipPathElement.clipPathUnits.baseVal = '1'", SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE.toString());
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
 
-debug("");
-debug("Check that the clipPathUnits value remained objectBBox");
+// ECMA-262, 9.7, "ToUint16"
+shouldThrow("clipPathElement.clipPathUnits.baseVal = 'aString'");
+shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE");
+
+shouldBe("clipPathElement.clipPathUnits.baseVal = 2", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
+shouldThrow("clipPathElement.clipPathUnits.baseVal = clipPathElement");
 shouldBe("clipPathElement.clipPathUnits.baseVal", "SVGUnitTypes.SVG_UNIT_TYPE_OBJECTBOUNDINGBOX");
 
 successfullyParsed = true;
index 799b21f..c833719 100644 (file)
@@ -10,7 +10,7 @@ PASS textElement.getAttribute('lengthAdjust') is null
 PASS textElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACING
 PASS textElement.textLength.baseVal.value is 200
 PASS lastLength = textElement.getComputedTextLength(); lastLength > 0 && lastLength < 200 is true
-FAIL textElement.getAttribute('lengthAdjust') should be spacingAndGlyphs. Was 2.
+PASS textElement.getAttribute('lengthAdjust') is "spacingAndGlyphs"
 PASS textElement.lengthAdjust.baseVal is SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS
 PASS textElement.textLength.baseVal.value is 200
 PASS textElement.getComputedTextLength() == lastLength is true
index f2f9214..b819225 100644 (file)
@@ -18,7 +18,6 @@ shouldBeTrue("lastLength = textElement.getComputedTextLength(); lastLength > 0 &
 
 function executeTest() {
     textElement.lengthAdjust.baseVal = SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS;
-    // FIXME: This currently fails, as the attribute value is "2" instead of "spacingAndGlyphs". Investigate.
     shouldBeEqualToString("textElement.getAttribute('lengthAdjust')", "spacingAndGlyphs");
     shouldBe("textElement.lengthAdjust.baseVal", "SVGTextContentElement.LENGTHADJUST_SPACINGANDGLYPHS");
     shouldBe("textElement.textLength.baseVal.value", "200");
index e3eec24..21d6544 100644 (file)
@@ -1 +1,2 @@
+CONSOLE MESSAGE: line 14: SVG_INVALID_VALUE_ERR: DOM SVG Exception 1: An invalid value was passed to an operation or assigned to an attribute.
 PASS: Invalid blend modes do not trigger a crash. 
index a5a21ce..d9d78a1 100644 (file)
@@ -8,7 +8,12 @@ if (window.layoutTestController) {
 }
 window.onload = function()
 {
-    document.getElementById('tgt').type.baseVal=99999;
+    try {
+        document.getElementById('tgt').type.baseVal=99999;
+    } catch (e) {
+        alert (e);
+    }
+
     setTimeout(function () {
             document.body.innerHTML = "PASS";
             if (window.layoutTestController)
index cc7fab5..8fa2ca8 100644 (file)
@@ -9,8 +9,13 @@ if (window.layoutTestController) {
 
 window.onload = function()
 {
-    document.getElementById('d').xChannelSelector.baseVal=0x80000000;
-    document.getElementById('d').yChannelSelector.baseVal=0x40000000;
+    try {
+        document.getElementById('d').xChannelSelector.baseVal=0x80000000;
+        document.getElementById('d').yChannelSelector.baseVal=0x40000000;
+    } catch(e) {
+        alert (e);
+    }
+
     setTimeout(function () {
             document.body.innerHTML = "PASS";
             layoutTestController.notifyDone();
@@ -21,4 +26,4 @@ window.onload = function()
 <rect width="128" height="128" style="fill:rgb(0,255,0)" filter="url(#f)"/> 
 </svg>
 </body>
-</html>
\ No newline at end of file
+</html>
index c7de9c2..dc55b60 100644 (file)
@@ -1,3 +1,187 @@
+2011-05-18  Nikolas Zimmermann  <nzimmermann@rim.com>
+
+        Reviewed by Rob Buis.
+
+        All animated SVG enum properties are now ints
+        https://bugs.webkit.org/show_bug.cgi?id=10749
+
+        DECLARE/DEFINE_ANIMATED_ENUMERATION created fooBaseVal()/setFooBaseVal() methods that take int parameters, and stored all enum types as integers.
+        Modify the SVG DOM API to store real enums, and get rid of any int<->enum conversions. It's now impossible to change any enum values to undefined
+        types, which is the root of several filter security bugs in the past, that were fixed by adding workarounds.
+        (Usual workaround: svgAttributeChanged(): if fooAttr has been changed from SVG DOM, and if it's an enum, check whether the enum is in range, or fix it up.)
+
+        Using a type-safe internal representation for these enum values we can get rid of ugly int<->enum conversions.
+        A lot of parseMappedAttribute() functions duplicated the code for parsing enum values (eg. userSpaceOnUse/objectBoundingBox unit values, in pattern/filter/mask/etc..)
+        Add dozens of new SVGPropertyTraits<EnumType> specializations for all enums we expose to JS, and offer static fromString/toString conversion methods in single places.
+        Use the new SVGPropertyTraits everywhere in svg/.
+
+        This also fixes SVG DOM <-> XML DOM synchronization for SVGAnimatedEnumeration types.
+        Example: <clipPath clipPathUnits="objectBoundingBox">
+        myClipPath.clipPathUnits.baseVal = SVGUnitTypes.SVG_UNIT_TYPE_USERSPACEONUSE;
+        alert(myClipPath.getAttribute('clipPathUnits')); <- without this patch it says "1", now it says "userSpaceOnUse" as expected, and as other browsers do.
+        We're now properly converting the enum values to strings.
+
+        Add testcases for all SVGAnimatedEnumeration objects used in the SVG DOM API. Found several small bugs:
+        - SVGFEConvolveMatrix 'edgeMode' SVG DOM <-> XML DOM synchronization was not working, because of a typo: s/operatorAttr/edgeModeAttr
+        - SVGFEConvolveMatrix was missing an synchronizeProperty() implementation, disabling SVG <-> XML DOM synchronization completly.
+
+        Tests: svg/dom/SVGAnimatedEnumeration-SVGClipPathElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGComponentTransferFunctionElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFEBlendElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFEColorMatrixElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFECompositeElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFEConvolveMatrixElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFEDisplacementMapElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFEMorphologyElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFETurbulenceElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGFilterElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGGradientElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGMarkerElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGMaskElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGPatternElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGTextContentElement.html
+               svg/dom/SVGAnimatedEnumeration-SVGTextPathElement.html
+
+        Fixes existing svg/dynamic-update/SVGTextContentElement-svgdom-lengthAdjust-prop.html where I found the bug initially.
+
+        * GNUmakefile.list.am: Add svg/properties/SVGAnimatedEnumerationPropertyTearOff.h to build.
+        * WebCore.gypi: Ditto.
+        * WebCore.pro: Ditto.
+        * WebCore.vcproj/WebCore.vcproj: Ditto.
+        * WebCore.xcodeproj/project.pbxproj: Ditto.
+        * bindings/scripts/CodeGeneratorV8.pm: Add V8 magic, to avoid ambigious conversion warning in toV8(PassRefPtr<SVGAnimatedEnumeration>).
+        * platform/graphics/GraphicsTypes.h: Cleanup GradientSpreadMethod, as the SVG dependency is gone.
+        * platform/graphics/filters/FEBlend.cpp:
+        (WebCore::FEBlend::apply): Turn early-returns (introduce in security patches a while ago) into ASSERTs, as the underlying bug has been fixed.
+        * platform/graphics/filters/FEDisplacementMap.cpp:
+        (WebCore::FEDisplacementMap::apply): Ditto.
+        * rendering/svg/RenderSVGResourceClipper.h: Remove toUnitType() usage, the clipPathUnits() provided by SVGClipPathElement have the correct enum type now.
+        (WebCore::RenderSVGResourceClipper::clipPathUnits):
+        * rendering/svg/RenderSVGResourceFilter.h: Remove toUnitType() usage, the filterUnits()/primitiveUnits() provided by SVGFilterElement have the correct enum type now.
+        (WebCore::RenderSVGResourceFilter::filterUnits):
+        (WebCore::RenderSVGResourceFilter::primitiveUnits):
+        * rendering/svg/RenderSVGResourceGradient.cpp: Add helper method platformSpreadMethodFromSVGType() converting from SVGGradientElement::SVGSpreadMethodType to GradientSpreadMethod (platform).
+        (WebCore::RenderSVGResourceGradient::applyResource):
+        * rendering/svg/RenderSVGResourceGradient.h: Ditto.
+        * rendering/svg/RenderSVGResourceLinearGradient.cpp:
+        (WebCore::RenderSVGResourceLinearGradient::buildGradient): Use platformSpreadMethodFromSVGType().
+        * rendering/svg/RenderSVGResourceMarker.h: Remove toUnitType() usage, the markerUnits() provided by SVGMarkerElement have the correct enum type now.
+        (WebCore::RenderSVGResourceMarker::markerUnits):
+        * rendering/svg/RenderSVGResourceMasker.h: Remove toUnitType() usage, the maskUnits()/maskContentUnits() provided by SVGMaskElement have the correct enum type now.
+        (WebCore::RenderSVGResourceMasker::maskUnits):
+        (WebCore::RenderSVGResourceMasker::maskContentUnits):
+        * rendering/svg/RenderSVGResourceRadialGradient.cpp:
+        (WebCore::RenderSVGResourceRadialGradient::buildGradient): Use platformSpreadMethodFromSVGType().
+        * rendering/svg/SVGRenderTreeAsText.cpp:
+        (WebCore::operator<<): Use SVGPropertyTraits<SomeSVGEnumType>::toString() to convert from enum to string, remove code duplication.
+        (WebCore::writeCommonGradientProperties):
+        * rendering/svg/SVGTextChunkBuilder.cpp:
+        (WebCore::SVGTextChunkBuilder::addTextChunk): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * rendering/svg/SVGTextLayoutEngine.cpp:
+        (WebCore::SVGTextLayoutEngine::parentDefinesTextLength): Ditto.
+        (WebCore::SVGTextLayoutEngine::beginTextPathLayout): Ditto.
+        * svg/GradientAttributes.h: Change spread method type from platform GradientSpreadMethod to SVGSpreadMethodType.
+        (WebCore::GradientAttributes::GradientAttributes):
+        (WebCore::GradientAttributes::spreadMethod):
+        (WebCore::GradientAttributes::setSpreadMethod):
+        * svg/SVGAnimatedBoolean.idl: Enable potential exception raising on baseVal setting for the primitive types.
+        * svg/SVGAnimatedEnumeration.h: Switch from generic SVGAnimatedStaticPropertyTearOff<int> to new SVGAnimatedEnumerationPropertyTearOff<EnumType>.
+        * svg/SVGAnimatedEnumeration.idl: Enable potential exception raising on baseVal setting for the primitive types.
+                                          Only SVGAnimatedEnumeration makes use of this if the assigned value is out of range.
+        * svg/SVGAnimatedInteger.idl: Ditto.
+        * svg/SVGAnimatedNumber.idl: Ditto.
+        * svg/SVGAnimatedString.idl: Ditto.
+        * svg/SVGClipPathElement.cpp:
+        (WebCore::SVGClipPathElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
+        * svg/SVGClipPathElement.h:
+        * svg/SVGComponentTransferFunctionElement.cpp:
+        (WebCore::SVGComponentTransferFunctionElement::SVGComponentTransferFunctionElement): Initialize type to identity, not unknown, as per spec.
+        (WebCore::SVGComponentTransferFunctionElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
+        (WebCore::SVGComponentTransferFunctionElement::transferFunction): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * svg/SVGComponentTransferFunctionElement.h: Remove svgAttributeChanged() method, that verified the enum value is not out of range.
+                                                     It's not possible anymore for these values to go out of range.
+        * svg/SVGFEBlendElement.cpp:
+        (WebCore::SVGFEBlendElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<BlendModeType>::fromString(attr->value()).
+        (WebCore::SVGFEBlendElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFEBlendElement::build): Ditto.
+        * svg/SVGFEBlendElement.h: Add SVGPropertyTraits<BlendModeType> specializations.
+        * svg/SVGFEColorMatrixElement.cpp:
+        (WebCore::SVGFEColorMatrixElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<ColorMatrixType>::fromString(attr->value()).
+        (WebCore::SVGFEColorMatrixElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now..
+        (WebCore::SVGFEColorMatrixElement::build): Ditto.
+        * svg/SVGFEColorMatrixElement.h: Add SVGPropertyTraits<ColorMatrixType> specializations.
+        * svg/SVGFECompositeElement.cpp:
+        (WebCore::SVGFECompositeElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<CompositeOperationType>::fromString(attr->value()).
+        (WebCore::SVGFECompositeElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFECompositeElement::build): Ditto.
+        * svg/SVGFECompositeElement.h: Add SVGPropertyTraits<CompositeOperationType> specializations.
+        * svg/SVGFEConvolveMatrixElement.cpp: Fix typo, edgeMode needs to be associated with SVGNames::edgeModeAttr, not SVGNames::operatorAttr.
+        (WebCore::SVGFEConvolveMatrixElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EdgeModeType>::fromString(attr->value()).
+        (WebCore::SVGFEConvolveMatrixElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFEConvolveMatrixElement::synchronizeProperty): Add missing synchronizeProperty() implementation, otherwhise SVG DOM <-> XML DOM is not in sync.
+        (WebCore::SVGFEConvolveMatrixElement::build): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * svg/SVGFEConvolveMatrixElement.h: Add SVGPropertyTraits<EdgeModeType> specializations.
+        * svg/SVGFEDisplacementMapElement.cpp:
+        (WebCore::SVGFEDisplacementMapElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<ChannelSelectorType>::fromString(attr->value()).
+        (WebCore::SVGFEDisplacementMapElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFEDisplacementMapElement::svgAttributeChanged): Remove range validation for enum types, they are always in range now.
+        (WebCore::SVGFEDisplacementMapElement::build): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * svg/SVGFEDisplacementMapElement.h: Add SVGPropertyTraits<ChannelSelectorType> specializations.
+        * svg/SVGFEMorphologyElement.cpp:
+        (WebCore::SVGFEMorphologyElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<MorphologyOperatorType>::fromString(attr->value()).
+        (WebCore::SVGFEMorphologyElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFEMorphologyElement::build): Ditto.
+        * svg/SVGFEMorphologyElement.h: Add SVGPropertyTraits<MorphologyOperatorType> specializations.
+        * svg/SVGFETurbulenceElement.cpp:
+        (WebCore::SVGFETurbulenceElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGStitchOptions/TurbulenceType>::fromString(attr->value()).
+        (WebCore::SVGFETurbulenceElement::setFilterEffectAttribute): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        (WebCore::SVGFETurbulenceElement::build): Ditto.
+        * svg/SVGFETurbulenceElement.h: Add SVGPropertyTraits<SVGStitchOptions/TurbulenceType> specializations.
+        * svg/SVGFilterElement.cpp:
+        (WebCore::SVGFilterElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGUnitType>::fromString(attr->value()).
+        * svg/SVGFilterElement.h:
+        * svg/SVGGradientElement.cpp:
+        (WebCore::SVGGradientElement::SVGGradientElement): Missing spread method default initialization: set it to 'pad' as per spec.
+        (WebCore::SVGGradientElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGUnitType/SVGSpreadMethodType>::fromString(attr->value()).
+        * svg/SVGGradientElement.h: Add SVGPropertyTraits<SVGSpreadMethodType> specializations.
+        * svg/SVGLinearGradientElement.cpp:
+        (WebCore::SVGLinearGradientElement::collectGradientAttributes): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * svg/SVGMarkerElement.cpp:
+        (WebCore::SVGMarkerElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
+        (WebCore::SVGMarkerElement::synchronizeOrientType): Add a custom synchronization method, that handles orientType/orientAngle -> orientAttr synchronization, which is special
+                                                            as it depends on to other SVG DOM objects (SVGAnimatedAngle and SVGAnimatedEnumeration). All covered by new tests.
+        (WebCore::SVGMarkerElement::orientTypeAnimated): Custom tear off creation method, which would usually be generated by the DECLARE_ANIMATED_... macros.
+        * svg/SVGMarkerElement.h: Add SVGPropertyTraits<SVGMarkerUnitsType/SVGMarkerOrientType> specializations.
+        (WebCore::SVGMarkerElement::orientType): Add custom property handling for the 'orientType' SVGAnimatedEnumeration object, as it has special demands, based on 'orientAngle'.
+        (WebCore::SVGMarkerElement::orientTypeBaseValue): Ditto.
+        (WebCore::SVGMarkerElement::setOrientTypeBaseValue): Ditto.
+        * svg/SVGMaskElement.cpp:
+        (WebCore::SVGMaskElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
+        * svg/SVGMaskElement.h:
+        * svg/SVGPatternElement.cpp:
+        (WebCore::SVGPatternElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<EnumType>::fromString(attr->value()).
+        * svg/SVGPatternElement.h:
+        * svg/SVGRadialGradientElement.cpp:
+        (WebCore::SVGRadialGradientElement::collectGradientAttributes): Remove int->enum casting for SVGAnimatedEnumeration types, they are enums now.
+        * svg/SVGTextContentElement.cpp:
+        (WebCore::SVGTextContentElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGLengthAdjustType>::fromString(attr->value()).
+        * svg/SVGTextContentElement.h: Add SVGPropertyTraits<SVGLengthAdjustType> specializations.
+        * svg/SVGTextPathElement.cpp:
+        (WebCore::SVGTextPathElement::parseMappedAttribute): Convert attribute parsing to use SVGPropertyTraits<SVGTextPathMethodType/SVGTextPathSpacingType>::fromString(attr->value()).
+        * svg/SVGTextPathElement.h: Add SVGPropertyTraits<SVGTextPathMethodType/SVGTextPathSpacingType> specializations.
+        * svg/SVGUnitTypes.h: Add SVGPropertyTraits<SVGUnitType> specializations.
+        * svg/properties/SVGAnimatedEnumerationPropertyTearOff.h: Added. SVGAnimatedEnumerationPropertyTearOff inherits from SVGAnimatedStaticPropertyTearOff<int>.
+                                                                  SVGAnimatedEnumeration remains a typedef to SVGAnimatedStaticPropertyTearOff<int>, to have a common base
+                                                                  class for all enum types. This special tear off object, overrides setBaseVal, to verify the incoming int
+                                                                  is within the enum range, otherwhise raise an SVG DOM exception. This makes it impossible to make any of
+                                                                  the enums go out of range anymore (which lead to security bugs in the past).
+        (WebCore::SVGAnimatedEnumerationPropertyTearOff::setBaseVal):
+        (WebCore::SVGAnimatedEnumerationPropertyTearOff::create):
+        (WebCore::SVGAnimatedEnumerationPropertyTearOff::SVGAnimatedEnumerationPropertyTearOff):
+        * svg/properties/SVGAnimatedStaticPropertyTearOff.h:
+        (WebCore::SVGAnimatedStaticPropertyTearOff::setBaseVal): Made this method virtual, to SVGAnimatedEnumerationPropertyTearOff can override the default behaviour. Also added an ExceptionCode param.
+        (WebCore::SVGAnimatedStaticPropertyTearOff::~SVGAnimatedStaticPropertyTearOff):
+
 2011-05-18  Kinuko Yasuda  <kinuko@chromium.org>
 
         Reviewed by David Levin.
index 81b908c..462b8c6 100644 (file)
@@ -3242,6 +3242,7 @@ webcore_sources += \
        Source/WebCore/svg/graphics/SVGImage.h \
        Source/WebCore/svg/LinearGradientAttributes.h \
        Source/WebCore/svg/PatternAttributes.h \
+       Source/WebCore/svg/properties/SVGAnimatedEnumerationPropertyTearOff.h \
        Source/WebCore/svg/properties/SVGAnimatedListPropertyTearOff.h \
        Source/WebCore/svg/properties/SVGAnimatedPathSegListPropertyTearOff.h \
        Source/WebCore/svg/properties/SVGAnimatedProperty.h \
index 8628dcf..3df633b 100644 (file)
             'svg/SVGTransformList.h',
             'svg/animation/SMILTime.h',
             'svg/animation/SVGSMILElement.h',
+            'svg/properties/SVGAnimatedEnumerationPropertyTearOff.h',
             'svg/properties/SVGAnimatedListPropertyTearOff.h',
             'svg/properties/SVGAnimatedProperty.h',
             'svg/properties/SVGAnimatedPropertyDescription.h',
index 5ef9134..379ebd1 100644 (file)
@@ -2262,6 +2262,7 @@ HEADERS += \
     svg/graphics/filters/SVGFilterBuilder.h \
     svg/graphics/filters/SVGFilter.h \
     svg/graphics/SVGImage.h \
+    svg/properties/SVGAnimatedEnumerationPropertyTearOff.h \
     svg/properties/SVGAnimatedListPropertyTearOff.h \
     svg/properties/SVGAnimatedPathSegListPropertyTearOff.h \
     svg/properties/SVGAnimatedProperty.h \
index 43261b3..9f99f8b 100755 (executable)
                                Name="properties"
                                >
                                <File
+                                       RelativePath="..\svg\properties\SVGAnimatedEnumerationPropertyTearOff.h"
+                                       >
+                               </File>
+                               <File
                                        RelativePath="..\svg\properties\SVGAnimatedListPropertyTearOff.h"
                                        >
                                </File>
index 669315d..abfd316 100644 (file)
                6EBF0E7712A9868800DB1709 /* JSOESTextureFloat.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EBF0E7512A9868800DB1709 /* JSOESTextureFloat.h */; };
                6EE8A77210F803F3005A4A24 /* JSWebGLContextAttributes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6EE8A77010F803F3005A4A24 /* JSWebGLContextAttributes.cpp */; };
                6EE8A77310F803F3005A4A24 /* JSWebGLContextAttributes.h in Headers */ = {isa = PBXBuildFile; fileRef = 6EE8A77110F803F3005A4A24 /* JSWebGLContextAttributes.h */; };
+               71FB967B1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h in Headers */ = {isa = PBXBuildFile; fileRef = 71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */; settings = {ATTRIBUTES = (Private, ); }; };
                72626E020EF022FE00A07E20 /* FontFastPath.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 72626E010EF022FE00A07E20 /* FontFastPath.cpp */; };
                750D029311D0E7F300BD1B27 /* RenderInputSpeech.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 750D029111D0E7F300BD1B27 /* RenderInputSpeech.cpp */; };
                750D029411D0E7F300BD1B27 /* RenderInputSpeech.h in Headers */ = {isa = PBXBuildFile; fileRef = 750D029211D0E7F300BD1B27 /* RenderInputSpeech.h */; };
                ADDF1AD71257CD9A0003A759 /* RenderSVGPath.h in Headers */ = {isa = PBXBuildFile; fileRef = ADDF1AD51257CD9A0003A759 /* RenderSVGPath.h */; };
                B1827493134CA4C100B98C2D /* CallbackFunction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B1827492134CA4C100B98C2D /* CallbackFunction.cpp */; };
                B1D5ECB5134B58DA0087C78F /* CallbackFunction.h in Headers */ = {isa = PBXBuildFile; fileRef = B1D5ECB4134B58DA0087C78F /* CallbackFunction.h */; };
+               B1E54593134629C10092A545 /* CallbackTask.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E54587134629C10092A545 /* CallbackTask.h */; };
                B1E54594134629C10092A545 /* MediaStreamClient.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E54588134629C10092A545 /* MediaStreamClient.h */; };
                B1E54595134629C10092A545 /* MediaStreamFrameController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B1E54589134629C10092A545 /* MediaStreamFrameController.cpp */; };
                B1E54596134629C10092A545 /* MediaStreamFrameController.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E5458A134629C10092A545 /* MediaStreamFrameController.h */; };
                B1E54597134629C10092A545 /* MediaStreamController.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B1E5458B134629C10092A545 /* MediaStreamController.cpp */; };
                B1E54598134629C10092A545 /* MediaStreamController.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E5458C134629C10092A545 /* MediaStreamController.h */; };
-               B1E54593134629C10092A545 /* CallbackTask.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E54587134629C10092A545 /* CallbackTask.h */; };
                B1E54599134629C10092A545 /* NavigatorUserMediaError.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E5458D134629C10092A545 /* NavigatorUserMediaError.h */; };
                B1E5459B134629C10092A545 /* NavigatorUserMediaErrorCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E5458F134629C10092A545 /* NavigatorUserMediaErrorCallback.h */; };
                B1E5459D134629C10092A545 /* NavigatorUserMediaSuccessCallback.h in Headers */ = {isa = PBXBuildFile; fileRef = B1E54591134629C10092A545 /* NavigatorUserMediaSuccessCallback.h */; };
                6EBF0E7512A9868800DB1709 /* JSOESTextureFloat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSOESTextureFloat.h; sourceTree = "<group>"; };
                6EE8A77010F803F3005A4A24 /* JSWebGLContextAttributes.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWebGLContextAttributes.cpp; sourceTree = "<group>"; };
                6EE8A77110F803F3005A4A24 /* JSWebGLContextAttributes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWebGLContextAttributes.h; sourceTree = "<group>"; };
+               71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVGAnimatedEnumerationPropertyTearOff.h; sourceTree = "<group>"; };
                72626E010EF022FE00A07E20 /* FontFastPath.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FontFastPath.cpp; sourceTree = "<group>"; };
                750D029111D0E7F300BD1B27 /* RenderInputSpeech.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = RenderInputSpeech.cpp; sourceTree = "<group>"; };
                750D029211D0E7F300BD1B27 /* RenderInputSpeech.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderInputSpeech.h; sourceTree = "<group>"; };
                ADDF1AD51257CD9A0003A759 /* RenderSVGPath.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RenderSVGPath.h; sourceTree = "<group>"; };
                B1827492134CA4C100B98C2D /* CallbackFunction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CallbackFunction.cpp; sourceTree = "<group>"; };
                B1D5ECB4134B58DA0087C78F /* CallbackFunction.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallbackFunction.h; sourceTree = "<group>"; };
+               B1E54587134629C10092A545 /* CallbackTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallbackTask.h; sourceTree = "<group>"; };
                B1E54588134629C10092A545 /* MediaStreamClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamClient.h; sourceTree = "<group>"; };
                B1E54589134629C10092A545 /* MediaStreamFrameController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamFrameController.cpp; sourceTree = "<group>"; };
                B1E5458A134629C10092A545 /* MediaStreamFrameController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamFrameController.h; sourceTree = "<group>"; };
                B1E5458B134629C10092A545 /* MediaStreamController.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MediaStreamController.cpp; sourceTree = "<group>"; };
                B1E5458C134629C10092A545 /* MediaStreamController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MediaStreamController.h; sourceTree = "<group>"; };
-               B1E54587134629C10092A545 /* CallbackTask.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CallbackTask.h; sourceTree = "<group>"; };
                B1E5458D134629C10092A545 /* NavigatorUserMediaError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigatorUserMediaError.h; sourceTree = "<group>"; };
                B1E5458E134629C10092A545 /* NavigatorUserMediaError.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = NavigatorUserMediaError.idl; sourceTree = "<group>"; };
                B1E5458F134629C10092A545 /* NavigatorUserMediaErrorCallback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigatorUserMediaErrorCallback.h; sourceTree = "<group>"; };
                081CDFBD126ECFE800D215CA /* properties */ = {
                        isa = PBXGroup;
                        children = (
+                               71FB967A1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h */,
                                088A0DFB126EF1DB00978F7A /* SVGAnimatedListPropertyTearOff.h */,
                                089A8E06128D8B3D00E7A534 /* SVGAnimatedPathSegListPropertyTearOff.h */,
                                088A0DFC126EF1DB00978F7A /* SVGAnimatedProperty.h */,
                                FD537357137B653B00008DCE /* DynamicsCompressorKernel.h in Headers */,
                                BCF7E491137CD7C7001DDAE7 /* AdjustViewSizeOrNot.h in Headers */,
                                B1E54593134629C10092A545 /* CallbackTask.h in Headers */,
+                               71FB967B1383D64600AC8A4C /* SVGAnimatedEnumerationPropertyTearOff.h in Headers */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
index a97ad11..e313ccf 100644 (file)
@@ -803,6 +803,8 @@ END
     } else {
         # Can inline the function call into the return statement to avoid overhead of using a Ref<> temporary
         $result = $getterString;
+        # Fix amigious conversion problem, by casting to the base type first ($getterString returns a type that inherits from SVGAnimatedEnumeration, not the base class directly).
+        $result = "static_pointer_cast<SVGAnimatedEnumeration>($result)" if $returnType eq "SVGAnimatedEnumeration";
     }
  
     # Special case for readonly or Replaceable attributes (with a few exceptions). This attempts to ensure that JS wrappers don't get
index 1e73f25..559a8e3 100644 (file)
@@ -50,12 +50,10 @@ namespace WebCore {
         CompositePlusLighter
     };
 
-    // FIXME: Currently these constants have to match the values used in the SVG
-    // DOM API. That's a mistake. We need to make cut that dependency.
     enum GradientSpreadMethod {
-        SpreadMethodPad = 1,
-        SpreadMethodReflect = 2,
-        SpreadMethodRepeat = 3
+        SpreadMethodPad,
+        SpreadMethodReflect,
+        SpreadMethodRepeat
     };
 
     enum LineCap { ButtCap, RoundCap, SquareCap };
index e5db03e..9180990 100644 (file)
@@ -102,8 +102,8 @@ void FEBlend::apply()
     if (!in->hasResult() || !in2->hasResult())
         return;
 
-    if (m_mode <= FEBLEND_MODE_UNKNOWN || m_mode > FEBLEND_MODE_LIGHTEN)
-        return;
+    ASSERT(m_mode > FEBLEND_MODE_UNKNOWN);
+    ASSERT(m_mode <= FEBLEND_MODE_LIGHTEN);
 
     ByteArray* dstPixelArray = createPremultipliedImageResult();
     if (!dstPixelArray)
index b632233..e8d2b34 100644 (file)
@@ -99,8 +99,8 @@ void FEDisplacementMap::apply()
     if (!in->hasResult() || !in2->hasResult())
         return;
 
-    if (m_xChannelSelector == CHANNEL_UNKNOWN || m_yChannelSelector == CHANNEL_UNKNOWN)
-        return;
+    ASSERT(m_xChannelSelector != CHANNEL_UNKNOWN);
+    ASSERT(m_yChannelSelector != CHANNEL_UNKNOWN);
 
     ByteArray* dstPixelArray = createPremultipliedImageResult();
     if (!dstPixelArray)
index 99861d8..228fc54 100644 (file)
@@ -58,7 +58,7 @@ public:
     
     bool hitTestClipContent(const FloatRect&, const FloatPoint&);
 
-    SVGUnitTypes::SVGUnitType clipPathUnits() const { return toUnitType(static_cast<SVGClipPathElement*>(node())->clipPathUnits()); }
+    SVGUnitTypes::SVGUnitType clipPathUnits() const { return static_cast<SVGClipPathElement*>(node())->clipPathUnits(); }
 
     static RenderSVGResourceType s_resourceType;
 private:
index 45aff5c..5a5b092 100644 (file)
@@ -78,8 +78,8 @@ public:
 
     PassRefPtr<SVGFilterBuilder> buildPrimitives(Filter*);
 
-    SVGUnitTypes::SVGUnitType filterUnits() const { return toUnitType(static_cast<SVGFilterElement*>(node())->filterUnits()); }
-    SVGUnitTypes::SVGUnitType primitiveUnits() const { return toUnitType(static_cast<SVGFilterElement*>(node())->primitiveUnits()); }
+    SVGUnitTypes::SVGUnitType filterUnits() const { return static_cast<SVGFilterElement*>(node())->filterUnits(); }
+    SVGUnitTypes::SVGUnitType primitiveUnits() const { return static_cast<SVGFilterElement*>(node())->primitiveUnits(); }
 
     void primitiveAttributeChanged(RenderObject*, const QualifiedName&);
 
index a42a227..aa5cb4e 100644 (file)
@@ -276,6 +276,22 @@ void RenderSVGResourceGradient::addStops(GradientData* gradientData, const Vecto
         gradientData->gradient->addColorStop(*it);
 }
 
+GradientSpreadMethod RenderSVGResourceGradient::platformSpreadMethodFromSVGType(SVGGradientElement::SVGSpreadMethodType method) const
+{
+    switch (method) {
+    case SVGGradientElement::SVG_SPREADMETHOD_UNKNOWN:
+    case SVGGradientElement::SVG_SPREADMETHOD_PAD:
+        return SpreadMethodPad;
+    case SVGGradientElement::SVG_SPREADMETHOD_REFLECT:
+        return SpreadMethodReflect;
+    case SVGGradientElement::SVG_SPREADMETHOD_REPEAT:
+        return SpreadMethodRepeat;
+    }
+
+    ASSERT_NOT_REACHED();
+    return SpreadMethodPad;
+}
+
 }
 
 #endif
index a71b6c5..c5635aa 100644 (file)
@@ -61,6 +61,8 @@ protected:
     virtual void collectGradientAttributes(SVGGradientElement*) = 0;
     virtual void buildGradient(GradientData*, SVGGradientElement*) const = 0;
 
+    GradientSpreadMethod platformSpreadMethodFromSVGType(SVGGradientElement::SVGSpreadMethodType) const;
+
 private:
     bool m_shouldCollectGradientAttributes : 1;
     HashMap<RenderObject*, GradientData*> m_gradient;
index 14dbd8c..569a759 100644 (file)
@@ -55,7 +55,7 @@ void RenderSVGResourceLinearGradient::buildGradient(GradientData* gradientData,
     linearGradientElement->calculateStartEndPoints(m_attributes, startPoint, endPoint);
 
     gradientData->gradient = Gradient::create(startPoint, endPoint);
-    gradientData->gradient->setSpreadMethod(m_attributes.spreadMethod());
+    gradientData->gradient->setSpreadMethod(platformSpreadMethodFromSVGType(m_attributes.spreadMethod()));
 
     // Add stops
     addStops(gradientData, m_attributes.stops());
index fd3b5e3..0d1aa11 100644 (file)
@@ -60,7 +60,7 @@ public:
 
     FloatPoint referencePoint() const;
     float angle() const;
-    SVGMarkerElement::SVGMarkerUnitsType markerUnits() const { return static_cast<SVGMarkerElement::SVGMarkerUnitsType>(static_cast<SVGMarkerElement*>(node())->markerUnits()); }
+    SVGMarkerElement::SVGMarkerUnitsType markerUnits() const { return static_cast<SVGMarkerElement*>(node())->markerUnits(); }
 
     virtual RenderSVGResourceType resourceType() const { return s_resourceType; }
     static RenderSVGResourceType s_resourceType;
index 0a7deb1..f4e831d 100644 (file)
@@ -50,8 +50,8 @@ public:
     virtual bool applyResource(RenderObject*, RenderStyle*, GraphicsContext*&, unsigned short resourceMode);
     virtual FloatRect resourceBoundingBox(RenderObject*);
 
-    SVGUnitTypes::SVGUnitType maskUnits() const { return toUnitType(static_cast<SVGMaskElement*>(node())->maskUnits()); }
-    SVGUnitTypes::SVGUnitType maskContentUnits() const { return toUnitType(static_cast<SVGMaskElement*>(node())->maskContentUnits()); }
+    SVGUnitTypes::SVGUnitType maskUnits() const { return static_cast<SVGMaskElement*>(node())->maskUnits(); }
+    SVGUnitTypes::SVGUnitType maskContentUnits() const { return static_cast<SVGMaskElement*>(node())->maskContentUnits(); }
 
     virtual RenderSVGResourceType resourceType() const { return s_resourceType; }
     static RenderSVGResourceType s_resourceType;
index a8830fc..fd5861d 100644 (file)
@@ -60,7 +60,7 @@ void RenderSVGResourceRadialGradient::buildGradient(GradientData* gradientData,
                                               centerPoint,
                                               radius);
 
-    gradientData->gradient->setSpreadMethod(m_attributes.spreadMethod());
+    gradientData->gradient->setSpreadMethod(platformSpreadMethodFromSVGType(m_attributes.spreadMethod()));
 
     // Add stops
     addStops(gradientData, m_attributes.stops());
index 7d3f909..d9e84e5 100644 (file)
@@ -188,35 +188,13 @@ static TextStream& operator<<(TextStream& ts, const WindRule rule)
 
 static TextStream& operator<<(TextStream& ts, const SVGUnitTypes::SVGUnitType& unitType)
 {
-    switch (unitType) {
-    case SVGUnitTypes::SVG_UNIT_TYPE_UNKNOWN:
-        ts << "unknown";
-        break;
-    case SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE:
-        ts << "userSpaceOnUse";
-        break;
-    case SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX:
-        ts << "objectBoundingBox";
-        break;
-    }
-
+    ts << SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::toString(unitType);
     return ts;
 }
 
 static TextStream& operator<<(TextStream& ts, const SVGMarkerElement::SVGMarkerUnitsType& markerUnit)
 {
-    switch (markerUnit) {
-    case SVGMarkerElement::SVG_MARKERUNITS_UNKNOWN:
-        ts << "unknown";
-        break;
-    case SVGMarkerElement::SVG_MARKERUNITS_USERSPACEONUSE:
-        ts << "userSpaceOnUse";
-        break;
-    case SVGMarkerElement::SVG_MARKERUNITS_STROKEWIDTH:
-        ts << "strokeWidth";
-        break;
-    }
-
+    ts << SVGPropertyTraits<SVGMarkerElement::SVGMarkerUnitsType>::toString(markerUnit);
     return ts;
 }
 
@@ -273,21 +251,9 @@ static TextStream& operator<<(TextStream& ts, LineJoin style)
     return ts;
 }
 
-// FIXME: Maybe this should be in Gradient.cpp
-static TextStream& operator<<(TextStream& ts, GradientSpreadMethod mode)
+static TextStream& operator<<(TextStream& ts, const SVGGradientElement::SVGSpreadMethodType& type)
 {
-    switch (mode) {
-    case SpreadMethodPad:
-        ts << "PAD";
-        break;
-    case SpreadMethodRepeat:
-        ts << "REPEAT";
-        break;
-    case SpreadMethodReflect:
-        ts << "REFLECT";
-        break;
-    }
-
+    ts << SVGPropertyTraits<SVGGradientElement::SVGSpreadMethodType>::toString(type).upper();
     return ts;
 }
 
@@ -534,11 +500,11 @@ static inline String boundingBoxModeString(bool boundingBoxMode)
     return boundingBoxMode ? "objectBoundingBox" : "userSpaceOnUse";
 }
 
-static inline void writeCommonGradientProperties(TextStream& ts, GradientSpreadMethod spreadMethod, const AffineTransform& gradientTransform, bool boundingBoxMode)
+static inline void writeCommonGradientProperties(TextStream& ts, SVGGradientElement::SVGSpreadMethodType spreadMethod, const AffineTransform& gradientTransform, bool boundingBoxMode)
 {
     writeNameValuePair(ts, "gradientUnits", boundingBoxModeString(boundingBoxMode));
 
-    if (spreadMethod != SpreadMethodPad)
+    if (spreadMethod != SVGGradientElement::SVG_SPREADMETHOD_PAD)
         ts << " [spreadMethod=" << spreadMethod << "]";
 
     if (!gradientTransform.isIdentity())
index 4391013..0e44cfa 100644 (file)
@@ -129,7 +129,7 @@ void SVGTextChunkBuilder::addTextChunk(Vector<SVGInlineTextBox*>& lineLayoutBoxe
     if (SVGTextContentElement* textContentElement = SVGTextContentElement::elementFromRenderer(textRenderer->parent())) {
         desiredTextLength = textContentElement->specifiedTextLength().value(textContentElement);
 
-        switch (static_cast<SVGTextContentElement::SVGLengthAdjustType>(textContentElement->lengthAdjust())) {
+        switch (textContentElement->lengthAdjust()) {
         case SVGTextContentElement::LENGTHADJUST_UNKNOWN:
             break;
         case SVGTextContentElement::LENGTHADJUST_SPACING:
index 2bc7e32..8d3efc2 100644 (file)
@@ -156,7 +156,7 @@ bool SVGTextLayoutEngine::parentDefinesTextLength(RenderObject* parent) const
     while (currentParent) {
         SVGTextContentElement* textContentElement = SVGTextContentElement::elementFromRenderer(currentParent);
         if (textContentElement) {
-            SVGTextContentElement::SVGLengthAdjustType lengthAdjust = static_cast<SVGTextContentElement::SVGLengthAdjustType>(textContentElement->lengthAdjust());
+            SVGTextContentElement::SVGLengthAdjustType lengthAdjust = textContentElement->lengthAdjust();
             if (lengthAdjust == SVGTextContentElement::LENGTHADJUST_SPACING && textContentElement->specifiedTextLength().value(textContentElement) > 0)
                 return true;
         }
@@ -212,7 +212,7 @@ void SVGTextLayoutEngine::beginTextPathLayout(RenderObject* object, SVGTextLayou
     float desiredTextLength = 0;
 
     if (SVGTextContentElement* textContentElement = SVGTextContentElement::elementFromRenderer(textPath)) {
-        lengthAdjust = static_cast<SVGTextContentElement::SVGLengthAdjustType>(textContentElement->lengthAdjust());
+        lengthAdjust = textContentElement->lengthAdjust();
         desiredTextLength = textContentElement->specifiedTextLength().value(textContentElement);
     }
 
index 4b02fae..52c0a02 100644 (file)
 #define GradientAttributes_h
 
 #if ENABLE(SVG)
-#include "Color.h"
-#include "Gradient.h"
+#include "SVGGradientElement.h"
 #include "SVGLength.h"
 
 namespace WebCore {
 
 struct GradientAttributes {
     GradientAttributes()
-        : m_spreadMethod(SpreadMethodPad)
+        : m_spreadMethod(SVGGradientElement::SVG_SPREADMETHOD_PAD)
         , m_boundingBoxMode(true)
         , m_spreadMethodSet(false)
         , m_boundingBoxModeSet(false)
@@ -38,12 +37,12 @@ struct GradientAttributes {
     {
     }
 
-    GradientSpreadMethod spreadMethod() const { return m_spreadMethod; }
+    SVGGradientElement::SVGSpreadMethodType spreadMethod() const { return m_spreadMethod; }
     bool boundingBoxMode() const { return m_boundingBoxMode; }
     AffineTransform gradientTransform() const { return m_gradientTransform; }
     const Vector<Gradient::ColorStop>& stops() const { return m_stops; }
 
-    void setSpreadMethod(GradientSpreadMethod value)
+    void setSpreadMethod(SVGGradientElement::SVGSpreadMethodType value)
     {
         m_spreadMethod = value;
         m_spreadMethodSet = true;
@@ -74,7 +73,7 @@ struct GradientAttributes {
 
 private:
     // Properties
-    GradientSpreadMethod m_spreadMethod;
+    SVGGradientElement::SVGSpreadMethodType m_spreadMethod;
     bool m_boundingBoxMode;
     AffineTransform m_gradientTransform;
     Vector<Gradient::ColorStop> m_stops;
index 3e41e3c..85fb4ba 100644 (file)
@@ -26,7 +26,8 @@
 module svg {
 
     interface [Conditional=SVG] SVGAnimatedBoolean {
-        attribute [StrictTypeChecking] boolean baseVal;
+        attribute [StrictTypeChecking] boolean baseVal
+            setter raises(DOMException);
         readonly attribute boolean animVal;
     };
 
index 354a935..e00a151 100644 (file)
 #define SVGAnimatedEnumeration_h
 
 #if ENABLE(SVG)
+#include "SVGAnimatedEnumerationPropertyTearOff.h"
 #include "SVGAnimatedPropertyMacros.h"
-#include "SVGAnimatedStaticPropertyTearOff.h"
 
 namespace WebCore {
 
 typedef SVGAnimatedStaticPropertyTearOff<int> SVGAnimatedEnumeration;
 
 // Helper macros to declare/define a SVGAnimatedEnumeration object
-#define DECLARE_ANIMATED_ENUMERATION(UpperProperty, LowerProperty) \
-DECLARE_ANIMATED_PROPERTY(SVGAnimatedEnumeration, int, UpperProperty, LowerProperty)
+#define DECLARE_ANIMATED_ENUMERATION(UpperProperty, LowerProperty, EnumType) \
+DECLARE_ANIMATED_PROPERTY(SVGAnimatedEnumerationPropertyTearOff<EnumType>, EnumType, UpperProperty, LowerProperty)
 
-#define DEFINE_ANIMATED_ENUMERATION(OwnerType, DOMAttribute, UpperProperty, LowerProperty) \
-DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, DOMAttribute.localName(), SVGAnimatedEnumeration, int, UpperProperty, LowerProperty)
+#define DEFINE_ANIMATED_ENUMERATION(OwnerType, DOMAttribute, UpperProperty, LowerProperty, EnumType) \
+DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, DOMAttribute.localName(), SVGAnimatedEnumerationPropertyTearOff<EnumType>, EnumType, UpperProperty, LowerProperty)
 
-#define DEFINE_ANIMATED_ENUMERATION_MULTIPLE_WRAPPERS(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, UpperProperty, LowerProperty) \
-DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, SVGAnimatedEnumeration, int, UpperProperty, LowerProperty)
+#define DEFINE_ANIMATED_ENUMERATION_MULTIPLE_WRAPPERS(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, UpperProperty, LowerProperty, EnumType) \
+DEFINE_ANIMATED_PROPERTY(OwnerType, DOMAttribute, SVGDOMAttributeIdentifier, SVGAnimatedEnumerationPropertyTearOff<EnumType>, EnumType, UpperProperty, LowerProperty)
 
 } // namespace WebCore
 
index c0840f2..e76cefa 100644 (file)
@@ -26,7 +26,8 @@
 module svg {
 
     interface [Conditional=SVG] SVGAnimatedEnumeration {
-        attribute [StrictTypeChecking] unsigned short baseVal;
+        attribute [StrictTypeChecking] unsigned short baseVal
+            setter raises(DOMException);
         readonly attribute unsigned short animVal;
     };
 
index 61de26c..31d1510 100644 (file)
@@ -26,7 +26,8 @@
 module svg {
 
     interface [Conditional=SVG] SVGAnimatedInteger {
-        attribute [StrictTypeChecking] long baseVal;
+        attribute [StrictTypeChecking] long baseVal
+            setter raises(DOMException);
         readonly attribute long animVal;
     };
 
index c3b0419..7c319cc 100644 (file)
@@ -27,7 +27,8 @@
 module svg {
 
     interface [Conditional=SVG] SVGAnimatedNumber {
-        attribute [StrictTypeChecking] float baseVal;
+        attribute [StrictTypeChecking] float baseVal
+            setter raises(DOMException);
         readonly attribute float animVal;
     };
 
index 3430c2c..4355ab3 100644 (file)
@@ -26,8 +26,8 @@
 module svg {
 
     interface [Conditional=SVG] SVGAnimatedString {
-                 attribute DOMString baseVal
-                     /*setter raises(DOMException)*/;
+        attribute DOMString baseVal
+            setter raises(DOMException);
         readonly attribute DOMString animVal;
     };
 
index a21ac4f..6afd6ad 100644 (file)
 #include "RenderSVGResourceClipper.h"
 #include "SVGNames.h"
 #include "SVGTransformList.h"
-#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGClipPathElement, SVGNames::clipPathUnitsAttr, ClipPathUnits, clipPathUnits)
+DEFINE_ANIMATED_ENUMERATION(SVGClipPathElement, SVGNames::clipPathUnitsAttr, ClipPathUnits, clipPathUnits, SVGUnitTypes::SVGUnitType)
 DEFINE_ANIMATED_BOOLEAN(SVGClipPathElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
 
 inline SVGClipPathElement::SVGClipPathElement(const QualifiedName& tagName, Document* document)
@@ -53,10 +52,9 @@ PassRefPtr<SVGClipPathElement> SVGClipPathElement::create(const QualifiedName& t
 void SVGClipPathElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::clipPathUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setClipPathUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setClipPathUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setClipPathUnitsBaseValue(propertyValue);
     } else {
         if (SVGTests::parseMappedAttribute(attr))
             return;
index ed2e13c..f8c6f61 100644 (file)
@@ -28,6 +28,7 @@
 #include "SVGLangSpace.h"
 #include "SVGStyledTransformableElement.h"
 #include "SVGTests.h"
+#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -56,7 +57,7 @@ private:
     virtual RenderObject* createRenderer(RenderArena*, RenderStyle*);
 
     // Animated property declarations
-    DECLARE_ANIMATED_ENUMERATION(ClipPathUnits, clipPathUnits)
+    DECLARE_ANIMATED_ENUMERATION(ClipPathUnits, clipPathUnits, SVGUnitTypes::SVGUnitType)
 
     // SVGExternalResourcesRequired
     DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
index 6ed5813..755ba04 100644 (file)
@@ -31,7 +31,7 @@
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGComponentTransferFunctionElement, SVGNames::typeAttr, Type, type)
+DEFINE_ANIMATED_ENUMERATION(SVGComponentTransferFunctionElement, SVGNames::typeAttr, Type, type, ComponentTransferType)
 DEFINE_ANIMATED_NUMBER_LIST(SVGComponentTransferFunctionElement, SVGNames::tableValuesAttr, TableValues, tableValues)
 DEFINE_ANIMATED_NUMBER(SVGComponentTransferFunctionElement, SVGNames::slopeAttr, Slope, slope)
 DEFINE_ANIMATED_NUMBER(SVGComponentTransferFunctionElement, SVGNames::interceptAttr, Intercept, intercept)
@@ -41,7 +41,7 @@ DEFINE_ANIMATED_NUMBER(SVGComponentTransferFunctionElement, SVGNames::offsetAttr
 
 SVGComponentTransferFunctionElement::SVGComponentTransferFunctionElement(const QualifiedName& tagName, Document* document)
     : SVGElement(tagName, document)
-    , m_type(FECOMPONENTTRANSFER_TYPE_UNKNOWN)
+    , m_type(FECOMPONENTTRANSFER_TYPE_IDENTITY)
     , m_slope(1)
     , m_amplitude(1)
     , m_exponent(1)
@@ -52,16 +52,9 @@ void SVGComponentTransferFunctionElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::typeAttr) {
-        if (value == "identity")
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_IDENTITY);
-        else if (value == "table")
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_TABLE);
-        else if (value == "discrete")
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_DISCRETE);
-        else if (value == "linear")
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_LINEAR);
-        else if (value == "gamma")
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_GAMMA);
+        ComponentTransferType propertyValue = SVGPropertyTraits<ComponentTransferType>::fromString(value);
+        if (propertyValue > 0)
+            setTypeBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::tableValuesAttr) {
         SVGNumberList newList;
         newList.parse(value);
@@ -81,17 +74,6 @@ void SVGComponentTransferFunctionElement::parseMappedAttribute(Attribute* attr)
         SVGElement::parseMappedAttribute(attr);
 }
 
-void SVGComponentTransferFunctionElement::svgAttributeChanged(const QualifiedName& attrName)
-{
-    SVGElement::svgAttributeChanged(attrName);
-
-    if (attrName == SVGNames::typeAttr) {
-        ComponentTransferType componentType = static_cast<ComponentTransferType>(type());
-        if (componentType < FECOMPONENTTRANSFER_TYPE_UNKNOWN || componentType > FECOMPONENTTRANSFER_TYPE_GAMMA)
-            setTypeBaseValue(FECOMPONENTTRANSFER_TYPE_UNKNOWN);
-    }
-}
-
 void SVGComponentTransferFunctionElement::synchronizeProperty(const QualifiedName& attrName)
 {
     SVGElement::synchronizeProperty(attrName);
@@ -144,7 +126,7 @@ void SVGComponentTransferFunctionElement::fillAttributeToPropertyTypeMap()
 ComponentTransferFunction SVGComponentTransferFunctionElement::transferFunction() const
 {
     ComponentTransferFunction func;
-    func.type = static_cast<ComponentTransferType>(type());
+    func.type = type();
     func.slope = slope();
     func.intercept = intercept();
     func.amplitude = amplitude();
index 931e52e..909e680 100644 (file)
@@ -37,14 +37,13 @@ protected:
     SVGComponentTransferFunctionElement(const QualifiedName&, Document*);
 
     virtual void parseMappedAttribute(Attribute*);
-    virtual void svgAttributeChanged(const QualifiedName&);
     virtual void synchronizeProperty(const QualifiedName&);
     virtual void fillAttributeToPropertyTypeMap();
     virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
     
 private:
     // Animated property declarations
-    DECLARE_ANIMATED_ENUMERATION(Type, type)
+    DECLARE_ANIMATED_ENUMERATION(Type, type, ComponentTransferType)
     DECLARE_ANIMATED_NUMBER_LIST(TableValues, tableValues)
     DECLARE_ANIMATED_NUMBER(Slope, slope)
     DECLARE_ANIMATED_NUMBER(Intercept, intercept)
@@ -53,6 +52,47 @@ private:
     DECLARE_ANIMATED_NUMBER(Offset, offset)
 };
 
+template<>
+struct SVGPropertyTraits<ComponentTransferType> {
+    static ComponentTransferType highestEnumValue() { return FECOMPONENTTRANSFER_TYPE_GAMMA; }
+
+    static String toString(ComponentTransferType type)
+    {
+        switch (type) {
+        case FECOMPONENTTRANSFER_TYPE_UNKNOWN:
+            return emptyString();
+        case FECOMPONENTTRANSFER_TYPE_IDENTITY:
+            return "identity";
+        case FECOMPONENTTRANSFER_TYPE_TABLE:
+            return "table";
+        case FECOMPONENTTRANSFER_TYPE_DISCRETE:
+            return "discrete";
+        case FECOMPONENTTRANSFER_TYPE_LINEAR:
+            return "linear";
+        case FECOMPONENTTRANSFER_TYPE_GAMMA:
+            return "gamma";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static ComponentTransferType fromString(const String& value)
+    {
+        if (value == "identity")
+            return FECOMPONENTTRANSFER_TYPE_IDENTITY;
+        if (value == "table")
+            return FECOMPONENTTRANSFER_TYPE_TABLE;
+        if (value == "discrete")
+            return FECOMPONENTTRANSFER_TYPE_DISCRETE;
+        if (value == "linear")
+            return FECOMPONENTTRANSFER_TYPE_LINEAR;
+        if (value == "gamma")
+            return FECOMPONENTTRANSFER_TYPE_GAMMA;
+        return FECOMPONENTTRANSFER_TYPE_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG) && ENABLE(FILTERS)
index 01284d1..96f75d2 100644 (file)
@@ -33,7 +33,7 @@ namespace WebCore {
 // Animated property definitions
 DEFINE_ANIMATED_STRING(SVGFEBlendElement, SVGNames::inAttr, In1, in1)
 DEFINE_ANIMATED_STRING(SVGFEBlendElement, SVGNames::in2Attr, In2, in2)
-DEFINE_ANIMATED_ENUMERATION(SVGFEBlendElement, SVGNames::modeAttr, Mode, mode)
+DEFINE_ANIMATED_ENUMERATION(SVGFEBlendElement, SVGNames::modeAttr, Mode, mode, BlendModeType)
 
 inline SVGFEBlendElement::SVGFEBlendElement(const QualifiedName& tagName, Document* document)
     : SVGFilterPrimitiveStandardAttributes(tagName, document)
@@ -51,16 +51,9 @@ void SVGFEBlendElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::modeAttr) {
-        if (value == "normal")
-            setModeBaseValue(FEBLEND_MODE_NORMAL);
-        else if (value == "multiply")
-            setModeBaseValue(FEBLEND_MODE_MULTIPLY);
-        else if (value == "screen")
-            setModeBaseValue(FEBLEND_MODE_SCREEN);
-        else if (value == "darken")
-            setModeBaseValue(FEBLEND_MODE_DARKEN);
-        else if (value == "lighten")
-            setModeBaseValue(FEBLEND_MODE_LIGHTEN);
+        BlendModeType propertyValue = SVGPropertyTraits<BlendModeType>::fromString(value);
+        if (propertyValue > 0)
+            setModeBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::inAttr)
         setIn1BaseValue(value);
     else if (attr->name() == SVGNames::in2Attr)
@@ -73,7 +66,7 @@ bool SVGFEBlendElement::setFilterEffectAttribute(FilterEffect* effect, const Qua
 {
     FEBlend* blend = static_cast<FEBlend*>(effect);
     if (attrName == SVGNames::modeAttr)
-        return blend->setBlendMode(static_cast<BlendModeType>(mode()));
+        return blend->setBlendMode(mode());
 
     ASSERT_NOT_REACHED();
     return false;
@@ -134,7 +127,7 @@ PassRefPtr<FilterEffect> SVGFEBlendElement::build(SVGFilterBuilder* filterBuilde
     if (!input1 || !input2)
         return 0;
 
-    RefPtr<FilterEffect> effect = FEBlend::create(filter, static_cast<BlendModeType>(mode()));
+    RefPtr<FilterEffect> effect = FEBlend::create(filter, mode());
     FilterEffectVector& inputEffects = effect->inputEffects();
     inputEffects.reserveCapacity(2);
     inputEffects.append(input1);
@@ -145,5 +138,3 @@ PassRefPtr<FilterEffect> SVGFEBlendElement::build(SVGFilterBuilder* filterBuilde
 }
 
 #endif // ENABLE(SVG)
-
-// vim:ts=4:noet
index b429d4b..7565103 100644 (file)
@@ -46,7 +46,48 @@ private:
     // Animated property declarations
     DECLARE_ANIMATED_STRING(In1, in1)
     DECLARE_ANIMATED_STRING(In2, in2)
-    DECLARE_ANIMATED_ENUMERATION(Mode, mode)
+    DECLARE_ANIMATED_ENUMERATION(Mode, mode, BlendModeType)
+};
+
+template<>
+struct SVGPropertyTraits<BlendModeType> {
+    static BlendModeType highestEnumValue() { return FEBLEND_MODE_LIGHTEN; }
+
+    static String toString(BlendModeType type)
+    {
+        switch (type) {
+        case FEBLEND_MODE_UNKNOWN:
+            return emptyString();
+        case FEBLEND_MODE_NORMAL:
+            return "normal";
+        case FEBLEND_MODE_MULTIPLY:
+            return "multiply";
+        case FEBLEND_MODE_SCREEN:
+            return "screen";
+        case FEBLEND_MODE_DARKEN:
+            return "darken";
+        case FEBLEND_MODE_LIGHTEN:
+            return "lighten";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static BlendModeType fromString(const String& value)
+    {
+        if (value == "normal")
+            return FEBLEND_MODE_NORMAL;
+        if (value == "multiply")
+            return FEBLEND_MODE_MULTIPLY;
+        if (value == "screen")
+            return FEBLEND_MODE_SCREEN;
+        if (value == "darken")
+            return FEBLEND_MODE_DARKEN;
+        if (value == "lighten")
+            return FEBLEND_MODE_LIGHTEN;
+        return FEBLEND_MODE_UNKNOWN;
+    }
 };
 
 } // namespace WebCore
index 5073328..d4413e4 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
 
 // Animated property definitions
 DEFINE_ANIMATED_STRING(SVGFEColorMatrixElement, SVGNames::inAttr, In1, in1)
-DEFINE_ANIMATED_ENUMERATION(SVGFEColorMatrixElement, SVGNames::typeAttr, Type, type)
+DEFINE_ANIMATED_ENUMERATION(SVGFEColorMatrixElement, SVGNames::typeAttr, Type, type, ColorMatrixType)
 DEFINE_ANIMATED_NUMBER_LIST(SVGFEColorMatrixElement, SVGNames::valuesAttr, Values, values)
 
 inline SVGFEColorMatrixElement::SVGFEColorMatrixElement(const QualifiedName& tagName, Document* document)
@@ -51,14 +51,9 @@ void SVGFEColorMatrixElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::typeAttr) {
-        if (value == "matrix")
-            setTypeBaseValue(FECOLORMATRIX_TYPE_MATRIX);
-        else if (value == "saturate")
-            setTypeBaseValue(FECOLORMATRIX_TYPE_SATURATE);
-        else if (value == "hueRotate")
-            setTypeBaseValue(FECOLORMATRIX_TYPE_HUEROTATE);
-        else if (value == "luminanceToAlpha")
-            setTypeBaseValue(FECOLORMATRIX_TYPE_LUMINANCETOALPHA);
+        ColorMatrixType propertyValue = SVGPropertyTraits<ColorMatrixType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setTypeBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::inAttr)
         setIn1BaseValue(value);
     else if (attr->name() == SVGNames::valuesAttr) {
@@ -74,7 +69,7 @@ bool SVGFEColorMatrixElement::setFilterEffectAttribute(FilterEffect* effect, con
 {
     FEColorMatrix* colorMatrix = static_cast<FEColorMatrix*>(effect);
     if (attrName == SVGNames::typeAttr)
-        return colorMatrix->setType(static_cast<ColorMatrixType>(type()));
+        return colorMatrix->setType(type());
     if (attrName == SVGNames::valuesAttr)
         return colorMatrix->setValues(values());
 
@@ -136,7 +131,7 @@ PassRefPtr<FilterEffect> SVGFEColorMatrixElement::build(SVGFilterBuilder* filter
         return 0;
 
     Vector<float> filterValues;
-    const ColorMatrixType filterType(static_cast<ColorMatrixType>(type()));
+    ColorMatrixType filterType = type();
 
     // Use defaults if values is empty (SVG 1.1 15.10).
     if (!hasAttribute(SVGNames::valuesAttr)) {
index ec7ea9b..0a65713 100644 (file)
@@ -46,10 +46,47 @@ private:
 
     // Animated property declarations
     DECLARE_ANIMATED_STRING(In1, in1)
-    DECLARE_ANIMATED_ENUMERATION(Type, type)
+    DECLARE_ANIMATED_ENUMERATION(Type, type, ColorMatrixType)
     DECLARE_ANIMATED_NUMBER_LIST(Values, values)
 };
 
+template<>
+struct SVGPropertyTraits<ColorMatrixType> {
+    static ColorMatrixType highestEnumValue() { return FECOLORMATRIX_TYPE_LUMINANCETOALPHA; }
+
+    static String toString(ColorMatrixType type)
+    {
+        switch (type) {
+        case FECOLORMATRIX_TYPE_UNKNOWN:
+            return emptyString();
+        case FECOLORMATRIX_TYPE_MATRIX:
+            return "matrix";
+        case FECOLORMATRIX_TYPE_SATURATE:
+            return "saturate";
+        case FECOLORMATRIX_TYPE_HUEROTATE:
+            return "hueRotate";
+        case FECOLORMATRIX_TYPE_LUMINANCETOALPHA:
+            return "luminanceToAlpha";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static ColorMatrixType fromString(const String& value)
+    {
+        if (value == "matrix")
+            return FECOLORMATRIX_TYPE_MATRIX;
+        if (value == "saturate")
+            return FECOLORMATRIX_TYPE_SATURATE;
+        if (value == "hueRotate")
+            return FECOLORMATRIX_TYPE_HUEROTATE;
+        if (value == "luminanceToAlpha")
+            return FECOLORMATRIX_TYPE_LUMINANCETOALPHA;
+        return FECOLORMATRIX_TYPE_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 6da72dd..96add07 100644 (file)
@@ -33,7 +33,7 @@ namespace WebCore {
 // Animated property definitions
 DEFINE_ANIMATED_STRING(SVGFECompositeElement, SVGNames::inAttr, In1, in1)
 DEFINE_ANIMATED_STRING(SVGFECompositeElement, SVGNames::in2Attr, In2, in2)
-DEFINE_ANIMATED_ENUMERATION(SVGFECompositeElement, SVGNames::operatorAttr, _operator, _operator)
+DEFINE_ANIMATED_ENUMERATION(SVGFECompositeElement, SVGNames::operatorAttr, _operator, _operator, CompositeOperationType)
 DEFINE_ANIMATED_NUMBER(SVGFECompositeElement, SVGNames::k1Attr, K1, k1)
 DEFINE_ANIMATED_NUMBER(SVGFECompositeElement, SVGNames::k2Attr, K2, k2)
 DEFINE_ANIMATED_NUMBER(SVGFECompositeElement, SVGNames::k3Attr, K3, k3)
@@ -55,18 +55,9 @@ void SVGFECompositeElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::operatorAttr) {
-        if (value == "over")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_OVER);
-        else if (value == "in")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_IN);
-        else if (value == "out")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_OUT);
-        else if (value == "atop")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_ATOP);
-        else if (value == "xor")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_XOR);
-        else if (value == "arithmetic")
-            set_operatorBaseValue(FECOMPOSITE_OPERATOR_ARITHMETIC);
+        CompositeOperationType propertyValue = SVGPropertyTraits<CompositeOperationType>::fromString(value);
+        if (propertyValue > 0)
+            set_operatorBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::inAttr)
         setIn1BaseValue(value);
     else if (attr->name() == SVGNames::in2Attr)
@@ -87,7 +78,7 @@ bool SVGFECompositeElement::setFilterEffectAttribute(FilterEffect* effect, const
 {
     FEComposite* composite = static_cast<FEComposite*>(effect);
     if (attrName == SVGNames::operatorAttr)
-        return composite->setOperation(static_cast<CompositeOperationType>(_operator()));
+        return composite->setOperation(_operator());
     if (attrName == SVGNames::k1Attr)
         return composite->setK1(k1());
     if (attrName == SVGNames::k2Attr)
@@ -177,8 +168,7 @@ PassRefPtr<FilterEffect> SVGFECompositeElement::build(SVGFilterBuilder* filterBu
     if (!input1 || !input2)
         return 0;
 
-    RefPtr<FilterEffect> effect = FEComposite::create(filter, static_cast<CompositeOperationType>(_operator()),
-                                                          k1(), k2(), k3(), k4());
+    RefPtr<FilterEffect> effect = FEComposite::create(filter, _operator(), k1(), k2(), k3(), k4());
     FilterEffectVector& inputEffects = effect->inputEffects();
     inputEffects.reserveCapacity(2);
     inputEffects.append(input1);
index 6557d0b..51c2e5a 100644 (file)
@@ -47,13 +47,58 @@ private:
     // Animated property declarations
     DECLARE_ANIMATED_STRING(In1, in1)
     DECLARE_ANIMATED_STRING(In2, in2)
-    DECLARE_ANIMATED_ENUMERATION(_operator, _operator)
+    DECLARE_ANIMATED_ENUMERATION(_operator, _operator, CompositeOperationType)
     DECLARE_ANIMATED_NUMBER(K1, k1)
     DECLARE_ANIMATED_NUMBER(K2, k2)
     DECLARE_ANIMATED_NUMBER(K3, k3)
     DECLARE_ANIMATED_NUMBER(K4, k4)
 };
 
+template<>
+struct SVGPropertyTraits<CompositeOperationType> {
+    static CompositeOperationType highestEnumValue() { return FECOMPOSITE_OPERATOR_ARITHMETIC; }
+
+    static String toString(CompositeOperationType type)
+    {
+        switch (type) {
+        case FECOMPOSITE_OPERATOR_UNKNOWN:
+            return emptyString();
+        case FECOMPOSITE_OPERATOR_OVER:
+            return "over";
+        case FECOMPOSITE_OPERATOR_IN:
+            return "in";
+        case FECOMPOSITE_OPERATOR_OUT:
+            return "out";
+        case FECOMPOSITE_OPERATOR_ATOP:
+            return "atop";
+        case FECOMPOSITE_OPERATOR_XOR:
+            return "xor";
+        case FECOMPOSITE_OPERATOR_ARITHMETIC:
+            return "arithmetic";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static CompositeOperationType fromString(const String& value)
+    {
+        if (value == "over")
+            return FECOMPOSITE_OPERATOR_OVER;
+        if (value == "in")
+            return FECOMPOSITE_OPERATOR_IN;
+        if (value == "out")
+            return FECOMPOSITE_OPERATOR_OUT;
+        if (value == "atop")
+            return FECOMPOSITE_OPERATOR_ATOP;
+        if (value == "xor")
+            return FECOMPOSITE_OPERATOR_XOR;
+        if (value == "arithmetic")
+            return FECOMPOSITE_OPERATOR_ARITHMETIC;
+        return FECOMPOSITE_OPERATOR_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 32cccb0..9ee2514 100644 (file)
@@ -42,7 +42,7 @@ DEFINE_ANIMATED_NUMBER(SVGFEConvolveMatrixElement, SVGNames::divisorAttr, Diviso
 DEFINE_ANIMATED_NUMBER(SVGFEConvolveMatrixElement, SVGNames::biasAttr, Bias, bias)
 DEFINE_ANIMATED_INTEGER(SVGFEConvolveMatrixElement, SVGNames::targetXAttr, TargetX, targetX)
 DEFINE_ANIMATED_INTEGER(SVGFEConvolveMatrixElement, SVGNames::targetYAttr, TargetY, targetY)
-DEFINE_ANIMATED_ENUMERATION(SVGFEConvolveMatrixElement, SVGNames::operatorAttr, EdgeMode, edgeMode)
+DEFINE_ANIMATED_ENUMERATION(SVGFEConvolveMatrixElement, SVGNames::edgeModeAttr, EdgeMode, edgeMode, EdgeModeType)
 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEConvolveMatrixElement, SVGNames::kernelUnitLengthAttr, kernelUnitLengthXIdentifier(), KernelUnitLengthX, kernelUnitLengthX)
 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEConvolveMatrixElement, SVGNames::kernelUnitLengthAttr, kernelUnitLengthYIdentifier(), KernelUnitLengthY, kernelUnitLengthY)
 DEFINE_ANIMATED_BOOLEAN(SVGFEConvolveMatrixElement, SVGNames::preserveAlphaAttr, PreserveAlpha, preserveAlpha)
@@ -95,12 +95,9 @@ void SVGFEConvolveMatrixElement::parseMappedAttribute(Attribute* attr)
             setOrderYBaseValue(y);
         }
     } else if (attr->name() == SVGNames::edgeModeAttr) {
-        if (value == "duplicate")
-            setEdgeModeBaseValue(EDGEMODE_DUPLICATE);
-        else if (value == "wrap")
-            setEdgeModeBaseValue(EDGEMODE_WRAP);
-        else if (value == "none")
-            setEdgeModeBaseValue(EDGEMODE_NONE);
+        EdgeModeType propertyValue = SVGPropertyTraits<EdgeModeType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setEdgeModeBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::kernelMatrixAttr) {
         SVGNumberList newList;
         newList.parse(value);
@@ -133,7 +130,7 @@ bool SVGFEConvolveMatrixElement::setFilterEffectAttribute(FilterEffect* effect,
 {
     FEConvolveMatrix* convolveMatrix = static_cast<FEConvolveMatrix*>(effect);
     if (attrName == SVGNames::edgeModeAttr)
-        return convolveMatrix->setEdgeMode(static_cast<EdgeModeType>(edgeMode()));
+        return convolveMatrix->setEdgeMode(edgeMode());
     if (attrName == SVGNames::divisorAttr)
         return convolveMatrix->setDivisor(divisor());
     if (attrName == SVGNames::biasAttr)
@@ -184,6 +181,39 @@ void SVGFEConvolveMatrixElement::svgAttributeChanged(const QualifiedName& attrNa
         invalidate();
 }
 
+void SVGFEConvolveMatrixElement::synchronizeProperty(const QualifiedName& attrName)
+{
+    SVGFilterPrimitiveStandardAttributes::synchronizeProperty(attrName);
+
+    if (attrName == anyQName()) {
+        synchronizeEdgeMode();
+        synchronizeDivisor();
+        synchronizeBias();
+        synchronizeTargetX();
+        synchronizeTargetY();
+        synchronizeKernelUnitLengthX();
+        synchronizeKernelUnitLengthY();
+        synchronizePreserveAlpha();
+        return;
+    }
+
+    if (attrName == SVGNames::edgeModeAttr)
+        synchronizeEdgeMode();
+    else if (attrName == SVGNames::divisorAttr)
+        synchronizeDivisor();
+    else if (attrName == SVGNames::biasAttr)
+        synchronizeBias();
+    else if (attrName == SVGNames::targetXAttr)
+        synchronizeTargetX();
+    else if (attrName == SVGNames::targetYAttr)
+        synchronizeTargetY();
+    else if (attrName == SVGNames::kernelUnitLengthAttr) {
+        synchronizeKernelUnitLengthX();
+        synchronizeKernelUnitLengthY();
+    } else if (attrName == SVGNames::preserveAlphaAttr)
+        synchronizePreserveAlpha();
+}
+
 AttributeToPropertyTypeMap& SVGFEConvolveMatrixElement::attributeToPropertyTypeMap()
 {
     DEFINE_STATIC_LOCAL(AttributeToPropertyTypeMap, s_attributeToPropertyTypeMap, ());
@@ -251,7 +281,7 @@ PassRefPtr<FilterEffect> SVGFEConvolveMatrixElement::build(SVGFilterBuilder* fil
 
     RefPtr<FilterEffect> effect = FEConvolveMatrix::create(filter,
                     IntSize(orderXValue, orderYValue), divisorValue,
-                    bias(), IntPoint(targetXValue, targetYValue), static_cast<EdgeModeType>(edgeMode()),
+                    bias(), IntPoint(targetXValue, targetYValue), edgeMode(),
                     FloatPoint(kernelUnitLengthX(), kernelUnitLengthX()), preserveAlpha(), kernelMatrix);
     effect->inputEffects().append(input1);
     return effect.release();
index 42f093d..351b061 100644 (file)
@@ -44,6 +44,7 @@ private:
     virtual void parseMappedAttribute(Attribute*);
     virtual bool setFilterEffectAttribute(FilterEffect*, const QualifiedName&);
     virtual void svgAttributeChanged(const QualifiedName&);
+    virtual void synchronizeProperty(const QualifiedName&);
     virtual void fillAttributeToPropertyTypeMap();
     virtual AttributeToPropertyTypeMap& attributeToPropertyTypeMap();
     virtual PassRefPtr<FilterEffect> build(SVGFilterBuilder*, Filter*);
@@ -62,12 +63,45 @@ private:
     DECLARE_ANIMATED_NUMBER(Bias, bias)
     DECLARE_ANIMATED_INTEGER(TargetX, targetX)
     DECLARE_ANIMATED_INTEGER(TargetY, targetY)
-    DECLARE_ANIMATED_ENUMERATION(EdgeMode, edgeMode)
+    DECLARE_ANIMATED_ENUMERATION(EdgeMode, edgeMode, EdgeModeType)
     DECLARE_ANIMATED_NUMBER(KernelUnitLengthX, kernelUnitLengthX)
     DECLARE_ANIMATED_NUMBER(KernelUnitLengthY, kernelUnitLengthY)
     DECLARE_ANIMATED_BOOLEAN(PreserveAlpha, preserveAlpha)
 };
 
+template<>
+struct SVGPropertyTraits<EdgeModeType> {
+    static EdgeModeType highestEnumValue() { return EDGEMODE_NONE; }
+
+    static String toString(EdgeModeType type)
+    {
+        switch (type) {
+        case EDGEMODE_UNKNOWN:
+            return emptyString();
+        case EDGEMODE_DUPLICATE:
+            return "duplicate";
+        case EDGEMODE_WRAP:
+            return "wrap";
+        case EDGEMODE_NONE:
+            return "none";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static EdgeModeType fromString(const String& value)
+    {
+        if (value == "duplicate")
+            return EDGEMODE_DUPLICATE;
+        if (value == "wrap")
+            return EDGEMODE_WRAP;
+        if (value == "none")
+            return EDGEMODE_NONE;
+        return EDGEMODE_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 53d5fb2..1198f64 100644 (file)
@@ -32,8 +32,8 @@ namespace WebCore {
 // Animated property definitions
 DEFINE_ANIMATED_STRING(SVGFEDisplacementMapElement, SVGNames::inAttr, In1, in1)
 DEFINE_ANIMATED_STRING(SVGFEDisplacementMapElement, SVGNames::in2Attr, In2, in2)
-DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::xChannelSelectorAttr, XChannelSelector, xChannelSelector)
-DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::yChannelSelectorAttr, YChannelSelector, yChannelSelector)    
+DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::xChannelSelectorAttr, XChannelSelector, xChannelSelector, ChannelSelectorType)
+DEFINE_ANIMATED_ENUMERATION(SVGFEDisplacementMapElement, SVGNames::yChannelSelectorAttr, YChannelSelector, yChannelSelector, ChannelSelectorType)
 DEFINE_ANIMATED_NUMBER(SVGFEDisplacementMapElement, SVGNames::scaleAttr, Scale, scale)
 
 inline SVGFEDisplacementMapElement::SVGFEDisplacementMapElement(const QualifiedName& tagName, Document* document)
@@ -49,28 +49,18 @@ PassRefPtr<SVGFEDisplacementMapElement> SVGFEDisplacementMapElement::create(cons
     return adoptRef(new SVGFEDisplacementMapElement(tagName, document));
 }
 
-ChannelSelectorType SVGFEDisplacementMapElement::stringToChannel(const String& key)
-{
-    if (key == "R")
-        return CHANNEL_R;
-    if (key == "G")
-        return CHANNEL_G;
-    if (key == "B")
-        return CHANNEL_B;
-    if (key == "A")
-        return CHANNEL_A;
-
-    return CHANNEL_UNKNOWN;
-}
-
 void SVGFEDisplacementMapElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
-    if (attr->name() == SVGNames::xChannelSelectorAttr)
-        setXChannelSelectorBaseValue(stringToChannel(value));
-    else if (attr->name() == SVGNames::yChannelSelectorAttr)
-        setYChannelSelectorBaseValue(stringToChannel(value));
-    else if (attr->name() == SVGNames::inAttr)
+    if (attr->name() == SVGNames::xChannelSelectorAttr) {
+        ChannelSelectorType propertyValue = SVGPropertyTraits<ChannelSelectorType>::fromString(value);
+        if (propertyValue > 0)
+            setXChannelSelectorBaseValue(propertyValue);
+    } else if (attr->name() == SVGNames::yChannelSelectorAttr) {
+        ChannelSelectorType propertyValue = SVGPropertyTraits<ChannelSelectorType>::fromString(value);
+        if (propertyValue > 0)
+            setYChannelSelectorBaseValue(propertyValue);
+    } else if (attr->name() == SVGNames::inAttr)
         setIn1BaseValue(value);
     else if (attr->name() == SVGNames::in2Attr)
         setIn2BaseValue(value);
@@ -84,9 +74,9 @@ bool SVGFEDisplacementMapElement::setFilterEffectAttribute(FilterEffect* effect,
 {
     FEDisplacementMap* displacementMap = static_cast<FEDisplacementMap*>(effect);
     if (attrName == SVGNames::xChannelSelectorAttr)
-        return displacementMap->setXChannelSelector(static_cast<ChannelSelectorType>(xChannelSelector()));
+        return displacementMap->setXChannelSelector(xChannelSelector());
     if (attrName == SVGNames::yChannelSelectorAttr)
-        return displacementMap->setYChannelSelector(static_cast<ChannelSelectorType>(yChannelSelector()));
+        return displacementMap->setYChannelSelector(yChannelSelector());
     if (attrName == SVGNames::scaleAttr)
         return displacementMap->setScale(scale());
 
@@ -98,17 +88,7 @@ void SVGFEDisplacementMapElement::svgAttributeChanged(const QualifiedName& attrN
 {
     SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName);
 
-    if (attrName == SVGNames::xChannelSelectorAttr) {
-        ChannelSelectorType selector = static_cast<ChannelSelectorType>(xChannelSelector());
-        if (CHANNEL_UNKNOWN > selector || selector > CHANNEL_A)
-            setXChannelSelectorBaseValue(CHANNEL_UNKNOWN);
-        primitiveAttributeChanged(attrName);
-    } else if (attrName == SVGNames::yChannelSelectorAttr) {
-        ChannelSelectorType selector = static_cast<ChannelSelectorType>(yChannelSelector());
-        if (CHANNEL_UNKNOWN > selector || selector > CHANNEL_A)
-            setYChannelSelectorBaseValue(CHANNEL_UNKNOWN);
-        primitiveAttributeChanged(attrName);
-    } else if (attrName == SVGNames::scaleAttr)
+    if (attrName == SVGNames::xChannelSelectorAttr || attrName == SVGNames::yChannelSelectorAttr || attrName == SVGNames::scaleAttr)
         primitiveAttributeChanged(attrName);
     else if (attrName == SVGNames::inAttr || attrName == SVGNames::in2Attr)
         invalidate();
@@ -165,8 +145,7 @@ PassRefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder* fi
     if (!input1 || !input2)
         return 0;
 
-    RefPtr<FilterEffect> effect = FEDisplacementMap::create(filter, static_cast<ChannelSelectorType>(xChannelSelector()), 
-                                                                static_cast<ChannelSelectorType>(yChannelSelector()), scale());
+    RefPtr<FilterEffect> effect = FEDisplacementMap::create(filter, xChannelSelector(), yChannelSelector(), scale());
     FilterEffectVector& inputEffects = effect->inputEffects();
     inputEffects.reserveCapacity(2);
     inputEffects.append(input1);
@@ -177,5 +156,3 @@ PassRefPtr<FilterEffect> SVGFEDisplacementMapElement::build(SVGFilterBuilder* fi
 }
 
 #endif // ENABLE(SVG)
-
-// vim:ts=4:noet
index 7aee539..d3d1aab 100644 (file)
@@ -48,11 +48,48 @@ private:
     // Animated property declarations
     DECLARE_ANIMATED_STRING(In1, in1)
     DECLARE_ANIMATED_STRING(In2, in2)
-    DECLARE_ANIMATED_ENUMERATION(XChannelSelector, xChannelSelector)
-    DECLARE_ANIMATED_ENUMERATION(YChannelSelector, yChannelSelector)
+    DECLARE_ANIMATED_ENUMERATION(XChannelSelector, xChannelSelector, ChannelSelectorType)
+    DECLARE_ANIMATED_ENUMERATION(YChannelSelector, yChannelSelector, ChannelSelectorType)
     DECLARE_ANIMATED_NUMBER(Scale, scale)
 };
 
+template<>
+struct SVGPropertyTraits<ChannelSelectorType> {
+    static ChannelSelectorType highestEnumValue() { return CHANNEL_A; }
+
+    static String toString(ChannelSelectorType type)
+    {
+        switch (type) {
+        case CHANNEL_UNKNOWN:
+            return emptyString();
+        case CHANNEL_R:
+            return "R";
+        case CHANNEL_G:
+            return "G";
+        case CHANNEL_B:
+            return "B";
+        case CHANNEL_A:
+            return "A";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static ChannelSelectorType fromString(const String& value)
+    {
+        if (value == "R")
+            return CHANNEL_R;
+        if (value == "G")
+            return CHANNEL_G;
+        if (value == "B")
+            return CHANNEL_B;
+        if (value == "A")
+            return CHANNEL_A;
+        return CHANNEL_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 40f71cf..ea1d64e 100644 (file)
@@ -32,7 +32,7 @@ namespace WebCore {
 
 // Animated property definitions
 DEFINE_ANIMATED_STRING(SVGFEMorphologyElement, SVGNames::inAttr, In1, in1)
-DEFINE_ANIMATED_ENUMERATION(SVGFEMorphologyElement, SVGNames::operatorAttr, _operator, _operator)
+DEFINE_ANIMATED_ENUMERATION(SVGFEMorphologyElement, SVGNames::operatorAttr, _operator, _operator, MorphologyOperatorType)
 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEMorphologyElement, SVGNames::radiusAttr, radiusXIdentifier(), RadiusX, radiusX)
 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFEMorphologyElement, SVGNames::radiusAttr, radiusYIdentifier(), RadiusY, radiusY)
 
@@ -71,10 +71,9 @@ void SVGFEMorphologyElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::operatorAttr) {
-        if (value == "erode")
-            set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_ERODE);
-        else if (value == "dilate")
-            set_operatorBaseValue(FEMORPHOLOGY_OPERATOR_DILATE);
+        MorphologyOperatorType propertyValue = SVGPropertyTraits<MorphologyOperatorType>::fromString(value);
+        if (propertyValue > 0)
+            set_operatorBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::inAttr)
         setIn1BaseValue(value);
     else if (attr->name() == SVGNames::radiusAttr) {
@@ -91,7 +90,7 @@ bool SVGFEMorphologyElement::setFilterEffectAttribute(FilterEffect* effect, cons
 {
     FEMorphology* morphology = static_cast<FEMorphology*>(effect);
     if (attrName == SVGNames::operatorAttr)
-        return morphology->setMorphologyOperator(static_cast<MorphologyOperatorType>(_operator()));
+        return morphology->setMorphologyOperator(_operator());
     if (attrName == SVGNames::radiusAttr)
         return (morphology->setRadiusX(radiusX()) || morphology->setRadiusY(radiusY()));
 
@@ -161,7 +160,7 @@ PassRefPtr<FilterEffect> SVGFEMorphologyElement::build(SVGFilterBuilder* filterB
     if (xRadius < 0 || yRadius < 0)
         return 0;
 
-    RefPtr<FilterEffect> effect = FEMorphology::create(filter, static_cast<MorphologyOperatorType>(_operator()), xRadius, yRadius);
+    RefPtr<FilterEffect> effect = FEMorphology::create(filter, _operator(), xRadius, yRadius);
     effect->inputEffects().append(input1);
     return effect.release();
 }
index d7c1c16..bed9db7 100644 (file)
@@ -50,11 +50,40 @@ private:
 
     // Animated property declarations
     DECLARE_ANIMATED_STRING(In1, in1)
-    DECLARE_ANIMATED_ENUMERATION(_operator, _operator)
+    DECLARE_ANIMATED_ENUMERATION(_operator, _operator, MorphologyOperatorType)
     DECLARE_ANIMATED_NUMBER(RadiusX, radiusX)
     DECLARE_ANIMATED_NUMBER(RadiusY, radiusY)
 };
 
+template<>
+struct SVGPropertyTraits<MorphologyOperatorType> {
+    static MorphologyOperatorType highestEnumValue() { return FEMORPHOLOGY_OPERATOR_DILATE; }
+
+    static String toString(MorphologyOperatorType type)
+    {
+        switch (type) {
+        case FEMORPHOLOGY_OPERATOR_UNKNOWN:
+            return emptyString();
+        case FEMORPHOLOGY_OPERATOR_ERODE:
+            return "erode";
+        case FEMORPHOLOGY_OPERATOR_DILATE:
+            return "dilate";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static MorphologyOperatorType fromString(const String& value)
+    {
+        if (value == "erode")
+            return FEMORPHOLOGY_OPERATOR_ERODE;
+        if (value == "dilate")
+            return FEMORPHOLOGY_OPERATOR_DILATE;
+        return FEMORPHOLOGY_OPERATOR_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 6917e6f..f710ddb 100644 (file)
@@ -34,8 +34,8 @@ DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFETurbulenceElement, SVGNames::baseF
 DEFINE_ANIMATED_NUMBER_MULTIPLE_WRAPPERS(SVGFETurbulenceElement, SVGNames::baseFrequencyAttr, baseFrequencyYIdentifier(), BaseFrequencyY, baseFrequencyY)
 DEFINE_ANIMATED_INTEGER(SVGFETurbulenceElement, SVGNames::numOctavesAttr, NumOctaves, numOctaves)
 DEFINE_ANIMATED_NUMBER(SVGFETurbulenceElement, SVGNames::seedAttr, Seed, seed)
-DEFINE_ANIMATED_ENUMERATION(SVGFETurbulenceElement, SVGNames::stitchTilesAttr, StitchTiles, stitchTiles)
-DEFINE_ANIMATED_ENUMERATION(SVGFETurbulenceElement, SVGNames::typeAttr, Type, type)
+DEFINE_ANIMATED_ENUMERATION(SVGFETurbulenceElement, SVGNames::stitchTilesAttr, StitchTiles, stitchTiles, SVGStitchOptions)
+DEFINE_ANIMATED_ENUMERATION(SVGFETurbulenceElement, SVGNames::typeAttr, Type, type, TurbulenceType)
 
 inline SVGFETurbulenceElement::SVGFETurbulenceElement(const QualifiedName& tagName, Document* document)
     : SVGFilterPrimitiveStandardAttributes(tagName, document)
@@ -67,15 +67,13 @@ void SVGFETurbulenceElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::typeAttr) {
-        if (value == "fractalNoise")
-            setTypeBaseValue(FETURBULENCE_TYPE_FRACTALNOISE);
-        else if (value == "turbulence")
-            setTypeBaseValue(FETURBULENCE_TYPE_TURBULENCE);
+        TurbulenceType propertyValue = SVGPropertyTraits<TurbulenceType>::fromString(value);
+        if (propertyValue > 0)
+            setTypeBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::stitchTilesAttr) {
-        if (value == "stitch")
-            setStitchTilesBaseValue(SVG_STITCHTYPE_STITCH);
-        else if (value == "noStitch")
-            setStitchTilesBaseValue(SVG_STITCHTYPE_NOSTITCH);
+        SVGStitchOptions propertyValue = SVGPropertyTraits<SVGStitchOptions>::fromString(value);
+        if (propertyValue > 0)
+            setStitchTilesBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::baseFrequencyAttr) {
         float x, y;
         if (parseNumberOptionalNumber(value, x, y)) {
@@ -94,7 +92,7 @@ bool SVGFETurbulenceElement::setFilterEffectAttribute(FilterEffect* effect, cons
 {
     FETurbulence* turbulence = static_cast<FETurbulence*>(effect);
     if (attrName == SVGNames::typeAttr)
-        return turbulence->setType(static_cast<TurbulenceType>(type()));
+        return turbulence->setType(type());
     if (attrName == SVGNames::stitchTilesAttr)
         return turbulence->setStitchTiles(stitchTiles());
     if (attrName == SVGNames::baseFrequencyAttr)
@@ -169,9 +167,7 @@ PassRefPtr<FilterEffect> SVGFETurbulenceElement::build(SVGFilterBuilder*, Filter
 {
     if (baseFrequencyX() < 0 || baseFrequencyY() < 0)
         return 0;
-
-    return FETurbulence::create(filter, static_cast<TurbulenceType>(type()), baseFrequencyX(), 
-                baseFrequencyY(), numOctaves(), seed(), stitchTiles() == SVG_STITCHTYPE_STITCH);
+    return FETurbulence::create(filter, type(), baseFrequencyX(), baseFrequencyY(), numOctaves(), seed(), stitchTiles() == SVG_STITCHTYPE_STITCH);
 }
 
 }
index a2cd4f5..15dbe53 100644 (file)
@@ -59,8 +59,66 @@ private:
     DECLARE_ANIMATED_NUMBER(BaseFrequencyY, baseFrequencyY)
     DECLARE_ANIMATED_INTEGER(NumOctaves, numOctaves)
     DECLARE_ANIMATED_NUMBER(Seed, seed)
-    DECLARE_ANIMATED_ENUMERATION(StitchTiles, stitchTiles)
-    DECLARE_ANIMATED_ENUMERATION(Type, type)
+    DECLARE_ANIMATED_ENUMERATION(StitchTiles, stitchTiles, SVGStitchOptions)
+    DECLARE_ANIMATED_ENUMERATION(Type, type, TurbulenceType)
+};
+
+template<>
+struct SVGPropertyTraits<SVGStitchOptions> {
+    static SVGStitchOptions highestEnumValue() { return SVG_STITCHTYPE_NOSTITCH; }
+
+    static String toString(SVGStitchOptions type)
+    {
+        switch (type) {
+        case SVG_STITCHTYPE_UNKNOWN:
+            return emptyString();
+        case SVG_STITCHTYPE_STITCH:
+            return "stitch";
+        case SVG_STITCHTYPE_NOSTITCH:
+            return "noStitch";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGStitchOptions fromString(const String& value)
+    {
+        if (value == "stitch")
+            return SVG_STITCHTYPE_STITCH;
+        if (value == "noStitch")
+            return SVG_STITCHTYPE_NOSTITCH;
+        return SVG_STITCHTYPE_UNKNOWN;
+    }
+};
+
+template<>
+struct SVGPropertyTraits<TurbulenceType> {
+    static TurbulenceType highestEnumValue() { return FETURBULENCE_TYPE_TURBULENCE; }
+
+    static String toString(TurbulenceType type)
+    {
+        switch (type) {
+        case FETURBULENCE_TYPE_UNKNOWN:
+            return emptyString();
+        case FETURBULENCE_TYPE_FRACTALNOISE:
+            return "fractalNoise";
+        case FETURBULENCE_TYPE_TURBULENCE:
+            return "turbulence";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static TurbulenceType fromString(const String& value)
+    {
+        if (value == "fractalNoise")
+            return FETURBULENCE_TYPE_FRACTALNOISE;
+        if (value == "turbulence")
+            return FETURBULENCE_TYPE_TURBULENCE;
+        return FETURBULENCE_TYPE_UNKNOWN;
+    }
 };
 
 } // namespace WebCore
index 90b27e8..9270b4b 100644 (file)
 #include "SVGFilterPrimitiveStandardAttributes.h"
 #include "SVGNames.h"
 #include "SVGParserUtilities.h"
-#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGFilterElement, SVGNames::filterUnitsAttr, FilterUnits, filterUnits)
-DEFINE_ANIMATED_ENUMERATION(SVGFilterElement, SVGNames::primitiveUnitsAttr, PrimitiveUnits, primitiveUnits)
+DEFINE_ANIMATED_ENUMERATION(SVGFilterElement, SVGNames::filterUnitsAttr, FilterUnits, filterUnits, SVGUnitTypes::SVGUnitType)
+DEFINE_ANIMATED_ENUMERATION(SVGFilterElement, SVGNames::primitiveUnitsAttr, PrimitiveUnits, primitiveUnits, SVGUnitTypes::SVGUnitType)
 DEFINE_ANIMATED_LENGTH(SVGFilterElement, SVGNames::xAttr, X, x)
 DEFINE_ANIMATED_LENGTH(SVGFilterElement, SVGNames::yAttr, Y, y)
 DEFINE_ANIMATED_LENGTH(SVGFilterElement, SVGNames::widthAttr, Width, width)
@@ -95,15 +94,13 @@ void SVGFilterElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
     if (attr->name() == SVGNames::filterUnitsAttr) {
-        if (value == "userSpaceOnUse")
-            setFilterUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (value == "objectBoundingBox")
-            setFilterUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(value);
+        if (propertyValue > 0)
+            setFilterUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::primitiveUnitsAttr) {
-        if (value == "userSpaceOnUse")
-            setPrimitiveUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (value == "objectBoundingBox")
-            setPrimitiveUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(value);
+        if (propertyValue > 0)
+            setPrimitiveUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::xAttr)
         setXBaseValue(SVGLength(LengthModeWidth, value));
     else if (attr->name() == SVGNames::yAttr)
index 4851296..891d432 100644 (file)
@@ -32,6 +32,7 @@
 #include "SVGLangSpace.h"
 #include "SVGStyledElement.h"
 #include "SVGURIReference.h"
+#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -65,8 +66,8 @@ private:
     static const AtomicString& filterResYIdentifier();
 
     // Animated property declarations
-    DECLARE_ANIMATED_ENUMERATION(FilterUnits, filterUnits)
-    DECLARE_ANIMATED_ENUMERATION(PrimitiveUnits, primitiveUnits)
+    DECLARE_ANIMATED_ENUMERATION(FilterUnits, filterUnits, SVGUnitTypes::SVGUnitType)
+    DECLARE_ANIMATED_ENUMERATION(PrimitiveUnits, primitiveUnits, SVGUnitTypes::SVGUnitType)
     DECLARE_ANIMATED_LENGTH(X, x)
     DECLARE_ANIMATED_LENGTH(Y, y)
     DECLARE_ANIMATED_LENGTH(Width, width)
index 67eb8fb..d1b8079 100644 (file)
 #include "SVGStopElement.h"
 #include "SVGTransformList.h"
 #include "SVGTransformable.h"
-#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGGradientElement, SVGNames::spreadMethodAttr, SpreadMethod, spreadMethod)
-DEFINE_ANIMATED_ENUMERATION(SVGGradientElement, SVGNames::gradientUnitsAttr, GradientUnits, gradientUnits)
+DEFINE_ANIMATED_ENUMERATION(SVGGradientElement, SVGNames::spreadMethodAttr, SpreadMethod, spreadMethod, SVGGradientElement::SVGSpreadMethodType)
+DEFINE_ANIMATED_ENUMERATION(SVGGradientElement, SVGNames::gradientUnitsAttr, GradientUnits, gradientUnits, SVGUnitTypes::SVGUnitType)
 DEFINE_ANIMATED_TRANSFORM_LIST(SVGGradientElement, SVGNames::gradientTransformAttr, GradientTransform, gradientTransform)
 DEFINE_ANIMATED_STRING(SVGGradientElement, XLinkNames::hrefAttr, Href, href)
 DEFINE_ANIMATED_BOOLEAN(SVGGradientElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
 
 SVGGradientElement::SVGGradientElement(const QualifiedName& tagName, Document* document)
     : SVGStyledElement(tagName, document)
+    , m_spreadMethod(SVG_SPREADMETHOD_PAD)
     , m_gradientUnits(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX)
 {
 }
@@ -54,10 +54,9 @@ SVGGradientElement::SVGGradientElement(const QualifiedName& tagName, Document* d
 void SVGGradientElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::gradientUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setGradientUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setGradientUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setGradientUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::gradientTransformAttr) {
         SVGTransformList newList;
         if (!SVGTransformable::parseTransformAttribute(newList, attr->value()))
@@ -66,12 +65,9 @@ void SVGGradientElement::parseMappedAttribute(Attribute* attr)
         detachAnimatedGradientTransformListWrappers(newList.size());
         setGradientTransformBaseValue(newList);
     } else if (attr->name() == SVGNames::spreadMethodAttr) {
-        if (attr->value() == "reflect")
-            setSpreadMethodBaseValue(SpreadMethodReflect);
-        else if (attr->value() == "repeat")
-            setSpreadMethodBaseValue(SpreadMethodRepeat);
-        else if (attr->value() == "pad")
-            setSpreadMethodBaseValue(SpreadMethodPad);
+        SVGSpreadMethodType propertyValue = SVGPropertyTraits<SVGSpreadMethodType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setSpreadMethodBaseValue(propertyValue);
     } else {
         if (SVGURIReference::parseMappedAttribute(attr))
             return;
index 09da5b0..fdaec60 100644 (file)
@@ -29,6 +29,7 @@
 #include "SVGExternalResourcesRequired.h"
 #include "SVGStyledElement.h"
 #include "SVGURIReference.h"
+#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -36,6 +37,13 @@ class SVGGradientElement : public SVGStyledElement,
                            public SVGURIReference,
                            public SVGExternalResourcesRequired {
 public:
+    enum SVGSpreadMethodType {
+        SVG_SPREADMETHOD_UNKNOWN = 0,
+        SVG_SPREADMETHOD_PAD     = 1,
+        SVG_SPREADMETHOD_REFLECT = 2,
+        SVG_SPREADMETHOD_REPEAT  = 3
+    };
+
     Vector<Gradient::ColorStop> buildStops();
  
 protected:
@@ -52,8 +60,8 @@ private:
     virtual void childrenChanged(bool changedByParser = false, Node* beforeChange = 0, Node* afterChange = 0, int childCountDelta = 0);
 
     // Animated property declarations
-    DECLARE_ANIMATED_ENUMERATION(SpreadMethod, spreadMethod)
-    DECLARE_ANIMATED_ENUMERATION(GradientUnits, gradientUnits)
+    DECLARE_ANIMATED_ENUMERATION(SpreadMethod, spreadMethod, SVGSpreadMethodType)
+    DECLARE_ANIMATED_ENUMERATION(GradientUnits, gradientUnits, SVGUnitTypes::SVGUnitType)
     DECLARE_ANIMATED_TRANSFORM_LIST(GradientTransform, gradientTransform)
 
     // SVGURIReference
@@ -63,6 +71,39 @@ private:
     DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
 };
 
+template<>
+struct SVGPropertyTraits<SVGGradientElement::SVGSpreadMethodType> {
+    static SVGGradientElement::SVGSpreadMethodType highestEnumValue() { return SVGGradientElement::SVG_SPREADMETHOD_REPEAT; }
+
+    static String toString(SVGGradientElement::SVGSpreadMethodType type)
+    {
+        switch (type) {
+        case SVGGradientElement::SVG_SPREADMETHOD_UNKNOWN:
+            return emptyString();
+        case SVGGradientElement::SVG_SPREADMETHOD_PAD:
+            return "pad";
+        case SVGGradientElement::SVG_SPREADMETHOD_REFLECT:
+            return "reflect";
+        case SVGGradientElement::SVG_SPREADMETHOD_REPEAT:
+            return "repeat";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGGradientElement::SVGSpreadMethodType fromString(const String& value)
+    {
+        if (value == "pad")
+            return SVGGradientElement::SVG_SPREADMETHOD_PAD;
+        if (value == "reflect")
+            return SVGGradientElement::SVG_SPREADMETHOD_REFLECT;
+        if (value == "repeat")
+            return SVGGradientElement::SVG_SPREADMETHOD_REPEAT;
+        return SVGGradientElement::SVG_SPREADMETHOD_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 68ccf5b..9cbd47a 100644 (file)
@@ -146,7 +146,7 @@ void SVGLinearGradientElement::collectGradientAttributes(LinearGradientAttribute
 
     while (current) {
         if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr))
-            attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod());
+            attributes.setSpreadMethod(current->spreadMethod());
 
         if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr))
             attributes.setBoundingBoxMode(current->gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
index 02cd5d5..43e7b1b 100644 (file)
@@ -37,8 +37,7 @@ DEFINE_ANIMATED_LENGTH(SVGMarkerElement, SVGNames::refXAttr, RefX, refX)
 DEFINE_ANIMATED_LENGTH(SVGMarkerElement, SVGNames::refYAttr, RefY, refY)
 DEFINE_ANIMATED_LENGTH(SVGMarkerElement, SVGNames::markerWidthAttr, MarkerWidth, markerWidth)
 DEFINE_ANIMATED_LENGTH(SVGMarkerElement, SVGNames::markerHeightAttr, MarkerHeight, markerHeight)
-DEFINE_ANIMATED_ENUMERATION(SVGMarkerElement, SVGNames::markerUnitsAttr, MarkerUnits, markerUnits)
-DEFINE_ANIMATED_ENUMERATION_MULTIPLE_WRAPPERS(SVGMarkerElement, SVGNames::orientAttr, orientTypeIdentifier(), OrientType, orientType)
+DEFINE_ANIMATED_ENUMERATION(SVGMarkerElement, SVGNames::markerUnitsAttr, MarkerUnits, markerUnits, SVGMarkerElement::SVGMarkerUnitsType)
 DEFINE_ANIMATED_ANGLE_MULTIPLE_WRAPPERS(SVGMarkerElement, SVGNames::orientAttr, orientAngleIdentifier(), OrientAngle, orientAngle)
 DEFINE_ANIMATED_BOOLEAN(SVGMarkerElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
 DEFINE_ANIMATED_RECT(SVGMarkerElement, SVGNames::viewBoxAttr, ViewBox, viewBox)
@@ -81,31 +80,26 @@ AffineTransform SVGMarkerElement::viewBoxToViewTransform(float viewWidth, float
 
 void SVGMarkerElement::parseMappedAttribute(Attribute* attr)
 {
+    const String& value = attr->value();
     if (attr->name() == SVGNames::markerUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setMarkerUnitsBaseValue(SVG_MARKERUNITS_USERSPACEONUSE);
-        else if (attr->value() == "strokeWidth")
-            setMarkerUnitsBaseValue(SVG_MARKERUNITS_STROKEWIDTH);
+        SVGMarkerUnitsType propertyValue = SVGPropertyTraits<SVGMarkerUnitsType>::fromString(value);
+        if (propertyValue > 0)
+            setMarkerUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::refXAttr)
-        setRefXBaseValue(SVGLength(LengthModeWidth, attr->value()));
+        setRefXBaseValue(SVGLength(LengthModeWidth, value));
     else if (attr->name() == SVGNames::refYAttr)
-        setRefYBaseValue(SVGLength(LengthModeHeight, attr->value()));
+        setRefYBaseValue(SVGLength(LengthModeHeight, value));
     else if (attr->name() == SVGNames::markerWidthAttr)
-        setMarkerWidthBaseValue(SVGLength(LengthModeWidth, attr->value()));
+        setMarkerWidthBaseValue(SVGLength(LengthModeWidth, value));
     else if (attr->name() == SVGNames::markerHeightAttr)
-        setMarkerHeightBaseValue(SVGLength(LengthModeHeight, attr->value()));
+        setMarkerHeightBaseValue(SVGLength(LengthModeHeight, value));
     else if (attr->name() == SVGNames::orientAttr) {
         SVGAngle angle;
-
-        if (attr->value() == "auto")
-            setOrientTypeBaseValue(SVG_MARKER_ORIENT_AUTO);
-        else {
-            ExceptionCode ec = 0;
-            angle.setValueAsString(attr->value(), ec);
-            setOrientTypeBaseValue(SVG_MARKER_ORIENT_ANGLE);
-        }
-
-        setOrientAngleBaseValue(angle);
+        SVGMarkerOrientType orientType = SVGPropertyTraits<SVGMarkerOrientType>::fromString(value, angle);
+        if (orientType > 0)
+            setOrientTypeBaseValue(orientType);
+        if (orientType == SVG_MARKER_ORIENT_ANGLE)
+            setOrientAngleBaseValue(angle);
     } else {
         if (SVGLangSpace::parseMappedAttribute(attr))
             return;
@@ -246,6 +240,26 @@ bool SVGMarkerElement::selfHasRelativeLengths() const
         || markerHeight().isRelative();
 }
 
+void SVGMarkerElement::synchronizeOrientType()
+{
+    if (!m_orientType.shouldSynchronize)
+        return;
+    
+    AtomicString value;
+    if (m_orientType.value == SVG_MARKER_ORIENT_AUTO)
+        value = "auto";
+    else if (m_orientType.value == SVG_MARKER_ORIENT_ANGLE)
+        value = orientAngle().valueAsString();
+
+    SVGAnimatedPropertySynchronizer<true>::synchronize(this, SVGNames::orientAttr, value);
+}
+
+PassRefPtr<SVGAnimatedEnumerationPropertyTearOff<SVGMarkerElement::SVGMarkerOrientType> > SVGMarkerElement::orientTypeAnimated()
+{
+    m_orientType.shouldSynchronize = true;
+    return SVGAnimatedProperty::lookupOrCreateWrapper<SVGAnimatedEnumerationPropertyTearOff<SVGMarkerOrientType>, SVGMarkerOrientType>(this, SVGNames::orientAttr, orientTypeIdentifier(), m_orientType.value);
+}
+
 }
 
 #endif
index 2275480..742eeb3 100644 (file)
@@ -83,8 +83,7 @@ private:
     DECLARE_ANIMATED_LENGTH(RefY, refY)
     DECLARE_ANIMATED_LENGTH(MarkerWidth, markerWidth)
     DECLARE_ANIMATED_LENGTH(MarkerHeight, markerHeight)
-    DECLARE_ANIMATED_ENUMERATION(MarkerUnits, markerUnits)
-    DECLARE_ANIMATED_ENUMERATION(OrientType, orientType)
+    DECLARE_ANIMATED_ENUMERATION(MarkerUnits, markerUnits, SVGMarkerUnitsType)
     DECLARE_ANIMATED_ANGLE(OrientAngle, orientAngle)
 
     // SVGExternalResourcesRequired
@@ -93,6 +92,65 @@ private:
     // SVGFitToViewBox
     DECLARE_ANIMATED_RECT(ViewBox, viewBox)
     DECLARE_ANIMATED_PRESERVEASPECTRATIO(PreserveAspectRatio, preserveAspectRatio)
+
+public:
+    // Custom animated property: orientType
+    SVGMarkerOrientType& orientType() const { return m_orientType.value; }
+    SVGMarkerOrientType& orientTypeBaseValue() const { return m_orientType.value; }
+    void setOrientTypeBaseValue(const SVGMarkerOrientType& type) { m_orientType.value = type; }
+    PassRefPtr<SVGAnimatedEnumerationPropertyTearOff<SVGMarkerOrientType> > orientTypeAnimated();
+
+private:
+    void synchronizeOrientType();
+    mutable SVGSynchronizableAnimatedProperty<SVGMarkerOrientType> m_orientType;
+};
+
+template<>
+struct SVGPropertyTraits<SVGMarkerElement::SVGMarkerUnitsType> {
+    static SVGMarkerElement::SVGMarkerUnitsType highestEnumValue() { return SVGMarkerElement::SVG_MARKERUNITS_STROKEWIDTH; }
+
+    static String toString(SVGMarkerElement::SVGMarkerUnitsType type)
+    {
+        switch (type) {
+        case SVGMarkerElement::SVG_MARKERUNITS_UNKNOWN:
+            return emptyString();
+        case SVGMarkerElement::SVG_MARKERUNITS_USERSPACEONUSE:
+            return "userSpaceOnUse";
+        case SVGMarkerElement::SVG_MARKERUNITS_STROKEWIDTH:
+            return "strokeWidth";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGMarkerElement::SVGMarkerUnitsType fromString(const String& value)
+    {
+        if (value == "userSpaceOnUse")
+            return SVGMarkerElement::SVG_MARKERUNITS_USERSPACEONUSE;
+        if (value == "strokeWidth")
+            return SVGMarkerElement::SVG_MARKERUNITS_STROKEWIDTH;
+        return SVGMarkerElement::SVG_MARKERUNITS_UNKNOWN;
+    }
+};
+
+template<>
+struct SVGPropertyTraits<SVGMarkerElement::SVGMarkerOrientType> {
+    static SVGMarkerElement::SVGMarkerOrientType highestEnumValue() { return SVGMarkerElement::SVG_MARKER_ORIENT_ANGLE; }
+
+    // toString is not needed, synchronizeOrientType() handles this on its own.
+
+    static SVGMarkerElement::SVGMarkerOrientType fromString(const String& value, SVGAngle& angle)
+    {
+        if (value == "auto")
+            return SVGMarkerElement::SVG_MARKER_ORIENT_AUTO;
+
+        ExceptionCode ec = 0;
+        angle.setValueAsString(value, ec);
+        if (!ec)
+            return SVGMarkerElement::SVG_MARKER_ORIENT_ANGLE;
+        return SVGMarkerElement::SVG_MARKER_ORIENT_UNKNOWN;
+    }
 };
 
 }
index 07b04d5..b999d23 100644 (file)
@@ -36,8 +36,8 @@
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGMaskElement, SVGNames::maskUnitsAttr, MaskUnits, maskUnits)
-DEFINE_ANIMATED_ENUMERATION(SVGMaskElement, SVGNames::maskContentUnitsAttr, MaskContentUnits, maskContentUnits)
+DEFINE_ANIMATED_ENUMERATION(SVGMaskElement, SVGNames::maskUnitsAttr, MaskUnits, maskUnits, SVGUnitTypes::SVGUnitType)
+DEFINE_ANIMATED_ENUMERATION(SVGMaskElement, SVGNames::maskContentUnitsAttr, MaskContentUnits, maskContentUnits, SVGUnitTypes::SVGUnitType)
 DEFINE_ANIMATED_LENGTH(SVGMaskElement, SVGNames::xAttr, X, x)
 DEFINE_ANIMATED_LENGTH(SVGMaskElement, SVGNames::yAttr, Y, y)
 DEFINE_ANIMATED_LENGTH(SVGMaskElement, SVGNames::widthAttr, Width, width)
@@ -66,15 +66,13 @@ PassRefPtr<SVGMaskElement> SVGMaskElement::create(const QualifiedName& tagName,
 void SVGMaskElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::maskUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setMaskUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setMaskUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setMaskUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::maskContentUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setMaskContentUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setMaskContentUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setMaskContentUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::xAttr)
         setXBaseValue(SVGLength(LengthModeWidth, attr->value()));
     else if (attr->name() == SVGNames::yAttr)
index 1add472..efbbdf8 100644 (file)
@@ -28,6 +28,7 @@
 #include "SVGLangSpace.h"
 #include "SVGStyledLocatableElement.h"
 #include "SVGTests.h"
+#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -58,8 +59,8 @@ private:
     virtual bool selfHasRelativeLengths() const;
 
     // Animated property declarations
-    DECLARE_ANIMATED_ENUMERATION(MaskUnits, maskUnits)
-    DECLARE_ANIMATED_ENUMERATION(MaskContentUnits, maskContentUnits)
+    DECLARE_ANIMATED_ENUMERATION(MaskUnits, maskUnits, SVGUnitTypes::SVGUnitType)
+    DECLARE_ANIMATED_ENUMERATION(MaskContentUnits, maskContentUnits, SVGUnitTypes::SVGUnitType)
     DECLARE_ANIMATED_LENGTH(X, x)
     DECLARE_ANIMATED_LENGTH(Y, y)
     DECLARE_ANIMATED_LENGTH(Width, width)
index b09f814..2deb4f7 100644 (file)
@@ -38,7 +38,6 @@
 #include "SVGSVGElement.h"
 #include "SVGStyledTransformableElement.h"
 #include "SVGTransformable.h"
-#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -47,8 +46,8 @@ DEFINE_ANIMATED_LENGTH(SVGPatternElement, SVGNames::xAttr, X, x)
 DEFINE_ANIMATED_LENGTH(SVGPatternElement, SVGNames::yAttr, Y, y)
 DEFINE_ANIMATED_LENGTH(SVGPatternElement, SVGNames::widthAttr, Width, width)
 DEFINE_ANIMATED_LENGTH(SVGPatternElement, SVGNames::heightAttr, Height, height)
-DEFINE_ANIMATED_ENUMERATION(SVGPatternElement, SVGNames::patternUnitsAttr, PatternUnits, patternUnits)
-DEFINE_ANIMATED_ENUMERATION(SVGPatternElement, SVGNames::patternContentUnitsAttr, PatternContentUnits, patternContentUnits)
+DEFINE_ANIMATED_ENUMERATION(SVGPatternElement, SVGNames::patternUnitsAttr, PatternUnits, patternUnits, SVGUnitTypes::SVGUnitType)
+DEFINE_ANIMATED_ENUMERATION(SVGPatternElement, SVGNames::patternContentUnitsAttr, PatternContentUnits, patternContentUnits, SVGUnitTypes::SVGUnitType)
 DEFINE_ANIMATED_TRANSFORM_LIST(SVGPatternElement, SVGNames::patternTransformAttr, PatternTransform, patternTransform) 
 DEFINE_ANIMATED_STRING(SVGPatternElement, XLinkNames::hrefAttr, Href, href)
 DEFINE_ANIMATED_BOOLEAN(SVGPatternElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
@@ -75,15 +74,13 @@ PassRefPtr<SVGPatternElement> SVGPatternElement::create(const QualifiedName& tag
 void SVGPatternElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::patternUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setPatternUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setPatternUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setPatternUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::patternContentUnitsAttr) {
-        if (attr->value() == "userSpaceOnUse")
-            setPatternContentUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE);
-        else if (attr->value() == "objectBoundingBox")
-            setPatternContentUnitsBaseValue(SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
+        SVGUnitTypes::SVGUnitType propertyValue = SVGPropertyTraits<SVGUnitTypes::SVGUnitType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setPatternContentUnitsBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::patternTransformAttr) {
         SVGTransformList newList;
         if (!SVGTransformable::parseTransformAttribute(newList, attr->value()))
index e7bfd80..0ad5250 100644 (file)
@@ -34,6 +34,7 @@
 #include "SVGStyledElement.h"
 #include "SVGTests.h"
 #include "SVGURIReference.h"
+#include "SVGUnitTypes.h"
 
 namespace WebCore {
 
@@ -72,8 +73,8 @@ private:
     DECLARE_ANIMATED_LENGTH(Y, y)
     DECLARE_ANIMATED_LENGTH(Width, width)
     DECLARE_ANIMATED_LENGTH(Height, height)
-    DECLARE_ANIMATED_ENUMERATION(PatternUnits, patternUnits)
-    DECLARE_ANIMATED_ENUMERATION(PatternContentUnits, patternContentUnits)
+    DECLARE_ANIMATED_ENUMERATION(PatternUnits, patternUnits, SVGUnitTypes::SVGUnitType)
+    DECLARE_ANIMATED_ENUMERATION(PatternContentUnits, patternContentUnits, SVGUnitTypes::SVGUnitType)
     DECLARE_ANIMATED_TRANSFORM_LIST(PatternTransform, patternTransform)
 
     // SVGURIReference
index ed29792..682f187 100644 (file)
@@ -157,7 +157,7 @@ void SVGRadialGradientElement::collectGradientAttributes(RadialGradientAttribute
 
     while (current) {
         if (!attributes.hasSpreadMethod() && current->hasAttribute(SVGNames::spreadMethodAttr))
-            attributes.setSpreadMethod((GradientSpreadMethod) current->spreadMethod());
+            attributes.setSpreadMethod(current->spreadMethod());
 
         if (!attributes.hasBoundingBoxMode() && current->hasAttribute(SVGNames::gradientUnitsAttr))
             attributes.setBoundingBoxMode(current->gradientUnits() == SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX);
index 9191cec..44f0bb9 100644 (file)
@@ -37,7 +37,7 @@
 namespace WebCore {
 
 // Animated property definitions
-DEFINE_ANIMATED_ENUMERATION(SVGTextContentElement, SVGNames::lengthAdjustAttr, LengthAdjust, lengthAdjust)
+DEFINE_ANIMATED_ENUMERATION(SVGTextContentElement, SVGNames::lengthAdjustAttr, LengthAdjust, lengthAdjust, SVGTextContentElement::SVGLengthAdjustType)
 DEFINE_ANIMATED_BOOLEAN(SVGTextContentElement, SVGNames::externalResourcesRequiredAttr, ExternalResourcesRequired, externalResourcesRequired)
 
 SVGTextContentElement::SVGTextContentElement(const QualifiedName& tagName, Document* document)
@@ -182,10 +182,9 @@ void SVGTextContentElement::selectSubString(unsigned charnum, unsigned nchars, E
 void SVGTextContentElement::parseMappedAttribute(Attribute* attr)
 {
     if (attr->name() == SVGNames::lengthAdjustAttr) {
-        if (attr->value() == "spacing")
-            setLengthAdjustBaseValue(LENGTHADJUST_SPACING);
-        else if (attr->value() == "spacingAndGlyphs")
-            setLengthAdjustBaseValue(LENGTHADJUST_SPACINGANDGLYPHS);
+        SVGLengthAdjustType propertyValue = SVGPropertyTraits<SVGLengthAdjustType>::fromString(attr->value());
+        if (propertyValue > 0)
+            setLengthAdjustBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::textLengthAttr) {
         m_textLength.value = SVGLength(LengthModeOther, attr->value());
         if (m_textLength.value.value(this) < 0)
index 94bba70..7c1a180 100644 (file)
@@ -79,12 +79,41 @@ private:
     void synchronizeTextLength();
     SVGLength m_specifiedTextLength;
     mutable SVGSynchronizableAnimatedProperty<SVGLength> m_textLength;
-    DECLARE_ANIMATED_ENUMERATION(LengthAdjust, lengthAdjust)
+    DECLARE_ANIMATED_ENUMERATION(LengthAdjust, lengthAdjust, SVGLengthAdjustType)
 
     // SVGExternalResourcesRequired
     DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired) 
 };
 
+template<>
+struct SVGPropertyTraits<SVGTextContentElement::SVGLengthAdjustType> {
+    static SVGTextContentElement::SVGLengthAdjustType highestEnumValue() { return SVGTextContentElement::LENGTHADJUST_SPACINGANDGLYPHS; }
+
+    static String toString(SVGTextContentElement::SVGLengthAdjustType type)
+    {
+        switch (type) {
+        case SVGTextContentElement::LENGTHADJUST_UNKNOWN:
+            return emptyString();
+        case SVGTextContentElement::LENGTHADJUST_SPACING:
+            return "spacing";
+        case SVGTextContentElement::LENGTHADJUST_SPACINGANDGLYPHS:
+            return "spacingAndGlyphs";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGTextContentElement::SVGLengthAdjustType fromString(const String& value)
+    {
+        if (value == "spacingAndGlyphs")
+            return SVGTextContentElement::LENGTHADJUST_SPACINGANDGLYPHS;
+        if (value == "spacing")
+            return SVGTextContentElement::LENGTHADJUST_SPACING;
+        return SVGTextContentElement::LENGTHADJUST_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index 2214d94..a67d6c9 100644 (file)
@@ -32,8 +32,8 @@ namespace WebCore {
 
 // Animated property definitions
 DEFINE_ANIMATED_LENGTH(SVGTextPathElement, SVGNames::startOffsetAttr, StartOffset, startOffset)
-DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::methodAttr, Method, method)
-DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::spacingAttr, Spacing, spacing)
+DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::methodAttr, Method, method, SVGTextPathMethodType)
+DEFINE_ANIMATED_ENUMERATION(SVGTextPathElement, SVGNames::spacingAttr, Spacing, spacing, SVGTextPathSpacingType)
 DEFINE_ANIMATED_STRING(SVGTextPathElement, XLinkNames::hrefAttr, Href, href)
 
 inline SVGTextPathElement::SVGTextPathElement(const QualifiedName& tagName, Document* document)
@@ -53,19 +53,16 @@ PassRefPtr<SVGTextPathElement> SVGTextPathElement::create(const QualifiedName& t
 void SVGTextPathElement::parseMappedAttribute(Attribute* attr)
 {
     const String& value = attr->value();
-
     if (attr->name() == SVGNames::startOffsetAttr)
         setStartOffsetBaseValue(SVGLength(LengthModeOther, value));
     else if (attr->name() == SVGNames::methodAttr) {
-        if (value == "align")
-            setSpacingBaseValue(SVG_TEXTPATH_METHODTYPE_ALIGN);
-        else if (value == "stretch")
-            setSpacingBaseValue(SVG_TEXTPATH_METHODTYPE_STRETCH);
+        SVGTextPathMethodType propertyValue = SVGPropertyTraits<SVGTextPathMethodType>::fromString(value);
+        if (propertyValue > 0)
+            setMethodBaseValue(propertyValue);
     } else if (attr->name() == SVGNames::spacingAttr) {
-        if (value == "auto")
-            setMethodBaseValue(SVG_TEXTPATH_SPACINGTYPE_AUTO);
-        else if (value == "exact")
-            setMethodBaseValue(SVG_TEXTPATH_SPACINGTYPE_EXACT);
+        SVGTextPathSpacingType propertyValue = SVGPropertyTraits<SVGTextPathSpacingType>::fromString(value);
+        if (propertyValue > 0)
+            setSpacingBaseValue(propertyValue);
     } else {
         if (SVGURIReference::parseMappedAttribute(attr))
             return;
index b113718..b699d61 100644 (file)
@@ -73,13 +73,71 @@ private:
 
     // Animated property declarations
     DECLARE_ANIMATED_LENGTH(StartOffset, startOffset)
-    DECLARE_ANIMATED_ENUMERATION(Method, method)
-    DECLARE_ANIMATED_ENUMERATION(Spacing, spacing)
+    DECLARE_ANIMATED_ENUMERATION(Method, method, SVGTextPathMethodType)
+    DECLARE_ANIMATED_ENUMERATION(Spacing, spacing, SVGTextPathSpacingType)
 
     // SVGURIReference
     DECLARE_ANIMATED_STRING(Href, href)
 };
 
+template<>
+struct SVGPropertyTraits<SVGTextPathMethodType> {
+    static SVGTextPathMethodType highestEnumValue() { return SVG_TEXTPATH_METHODTYPE_STRETCH; }
+
+    static String toString(SVGTextPathMethodType type)
+    {
+        switch (type) {
+        case SVG_TEXTPATH_METHODTYPE_UNKNOWN:
+            return emptyString();
+        case SVG_TEXTPATH_METHODTYPE_ALIGN:
+            return "align";
+        case SVG_TEXTPATH_METHODTYPE_STRETCH:
+            return "stretch";
+        }
+    
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGTextPathMethodType fromString(const String& value)
+    {
+        if (value == "align")
+            return SVG_TEXTPATH_METHODTYPE_ALIGN;
+        if (value == "stretch")
+            return SVG_TEXTPATH_METHODTYPE_STRETCH;
+        return SVG_TEXTPATH_METHODTYPE_UNKNOWN;
+    }
+};
+
+template<>
+struct SVGPropertyTraits<SVGTextPathSpacingType> {
+    static SVGTextPathSpacingType highestEnumValue() { return SVG_TEXTPATH_SPACINGTYPE_EXACT; }
+
+    static String toString(SVGTextPathSpacingType type)
+    {
+        switch (type) {
+        case SVG_TEXTPATH_SPACINGTYPE_UNKNOWN:
+            return emptyString();
+        case SVG_TEXTPATH_SPACINGTYPE_AUTO:
+            return "auto";
+        case SVG_TEXTPATH_SPACINGTYPE_EXACT:
+            return "exact";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGTextPathSpacingType fromString(const String& value)
+    {
+        if (value == "auto")
+            return SVG_TEXTPATH_SPACINGTYPE_AUTO;
+        if (value == "exact")
+            return SVG_TEXTPATH_SPACINGTYPE_EXACT;
+        return SVG_TEXTPATH_SPACINGTYPE_UNKNOWN;
+    }
+};
+
 } // namespace WebCore
 
 #endif // ENABLE(SVG)
index d30132c..da51937 100644 (file)
@@ -21,7 +21,7 @@
 #define SVGUnitTypes_h
 
 #if ENABLE(SVG)
-
+#include "SVGPropertyTraits.h"
 #include <wtf/RefCounted.h>
 
 namespace WebCore {
@@ -38,7 +38,34 @@ private:
     SVGUnitTypes() { }
 };
 
-static inline SVGUnitTypes::SVGUnitType toUnitType(int type) { return static_cast<SVGUnitTypes::SVGUnitType>(type); }
+template<>
+struct SVGPropertyTraits<SVGUnitTypes::SVGUnitType> {
+    static SVGUnitTypes::SVGUnitType highestEnumValue() { return SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX; }
+
+    static String toString(SVGUnitTypes::SVGUnitType type)
+    {
+        switch (type) {
+        case SVGUnitTypes::SVG_UNIT_TYPE_UNKNOWN:
+            return emptyString();
+        case SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE:
+            return "userSpaceOnUse";
+        case SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX:
+            return "objectBoundingBox";
+        }
+
+        ASSERT_NOT_REACHED();
+        return emptyString();
+    }
+
+    static SVGUnitTypes::SVGUnitType fromString(const String& value)
+    {
+        if (value == "userSpaceOnUse")
+            return SVGUnitTypes::SVG_UNIT_TYPE_USERSPACEONUSE;
+        if (value == "objectBoundingBox")
+            return SVGUnitTypes::SVG_UNIT_TYPE_OBJECTBOUNDINGBOX;
+        return SVGUnitTypes::SVG_UNIT_TYPE_UNKNOWN;
+    }
+};
 
 }
 
diff --git a/Source/WebCore/svg/properties/SVGAnimatedEnumerationPropertyTearOff.h b/Source/WebCore/svg/properties/SVGAnimatedEnumerationPropertyTearOff.h
new file mode 100644 (file)
index 0000000..5439c5b
--- /dev/null
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SVGAnimatedEnumerationPropertyTearOff_h
+#define SVGAnimatedEnumerationPropertyTearOff_h
+
+#if ENABLE(SVG)
+#include "SVGAnimatedStaticPropertyTearOff.h"
+#include "SVGException.h"
+#include "SVGPropertyTraits.h"
+
+namespace WebCore {
+
+template<typename EnumType>
+class SVGAnimatedEnumerationPropertyTearOff : public SVGAnimatedStaticPropertyTearOff<int> {
+public:
+    virtual void setBaseVal(const int& property, ExceptionCode& ec)
+    {
+        // All SVG enumeration values, that are allowed to be set via SVG DOM start with 1, 0 corresponds to unknown and is not settable through SVG DOM.
+        if (property <= 0 || property > SVGPropertyTraits<EnumType>::highestEnumValue()) {
+            ec = SVGException::SVG_INVALID_VALUE_ERR;
+            return;
+        }
+        SVGAnimatedStaticPropertyTearOff<int>::setBaseVal(property, ec);
+    }
+
+private:
+    friend class SVGAnimatedProperty;
+
+    static PassRefPtr<SVGAnimatedEnumerationPropertyTearOff<EnumType> > create(SVGElement* contextElement, const QualifiedName& attributeName, EnumType& property)
+    {
+        ASSERT(contextElement);
+        return adoptRef(new SVGAnimatedEnumerationPropertyTearOff<EnumType>(contextElement, attributeName, reinterpret_cast<int&>(property)));
+    }
+
+    SVGAnimatedEnumerationPropertyTearOff(SVGElement* contextElement, const QualifiedName& attributeName, int& property)
+        : SVGAnimatedStaticPropertyTearOff<int>(contextElement, attributeName, property)
+    {
+    }
+};
+
+}
+
+#endif // ENABLE(SVG)
+#endif // SVGAnimatedEnumerationPropertyTearOff_h
index 930569e..9b31e80 100644 (file)
@@ -39,7 +39,7 @@ public:
         return m_property;
     }
 
-    void setBaseVal(const PropertyType& property)
+    virtual void setBaseVal(const PropertyType& property, ExceptionCode&)
     {
         m_property = property;
         commitChange();
@@ -48,7 +48,7 @@ public:
     // FIXME: No animVal support.
     void setAnimVal(const PropertyType&) { }
 
-private:
+protected:
     friend class SVGAnimatedProperty;
 
     static PassRefPtr<SVGAnimatedStaticPropertyTearOff<PropertyType> > create(SVGElement* contextElement, const QualifiedName& attributeName, PropertyType& property)
@@ -63,6 +63,8 @@ private:
     {
     }
 
+    virtual ~SVGAnimatedStaticPropertyTearOff() { }
+
 private:
     PropertyType& m_property;
 };