haikuwebkit/LayoutTests/svg/animations/change-target-while-animati...

85 lines
2.6 KiB
HTML
Raw Permalink Normal View History

SVG Animations update baseVal instead of animVal https://bugs.webkit.org/show_bug.cgi?id=12437 Reviewed by Dirk Schulze. Source/WebCore: Begin implementing the last missing core piece of the SVG DOM: proper animVal support. Most SVG DOM interfaces exposing eg. lengths use SVGAnimatedLength. eg. from SVGRectElement: "readonly attribute SVGAnimatedLength x;" SVGAnimatedXXX contains following methods: "readonly attribute SVGLength baseVal; readonly attribute SVGLength animVal;" From SVG DOM perspective, animVal and baseVal are two distinctive objects, animVal != baseVal. Its underlying value is the same though, if no animation is running on that attribute. As soon as a SMIL animation starts animating an SVGAnimated* target attribute, its baseVal and animVal may begin to differ. The animVal always reflect the current animated value (including all effects of additive/accumulated animations) which is shown on screen when eg animating the width of a <rect>. The baseVal is is equal to the underlying XML property value / SVG DOM value, but may be influenced through dynamic changes. (Consider changing rect1.width.baseVal.value while 'width' is animated) During the last year we prepared our animation code to turn on animVal support. This patch adds the last missing pieces to turn on animVal support for the SVGLength. SVGLengthList and all other types will follow, one after the other. I've decided to write an exhaustive ChangeLog, as this as the base for any future work in this area - hopefully making this more reviewable. Tests: svg/animations/additive-from-to-width-animation.html svg/animations/additive-values-width-animation.html svg/animations/change-baseVal-while-animating-fill-freeze-2.html svg/animations/change-baseVal-while-animating-fill-freeze.html svg/animations/change-baseVal-while-animating-fill-remove-2.html svg/animations/change-baseVal-while-animating-fill-remove.html svg/animations/change-target-while-animating-SVG-property.html svg/animations/multiple-animations-fill-freeze.html svg/animations/remove-animation-element-while-animation-is-running.html svg/repaint/repainting-after-animation-element-removal.svg * svg/SVGAnimateElement.cpp: Remove unnecessary std namespace inclusion. (WebCore::SVGAnimateElement::SVGAnimateElement): Remove now-obsolete m_aboutToStopAnimation. (WebCore::SVGAnimateElement::calculateAnimatedValue): Swap assertion order, to test hasTagName() _before_ casting. (WebCore::SVGAnimateElement::resetToBaseValue): Stop relying on the cached baseValue (breaking additive="sum"+values animation) for SVG DOM primitive animations. Avoid any string roundtrips previously needed to reset the SVGAnimatedType to the base value. Just grab the currentBaseValue() from the associated SVGAnimatedProperty, which includes all dynamic changes to the baseVal either by SVG DOM or setAttribute() calls - this way we don't need to utilize the buggy cache in SMILTimeContainer, which can be removed once all SVG DOM primitive types switched to the new animVal concept. NOTE: When multiple animations of the same attribute are applied to a target element, resetToBaseValue() will be called for the highest priority SVGSMILElement, on every animation step! Consider two <animate> elements, applied to a target <rect> which both animate the 'x' attribute, one from 0s to 2s, the other from 4s to 6s. The last <animate> element will reuse the SVGAnimatedType m_animatedType from the first <animate> element, and never create an own m_animatedType. When the animation starts the first time at 0s, we update the rect.x.animVals SVGLength* pointer, to point to the SVGAnimatedType of the first <animate> element, owning the m_animatedType. From that point on each call to rect.x.animVal will always return the same value as the SVGAnimatedType of the first <animate> element holds. Now after 2s the first <animate> element becomes inactive, but its m_animatedType remains alive. The bindings don't notice this change at all. Now at 4s, the second animation element gets active. It reuses the SVGAnimatedType of the first <animate> element, and applies its animation changes to that SVGAnimatedType, which is immediately reflected in the bindings w/o any additional work. It's very important for the understanding when animationStarted/animationEnded need to be called. (WebCore::SVGAnimateElement::applyResultsToTarget): Remove now-obsolete m_aboutToStopAnimation logic. No need to know it at this point. (WebCore::SVGAnimateElement::targetElementWillChange): Renamed from targetElementDidChange(). This method is called from SVGSMILElement for following conditions: - animation element is destructed - animation element is removed from document - target element of animation is destructed - target element of animation is removed from document - target element of animation changes id Whenever any of this happens, we need to reset the animVal. Resetting the animVal involves resetting the PropertyType* pointer, eg. SVGLength*, from the animVal property tear off, belonging to a certain SVGAnimatedProperty (eg. rect.x) to the initial value again, which is the 'm_x' of the SVGRectElement. This is needed as the SVGAnimatedType the animVal currently points to, if an animation is/was running, is destructed in targetElementWillChange(), to reset the SVGAnimateElement to the initial state before it received a target. This is the only place which destructed the m_animatedType, and thus the only place that needs to take care of resetting the animVal pointers. * svg/SVGAnimatedLength.cpp: (WebCore::SVGAnimatedLengthAnimator::constructFromCopy): Add a new constructFromCopy(SVGGenericAnimatedType) function to SVGAnimatedLengthAnimator. It takes a type-unsafe SVGGenericAnimatedType - the caller has to guarantee the type matches. This is strictly enforced for the single caller of constructFromCopy, and guaranteed to be safe. * svg/SVGAnimatedLength.h: Add new constructFromCopy method, which is used to avoid string-roundtrips when resetting to base values. * svg/SVGAnimatedType.cpp: (WebCore::SVGAnimatedType::supportsAnimVal): Only returns true for AnimatedLength, for now. (WebCore::SVGAnimatedType::setVariantValue): Takes a SVGGenericAnimatedType, assuming the type matches. Callers have to guarantee type-safety! * svg/SVGAnimatedType.h: (SVGAnimatedType): Add new static supportsAnimVal(AnimatedPropertyType) function. (WebCore::SVGAnimatedType::variantValue): Add a generic accessor for all animated types, called variant(). Only one place uses this. * svg/SVGAnimatedTypeAnimator.h: (WebCore::SVGAnimatedTypeAnimator::constructFromCopy): New method to construct an eg. SVGAnimatedLengthAnimator right from a SVGLength, instead of a String. In that case the SVGAnimatedType just stores a pointer to the underlying SVGLength, no copying and or other roundtrips involved. * svg/SVGAnimationElement.cpp: (WebCore::SVGAnimationElement::svgAttributeChanged): Implement this instead of attributeChanged. The previous implementation reset the animation state to Inactive, causing a full rebuild, whenever any attribute changes, even though it might not be related for the animation element, eg. animate.setAttribute("stdDeviationX", "foobar"). Fix that by checking if we support the attribute (keyTimes/keySplines/etc..) , if not pass it on to SVGSMILElement (which supports begin/end/etc..) to check if it can handle that. (WebCore::SVGAnimationElement::animationAttributeChanged): Called from our svgAttributeChanged, and/or from SVGSMILElement::svgAttributeChanged, whenever a _known_ attribute has changed. This sledgehammer should be used with care, instead of each time attributeChanged() is called :-) (WebCore::setTargetAttributeAnimatedCSSValue): Remove support for removing properties from the override style sheet. I've added this optimization too early, we should reevaluate this once more types support animVal. It currently complexifies the logic too much, requiring setAttributeAnimatedValue to know if the animation ends (and that's not easy to figure out, at least not using started/endedActiveInterval, as I anticipated). (WebCore::findMatchingAnimatedProperty): Add helper functions which retrieves a SVGAnimatedProperty* for a given SVGElement* targetElement, an attributeName, and an attribute type. eg. findMatchingAnimatedProperty(myRectElement, SVGNames::xAttr, AnimatedLength) returns the SVGAnimatedProperty which is exposed to JS, that holds: SVGProperty* baseVal, and SVGProperty* animVal. (Lazily created if they got accessed from JS.). This is used to update the animVal pointing to a new eg. SVGLength* value, once animation has started, to make rect->x() return that new SVGLength* value (internally), and to reflect the current animated value in rect.x.animVal.value from JS. (WebCore::SVGAnimationElement::applyAnimatedValue): Refactored from setTargetAttributeAnimatedValue, to simplify the code. (WebCore::notifyAnimatedPropertyAboutAnimationBeginEnd): Helper function to share code betweeen animationStarted/animationEnded. It takes a SVGAnimatedProperty* and a SVGAnimatedType* which may be zero, indicating that the animation ended. It calls animationStarted/animationEnded on the given SVGAnimatedProperty, to update the animVal state. It also figures out all instances of the target element, and their SVGAnimatedProperties that may need updating. (WebCore::SVGAnimationElement::animationStarted): Uses the helper above, passing on the given animatedType. (WebCore::SVGAnimationElement::animationEnded): Uses the helper above, passing 0 as animatedType. (WebCore::InstanceUpdateBlocker::InstanceUpdateBlocker): Added new helper struct, doing element->setInstancesUpdatedBlock(true) on construction and setInstancesUpdatesBlocked(false) on destruction, making it impossible to forget one. If we ever rewrite svgAttributeChanged & co to auto-update the cloned instances, this can go away. (WebCore::SVGAnimationElement::setTargetAttributeAnimatedValue): Now takes an SVGAnimatedType* instead of a String parameter. In order to avoid string-roundtrips for animVal support, let us decide if we need to construct a String out of it, or not. For animations supporting animVal (only SVGLength) we don't need to update any attribute or animVal pointer here, that happens automatically! We only need to notify the targetElement eg, that its xAttr changed! Previously we had to call targetElement->setAttribute("x", "...") on every animation step for SVGLength animations - that's gone now! The SVGAnimatedType pointers remains the same during the whole animation, so there's no need to call animationStarted() at each animated step! (WebCore::SVGAnimationElement::animatedPropertyForType): Helper function returning a SVGAnimatedProperty* for the current target element & current target attribute, if the current animation is running on a type supporting animVal (SVGLength), or returning 0. This is needed for SVGAnimateElement. Reuses the existing findMatchingAnimatedProperty code. * svg/SVGAnimationElement.h: * svg/animation/SMILTimeContainer.cpp: (WebCore::SMILTimeContainer::updateAnimations): Add comment to clarify why caching baseValues is just wrong. For SVGLength animations the problem is now gone. This is exercised using the new additive-from-to-width-animation.html & additive-values-width-animation.html tests. * svg/animation/SVGSMILElement.cpp: (WebCore::SVGSMILElement::removedFromDocument): Since animVal requires that the SVGAnimatedProperties are correctly reset if an animation element is removed from the document, we have to call targetElementWillChange(0) from here. That requires to move the "m_attributeName = anyQName()" line down, otherwise targetElementWillChange() would early exit, as no valid attributeName was specified. This is verified using the new svg/animations/remove-animation-element-while-animation-is-running.html and svg/repaint/repainting-after-animation-element-removal.svg tests. (WebCore::SVGSMILElement::isSupportedAttribute): Add function like all SVG*Elements have identifying their supported attributes. (WebCore::SVGSMILElement::svgAttributeChanged): Implement svgAttributeChanged instead of attributeChanged. Only take action if the attribute is actually supported. If one of the common attributes like begin/end/etc. changed, be sure to call animationAttributeChanged() so that our ancestor-classes get notified about this and can take action as well. NOTE: This is not about animating begin/end attributes, but about pure DOM changes. begin/end/et.. are not exposed to the SVG DOM, we still reuse the svgAttributeChanged logic for consistency. (This does NOT make those attributes animatable, nothing this here as it came up while reviewing). (WebCore::SVGSMILElement::targetElement): Adapt logic to targetElementDidChange -> targetElementWillChange change. (WebCore::SVGSMILElement::targetElementWillChange): Renamed from targetElementDidChange. Added "oldTarget" as parameter as well. Our ancestor-classes like SVGAnimateElement use this to properly deregister the animVal in the old target, before resetting the SVGAnimatedType, otherwise we'd leave dangling pointers around (verified manually by guard malloc runs, that none of this happens). Also add a default implementation here in targetElementWillChange, that ancestor classes have to call. Now we properly call endedActiveInterval() if the m_activeState is currently Active, so that animations are shut-down just like if the animation properly ends (use the same cleanup routines, etc.). Not doing that now leads to assertions. (WebCore::SVGSMILElement::resetTargetElement): Instead of forcing m_activeState to be inactive, use the standard methods to end the animation. targetElementWillChange(m_targetElement, 0) and animationAttributeChanged(). resetTargetElement() is only called by SVGDocumentExtensions::removeAllAnimationElementsFromTarget() for following conditions: - targetElement gets destructed - targetElement gets removed from the document - targetElement id changes If the targetElement gets destructed or removed, no actions need to be taken, as the SVGAnimatedPropertys are teared down as well. But if only the id changes, we still have to properly disconnect the animVals - this is all handled through targetElementWillChange now - that's why this has to be called from here as well. That explains why targetElementWillChange() now needs to check if the targetElement is destructing or not. * svg/properties/SVGAnimatedEnumerationPropertyTearOff.h: Pass the AnimatedPropertyType from the SVGPropertyInfo to the SVGAnimatedProperties. Requires mechanic changes in all SVGAnimated* classes. We need acccess to the AnimatedPropertyType to verify the SVGAnimatedType objects, passed to animationStarted, match our type. This is to enforce strict type-checking, whenever SVGGenericAnimatedTypes are passed around. (WebCore::SVGAnimatedEnumerationPropertyTearOff::create): (WebCore::SVGAnimatedEnumerationPropertyTearOff::SVGAnimatedEnumerationPropertyTearOff): * svg/properties/SVGAnimatedListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedListPropertyTearOff::create): (WebCore::SVGAnimatedListPropertyTearOff::SVGAnimatedListPropertyTearOff): * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedPathSegListPropertyTearOff::create): (WebCore::SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff): * svg/properties/SVGAnimatedProperty.h: Store AnimatedPropertyType, add accessors. (WebCore::SVGAnimatedProperty::animatedPropertyType): Add accessor. (WebCore::SVGAnimatedProperty::animationValueChanged): New animVal related functions to be implemented in the animated tear offs. (WebCore::SVGAnimatedProperty::animationStarted): Ditto. (WebCore::SVGAnimatedProperty::animationEnded): Ditto. (WebCore::SVGAnimatedProperty::currentBaseValue): Generic accessor for the baseVal: returns a SVGGenericAnimatedType. It takes an AnimatedPropertyType as input, that's only needed to verify that the type we're returning matches the expectation of the caller. If not, return 0 to avoid any potential casting mistakes, which would lead to crashes. (WebCore::SVGAnimatedProperty::SVGAnimatedProperty): Store m_animatedPropertyType. * svg/properties/SVGAnimatedPropertyTearOff.h: (WebCore::SVGAnimatedPropertyTearOff::create): Same changes as in the other tear offs: pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::currentBaseValue): Returns &m_property, if the type matches (see above). (SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::animationValueChanged): No-op for non list types, don't need to do anything here. (WebCore::SVGAnimatedPropertyTearOff::animationStarted): (WebCore::SVGAnimatedPropertyTearOff::animationEnded): Store the currently animated value in the animVal() property tear off, that's also re-used as-is for the JS bindings. As this is important, here's an example of how this affects methods like rect->x() used in the renderers. Setting m_isAnimating to true, redirects any rect->x() calls that previously returned rect->m_x, to rect->xAnimated()->animVal()->propertyReference() (which returns the same SVGLength& that the SVGAnimatedElement m_animatedType contains). Calling rect->setXBaseValue() still modifies rect->m_x, and is used by all parseAttribute() methods in svg/ as setAttribute() calls only ever modify the "baseValue", never the current animated value. rect.x.baseVal will return a SVGLength object corresponding to rect->m_x. rect.x.animVal will return a SVGLength object corresponding to rect->xAnimated()->animVal()->propertyReference(). These implementation details are all hidden in the SVGAnimatedPropertyMacros. Here's an example from SVGRectElement: DECLARE_ANIMATED_LENGTH(X, x) -> Replace PropertyType with 'SVGLength', LowerProperty with 'x', and UpperProperty with 'X'. PropertyType& LowerProperty() const { if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType, IsDerivedFromSVGElement<UseOwnerType>::value>(this, LowerProperty##PropertyInfo())) { if (wrapper->isAnimating()) return wrapper->currentAnimatedValue(); } return m_##LowerProperty.value; } PropertyType& LowerProperty##BaseValue() const { return m_##LowerProperty.value; } void set##UpperProperty##BaseValue(const PropertyType& type) { m_##LowerProperty.value = type; } Any code outside of svg/, eg. in rendering/svg, does not need to care about any baseVal/animVal differences. During layout eg. RenderSVGRect calls rect->x().value(someLengthContext) to get the current 'x' as float. If an animation is running on that rect element it will automatically retrieve the last set animated value here - all under the hood. I hope that sheds some light in those myserious functions, they were designed with animVal in mind, but we never had that until now :-) (WebCore::SVGAnimatedPropertyTearOff::SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::~SVGAnimatedPropertyTearOff): Add destructor to debug builds veryifing that m_isAnimating is false. * svg/properties/SVGAnimatedStaticPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedStaticPropertyTearOff::create): (WebCore::SVGAnimatedStaticPropertyTearOff::SVGAnimatedStaticPropertyTearOff): * svg/properties/SVGAnimatedTransformListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedTransformListPropertyTearOff::create): (WebCore::SVGAnimatedTransformListPropertyTearOff::SVGAnimatedTransformListPropertyTearOff): * svg/properties/SVGPropertyInfo.h: Add SVGGenericAnimatedType definition. * svg/properties/SVGPropertyTearOff.h: Remove obsolete updateAnimVal method - switched to using setValue directly. LayoutTests: Update test expectations after turning on animVal support for SVGLength, the first primitive now support animVal. Added several new tests, checking additive behaviour with SVGLength objects, removing animation elements while animations are running (+ test repainting of those cases), etc. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.png: Added. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.txt: Added. * svg/animations/additive-from-to-width-animation-expected.txt: Added. * svg/animations/additive-from-to-width-animation.html: Added. * svg/animations/additive-values-width-animation-expected.txt: Added. * svg/animations/additive-values-width-animation.html: Added. * svg/animations/animVal-basics-expected.txt: * svg/animations/animate-calcMode-spline-by-expected.txt: * svg/animations/animate-calcMode-spline-from-by-expected.txt: * svg/animations/animate-calcMode-spline-from-to-expected.txt: * svg/animations/animate-calcMode-spline-to-expected.txt: * svg/animations/animate-calcMode-spline-values-expected.txt: * svg/animations/animate-elem-02-t-drt-expected.txt: * svg/animations/animate-elem-09-t-drt-expected.txt: * svg/animations/animate-elem-10-t-drt-expected.txt: * svg/animations/animate-elem-11-t-drt-expected.txt: * svg/animations/animate-elem-12-t-drt-expected.txt: * svg/animations/animate-elem-13-t-drt-expected.txt: * svg/animations/animate-elem-14-t-drt-expected.txt: * svg/animations/animate-elem-15-t-drt-expected.txt: * svg/animations/animate-elem-16-t-drt-expected.txt: * svg/animations/animate-elem-17-t-drt-expected.txt: * svg/animations/animate-elem-18-t-drt-expected.txt: * svg/animations/animate-elem-19-t-drt-expected.txt: * svg/animations/animate-end-attribute-expected.txt: * svg/animations/animate-endElement-beginElement-expected.txt: * svg/animations/animate-from-to-keyTimes-expected.txt: * svg/animations/animate-insert-begin-expected.txt: * svg/animations/animate-insert-no-begin-expected.txt: * svg/animations/animate-keySplines-expected.txt: * svg/animations/animate-number-calcMode-discrete-keyTimes-expected.txt: * svg/animations/attributeTypes-expected.txt: * svg/animations/change-baseVal-while-animating-fill-freeze-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove.html: Added. * svg/animations/change-target-while-animating-SVG-property-expected.txt: Added. * svg/animations/change-target-while-animating-SVG-property.html: Added. * svg/animations/multiple-animations-fill-freeze-expected.txt: Added. * svg/animations/multiple-animations-fill-freeze.html: Added. * svg/animations/remove-animation-element-while-animation-is-running-expected.txt: Added. * svg/animations/remove-animation-element-while-animation-is-running.html: Added. * svg/animations/resources/additive-from-to-width-animation.svg: Added. * svg/animations/resources/additive-values-width-animation.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-freeze.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-remove.svg: Added. * svg/animations/resources/change-target-while-animating-SVG-property.svg: Added. * svg/animations/resources/multiple-animations-fill-freeze.svg: Added. * svg/animations/resources/remove-animation-element-while-animation-is-running.svg: Added. * svg/animations/script-tests/additive-from-to-width-animation.js: Added. (sample1): (sample2): (sample3): (executeTest): * svg/animations/script-tests/additive-values-width-animation.js: Added. (sample1): (sample2): (sample3): (changeBaseVal): (sample4): (sample5): (executeTest): * svg/animations/script-tests/animVal-basics.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-values.js: (sample2): (sample3): * svg/animations/script-tests/animate-elem-02-t-drt.js: (sampleAfterBegin): (sampleAfterMid): (sampleAfterBeginOfFirstRepetition): (sampleAfterMidOfFirstRepetition): * svg/animations/script-tests/animate-elem-09-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-10-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-11-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-12-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-13-t-drt.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-elem-14-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-15-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-16-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-17-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-18-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-19-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-end-attribute.js: (sample2): (sample3): * svg/animations/script-tests/animate-endElement-beginElement.js: (sample1): * svg/animations/script-tests/animate-from-to-keyTimes.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-no-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-keySplines.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-number-calcMode-discrete-keyTimes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/attributeTypes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-target-while-animating-SVG-property.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/multiple-animations-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (sample6): (sample7): (sample8): (executeTest): * svg/animations/script-tests/remove-animation-element-while-animation-is-running.js: Added. (sample1): (sample2): (sample3): (sample4): (executeTest): * svg/animations/script-tests/svglength-animation-LengthModeHeight.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeOther.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeWidth.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-invalid-value-1.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-2.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-3.js: (sample2): * svg/animations/script-tests/svglength-animation-number-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-cm.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-ems.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-exs.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-in.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pc.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-percentage.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pt.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-px.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-unitType.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/svglength-animation-values.js: (sample2): (sample3): (sample4): (sample5): * svg/animations/svglength-animation-LengthModeHeight-expected.txt: * svg/animations/svglength-animation-LengthModeOther-expected.txt: * svg/animations/svglength-animation-LengthModeWidth-expected.txt: * svg/animations/svglength-animation-invalid-value-1-expected.txt: * svg/animations/svglength-animation-invalid-value-2-expected.txt: * svg/animations/svglength-animation-invalid-value-3-expected.txt: * svg/animations/svglength-animation-number-to-number-expected.txt: * svg/animations/svglength-animation-px-to-cm-expected.txt: * svg/animations/svglength-animation-px-to-ems-expected.txt: * svg/animations/svglength-animation-px-to-exs-expected.txt: * svg/animations/svglength-animation-px-to-in-expected.txt: * svg/animations/svglength-animation-px-to-number-expected.txt: * svg/animations/svglength-animation-px-to-pc-expected.txt: * svg/animations/svglength-animation-px-to-percentage-expected.txt: * svg/animations/svglength-animation-px-to-pt-expected.txt: * svg/animations/svglength-animation-px-to-px-expected.txt: * svg/animations/svglength-animation-unitType-expected.txt: * svg/animations/svglength-animation-values-expected.txt: * svg/repaint/repainting-after-animation-element-removal.svg: Added. Canonical link: https://commits.webkit.org/98122@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110545 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2012-03-13 08:27:14 +00:00
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
Change LayoutTests' s* files to use pre and post js files in LayoutTests/resources. https://bugs.webkit.org/show_bug.cgi?id=120899. Rubber stamped by Filip Pizlo. * scrollbars/rtl/div-absolute.html: * scrollbars/rtl/div-horizontal.html: * scrollbars/rtl/div-vertical.html: * security/crypto-random-values-limits.html: * security/crypto-random-values-types.html: * security/crypto-random-values.html: * storage/domstorage/clear.html: * storage/domstorage/complex-keys.html: * storage/domstorage/complex-values.html: * storage/domstorage/events/basic-body-attribute.html: * storage/domstorage/events/basic-setattribute.html: * storage/domstorage/events/basic.html: * storage/domstorage/events/case-sensitive.html: * storage/domstorage/events/script-tests/TEMPLATE.html: * storage/domstorage/localstorage/close-idle-localstorage-databases-immediately.html: * storage/domstorage/localstorage/missing-arguments.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-1-prepare.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-2-create.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-3-delete-all.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-4-create.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-5-delete-one.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-6-create.html: * storage/domstorage/localstorage/storagetracker/storage-tracker-7-usage.html: * storage/domstorage/quota.html: * storage/domstorage/remove-item.html: * storage/domstorage/script-tests/TEMPLATE.html: * storage/domstorage/storage-functions-not-overwritten.html: * storage/indexeddb/aborted-versionchange-closes.html: * storage/indexeddb/basics-shared-workers.html: * storage/indexeddb/basics-workers.html: * storage/indexeddb/basics.html: * storage/indexeddb/clone-exception.html: * storage/indexeddb/create-and-remove-object-store.html: * storage/indexeddb/create-object-store-options.html: * storage/indexeddb/createIndex-after-failure.html: * storage/indexeddb/createObjectStore-name-argument-required.html: * storage/indexeddb/createObjectStore-null-name.html: * storage/indexeddb/cursor-added-bug.html: * storage/indexeddb/cursor-advance-workers.html: * storage/indexeddb/cursor-advance.html: * storage/indexeddb/cursor-continue-dir.html: * storage/indexeddb/cursor-continue-validity.html: * storage/indexeddb/cursor-continue.html: * storage/indexeddb/cursor-delete.html: * storage/indexeddb/cursor-finished.html: * storage/indexeddb/cursor-inconsistency.html: * storage/indexeddb/cursor-index-delete.html: * storage/indexeddb/cursor-key-order.html: * storage/indexeddb/cursor-overloads.html: * storage/indexeddb/cursor-prev-no-duplicate.html: * storage/indexeddb/cursor-primary-key-order.html: * storage/indexeddb/cursor-properties.html: * storage/indexeddb/cursor-reverse-bug.html: * storage/indexeddb/cursor-skip-deleted.html: * storage/indexeddb/cursor-update-value-argument-required.html: * storage/indexeddb/cursor-update.html: * storage/indexeddb/cursor-value.html: * storage/indexeddb/data-corruption.html: * storage/indexeddb/database-basics.html: * storage/indexeddb/database-close.html: * storage/indexeddb/database-closepending-flag.html: * storage/indexeddb/database-deletepending-flag.html: * storage/indexeddb/database-name-undefined.html: * storage/indexeddb/database-odd-names.html: * storage/indexeddb/database-quota.html: * storage/indexeddb/database-wrapper.html: * storage/indexeddb/delete-closed-database-object.html: * storage/indexeddb/delete-in-upgradeneeded-close-in-open-success.html: * storage/indexeddb/delete-in-upgradeneeded-close-in-versionchange.html: * storage/indexeddb/delete-range.html: * storage/indexeddb/deleteIndex-bug110792.html: * storage/indexeddb/deleteIndex.html: * storage/indexeddb/deleteObjectStore-name-argument-required.html: * storage/indexeddb/deleteObjectStore-null-name.html: * storage/indexeddb/deleted-objects.html: * storage/indexeddb/deletedatabase-blocked.html: * storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange-workers.html: * storage/indexeddb/deletedatabase-delayed-by-open-and-versionchange.html: * storage/indexeddb/deletedatabase-delayed-by-versionchange.html: * storage/indexeddb/deletedatabase-not-blocked.html: * storage/indexeddb/deletedatabase-transaction.html: * storage/indexeddb/dont-commit-on-blocked.html: * storage/indexeddb/dont-wedge.html: * storage/indexeddb/duplicates.html: * storage/indexeddb/error-causes-abort-by-default.html: * storage/indexeddb/events.html: * storage/indexeddb/exception-in-event-aborts.html: * storage/indexeddb/exceptions.html: * storage/indexeddb/factory-basics-workers.html: * storage/indexeddb/factory-basics.html: * storage/indexeddb/factory-cmp.html: * storage/indexeddb/factory-deletedatabase.html: * storage/indexeddb/get-keyrange.html: * storage/indexeddb/index-basics-workers.html: * storage/indexeddb/index-basics.html: * storage/indexeddb/index-count.html: * storage/indexeddb/index-cursor.html: * storage/indexeddb/index-duplicate-keypaths.html: * storage/indexeddb/index-get-key-argument-required.html: * storage/indexeddb/index-multientry.html: * storage/indexeddb/index-population.html: * storage/indexeddb/index-unique.html: * storage/indexeddb/interfaces.html: * storage/indexeddb/intversion-abort-in-initial-upgradeneeded.html: * storage/indexeddb/intversion-bad-parameters.html: * storage/indexeddb/intversion-blocked.html: * storage/indexeddb/intversion-close-between-events.html: * storage/indexeddb/intversion-close-in-oncomplete.html: * storage/indexeddb/intversion-close-in-upgradeneeded.html: * storage/indexeddb/intversion-encoding.html: * storage/indexeddb/intversion-gated-on-delete.html: * storage/indexeddb/intversion-long-queue.html: * storage/indexeddb/intversion-omit-parameter.html: * storage/indexeddb/intversion-open-in-upgradeneeded.html: * storage/indexeddb/intversion-open-with-version.html: * storage/indexeddb/intversion-persistence.html: * storage/indexeddb/intversion-revert-on-abort.html: * storage/indexeddb/intversion-two-opens-no-versions.html: * storage/indexeddb/intversion-upgrades.html: * storage/indexeddb/invalid-keys.html: * storage/indexeddb/key-generator.html: * storage/indexeddb/key-sort-order-across-types.html: * storage/indexeddb/key-sort-order-date.html: * storage/indexeddb/key-type-array.html: * storage/indexeddb/key-type-infinity.html: * storage/indexeddb/keypath-arrays.html: * storage/indexeddb/keypath-basics.html: * storage/indexeddb/keypath-edges.html: * storage/indexeddb/keypath-fetch-key.html: * storage/indexeddb/keypath-intrinsic-properties.html: * storage/indexeddb/keyrange-required-arguments.html: * storage/indexeddb/keyrange.html: * storage/indexeddb/lazy-index-population.html: * storage/indexeddb/lazy-index-types.html: * storage/indexeddb/legacy-constants.html: * storage/indexeddb/list-ordering.html: * storage/indexeddb/metadata.html: * storage/indexeddb/mozilla/add-twice-failure.html: * storage/indexeddb/mozilla/autoincrement-indexes.html: * storage/indexeddb/mozilla/bad-keypath.html: * storage/indexeddb/mozilla/clear.html: * storage/indexeddb/mozilla/create-index-unique.html: * storage/indexeddb/mozilla/create-index-with-integer-keys.html: * storage/indexeddb/mozilla/create-objectstore-basics.html: * storage/indexeddb/mozilla/create-objectstore-null-name.html: * storage/indexeddb/mozilla/cursor-mutation-objectstore-only.html: * storage/indexeddb/mozilla/cursor-mutation.html: * storage/indexeddb/mozilla/cursor-update-updates-indexes.html: * storage/indexeddb/mozilla/cursors.html: * storage/indexeddb/mozilla/delete-result.html: * storage/indexeddb/mozilla/event-source.html: * storage/indexeddb/mozilla/global-data.html: * storage/indexeddb/mozilla/index-prev-no-duplicate.html: * storage/indexeddb/mozilla/indexes.html: * storage/indexeddb/mozilla/key-requirements-delete-null-key.html: * storage/indexeddb/mozilla/key-requirements-inline-and-passed.html: * storage/indexeddb/mozilla/key-requirements-put-no-key.html: * storage/indexeddb/mozilla/key-requirements-put-null-key.html: * storage/indexeddb/mozilla/key-requirements.html: * storage/indexeddb/mozilla/object-cursors.html: * storage/indexeddb/mozilla/object-identity.html: * storage/indexeddb/mozilla/object-store-inline-autoincrement-key-added-on-put.html: * storage/indexeddb/mozilla/object-store-remove-values.html: * storage/indexeddb/mozilla/objectstorenames.html: * storage/indexeddb/mozilla/odd-result-order.html: * storage/indexeddb/mozilla/open-database-null-name.html: * storage/indexeddb/mozilla/put-get-values.html: * storage/indexeddb/mozilla/readonly-transactions.html: * storage/indexeddb/mozilla/readwrite-transactions.html: * storage/indexeddb/mozilla/readyState.html: * storage/indexeddb/mozilla/remove-index.html: * storage/indexeddb/mozilla/remove-objectstore.html: * storage/indexeddb/mozilla/resources/add-twice-failure.js: * storage/indexeddb/mozilla/resources/autoincrement-indexes.js: * storage/indexeddb/mozilla/resources/bad-keypath.js: * storage/indexeddb/mozilla/resources/clear.js: * storage/indexeddb/mozilla/resources/create-index-unique.js: * storage/indexeddb/mozilla/resources/create-index-with-integer-keys.js: * storage/indexeddb/mozilla/resources/create-objectstore-basics.js: * storage/indexeddb/mozilla/resources/create-objectstore-null-name.js: * storage/indexeddb/mozilla/resources/cursor-mutation-objectstore-only.js: * storage/indexeddb/mozilla/resources/cursor-mutation.js: * storage/indexeddb/mozilla/resources/cursor-update-updates-indexes.js: * storage/indexeddb/mozilla/resources/cursors.js: * storage/indexeddb/mozilla/resources/delete-result.js: * storage/indexeddb/mozilla/resources/event-source.js: * storage/indexeddb/mozilla/resources/global-data.js: * storage/indexeddb/mozilla/resources/indexes.js: * storage/indexeddb/mozilla/resources/key-requirements-delete-null-key.js: * storage/indexeddb/mozilla/resources/key-requirements-inline-and-passed.js: * storage/indexeddb/mozilla/resources/key-requirements-put-no-key.js: * storage/indexeddb/mozilla/resources/key-requirements-put-null-key.js: * storage/indexeddb/mozilla/resources/key-requirements.js: * storage/indexeddb/mozilla/resources/object-cursors.js: * storage/indexeddb/mozilla/resources/object-identity.js: * storage/indexeddb/mozilla/resources/object-store-inline-autoincrement-key-added-on-put.js: * storage/indexeddb/mozilla/resources/object-store-remove-values.js: * storage/indexeddb/mozilla/resources/objectstorenames.js: * storage/indexeddb/mozilla/resources/odd-result-order.js: * storage/indexeddb/mozilla/resources/open-database-null-name.js: * storage/indexeddb/mozilla/resources/put-get-values.js: * storage/indexeddb/mozilla/resources/readonly-transactions.js: * storage/indexeddb/mozilla/resources/readwrite-transactions.js: * storage/indexeddb/mozilla/resources/readyState.js: * storage/indexeddb/mozilla/resources/remove-index.js: * storage/indexeddb/mozilla/resources/remove-objectstore.js: * storage/indexeddb/mozilla/resources/versionchange-abort.js: * storage/indexeddb/mozilla/versionchange-abort.html: * storage/indexeddb/mutating-cursor.html: * storage/indexeddb/noblobs.html: * storage/indexeddb/object-lookups-in-versionchange.html: * storage/indexeddb/objectStore-required-arguments.html: * storage/indexeddb/objectstore-autoincrement.html: * storage/indexeddb/objectstore-basics-workers.html: * storage/indexeddb/objectstore-basics.html: * storage/indexeddb/objectstore-clear.html: * storage/indexeddb/objectstore-count.html: * storage/indexeddb/objectstore-cursor.html: * storage/indexeddb/objectstore-removeobjectstore.html: * storage/indexeddb/odd-strings.html: * storage/indexeddb/open-bad-versions.html: * storage/indexeddb/open-cursor.html: * storage/indexeddb/open-during-transaction.html: * storage/indexeddb/open-ordering.html: * storage/indexeddb/open-twice-workers.html: * storage/indexeddb/opencursor-key.html: * storage/indexeddb/pending-activity-workers.html: * storage/indexeddb/pending-activity.html: * storage/indexeddb/pending-version-change-on-exit.html: * storage/indexeddb/pending-version-change-stuck-works-with-terminate.html: * storage/indexeddb/pending-version-change-stuck.html: * storage/indexeddb/persistence.html: * storage/indexeddb/prefetch-bugfix-108071.html: * storage/indexeddb/queued-commands.html: * storage/indexeddb/readonly-properties.html: * storage/indexeddb/readonly.html: * storage/indexeddb/removed.html: * storage/indexeddb/request-continue-abort.html: * storage/indexeddb/request-event-propagation.html: * storage/indexeddb/resources/aborted-versionchange-closes.js: * storage/indexeddb/resources/basics.js: * storage/indexeddb/resources/create-and-remove-object-store.js: * storage/indexeddb/resources/create-object-store-options.js: * storage/indexeddb/resources/createIndex-after-failure.js: * storage/indexeddb/resources/createObjectStore-name-argument-required.js: * storage/indexeddb/resources/createObjectStore-null-name.js: * storage/indexeddb/resources/cursor-added-bug.js: * storage/indexeddb/resources/cursor-advance.js: * storage/indexeddb/resources/cursor-continue-dir.js: * storage/indexeddb/resources/cursor-continue-validity.js: * storage/indexeddb/resources/cursor-continue.js: * storage/indexeddb/resources/cursor-delete.js: * storage/indexeddb/resources/cursor-inconsistency.js: * storage/indexeddb/resources/cursor-index-delete.js: * storage/indexeddb/resources/cursor-key-order.js: * storage/indexeddb/resources/cursor-prev-no-duplicate.js: * storage/indexeddb/resources/cursor-primary-key-order.js: * storage/indexeddb/resources/cursor-properties.js: * storage/indexeddb/resources/cursor-reverse-bug.js: * storage/indexeddb/resources/cursor-skip-deleted.js: * storage/indexeddb/resources/cursor-update-value-argument-required.js: * storage/indexeddb/resources/cursor-update.js: * storage/indexeddb/resources/cursor-value.js: * storage/indexeddb/resources/data-corruption.js: * storage/indexeddb/resources/database-basics.js: * storage/indexeddb/resources/database-close.js: * storage/indexeddb/resources/database-closepending-flag.js: * storage/indexeddb/resources/database-deletepending-flag.js: * storage/indexeddb/resources/database-name-undefined.js: * storage/indexeddb/resources/database-odd-names.js: * storage/indexeddb/resources/database-quota.js: * storage/indexeddb/resources/database-wrapper.js: * storage/indexeddb/resources/delete-closed-database-object.js: * storage/indexeddb/resources/delete-in-upgradeneeded-close-in-open-success.js: * storage/indexeddb/resources/delete-in-upgradeneeded-close-in-versionchange.js: * storage/indexeddb/resources/delete-range.js: * storage/indexeddb/resources/deleteIndex.js: * storage/indexeddb/resources/deleteObjectStore-name-argument-required.js: * storage/indexeddb/resources/deleteObjectStore-null-name.js: * storage/indexeddb/resources/deleted-objects.js: * storage/indexeddb/resources/deletedatabase-blocked.js: * storage/indexeddb/resources/deletedatabase-delayed-by-open-and-versionchange.js: * storage/indexeddb/resources/deletedatabase-delayed-by-versionchange.js: * storage/indexeddb/resources/deletedatabase-not-blocked.js: * storage/indexeddb/resources/dont-commit-on-blocked-worker.js: * storage/indexeddb/resources/dont-wedge.js: * storage/indexeddb/resources/duplicates.js: * storage/indexeddb/resources/error-causes-abort-by-default.js: * storage/indexeddb/resources/events.js: * storage/indexeddb/resources/exception-in-event-aborts.js: * storage/indexeddb/resources/exceptions.js: * storage/indexeddb/resources/factory-basics.js: * storage/indexeddb/resources/factory-cmp.js: * storage/indexeddb/resources/factory-deletedatabase.js: * storage/indexeddb/resources/get-keyrange.js: * storage/indexeddb/resources/index-basics.js: * storage/indexeddb/resources/index-count.js: * storage/indexeddb/resources/index-cursor.js: * storage/indexeddb/resources/index-duplicate-keypaths.js: * storage/indexeddb/resources/index-get-key-argument-required.js: * storage/indexeddb/resources/index-multientry.js: * storage/indexeddb/resources/index-population.js: * storage/indexeddb/resources/index-unique.js: * storage/indexeddb/resources/interfaces.js: * storage/indexeddb/resources/intversion-abort-in-initial-upgradeneeded.js: * storage/indexeddb/resources/intversion-bad-parameters.js: * storage/indexeddb/resources/intversion-blocked.js: * storage/indexeddb/resources/intversion-close-between-events.js: * storage/indexeddb/resources/intversion-close-in-oncomplete.js: * storage/indexeddb/resources/intversion-close-in-upgradeneeded.js: * storage/indexeddb/resources/intversion-encoding.js: * storage/indexeddb/resources/intversion-gated-on-delete.js: * storage/indexeddb/resources/intversion-long-queue.js: * storage/indexeddb/resources/intversion-omit-parameter.js: * storage/indexeddb/resources/intversion-open-in-upgradeneeded.js: * storage/indexeddb/resources/intversion-open-with-version.js: * storage/indexeddb/resources/intversion-persistence.js: * storage/indexeddb/resources/intversion-revert-on-abort.js: * storage/indexeddb/resources/intversion-two-opens-no-versions.js: * storage/indexeddb/resources/intversion-upgrades.js: * storage/indexeddb/resources/invalid-keys.js: * storage/indexeddb/resources/key-generator.js: * storage/indexeddb/resources/key-sort-order-across-types.js: * storage/indexeddb/resources/key-sort-order-date.js: * storage/indexeddb/resources/key-type-array.js: * storage/indexeddb/resources/key-type-infinity.js: * storage/indexeddb/resources/keypath-arrays.js: * storage/indexeddb/resources/keypath-basics.js: * storage/indexeddb/resources/keypath-edges.js: * storage/indexeddb/resources/keypath-fetch-key.js: * storage/indexeddb/resources/keypath-intrinsic-properties.js: * storage/indexeddb/resources/keyrange-required-arguments.js: * storage/indexeddb/resources/keyrange.js: * storage/indexeddb/resources/lazy-index-types.js: * storage/indexeddb/resources/legacy-constants.js: * storage/indexeddb/resources/list-ordering.js: * storage/indexeddb/resources/metadata.js: * storage/indexeddb/resources/mutating-cursor.js: * storage/indexeddb/resources/objectStore-required-arguments.js: * storage/indexeddb/resources/objectstore-autoincrement.js: * storage/indexeddb/resources/objectstore-basics.js: * storage/indexeddb/resources/objectstore-clear.js: * storage/indexeddb/resources/objectstore-count.js: * storage/indexeddb/resources/objectstore-cursor.js: * storage/indexeddb/resources/objectstore-removeobjectstore.js: * storage/indexeddb/resources/odd-strings.js: * storage/indexeddb/resources/open-cursor.js: * storage/indexeddb/resources/open-during-transaction.js: * storage/indexeddb/resources/open-ordering.js: * storage/indexeddb/resources/open-twice.js: * storage/indexeddb/resources/opencursor-key.js: * storage/indexeddb/resources/pending-activity.js: * storage/indexeddb/resources/pending-version-change-on-exit.js: * storage/indexeddb/resources/pending-version-change-stuck.js: * storage/indexeddb/resources/persistence.js: * storage/indexeddb/resources/prefetch-bugfix-108071.js: * storage/indexeddb/resources/queued-commands.js: * storage/indexeddb/resources/readonly-properties.js: * storage/indexeddb/resources/readonly.js: * storage/indexeddb/resources/removed.js: * storage/indexeddb/resources/request-continue-abort.js: * storage/indexeddb/resources/request-event-propagation.js: * storage/indexeddb/resources/set_version_blocked.js: * storage/indexeddb/resources/setversion-blocked-by-versionchange-close.js: * storage/indexeddb/resources/setversion-not-blocked.js: * storage/indexeddb/resources/transaction-abort.js: * storage/indexeddb/resources/transaction-active-flag.js: * storage/indexeddb/resources/transaction-after-close.js: * storage/indexeddb/resources/transaction-and-objectstore-calls.js: * storage/indexeddb/resources/transaction-basics.js: * storage/indexeddb/resources/transaction-complete-workers.js: * storage/indexeddb/resources/transaction-coordination-across-databases.js: * storage/indexeddb/resources/transaction-coordination-within-database.js: * storage/indexeddb/resources/transaction-crash-on-abort.js: * storage/indexeddb/resources/transaction-error.js: * storage/indexeddb/resources/transaction-event-propagation.js: * storage/indexeddb/resources/transaction-read-only.js: * storage/indexeddb/resources/transaction-readwrite-exclusive.js: * storage/indexeddb/resources/transaction-rollback.js: * storage/indexeddb/resources/transaction-scope-sequencing.js: * storage/indexeddb/resources/transaction-starvation.js: * storage/indexeddb/resources/transaction-storeNames-required.js: * storage/indexeddb/resources/unblocked-version-changes.js: * storage/indexeddb/resources/unprefix.js: * storage/indexeddb/resources/value-undefined.js: * storage/indexeddb/resources/values-odd-types.js: * storage/indexeddb/resources/version-change-abort.js: * storage/indexeddb/resources/version-change-exclusive.js: * storage/indexeddb/resources/versionchangerequest-activedomobject.js: * storage/indexeddb/set_version_blocked.html: * storage/indexeddb/setversion-blocked-by-versionchange-close.html: * storage/indexeddb/setversion-not-blocked.html: * storage/indexeddb/structured-clone.html: * storage/indexeddb/transaction-abort.html: * storage/indexeddb/transaction-active-flag.html: * storage/indexeddb/transaction-after-close.html: * storage/indexeddb/transaction-and-objectstore-calls.html: * storage/indexeddb/transaction-basics.html: * storage/indexeddb/transaction-complete-with-js-recursion-cross-frame.html: * storage/indexeddb/transaction-complete-with-js-recursion.html: * storage/indexeddb/transaction-complete-workers.html: * storage/indexeddb/transaction-coordination-across-databases.html: * storage/indexeddb/transaction-coordination-within-database.html: * storage/indexeddb/transaction-crash-in-tasks.html: * storage/indexeddb/transaction-crash-on-abort.html: * storage/indexeddb/transaction-error.html: * storage/indexeddb/transaction-event-propagation.html: * storage/indexeddb/transaction-read-only.html: * storage/indexeddb/transaction-readwrite-exclusive.html: * storage/indexeddb/transaction-rollback.html: * storage/indexeddb/transaction-scope-sequencing.html: * storage/indexeddb/transaction-starvation.html: * storage/indexeddb/transaction-storeNames-required.html: * storage/indexeddb/unblocked-version-changes.html: * storage/indexeddb/unprefix-workers.html: * storage/indexeddb/unprefix.html: * storage/indexeddb/value-undefined.html: * storage/indexeddb/values-odd-types.html: * storage/indexeddb/version-change-abort.html: * storage/indexeddb/version-change-exclusive.html: * storage/indexeddb/versionchangerequest-activedomobject.html: * storage/script-tests/TEMPLATE.html: * storage/storageinfo-missing-arguments.html: * storage/storageinfo-no-callbacks.html: * storage/storageinfo-query-usage.html: * storage/storageinfo-request-quota.html: * storage/storagequota-query-usage.html: * storage/storagequota-request-quota.html: * storage/websql/execute-sql-rowsAffected.html: * svg/animations/accumulate-values-width-animation.html: * svg/animations/additive-from-to-width-animation.html: * svg/animations/additive-type-by-animation.html: * svg/animations/additive-values-width-animation.html: * svg/animations/animVal-basics.html: * svg/animations/animate-calcMode-spline-by.html: * svg/animations/animate-calcMode-spline-from-by.html: * svg/animations/animate-calcMode-spline-from-to.html: * svg/animations/animate-calcMode-spline-to.html: * svg/animations/animate-calcMode-spline-values.html: * svg/animations/animate-color-calcMode-discrete.html: * svg/animations/animate-color-fill-currentColor.html: * svg/animations/animate-color-fill-from-by.html: * svg/animations/animate-color-rgba-calcMode-discrete.html: * svg/animations/animate-color-transparent.html: * svg/animations/animate-css-xml-attributeType.html: * svg/animations/animate-currentColor.html: * svg/animations/animate-dynamic-update-attributeName.html: * svg/animations/animate-elem-02-t-drt.html: * svg/animations/animate-elem-03-t-drt.html: * svg/animations/animate-elem-04-t-drt.html: * svg/animations/animate-elem-05-t-drt.html: * svg/animations/animate-elem-06-t-drt.html: * svg/animations/animate-elem-07-t-drt.html: * svg/animations/animate-elem-08-t-drt.html: * svg/animations/animate-elem-09-t-drt.html: * svg/animations/animate-elem-10-t-drt.html: * svg/animations/animate-elem-11-t-drt.html: * svg/animations/animate-elem-12-t-drt.html: * svg/animations/animate-elem-13-t-drt.html: * svg/animations/animate-elem-14-t-drt.html: * svg/animations/animate-elem-15-t-drt.html: * svg/animations/animate-elem-16-t-drt.html: * svg/animations/animate-elem-17-t-drt.html: * svg/animations/animate-elem-18-t-drt.html: * svg/animations/animate-elem-19-t-drt.html: * svg/animations/animate-end-attribute-numeric-precision.html: * svg/animations/animate-end-attribute.html: * svg/animations/animate-endElement-beginElement.html: * svg/animations/animate-from-to-keyTimes.html: * svg/animations/animate-gradient-transform.html: * svg/animations/animate-inherit-css-property.html: * svg/animations/animate-insert-begin.html: * svg/animations/animate-insert-no-begin.html: * svg/animations/animate-keySplines.html: * svg/animations/animate-marker-orient-from-angle-to-angle.html: * svg/animations/animate-marker-orient-from-angle-to-auto.html: * svg/animations/animate-marker-orient-to-angle.html: * svg/animations/animate-mpath-insert.html: * svg/animations/animate-number-calcMode-discrete-keyTimes.html: * svg/animations/animate-number-calcMode-discrete.html: * svg/animations/animate-path-animation-Cc-Ss.html: * svg/animations/animate-path-animation-Ll-Vv-Hh.html: * svg/animations/animate-path-animation-Qq-Tt.html: * svg/animations/animate-path-animation-cC-sS-inverse.html: * svg/animations/animate-path-animation-lL-vV-hH-inverse.html: * svg/animations/animate-path-animation-qQ-tT-inverse.html: * svg/animations/animate-path-nested-transforms.html: * svg/animations/animate-path-to-animation.html: * svg/animations/animate-reset-freeze.html: * svg/animations/animate-setcurrenttime.html: * svg/animations/animate-text-nested-transforms.html: * svg/animations/animateTransform-pattern-transform.html: * svg/animations/animateTransform-translate-attributetype-auto.html: * svg/animations/animateTransform-translate-invalid-attributetype.html: * svg/animations/attributeTypes.html: * svg/animations/change-baseVal-while-animating-fill-freeze-2.html: * svg/animations/change-baseVal-while-animating-fill-freeze.html: * svg/animations/change-baseVal-while-animating-fill-remove-2.html: * svg/animations/change-baseVal-while-animating-fill-remove.html: * svg/animations/change-css-property-while-animating-fill-freeze.html: * svg/animations/change-css-property-while-animating-fill-remove.html: * svg/animations/change-target-while-animating-SVG-property.html: * svg/animations/deferred-insertion.html: * svg/animations/dynamic-modify-attributename-crash2.svg: * svg/animations/force-use-shadow-tree-recreation-while-animating.html: * svg/animations/multiple-animations-ending.html: * svg/animations/multiple-animations-fill-freeze.html: * svg/animations/multiple-begin-additive-animation.html: * svg/animations/non-additive-type-by-animation.html: * svg/animations/non-additive-type-from-by-animation.html: * svg/animations/reinserting-svg-into-document.html: * svg/animations/remove-animation-element-while-animation-is-running.html: * svg/animations/single-values-animation.html: * svg/animations/svgPreserveAspectRatio-animation-1.html: * svg/animations/svgangle-animation-deg-to-grad.html: * svg/animations/svgangle-animation-deg-to-rad.html: * svg/animations/svgangle-animation-grad-to-deg.html: * svg/animations/svgangle-animation-grad-to-rad.html: * svg/animations/svgangle-animation-rad-to-deg.html: * svg/animations/svgangle-animation-rad-to-grad.html: * svg/animations/svgboolean-animation-1.html: * svg/animations/svgenum-animation-1.html: * svg/animations/svgenum-animation-10.html: * svg/animations/svgenum-animation-11.html: * svg/animations/svgenum-animation-12.html: * svg/animations/svgenum-animation-13.html: * svg/animations/svgenum-animation-2.html: * svg/animations/svgenum-animation-3.html: * svg/animations/svgenum-animation-4.html: * svg/animations/svgenum-animation-5.html: * svg/animations/svgenum-animation-6.html: * svg/animations/svgenum-animation-7.html: * svg/animations/svgenum-animation-8.html: * svg/animations/svgenum-animation-9.html: * svg/animations/svginteger-animation-1.html: * svg/animations/svginteger-animation-2.html: * svg/animations/svglength-additive-by-1.html: * svg/animations/svglength-additive-by-2.html: * svg/animations/svglength-additive-by-3.html: * svg/animations/svglength-additive-by-4.html: * svg/animations/svglength-additive-by-5.html: * svg/animations/svglength-additive-by-6.html: * svg/animations/svglength-additive-from-by-1.html: * svg/animations/svglength-additive-from-by-2.html: * svg/animations/svglength-additive-from-by-3.html: * svg/animations/svglength-additive-from-by-4.html: * svg/animations/svglength-animation-LengthModeHeight.html: * svg/animations/svglength-animation-LengthModeOther.html: * svg/animations/svglength-animation-LengthModeWidth.html: * svg/animations/svglength-animation-invalid-value-1.html: * svg/animations/svglength-animation-invalid-value-2.html: * svg/animations/svglength-animation-invalid-value-3.html: * svg/animations/svglength-animation-number-to-number.html: * svg/animations/svglength-animation-px-to-cm.html: * svg/animations/svglength-animation-px-to-ems.html: * svg/animations/svglength-animation-px-to-exs.html: * svg/animations/svglength-animation-px-to-in.html: * svg/animations/svglength-animation-px-to-number.html: * svg/animations/svglength-animation-px-to-pc.html: * svg/animations/svglength-animation-px-to-percentage.html: * svg/animations/svglength-animation-px-to-pt.html: * svg/animations/svglength-animation-px-to-px.html: * svg/animations/svglength-animation-unitType.html: * svg/animations/svglength-animation-values.html: * svg/animations/svglengthlist-animation-1.html: * svg/animations/svglengthlist-animation-2.html: * svg/animations/svglengthlist-animation-3.html: * svg/animations/svglengthlist-animation-4.html: * svg/animations/svglengthlist-animation-5.html: * svg/animations/svgnumber-animation-1.html: * svg/animations/svgnumber-animation-2.html: * svg/animations/svgnumber-animation-3.html: * svg/animations/svgnumber-animation-4.html: * svg/animations/svgnumberlist-animation-1.html: * svg/animations/svgnumberlist-animation-2.html: * svg/animations/svgnumberoptionalnumber-animation-1.html: * svg/animations/svgnumberoptionalnumber-animation-2.html: * svg/animations/svgnumberoptionalnumber-animation-3.html: * svg/animations/svgnumberoptionalnumber-animation-4.html: * svg/animations/svgpath-animation-1.html: * svg/animations/svgpointlist-animation-1.html: * svg/animations/svgpointlist-animation-2.html: * svg/animations/svgrect-animation-1.html: * svg/animations/svgrect-animation-2.html: * svg/animations/svgstring-animation-1.html: * svg/animations/svgstring-animation-fallback-to-discrete.html: * svg/animations/svgtransform-animation-1.html: * svg/animations/svgtransform-animation-discrete.html: * svg/animations/use-animate-transform-and-position.html: * svg/as-image/svg-canvas-link-not-colored.html: * svg/as-image/svg-canvas-xhtml-tainted.html: * svg/as-image/svg-container-size-after-reload.html: * svg/as-object/embedded-svg-immediate-offsetWidth-query.html: * svg/as-object/embedded-svg-size-changes.html: * svg/as-object/nested-embedded-svg-size-changes.html: * svg/css/buffered-rendering.html: * svg/css/case-sensitive-attrname-selectors.html: * svg/css/glyph-orientation-rounding-test.xhtml: * svg/css/mask-type.html: * svg/css/rect-system-color.xhtml: * svg/css/scientific-numbers.html: * svg/css/svg-attribute-length-parsing.html: * svg/css/svg-attribute-parser-mode.html: * svg/custom/SVGException.html: * svg/custom/acid3-test-77.html: * svg/custom/currentColor-on-color.html: * svg/custom/document-all-includes-svg.html: * svg/custom/focus-event-handling-keyboard.xhtml: * svg/custom/focus-event-handling.xhtml: * svg/custom/frame-getSVGDocument.html: * svg/custom/getBoundingClientRect.xhtml: * svg/custom/getSubStringLength.html: * svg/custom/global-constructors.html: * svg/custom/immutable-properties.html: * svg/custom/invalid-length-units.html: * svg/custom/loadevents-async.html: * svg/custom/poly-parsing-error.html: * svg/custom/script-tests/TEMPLATE.html: * svg/custom/selectSubString.html: * svg/custom/svg-createsvgtransform-type.html: * svg/custom/svg-fonts-in-text-controls.html: * svg/custom/svg-getelementid.xhtml: * svg/custom/svg-modify-currentTranslate.html: * svg/custom/svg-viewBox-dynamic.html: * svg/custom/svg-xml-dom-sync.html: * svg/custom/tearoffs-with-tearoffs.html: * svg/custom/use-href-update-crash.svg: * svg/custom/use-instanceRoot-as-event-target.xhtml: * svg/custom/use-instanceRoot-event-bubbling.xhtml: * svg/custom/use-instanceRoot-event-listeners.xhtml: * svg/custom/window-named-item-lookup.html: * svg/dom/SVGAngle.html: * svg/dom/SVGAnimatedAngle.html: * svg/dom/SVGAnimatedBoolean.html: * 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: * svg/dom/SVGAnimatedEnumeration.html: * svg/dom/SVGAnimatedInteger.html: * svg/dom/SVGAnimatedLength.html: * svg/dom/SVGAnimatedLengthList.html: * svg/dom/SVGAnimatedNumber.html: * svg/dom/SVGAnimatedNumberList.html: * svg/dom/SVGAnimatedPreserveAspectRatio.html: * svg/dom/SVGAnimatedRect.html: * svg/dom/SVGColor.html: * svg/dom/SVGLength-px-with-context.html: * svg/dom/SVGLength-px.html: * svg/dom/SVGLength.html: * svg/dom/SVGLengthList-appendItem.xhtml: * svg/dom/SVGLengthList-basics.xhtml: * svg/dom/SVGLengthList-getItem.xhtml: * svg/dom/SVGLengthList-initialize.xhtml: * svg/dom/SVGLengthList-insertItemBefore.xhtml: * svg/dom/SVGLengthList-removeItem.xhtml: * svg/dom/SVGLengthList-replaceItem.xhtml: * svg/dom/SVGLengthList-xml-dom-modifications.xhtml: * svg/dom/SVGLocatable-getCTM-svg-root.html: * svg/dom/SVGMatrix-interface.xhtml: * svg/dom/SVGMatrix.html: * svg/dom/SVGNumber.html: * svg/dom/SVGNumberList-basics.xhtml: * svg/dom/SVGPaint.html: * svg/dom/SVGPathSegList-appendItem.xhtml: * svg/dom/SVGPathSegList-clear-and-initialize.xhtml: * svg/dom/SVGPathSegList-insertItemBefore.xhtml: * svg/dom/SVGPathSegList-removeItem.xhtml: * svg/dom/SVGPathSegList-replaceItem.xhtml: * svg/dom/SVGPathSegList-xml-dom-synchronization.xhtml: * svg/dom/SVGPoint.html: * svg/dom/SVGPointList-basics.xhtml: * svg/dom/SVGPreserveAspectRatio.html: * svg/dom/SVGRect.html: * svg/dom/SVGStringList-basics.xhtml: * svg/dom/SVGStringList.html: * svg/dom/SVGStyleElement/disable-svg-style-element.html: * svg/dom/SVGStyleElement/script-tests/TEMPLATE.html: * svg/dom/SVGStyleElement/style-langspace.html: * svg/dom/SVGTransform.html: * svg/dom/SVGTransformList-basics.xhtml: * svg/dom/SVGTransformList.html: * svg/dom/SVGViewSpec-defaults.html: * svg/dom/SVGViewSpec-invalid-ref-crash.html: * svg/dom/SVGViewSpec.html: * svg/dom/altGlyph-dom.xhtml: * svg/dom/baseVal-animVal-crash.html: * svg/dom/css-transforms.xhtml: * svg/dom/feFlood-no-in1.html: * svg/dom/font-face-elements.html: * svg/dom/fuzz-path-parser.html: * svg/dom/getElementsByTagName-localName-matching.html: * svg/dom/id-reflect.html: * svg/dom/length-list-parser.html: * svg/dom/operatorAttribute.html: * svg/dom/path-parser.html: * svg/dom/path-pointAtLength.html: * svg/dom/path-segments.html: * svg/dom/path-totalLength.html: * svg/dom/points-parser.html: * svg/dom/preserve-aspect-ratio-parser.html: * svg/dom/resources/viewspec-parser.js: (continueFuzzing): * svg/dom/rgb-color-parser.html: * svg/dom/script-tests/SVGViewSpec.js: (completeTest): * svg/dom/script-tests/TEMPLATE.html: * svg/dom/string-list-parser.html: * svg/dom/style-reflect.html: * svg/dom/svg2-inheritance.html: * svg/dom/svglist-exception-on-out-bounds-error.html: * svg/dom/svglist-insertItemBefore-appends.html: * svg/dom/svgpath-getPathSegAtLength.html: * svg/dom/svgpath-out-of-bounds-getPathSeg.html: * svg/dom/text-rotate-live.html: * svg/dom/transform-parser.html: * svg/dom/viewspec-parser-1.html: * svg/dom/viewspec-parser-2.html: * svg/dom/viewspec-parser-3.html: * svg/dom/viewspec-parser-4.html: * svg/dom/viewspec-parser-5.html: * svg/dom/viewspec-parser-6.html: * svg/dom/viewspec-parser-7.html: * svg/dynamic-updates/SVG-dynamic-css-transform.html: * svg/dynamic-updates/SVGAElement-dom-href-attr.html: * svg/dynamic-updates/SVGAElement-dom-target-attr.html: * svg/dynamic-updates/SVGAElement-svgdom-href-prop.html: * svg/dynamic-updates/SVGAElement-svgdom-target-prop.html: * svg/dynamic-updates/SVGCircleElement-dom-cx-attr.html: * svg/dynamic-updates/SVGCircleElement-dom-cy-attr.html: * svg/dynamic-updates/SVGCircleElement-dom-r-attr.html: * svg/dynamic-updates/SVGCircleElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGCircleElement-svgdom-cx-prop.html: * svg/dynamic-updates/SVGCircleElement-svgdom-cy-prop.html: * svg/dynamic-updates/SVGCircleElement-svgdom-r-prop.html: * svg/dynamic-updates/SVGCircleElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGClipPath-influences-hitTesting.html: * svg/dynamic-updates/SVGClipPathElement-css-transform-influences-hitTesting.html: * svg/dynamic-updates/SVGClipPathElement-dom-clipPathUnits-attr.html: * svg/dynamic-updates/SVGClipPathElement-svgdom-clipPathUnits-prop.html: * svg/dynamic-updates/SVGClipPathElement-transform-influences-hitTesting.html: * svg/dynamic-updates/SVGCursorElement-dom-x-attr.html: * svg/dynamic-updates/SVGCursorElement-dom-y-attr.html: * svg/dynamic-updates/SVGCursorElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGCursorElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGEllipseElement-dom-cx-attr.html: * svg/dynamic-updates/SVGEllipseElement-dom-cy-attr.html: * svg/dynamic-updates/SVGEllipseElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGEllipseElement-dom-rx-attr.html: * svg/dynamic-updates/SVGEllipseElement-dom-ry-attr.html: * svg/dynamic-updates/SVGEllipseElement-svgdom-cx-prop.html: * svg/dynamic-updates/SVGEllipseElement-svgdom-cy-prop.html: * svg/dynamic-updates/SVGEllipseElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGEllipseElement-svgdom-rx-prop.html: * svg/dynamic-updates/SVGEllipseElement-svgdom-ry-prop.html: * svg/dynamic-updates/SVGFEBlendElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEBlendElement-dom-in2-attr.html: * svg/dynamic-updates/SVGFEBlendElement-dom-mode-attr.html: * svg/dynamic-updates/SVGFEBlendElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEBlendElement-svgdom-in2-prop.html: * svg/dynamic-updates/SVGFEBlendElement-svgdom-mode-prop.html: * svg/dynamic-updates/SVGFEColorMatrixElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEColorMatrixElement-dom-type-attr.html: * svg/dynamic-updates/SVGFEColorMatrixElement-dom-values-attr.html: * svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-type-prop.html: * svg/dynamic-updates/SVGFEColorMatrixElement-svgdom-values-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-amplitude-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-exponent-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-intercept-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-offset-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-slope-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-tableValues-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-dom-type-attr.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-amplitude-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-exponent-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-intercept-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-offset-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-slope-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-tableValues-prop.html: * svg/dynamic-updates/SVGFEComponentTransferElement-svgdom-type-prop.html: * svg/dynamic-updates/SVGFECompositeElement-dom-in-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-in2-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-k1-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-k2-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-k3-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-k4-attr.html: * svg/dynamic-updates/SVGFECompositeElement-dom-operator-attr.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-in2-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-k1-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-k2-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-k3-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-k4-prop.html: * svg/dynamic-updates/SVGFECompositeElement-svgdom-operator-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-bias-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-divisor-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-edgeMode-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelMatrix-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-kernelUnitLength-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-order-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-preserveAlpha-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetX-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-dom-targetY-attr.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-bias-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-divisor-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-edgeMode-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelMatrix-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-kernelUnitLength-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-order-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-preserveAlpha-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetX-prop.html: * svg/dynamic-updates/SVGFEConvolveMatrixElement-svgdom-targetY-prop.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-diffuseConstant-attr.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-lighting-color-attr.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-dom-surfaceScale-attr.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-inherit-lighting-color-css-prop.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-lighting-color-css-prop.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-diffuseConstant-prop.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEDiffuseLightingElement-svgdom-surfaceScale-prop.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-dom-in2-attr.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-dom-scale-attr.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-dom-xChannelSelector-attr.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-dom-yChannelSelector-attr.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-in2-prop.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-scale-prop.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-xChannelSelector-prop.html: * svg/dynamic-updates/SVGFEDisplacementMapElement-svgdom-yChannelSelector-prop.html: * svg/dynamic-updates/SVGFEDistantLightElement-dom-azimuth-attr.html: * svg/dynamic-updates/SVGFEDistantLightElement-dom-elevation-attr.html: * svg/dynamic-updates/SVGFEDistantLightElement-svgdom-azimuth-prop.html: * svg/dynamic-updates/SVGFEDistantLightElement-svgdom-elevation-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-dx-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-dy-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-color-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-shadow-opacity-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-dom-stdDeviation-attr.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dx-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-dy-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-color-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-shadow-opacity-prop.html: * svg/dynamic-updates/SVGFEDropShadowElement-svgdom-stdDeviation-prop.html: * svg/dynamic-updates/SVGFEFloodElement-dom-flood-color-attr.html: * svg/dynamic-updates/SVGFEFloodElement-dom-flood-opacity-attr.html: * svg/dynamic-updates/SVGFEFloodElement-inherit-flood-color.html: * svg/dynamic-updates/SVGFEFloodElement-svgdom-flood-color-prop.html: * svg/dynamic-updates/SVGFEFloodElement-svgdom-flood-opacity-prop.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-dom-edgeMode-attr.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-attr.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-dom-stdDeviation-call.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-edgeMode-prop.html: * svg/dynamic-updates/SVGFEGaussianBlurElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEImageElement-dom-preserveAspectRatio-attr.html: * svg/dynamic-updates/SVGFEImageElement-svgdom-preserveAspectRatio-prop.html: * svg/dynamic-updates/SVGFEMergeNodeElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEMergeNodeElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEMorphologyElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEMorphologyElement-dom-operator-attr.html: * svg/dynamic-updates/SVGFEMorphologyElement-dom-radius-attr.html: * svg/dynamic-updates/SVGFEMorphologyElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEMorphologyElement-svgdom-operator-prop.html: * svg/dynamic-updates/SVGFEMorphologyElement-svgdom-radius-call.html: * svg/dynamic-updates/SVGFEOffsetElement-dom-dx-attr.html: * svg/dynamic-updates/SVGFEOffsetElement-dom-dy-attr.html: * svg/dynamic-updates/SVGFEOffsetElement-dom-in-attr.html: * svg/dynamic-updates/SVGFEOffsetElement-svgdom-dx-prop.html: * svg/dynamic-updates/SVGFEOffsetElement-svgdom-dy-prop.html: * svg/dynamic-updates/SVGFEOffsetElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFEPointLightElement-dom-x-attr.html: * svg/dynamic-updates/SVGFEPointLightElement-dom-y-attr.html: * svg/dynamic-updates/SVGFEPointLightElement-dom-z-attr.html: * svg/dynamic-updates/SVGFEPointLightElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGFEPointLightElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGFEPointLightElement-svgdom-z-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-dom-in-attr.html: * svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularConstant-attr.html: * svg/dynamic-updates/SVGFESpecularLightingElement-dom-specularExponent-attr.html: * svg/dynamic-updates/SVGFESpecularLightingElement-dom-suraceScale-attr.html: * svg/dynamic-updates/SVGFESpecularLightingElement-inherit-lighting-color-css-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-lighting-color-css-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-remove-lightSource.html: * svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularConstant-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-specularExponent-prop.html: * svg/dynamic-updates/SVGFESpecularLightingElement-svgdom-suraceScale-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-limitingConeAngle-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtX-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtY-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-pointsAtZ-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-specularExponent-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-x-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-y-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-dom-z-attr.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-limitingConeAngle-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtX-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtY-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-pointsAtZ-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-specularExponent-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGFESpotLightElement-svgdom-z-prop.html: * svg/dynamic-updates/SVGFETileElement-dom-in-attr.html: * svg/dynamic-updates/SVGFETileElement-svgdom-in-prop.html: * svg/dynamic-updates/SVGFETurbulenceElement-dom-baseFrequency-attr.html: * svg/dynamic-updates/SVGFETurbulenceElement-dom-numOctaves-attr.html: * svg/dynamic-updates/SVGFETurbulenceElement-dom-seed-attr.html: * svg/dynamic-updates/SVGFETurbulenceElement-dom-stitchTiles-attr.html: * svg/dynamic-updates/SVGFETurbulenceElement-dom-type-attr.html: * svg/dynamic-updates/SVGFETurbulenceElement-svgdom-baseFrequency-prop.html: * svg/dynamic-updates/SVGFETurbulenceElement-svgdom-numOctaves-prop.html: * svg/dynamic-updates/SVGFETurbulenceElement-svgdom-seed-prop.html: * svg/dynamic-updates/SVGFETurbulenceElement-svgdom-stitchTiles-prop.html: * svg/dynamic-updates/SVGFETurbulenceElement-svgdom-type-prop.html: * svg/dynamic-updates/SVGFilterElement-dom-filterRes-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-filterUnits-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-height-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-primitiveUnits-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-width-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-x-attr.html: * svg/dynamic-updates/SVGFilterElement-dom-y-attr.html: * svg/dynamic-updates/SVGFilterElement-svgdom-filterRes-call.html: * svg/dynamic-updates/SVGFilterElement-svgdom-filterResX-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-filterResY-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-filterUnits-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-primitiveUnits-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGFilterElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-height-attr.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-result-attr.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-width-attr.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-x-attr.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-dom-y-attr.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-height-prop.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-result-prop.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-width-prop.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-x-prop.html: * svg/dynamic-updates/SVGFilterPrimitiveStandardAttributes-svgdom-y-prop.html: * svg/dynamic-updates/SVGForeignObjectElement-dom-height-attr.html: * svg/dynamic-updates/SVGForeignObjectElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGForeignObjectElement-dom-width-attr.html: * svg/dynamic-updates/SVGForeignObjectElement-dom-x-attr.html: * svg/dynamic-updates/SVGForeignObjectElement-dom-y-attr.html: * svg/dynamic-updates/SVGForeignObjectElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGForeignObjectElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGForeignObjectElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGForeignObjectElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGForeignObjectElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGGElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGGElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGImageElement-dom-height-attr.html: * svg/dynamic-updates/SVGImageElement-dom-preserveAspectRatio-attr.html: * svg/dynamic-updates/SVGImageElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGImageElement-dom-width-attr.html: * svg/dynamic-updates/SVGImageElement-dom-x-attr.html: * svg/dynamic-updates/SVGImageElement-dom-y-attr.html: * svg/dynamic-updates/SVGImageElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGImageElement-svgdom-preserveAspectRatio-prop.html: * svg/dynamic-updates/SVGImageElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGImageElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGImageElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGImageElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGLineElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGLineElement-dom-x1-attr.html: * svg/dynamic-updates/SVGLineElement-dom-x2-attr.html: * svg/dynamic-updates/SVGLineElement-dom-y1-attr.html: * svg/dynamic-updates/SVGLineElement-dom-y2-attr.html: * svg/dynamic-updates/SVGLineElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGLineElement-svgdom-x1-prop.html: * svg/dynamic-updates/SVGLineElement-svgdom-x2-prop.html: * svg/dynamic-updates/SVGLineElement-svgdom-y1-prop.html: * svg/dynamic-updates/SVGLineElement-svgdom-y2-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-gradientTransform-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-gradientUnits-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-x1-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-x2-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-y1-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-dom-y2-attr.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-gradientTransform-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-gradientUnits-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-x1-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-x2-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-y1-prop.html: * svg/dynamic-updates/SVGLinearGradientElement-svgdom-y2-prop.html: * svg/dynamic-updates/SVGMarkerElement-dom-markerHeight-attr.html: * svg/dynamic-updates/SVGMarkerElement-dom-markerUnits-attr.html: * svg/dynamic-updates/SVGMarkerElement-dom-markerWidth-attr.html: * svg/dynamic-updates/SVGMarkerElement-dom-orient-attr.html: * svg/dynamic-updates/SVGMarkerElement-dom-refX-attr.html: * svg/dynamic-updates/SVGMarkerElement-dom-refY-attr.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-markerHeight-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-markerUnits-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-markerWidth-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-orientAngle-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-orientType-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-refX-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-refY-prop.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-setOrientToAngle-call.html: * svg/dynamic-updates/SVGMarkerElement-svgdom-setOrientToAuto-call.html: * svg/dynamic-updates/SVGMaskElement-dom-height-attr.html: * svg/dynamic-updates/SVGMaskElement-dom-maskContentUnits-attr.html: * svg/dynamic-updates/SVGMaskElement-dom-maskUnits-attr.html: * svg/dynamic-updates/SVGMaskElement-dom-width-attr.html: * svg/dynamic-updates/SVGMaskElement-dom-x-attr.html: * svg/dynamic-updates/SVGMaskElement-dom-y-attr.html: * svg/dynamic-updates/SVGMaskElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGMaskElement-svgdom-maskContentUnits-prop.html: * svg/dynamic-updates/SVGMaskElement-svgdom-maskUnits-prop.html: * svg/dynamic-updates/SVGMaskElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGMaskElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGMaskElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGPathElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGPathElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGPatternElement-dom-height-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-patternContentUnits-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-patternTransform-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-patternUnits-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-width-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-x-attr.html: * svg/dynamic-updates/SVGPatternElement-dom-y-attr.html: * svg/dynamic-updates/SVGPatternElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-patternContentUnits-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-patternTransform-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-patternUnits-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGPatternElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGPolygonElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGPolygonElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGPolylineElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGPolylineElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-cx-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-cy-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-fx-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-fy-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-gradientTransform-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-gradientUnits-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-dom-r-attr.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-cx-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-cy-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-fx-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-fy-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-gradientTransform-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-gradientUnits-prop.html: * svg/dynamic-updates/SVGRadialGradientElement-svgdom-r-prop.html: * svg/dynamic-updates/SVGRectElement-dom-height-attr.html: * svg/dynamic-updates/SVGRectElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGRectElement-dom-width-attr.html: * svg/dynamic-updates/SVGRectElement-dom-x-attr.html: * svg/dynamic-updates/SVGRectElement-dom-y-attr.html: * svg/dynamic-updates/SVGRectElement-svgdom-height-prop.html: * svg/dynamic-updates/SVGRectElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGRectElement-svgdom-width-prop.html: * svg/dynamic-updates/SVGRectElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGRectElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGSVGElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGSVGElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGTRefElement-dom-href-attr.html: * svg/dynamic-updates/SVGTextElement-dom-dx-attr.html: * svg/dynamic-updates/SVGTextElement-dom-dy-attr.html: * svg/dynamic-updates/SVGTextElement-dom-lengthAdjust-attr.html: * svg/dynamic-updates/SVGTextElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGTextElement-dom-rotate-attr.html: * svg/dynamic-updates/SVGTextElement-dom-textLength-attr.html: * svg/dynamic-updates/SVGTextElement-dom-transform-attr.html: * svg/dynamic-updates/SVGTextElement-dom-x-attr.html: * svg/dynamic-updates/SVGTextElement-dom-y-attr.html: * svg/dynamic-updates/SVGTextElement-svgdom-dx-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-dy-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-lengthAdjust-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/SVGTextElement-svgdom-rotate-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-textLength-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-transform-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-x-prop.html: * svg/dynamic-updates/SVGTextElement-svgdom-y-prop.html: * svg/dynamic-updates/SVGUseElement-dom-href1-attr.html: * svg/dynamic-updates/SVGUseElement-dom-href2-attr.html: * svg/dynamic-updates/SVGUseElement-dom-requiredFeatures.html: * svg/dynamic-updates/SVGUseElement-svgdom-href1-prop.html: * svg/dynamic-updates/SVGUseElement-svgdom-href2-prop.html: * svg/dynamic-updates/SVGUseElement-svgdom-requiredFeatures.html: * svg/dynamic-updates/resources/SVGTestCase.js: (completeTest): * svg/foreignObject/absolute-position-foreign-object-child-crash.html: * svg/in-html/script-external.html: * svg/in-html/script-nested.html: * svg/in-html/script-write.html: * svg/in-html/script.html: * svg/text/lengthAdjust-text-metrics.html: * svg/text/script-tests/TEMPLATE.html: * svg/text/text-rect-precision.html: * svg/zoom/page/zoom-get-screen-ctm.html: * svg/zoom/page/zoom-getBoundingClientRect.xhtml: * svg/zoom/page/zoom-zoom-coords.xhtml: * svg/zoom/resources/testPageZoom.js: (completeDynamicTest): Canonical link: https://commits.webkit.org/138888@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@155284 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2013-09-08 05:29:22 +00:00
<script src="../../resources/js-test-pre.js"></script>
SVG Animations update baseVal instead of animVal https://bugs.webkit.org/show_bug.cgi?id=12437 Reviewed by Dirk Schulze. Source/WebCore: Begin implementing the last missing core piece of the SVG DOM: proper animVal support. Most SVG DOM interfaces exposing eg. lengths use SVGAnimatedLength. eg. from SVGRectElement: "readonly attribute SVGAnimatedLength x;" SVGAnimatedXXX contains following methods: "readonly attribute SVGLength baseVal; readonly attribute SVGLength animVal;" From SVG DOM perspective, animVal and baseVal are two distinctive objects, animVal != baseVal. Its underlying value is the same though, if no animation is running on that attribute. As soon as a SMIL animation starts animating an SVGAnimated* target attribute, its baseVal and animVal may begin to differ. The animVal always reflect the current animated value (including all effects of additive/accumulated animations) which is shown on screen when eg animating the width of a <rect>. The baseVal is is equal to the underlying XML property value / SVG DOM value, but may be influenced through dynamic changes. (Consider changing rect1.width.baseVal.value while 'width' is animated) During the last year we prepared our animation code to turn on animVal support. This patch adds the last missing pieces to turn on animVal support for the SVGLength. SVGLengthList and all other types will follow, one after the other. I've decided to write an exhaustive ChangeLog, as this as the base for any future work in this area - hopefully making this more reviewable. Tests: svg/animations/additive-from-to-width-animation.html svg/animations/additive-values-width-animation.html svg/animations/change-baseVal-while-animating-fill-freeze-2.html svg/animations/change-baseVal-while-animating-fill-freeze.html svg/animations/change-baseVal-while-animating-fill-remove-2.html svg/animations/change-baseVal-while-animating-fill-remove.html svg/animations/change-target-while-animating-SVG-property.html svg/animations/multiple-animations-fill-freeze.html svg/animations/remove-animation-element-while-animation-is-running.html svg/repaint/repainting-after-animation-element-removal.svg * svg/SVGAnimateElement.cpp: Remove unnecessary std namespace inclusion. (WebCore::SVGAnimateElement::SVGAnimateElement): Remove now-obsolete m_aboutToStopAnimation. (WebCore::SVGAnimateElement::calculateAnimatedValue): Swap assertion order, to test hasTagName() _before_ casting. (WebCore::SVGAnimateElement::resetToBaseValue): Stop relying on the cached baseValue (breaking additive="sum"+values animation) for SVG DOM primitive animations. Avoid any string roundtrips previously needed to reset the SVGAnimatedType to the base value. Just grab the currentBaseValue() from the associated SVGAnimatedProperty, which includes all dynamic changes to the baseVal either by SVG DOM or setAttribute() calls - this way we don't need to utilize the buggy cache in SMILTimeContainer, which can be removed once all SVG DOM primitive types switched to the new animVal concept. NOTE: When multiple animations of the same attribute are applied to a target element, resetToBaseValue() will be called for the highest priority SVGSMILElement, on every animation step! Consider two <animate> elements, applied to a target <rect> which both animate the 'x' attribute, one from 0s to 2s, the other from 4s to 6s. The last <animate> element will reuse the SVGAnimatedType m_animatedType from the first <animate> element, and never create an own m_animatedType. When the animation starts the first time at 0s, we update the rect.x.animVals SVGLength* pointer, to point to the SVGAnimatedType of the first <animate> element, owning the m_animatedType. From that point on each call to rect.x.animVal will always return the same value as the SVGAnimatedType of the first <animate> element holds. Now after 2s the first <animate> element becomes inactive, but its m_animatedType remains alive. The bindings don't notice this change at all. Now at 4s, the second animation element gets active. It reuses the SVGAnimatedType of the first <animate> element, and applies its animation changes to that SVGAnimatedType, which is immediately reflected in the bindings w/o any additional work. It's very important for the understanding when animationStarted/animationEnded need to be called. (WebCore::SVGAnimateElement::applyResultsToTarget): Remove now-obsolete m_aboutToStopAnimation logic. No need to know it at this point. (WebCore::SVGAnimateElement::targetElementWillChange): Renamed from targetElementDidChange(). This method is called from SVGSMILElement for following conditions: - animation element is destructed - animation element is removed from document - target element of animation is destructed - target element of animation is removed from document - target element of animation changes id Whenever any of this happens, we need to reset the animVal. Resetting the animVal involves resetting the PropertyType* pointer, eg. SVGLength*, from the animVal property tear off, belonging to a certain SVGAnimatedProperty (eg. rect.x) to the initial value again, which is the 'm_x' of the SVGRectElement. This is needed as the SVGAnimatedType the animVal currently points to, if an animation is/was running, is destructed in targetElementWillChange(), to reset the SVGAnimateElement to the initial state before it received a target. This is the only place which destructed the m_animatedType, and thus the only place that needs to take care of resetting the animVal pointers. * svg/SVGAnimatedLength.cpp: (WebCore::SVGAnimatedLengthAnimator::constructFromCopy): Add a new constructFromCopy(SVGGenericAnimatedType) function to SVGAnimatedLengthAnimator. It takes a type-unsafe SVGGenericAnimatedType - the caller has to guarantee the type matches. This is strictly enforced for the single caller of constructFromCopy, and guaranteed to be safe. * svg/SVGAnimatedLength.h: Add new constructFromCopy method, which is used to avoid string-roundtrips when resetting to base values. * svg/SVGAnimatedType.cpp: (WebCore::SVGAnimatedType::supportsAnimVal): Only returns true for AnimatedLength, for now. (WebCore::SVGAnimatedType::setVariantValue): Takes a SVGGenericAnimatedType, assuming the type matches. Callers have to guarantee type-safety! * svg/SVGAnimatedType.h: (SVGAnimatedType): Add new static supportsAnimVal(AnimatedPropertyType) function. (WebCore::SVGAnimatedType::variantValue): Add a generic accessor for all animated types, called variant(). Only one place uses this. * svg/SVGAnimatedTypeAnimator.h: (WebCore::SVGAnimatedTypeAnimator::constructFromCopy): New method to construct an eg. SVGAnimatedLengthAnimator right from a SVGLength, instead of a String. In that case the SVGAnimatedType just stores a pointer to the underlying SVGLength, no copying and or other roundtrips involved. * svg/SVGAnimationElement.cpp: (WebCore::SVGAnimationElement::svgAttributeChanged): Implement this instead of attributeChanged. The previous implementation reset the animation state to Inactive, causing a full rebuild, whenever any attribute changes, even though it might not be related for the animation element, eg. animate.setAttribute("stdDeviationX", "foobar"). Fix that by checking if we support the attribute (keyTimes/keySplines/etc..) , if not pass it on to SVGSMILElement (which supports begin/end/etc..) to check if it can handle that. (WebCore::SVGAnimationElement::animationAttributeChanged): Called from our svgAttributeChanged, and/or from SVGSMILElement::svgAttributeChanged, whenever a _known_ attribute has changed. This sledgehammer should be used with care, instead of each time attributeChanged() is called :-) (WebCore::setTargetAttributeAnimatedCSSValue): Remove support for removing properties from the override style sheet. I've added this optimization too early, we should reevaluate this once more types support animVal. It currently complexifies the logic too much, requiring setAttributeAnimatedValue to know if the animation ends (and that's not easy to figure out, at least not using started/endedActiveInterval, as I anticipated). (WebCore::findMatchingAnimatedProperty): Add helper functions which retrieves a SVGAnimatedProperty* for a given SVGElement* targetElement, an attributeName, and an attribute type. eg. findMatchingAnimatedProperty(myRectElement, SVGNames::xAttr, AnimatedLength) returns the SVGAnimatedProperty which is exposed to JS, that holds: SVGProperty* baseVal, and SVGProperty* animVal. (Lazily created if they got accessed from JS.). This is used to update the animVal pointing to a new eg. SVGLength* value, once animation has started, to make rect->x() return that new SVGLength* value (internally), and to reflect the current animated value in rect.x.animVal.value from JS. (WebCore::SVGAnimationElement::applyAnimatedValue): Refactored from setTargetAttributeAnimatedValue, to simplify the code. (WebCore::notifyAnimatedPropertyAboutAnimationBeginEnd): Helper function to share code betweeen animationStarted/animationEnded. It takes a SVGAnimatedProperty* and a SVGAnimatedType* which may be zero, indicating that the animation ended. It calls animationStarted/animationEnded on the given SVGAnimatedProperty, to update the animVal state. It also figures out all instances of the target element, and their SVGAnimatedProperties that may need updating. (WebCore::SVGAnimationElement::animationStarted): Uses the helper above, passing on the given animatedType. (WebCore::SVGAnimationElement::animationEnded): Uses the helper above, passing 0 as animatedType. (WebCore::InstanceUpdateBlocker::InstanceUpdateBlocker): Added new helper struct, doing element->setInstancesUpdatedBlock(true) on construction and setInstancesUpdatesBlocked(false) on destruction, making it impossible to forget one. If we ever rewrite svgAttributeChanged & co to auto-update the cloned instances, this can go away. (WebCore::SVGAnimationElement::setTargetAttributeAnimatedValue): Now takes an SVGAnimatedType* instead of a String parameter. In order to avoid string-roundtrips for animVal support, let us decide if we need to construct a String out of it, or not. For animations supporting animVal (only SVGLength) we don't need to update any attribute or animVal pointer here, that happens automatically! We only need to notify the targetElement eg, that its xAttr changed! Previously we had to call targetElement->setAttribute("x", "...") on every animation step for SVGLength animations - that's gone now! The SVGAnimatedType pointers remains the same during the whole animation, so there's no need to call animationStarted() at each animated step! (WebCore::SVGAnimationElement::animatedPropertyForType): Helper function returning a SVGAnimatedProperty* for the current target element & current target attribute, if the current animation is running on a type supporting animVal (SVGLength), or returning 0. This is needed for SVGAnimateElement. Reuses the existing findMatchingAnimatedProperty code. * svg/SVGAnimationElement.h: * svg/animation/SMILTimeContainer.cpp: (WebCore::SMILTimeContainer::updateAnimations): Add comment to clarify why caching baseValues is just wrong. For SVGLength animations the problem is now gone. This is exercised using the new additive-from-to-width-animation.html & additive-values-width-animation.html tests. * svg/animation/SVGSMILElement.cpp: (WebCore::SVGSMILElement::removedFromDocument): Since animVal requires that the SVGAnimatedProperties are correctly reset if an animation element is removed from the document, we have to call targetElementWillChange(0) from here. That requires to move the "m_attributeName = anyQName()" line down, otherwise targetElementWillChange() would early exit, as no valid attributeName was specified. This is verified using the new svg/animations/remove-animation-element-while-animation-is-running.html and svg/repaint/repainting-after-animation-element-removal.svg tests. (WebCore::SVGSMILElement::isSupportedAttribute): Add function like all SVG*Elements have identifying their supported attributes. (WebCore::SVGSMILElement::svgAttributeChanged): Implement svgAttributeChanged instead of attributeChanged. Only take action if the attribute is actually supported. If one of the common attributes like begin/end/etc. changed, be sure to call animationAttributeChanged() so that our ancestor-classes get notified about this and can take action as well. NOTE: This is not about animating begin/end attributes, but about pure DOM changes. begin/end/et.. are not exposed to the SVG DOM, we still reuse the svgAttributeChanged logic for consistency. (This does NOT make those attributes animatable, nothing this here as it came up while reviewing). (WebCore::SVGSMILElement::targetElement): Adapt logic to targetElementDidChange -> targetElementWillChange change. (WebCore::SVGSMILElement::targetElementWillChange): Renamed from targetElementDidChange. Added "oldTarget" as parameter as well. Our ancestor-classes like SVGAnimateElement use this to properly deregister the animVal in the old target, before resetting the SVGAnimatedType, otherwise we'd leave dangling pointers around (verified manually by guard malloc runs, that none of this happens). Also add a default implementation here in targetElementWillChange, that ancestor classes have to call. Now we properly call endedActiveInterval() if the m_activeState is currently Active, so that animations are shut-down just like if the animation properly ends (use the same cleanup routines, etc.). Not doing that now leads to assertions. (WebCore::SVGSMILElement::resetTargetElement): Instead of forcing m_activeState to be inactive, use the standard methods to end the animation. targetElementWillChange(m_targetElement, 0) and animationAttributeChanged(). resetTargetElement() is only called by SVGDocumentExtensions::removeAllAnimationElementsFromTarget() for following conditions: - targetElement gets destructed - targetElement gets removed from the document - targetElement id changes If the targetElement gets destructed or removed, no actions need to be taken, as the SVGAnimatedPropertys are teared down as well. But if only the id changes, we still have to properly disconnect the animVals - this is all handled through targetElementWillChange now - that's why this has to be called from here as well. That explains why targetElementWillChange() now needs to check if the targetElement is destructing or not. * svg/properties/SVGAnimatedEnumerationPropertyTearOff.h: Pass the AnimatedPropertyType from the SVGPropertyInfo to the SVGAnimatedProperties. Requires mechanic changes in all SVGAnimated* classes. We need acccess to the AnimatedPropertyType to verify the SVGAnimatedType objects, passed to animationStarted, match our type. This is to enforce strict type-checking, whenever SVGGenericAnimatedTypes are passed around. (WebCore::SVGAnimatedEnumerationPropertyTearOff::create): (WebCore::SVGAnimatedEnumerationPropertyTearOff::SVGAnimatedEnumerationPropertyTearOff): * svg/properties/SVGAnimatedListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedListPropertyTearOff::create): (WebCore::SVGAnimatedListPropertyTearOff::SVGAnimatedListPropertyTearOff): * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedPathSegListPropertyTearOff::create): (WebCore::SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff): * svg/properties/SVGAnimatedProperty.h: Store AnimatedPropertyType, add accessors. (WebCore::SVGAnimatedProperty::animatedPropertyType): Add accessor. (WebCore::SVGAnimatedProperty::animationValueChanged): New animVal related functions to be implemented in the animated tear offs. (WebCore::SVGAnimatedProperty::animationStarted): Ditto. (WebCore::SVGAnimatedProperty::animationEnded): Ditto. (WebCore::SVGAnimatedProperty::currentBaseValue): Generic accessor for the baseVal: returns a SVGGenericAnimatedType. It takes an AnimatedPropertyType as input, that's only needed to verify that the type we're returning matches the expectation of the caller. If not, return 0 to avoid any potential casting mistakes, which would lead to crashes. (WebCore::SVGAnimatedProperty::SVGAnimatedProperty): Store m_animatedPropertyType. * svg/properties/SVGAnimatedPropertyTearOff.h: (WebCore::SVGAnimatedPropertyTearOff::create): Same changes as in the other tear offs: pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::currentBaseValue): Returns &m_property, if the type matches (see above). (SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::animationValueChanged): No-op for non list types, don't need to do anything here. (WebCore::SVGAnimatedPropertyTearOff::animationStarted): (WebCore::SVGAnimatedPropertyTearOff::animationEnded): Store the currently animated value in the animVal() property tear off, that's also re-used as-is for the JS bindings. As this is important, here's an example of how this affects methods like rect->x() used in the renderers. Setting m_isAnimating to true, redirects any rect->x() calls that previously returned rect->m_x, to rect->xAnimated()->animVal()->propertyReference() (which returns the same SVGLength& that the SVGAnimatedElement m_animatedType contains). Calling rect->setXBaseValue() still modifies rect->m_x, and is used by all parseAttribute() methods in svg/ as setAttribute() calls only ever modify the "baseValue", never the current animated value. rect.x.baseVal will return a SVGLength object corresponding to rect->m_x. rect.x.animVal will return a SVGLength object corresponding to rect->xAnimated()->animVal()->propertyReference(). These implementation details are all hidden in the SVGAnimatedPropertyMacros. Here's an example from SVGRectElement: DECLARE_ANIMATED_LENGTH(X, x) -> Replace PropertyType with 'SVGLength', LowerProperty with 'x', and UpperProperty with 'X'. PropertyType& LowerProperty() const { if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType, IsDerivedFromSVGElement<UseOwnerType>::value>(this, LowerProperty##PropertyInfo())) { if (wrapper->isAnimating()) return wrapper->currentAnimatedValue(); } return m_##LowerProperty.value; } PropertyType& LowerProperty##BaseValue() const { return m_##LowerProperty.value; } void set##UpperProperty##BaseValue(const PropertyType& type) { m_##LowerProperty.value = type; } Any code outside of svg/, eg. in rendering/svg, does not need to care about any baseVal/animVal differences. During layout eg. RenderSVGRect calls rect->x().value(someLengthContext) to get the current 'x' as float. If an animation is running on that rect element it will automatically retrieve the last set animated value here - all under the hood. I hope that sheds some light in those myserious functions, they were designed with animVal in mind, but we never had that until now :-) (WebCore::SVGAnimatedPropertyTearOff::SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::~SVGAnimatedPropertyTearOff): Add destructor to debug builds veryifing that m_isAnimating is false. * svg/properties/SVGAnimatedStaticPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedStaticPropertyTearOff::create): (WebCore::SVGAnimatedStaticPropertyTearOff::SVGAnimatedStaticPropertyTearOff): * svg/properties/SVGAnimatedTransformListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedTransformListPropertyTearOff::create): (WebCore::SVGAnimatedTransformListPropertyTearOff::SVGAnimatedTransformListPropertyTearOff): * svg/properties/SVGPropertyInfo.h: Add SVGGenericAnimatedType definition. * svg/properties/SVGPropertyTearOff.h: Remove obsolete updateAnimVal method - switched to using setValue directly. LayoutTests: Update test expectations after turning on animVal support for SVGLength, the first primitive now support animVal. Added several new tests, checking additive behaviour with SVGLength objects, removing animation elements while animations are running (+ test repainting of those cases), etc. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.png: Added. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.txt: Added. * svg/animations/additive-from-to-width-animation-expected.txt: Added. * svg/animations/additive-from-to-width-animation.html: Added. * svg/animations/additive-values-width-animation-expected.txt: Added. * svg/animations/additive-values-width-animation.html: Added. * svg/animations/animVal-basics-expected.txt: * svg/animations/animate-calcMode-spline-by-expected.txt: * svg/animations/animate-calcMode-spline-from-by-expected.txt: * svg/animations/animate-calcMode-spline-from-to-expected.txt: * svg/animations/animate-calcMode-spline-to-expected.txt: * svg/animations/animate-calcMode-spline-values-expected.txt: * svg/animations/animate-elem-02-t-drt-expected.txt: * svg/animations/animate-elem-09-t-drt-expected.txt: * svg/animations/animate-elem-10-t-drt-expected.txt: * svg/animations/animate-elem-11-t-drt-expected.txt: * svg/animations/animate-elem-12-t-drt-expected.txt: * svg/animations/animate-elem-13-t-drt-expected.txt: * svg/animations/animate-elem-14-t-drt-expected.txt: * svg/animations/animate-elem-15-t-drt-expected.txt: * svg/animations/animate-elem-16-t-drt-expected.txt: * svg/animations/animate-elem-17-t-drt-expected.txt: * svg/animations/animate-elem-18-t-drt-expected.txt: * svg/animations/animate-elem-19-t-drt-expected.txt: * svg/animations/animate-end-attribute-expected.txt: * svg/animations/animate-endElement-beginElement-expected.txt: * svg/animations/animate-from-to-keyTimes-expected.txt: * svg/animations/animate-insert-begin-expected.txt: * svg/animations/animate-insert-no-begin-expected.txt: * svg/animations/animate-keySplines-expected.txt: * svg/animations/animate-number-calcMode-discrete-keyTimes-expected.txt: * svg/animations/attributeTypes-expected.txt: * svg/animations/change-baseVal-while-animating-fill-freeze-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove.html: Added. * svg/animations/change-target-while-animating-SVG-property-expected.txt: Added. * svg/animations/change-target-while-animating-SVG-property.html: Added. * svg/animations/multiple-animations-fill-freeze-expected.txt: Added. * svg/animations/multiple-animations-fill-freeze.html: Added. * svg/animations/remove-animation-element-while-animation-is-running-expected.txt: Added. * svg/animations/remove-animation-element-while-animation-is-running.html: Added. * svg/animations/resources/additive-from-to-width-animation.svg: Added. * svg/animations/resources/additive-values-width-animation.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-freeze.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-remove.svg: Added. * svg/animations/resources/change-target-while-animating-SVG-property.svg: Added. * svg/animations/resources/multiple-animations-fill-freeze.svg: Added. * svg/animations/resources/remove-animation-element-while-animation-is-running.svg: Added. * svg/animations/script-tests/additive-from-to-width-animation.js: Added. (sample1): (sample2): (sample3): (executeTest): * svg/animations/script-tests/additive-values-width-animation.js: Added. (sample1): (sample2): (sample3): (changeBaseVal): (sample4): (sample5): (executeTest): * svg/animations/script-tests/animVal-basics.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-values.js: (sample2): (sample3): * svg/animations/script-tests/animate-elem-02-t-drt.js: (sampleAfterBegin): (sampleAfterMid): (sampleAfterBeginOfFirstRepetition): (sampleAfterMidOfFirstRepetition): * svg/animations/script-tests/animate-elem-09-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-10-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-11-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-12-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-13-t-drt.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-elem-14-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-15-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-16-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-17-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-18-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-19-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-end-attribute.js: (sample2): (sample3): * svg/animations/script-tests/animate-endElement-beginElement.js: (sample1): * svg/animations/script-tests/animate-from-to-keyTimes.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-no-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-keySplines.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-number-calcMode-discrete-keyTimes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/attributeTypes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-target-while-animating-SVG-property.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/multiple-animations-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (sample6): (sample7): (sample8): (executeTest): * svg/animations/script-tests/remove-animation-element-while-animation-is-running.js: Added. (sample1): (sample2): (sample3): (sample4): (executeTest): * svg/animations/script-tests/svglength-animation-LengthModeHeight.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeOther.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeWidth.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-invalid-value-1.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-2.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-3.js: (sample2): * svg/animations/script-tests/svglength-animation-number-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-cm.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-ems.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-exs.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-in.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pc.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-percentage.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pt.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-px.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-unitType.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/svglength-animation-values.js: (sample2): (sample3): (sample4): (sample5): * svg/animations/svglength-animation-LengthModeHeight-expected.txt: * svg/animations/svglength-animation-LengthModeOther-expected.txt: * svg/animations/svglength-animation-LengthModeWidth-expected.txt: * svg/animations/svglength-animation-invalid-value-1-expected.txt: * svg/animations/svglength-animation-invalid-value-2-expected.txt: * svg/animations/svglength-animation-invalid-value-3-expected.txt: * svg/animations/svglength-animation-number-to-number-expected.txt: * svg/animations/svglength-animation-px-to-cm-expected.txt: * svg/animations/svglength-animation-px-to-ems-expected.txt: * svg/animations/svglength-animation-px-to-exs-expected.txt: * svg/animations/svglength-animation-px-to-in-expected.txt: * svg/animations/svglength-animation-px-to-number-expected.txt: * svg/animations/svglength-animation-px-to-pc-expected.txt: * svg/animations/svglength-animation-px-to-percentage-expected.txt: * svg/animations/svglength-animation-px-to-pt-expected.txt: * svg/animations/svglength-animation-px-to-px-expected.txt: * svg/animations/svglength-animation-unitType-expected.txt: * svg/animations/svglength-animation-values-expected.txt: * svg/repaint/repainting-after-animation-element-removal.svg: Added. Canonical link: https://commits.webkit.org/98122@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110545 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2012-03-13 08:27:14 +00:00
<script src="../dynamic-updates/resources/SVGTestCase.js"></script>
<script src="resources/SVGAnimationTestCase.js"></script>
</head>
<body onload="runSMILTest()">
<h1>SVG 1.1 dynamic animation tests</h1>
<p id="description"></p>
<div id="console"></div>
<script>
description("This changes the target of an animation while its running");
embedSVGTestCase("resources/change-target-while-animating-SVG-property.svg");
// Setup animation test
function sample1() {
shouldBeCloseEnough("rect1.width.animVal.value", "150");
shouldBe("rect1.width.baseVal.value", "150");
shouldBeCloseEnough("rect2.width.animVal.value", "150");
shouldBe("rect2.width.baseVal.value", "150");
}
function sample2() {
shouldBeCloseEnough("rect1.width.animVal.value", "100");
shouldBe("rect1.width.baseVal.value", "150");
shouldBeCloseEnough("rect2.width.animVal.value", "150");
shouldBe("rect2.width.baseVal.value", "150");
// Switch to new target while animation is running.
// The effect is that rect1 is now reset to the initial state, before any animation was applied to it.
// Compatible with FF. In Opera it only works when not driving the timeline using setCurrentTime.
rootSVGElement.ownerDocument.getElementById("an1").setAttributeNS(xlinkNS, "xlink:href", "#target2");
}
function sample3() {
shouldBeCloseEnough("rect1.width.animVal.value", "150");
shouldBe("rect1.width.baseVal.value", "150");
shouldBeCloseEnough("rect2.width.animVal.value", "100");
shouldBe("rect2.width.baseVal.value", "150");
}
function sample4() {
shouldBeCloseEnough("rect1.width.animVal.value", "150");
shouldBe("rect1.width.baseVal.value", "150");
shouldBeCloseEnough("rect2.width.animVal.value", "50");
shouldBe("rect2.width.baseVal.value", "150");
}
function sample5() {
shouldBe("rect1.width.animVal.value", "150");
shouldBe("rect1.width.baseVal.value", "150");
shouldBe("rect2.width.animVal.value", "50");
shouldBe("rect2.width.baseVal.value", "150");
}
function executeTest() {
var rects = rootSVGElement.ownerDocument.getElementsByTagName("rect");
rect1 = rects[0];
rect2 = rects[1];
const expectedValues = [
// [animationId, time, sampleCallback]
["an1", 0.0, sample1],
["an1", 2.0, sample2],
["an1", 2.001, sample3],
["an1", 3.999, sample4],
["an1", 4.001, sample5],
["an1", 60.0, sample5]
];
runAnimationTest(expectedValues);
}
window.animationStartsImmediately = true;
var successfullyParsed = true;
</script>
SVG Animations update baseVal instead of animVal https://bugs.webkit.org/show_bug.cgi?id=12437 Reviewed by Dirk Schulze. Source/WebCore: Begin implementing the last missing core piece of the SVG DOM: proper animVal support. Most SVG DOM interfaces exposing eg. lengths use SVGAnimatedLength. eg. from SVGRectElement: "readonly attribute SVGAnimatedLength x;" SVGAnimatedXXX contains following methods: "readonly attribute SVGLength baseVal; readonly attribute SVGLength animVal;" From SVG DOM perspective, animVal and baseVal are two distinctive objects, animVal != baseVal. Its underlying value is the same though, if no animation is running on that attribute. As soon as a SMIL animation starts animating an SVGAnimated* target attribute, its baseVal and animVal may begin to differ. The animVal always reflect the current animated value (including all effects of additive/accumulated animations) which is shown on screen when eg animating the width of a <rect>. The baseVal is is equal to the underlying XML property value / SVG DOM value, but may be influenced through dynamic changes. (Consider changing rect1.width.baseVal.value while 'width' is animated) During the last year we prepared our animation code to turn on animVal support. This patch adds the last missing pieces to turn on animVal support for the SVGLength. SVGLengthList and all other types will follow, one after the other. I've decided to write an exhaustive ChangeLog, as this as the base for any future work in this area - hopefully making this more reviewable. Tests: svg/animations/additive-from-to-width-animation.html svg/animations/additive-values-width-animation.html svg/animations/change-baseVal-while-animating-fill-freeze-2.html svg/animations/change-baseVal-while-animating-fill-freeze.html svg/animations/change-baseVal-while-animating-fill-remove-2.html svg/animations/change-baseVal-while-animating-fill-remove.html svg/animations/change-target-while-animating-SVG-property.html svg/animations/multiple-animations-fill-freeze.html svg/animations/remove-animation-element-while-animation-is-running.html svg/repaint/repainting-after-animation-element-removal.svg * svg/SVGAnimateElement.cpp: Remove unnecessary std namespace inclusion. (WebCore::SVGAnimateElement::SVGAnimateElement): Remove now-obsolete m_aboutToStopAnimation. (WebCore::SVGAnimateElement::calculateAnimatedValue): Swap assertion order, to test hasTagName() _before_ casting. (WebCore::SVGAnimateElement::resetToBaseValue): Stop relying on the cached baseValue (breaking additive="sum"+values animation) for SVG DOM primitive animations. Avoid any string roundtrips previously needed to reset the SVGAnimatedType to the base value. Just grab the currentBaseValue() from the associated SVGAnimatedProperty, which includes all dynamic changes to the baseVal either by SVG DOM or setAttribute() calls - this way we don't need to utilize the buggy cache in SMILTimeContainer, which can be removed once all SVG DOM primitive types switched to the new animVal concept. NOTE: When multiple animations of the same attribute are applied to a target element, resetToBaseValue() will be called for the highest priority SVGSMILElement, on every animation step! Consider two <animate> elements, applied to a target <rect> which both animate the 'x' attribute, one from 0s to 2s, the other from 4s to 6s. The last <animate> element will reuse the SVGAnimatedType m_animatedType from the first <animate> element, and never create an own m_animatedType. When the animation starts the first time at 0s, we update the rect.x.animVals SVGLength* pointer, to point to the SVGAnimatedType of the first <animate> element, owning the m_animatedType. From that point on each call to rect.x.animVal will always return the same value as the SVGAnimatedType of the first <animate> element holds. Now after 2s the first <animate> element becomes inactive, but its m_animatedType remains alive. The bindings don't notice this change at all. Now at 4s, the second animation element gets active. It reuses the SVGAnimatedType of the first <animate> element, and applies its animation changes to that SVGAnimatedType, which is immediately reflected in the bindings w/o any additional work. It's very important for the understanding when animationStarted/animationEnded need to be called. (WebCore::SVGAnimateElement::applyResultsToTarget): Remove now-obsolete m_aboutToStopAnimation logic. No need to know it at this point. (WebCore::SVGAnimateElement::targetElementWillChange): Renamed from targetElementDidChange(). This method is called from SVGSMILElement for following conditions: - animation element is destructed - animation element is removed from document - target element of animation is destructed - target element of animation is removed from document - target element of animation changes id Whenever any of this happens, we need to reset the animVal. Resetting the animVal involves resetting the PropertyType* pointer, eg. SVGLength*, from the animVal property tear off, belonging to a certain SVGAnimatedProperty (eg. rect.x) to the initial value again, which is the 'm_x' of the SVGRectElement. This is needed as the SVGAnimatedType the animVal currently points to, if an animation is/was running, is destructed in targetElementWillChange(), to reset the SVGAnimateElement to the initial state before it received a target. This is the only place which destructed the m_animatedType, and thus the only place that needs to take care of resetting the animVal pointers. * svg/SVGAnimatedLength.cpp: (WebCore::SVGAnimatedLengthAnimator::constructFromCopy): Add a new constructFromCopy(SVGGenericAnimatedType) function to SVGAnimatedLengthAnimator. It takes a type-unsafe SVGGenericAnimatedType - the caller has to guarantee the type matches. This is strictly enforced for the single caller of constructFromCopy, and guaranteed to be safe. * svg/SVGAnimatedLength.h: Add new constructFromCopy method, which is used to avoid string-roundtrips when resetting to base values. * svg/SVGAnimatedType.cpp: (WebCore::SVGAnimatedType::supportsAnimVal): Only returns true for AnimatedLength, for now. (WebCore::SVGAnimatedType::setVariantValue): Takes a SVGGenericAnimatedType, assuming the type matches. Callers have to guarantee type-safety! * svg/SVGAnimatedType.h: (SVGAnimatedType): Add new static supportsAnimVal(AnimatedPropertyType) function. (WebCore::SVGAnimatedType::variantValue): Add a generic accessor for all animated types, called variant(). Only one place uses this. * svg/SVGAnimatedTypeAnimator.h: (WebCore::SVGAnimatedTypeAnimator::constructFromCopy): New method to construct an eg. SVGAnimatedLengthAnimator right from a SVGLength, instead of a String. In that case the SVGAnimatedType just stores a pointer to the underlying SVGLength, no copying and or other roundtrips involved. * svg/SVGAnimationElement.cpp: (WebCore::SVGAnimationElement::svgAttributeChanged): Implement this instead of attributeChanged. The previous implementation reset the animation state to Inactive, causing a full rebuild, whenever any attribute changes, even though it might not be related for the animation element, eg. animate.setAttribute("stdDeviationX", "foobar"). Fix that by checking if we support the attribute (keyTimes/keySplines/etc..) , if not pass it on to SVGSMILElement (which supports begin/end/etc..) to check if it can handle that. (WebCore::SVGAnimationElement::animationAttributeChanged): Called from our svgAttributeChanged, and/or from SVGSMILElement::svgAttributeChanged, whenever a _known_ attribute has changed. This sledgehammer should be used with care, instead of each time attributeChanged() is called :-) (WebCore::setTargetAttributeAnimatedCSSValue): Remove support for removing properties from the override style sheet. I've added this optimization too early, we should reevaluate this once more types support animVal. It currently complexifies the logic too much, requiring setAttributeAnimatedValue to know if the animation ends (and that's not easy to figure out, at least not using started/endedActiveInterval, as I anticipated). (WebCore::findMatchingAnimatedProperty): Add helper functions which retrieves a SVGAnimatedProperty* for a given SVGElement* targetElement, an attributeName, and an attribute type. eg. findMatchingAnimatedProperty(myRectElement, SVGNames::xAttr, AnimatedLength) returns the SVGAnimatedProperty which is exposed to JS, that holds: SVGProperty* baseVal, and SVGProperty* animVal. (Lazily created if they got accessed from JS.). This is used to update the animVal pointing to a new eg. SVGLength* value, once animation has started, to make rect->x() return that new SVGLength* value (internally), and to reflect the current animated value in rect.x.animVal.value from JS. (WebCore::SVGAnimationElement::applyAnimatedValue): Refactored from setTargetAttributeAnimatedValue, to simplify the code. (WebCore::notifyAnimatedPropertyAboutAnimationBeginEnd): Helper function to share code betweeen animationStarted/animationEnded. It takes a SVGAnimatedProperty* and a SVGAnimatedType* which may be zero, indicating that the animation ended. It calls animationStarted/animationEnded on the given SVGAnimatedProperty, to update the animVal state. It also figures out all instances of the target element, and their SVGAnimatedProperties that may need updating. (WebCore::SVGAnimationElement::animationStarted): Uses the helper above, passing on the given animatedType. (WebCore::SVGAnimationElement::animationEnded): Uses the helper above, passing 0 as animatedType. (WebCore::InstanceUpdateBlocker::InstanceUpdateBlocker): Added new helper struct, doing element->setInstancesUpdatedBlock(true) on construction and setInstancesUpdatesBlocked(false) on destruction, making it impossible to forget one. If we ever rewrite svgAttributeChanged & co to auto-update the cloned instances, this can go away. (WebCore::SVGAnimationElement::setTargetAttributeAnimatedValue): Now takes an SVGAnimatedType* instead of a String parameter. In order to avoid string-roundtrips for animVal support, let us decide if we need to construct a String out of it, or not. For animations supporting animVal (only SVGLength) we don't need to update any attribute or animVal pointer here, that happens automatically! We only need to notify the targetElement eg, that its xAttr changed! Previously we had to call targetElement->setAttribute("x", "...") on every animation step for SVGLength animations - that's gone now! The SVGAnimatedType pointers remains the same during the whole animation, so there's no need to call animationStarted() at each animated step! (WebCore::SVGAnimationElement::animatedPropertyForType): Helper function returning a SVGAnimatedProperty* for the current target element & current target attribute, if the current animation is running on a type supporting animVal (SVGLength), or returning 0. This is needed for SVGAnimateElement. Reuses the existing findMatchingAnimatedProperty code. * svg/SVGAnimationElement.h: * svg/animation/SMILTimeContainer.cpp: (WebCore::SMILTimeContainer::updateAnimations): Add comment to clarify why caching baseValues is just wrong. For SVGLength animations the problem is now gone. This is exercised using the new additive-from-to-width-animation.html & additive-values-width-animation.html tests. * svg/animation/SVGSMILElement.cpp: (WebCore::SVGSMILElement::removedFromDocument): Since animVal requires that the SVGAnimatedProperties are correctly reset if an animation element is removed from the document, we have to call targetElementWillChange(0) from here. That requires to move the "m_attributeName = anyQName()" line down, otherwise targetElementWillChange() would early exit, as no valid attributeName was specified. This is verified using the new svg/animations/remove-animation-element-while-animation-is-running.html and svg/repaint/repainting-after-animation-element-removal.svg tests. (WebCore::SVGSMILElement::isSupportedAttribute): Add function like all SVG*Elements have identifying their supported attributes. (WebCore::SVGSMILElement::svgAttributeChanged): Implement svgAttributeChanged instead of attributeChanged. Only take action if the attribute is actually supported. If one of the common attributes like begin/end/etc. changed, be sure to call animationAttributeChanged() so that our ancestor-classes get notified about this and can take action as well. NOTE: This is not about animating begin/end attributes, but about pure DOM changes. begin/end/et.. are not exposed to the SVG DOM, we still reuse the svgAttributeChanged logic for consistency. (This does NOT make those attributes animatable, nothing this here as it came up while reviewing). (WebCore::SVGSMILElement::targetElement): Adapt logic to targetElementDidChange -> targetElementWillChange change. (WebCore::SVGSMILElement::targetElementWillChange): Renamed from targetElementDidChange. Added "oldTarget" as parameter as well. Our ancestor-classes like SVGAnimateElement use this to properly deregister the animVal in the old target, before resetting the SVGAnimatedType, otherwise we'd leave dangling pointers around (verified manually by guard malloc runs, that none of this happens). Also add a default implementation here in targetElementWillChange, that ancestor classes have to call. Now we properly call endedActiveInterval() if the m_activeState is currently Active, so that animations are shut-down just like if the animation properly ends (use the same cleanup routines, etc.). Not doing that now leads to assertions. (WebCore::SVGSMILElement::resetTargetElement): Instead of forcing m_activeState to be inactive, use the standard methods to end the animation. targetElementWillChange(m_targetElement, 0) and animationAttributeChanged(). resetTargetElement() is only called by SVGDocumentExtensions::removeAllAnimationElementsFromTarget() for following conditions: - targetElement gets destructed - targetElement gets removed from the document - targetElement id changes If the targetElement gets destructed or removed, no actions need to be taken, as the SVGAnimatedPropertys are teared down as well. But if only the id changes, we still have to properly disconnect the animVals - this is all handled through targetElementWillChange now - that's why this has to be called from here as well. That explains why targetElementWillChange() now needs to check if the targetElement is destructing or not. * svg/properties/SVGAnimatedEnumerationPropertyTearOff.h: Pass the AnimatedPropertyType from the SVGPropertyInfo to the SVGAnimatedProperties. Requires mechanic changes in all SVGAnimated* classes. We need acccess to the AnimatedPropertyType to verify the SVGAnimatedType objects, passed to animationStarted, match our type. This is to enforce strict type-checking, whenever SVGGenericAnimatedTypes are passed around. (WebCore::SVGAnimatedEnumerationPropertyTearOff::create): (WebCore::SVGAnimatedEnumerationPropertyTearOff::SVGAnimatedEnumerationPropertyTearOff): * svg/properties/SVGAnimatedListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedListPropertyTearOff::create): (WebCore::SVGAnimatedListPropertyTearOff::SVGAnimatedListPropertyTearOff): * svg/properties/SVGAnimatedPathSegListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedPathSegListPropertyTearOff::create): (WebCore::SVGAnimatedPathSegListPropertyTearOff::SVGAnimatedPathSegListPropertyTearOff): * svg/properties/SVGAnimatedProperty.h: Store AnimatedPropertyType, add accessors. (WebCore::SVGAnimatedProperty::animatedPropertyType): Add accessor. (WebCore::SVGAnimatedProperty::animationValueChanged): New animVal related functions to be implemented in the animated tear offs. (WebCore::SVGAnimatedProperty::animationStarted): Ditto. (WebCore::SVGAnimatedProperty::animationEnded): Ditto. (WebCore::SVGAnimatedProperty::currentBaseValue): Generic accessor for the baseVal: returns a SVGGenericAnimatedType. It takes an AnimatedPropertyType as input, that's only needed to verify that the type we're returning matches the expectation of the caller. If not, return 0 to avoid any potential casting mistakes, which would lead to crashes. (WebCore::SVGAnimatedProperty::SVGAnimatedProperty): Store m_animatedPropertyType. * svg/properties/SVGAnimatedPropertyTearOff.h: (WebCore::SVGAnimatedPropertyTearOff::create): Same changes as in the other tear offs: pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::currentBaseValue): Returns &m_property, if the type matches (see above). (SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::animationValueChanged): No-op for non list types, don't need to do anything here. (WebCore::SVGAnimatedPropertyTearOff::animationStarted): (WebCore::SVGAnimatedPropertyTearOff::animationEnded): Store the currently animated value in the animVal() property tear off, that's also re-used as-is for the JS bindings. As this is important, here's an example of how this affects methods like rect->x() used in the renderers. Setting m_isAnimating to true, redirects any rect->x() calls that previously returned rect->m_x, to rect->xAnimated()->animVal()->propertyReference() (which returns the same SVGLength& that the SVGAnimatedElement m_animatedType contains). Calling rect->setXBaseValue() still modifies rect->m_x, and is used by all parseAttribute() methods in svg/ as setAttribute() calls only ever modify the "baseValue", never the current animated value. rect.x.baseVal will return a SVGLength object corresponding to rect->m_x. rect.x.animVal will return a SVGLength object corresponding to rect->xAnimated()->animVal()->propertyReference(). These implementation details are all hidden in the SVGAnimatedPropertyMacros. Here's an example from SVGRectElement: DECLARE_ANIMATED_LENGTH(X, x) -> Replace PropertyType with 'SVGLength', LowerProperty with 'x', and UpperProperty with 'X'. PropertyType& LowerProperty() const { if (TearOffType* wrapper = SVGAnimatedProperty::lookupWrapper<UseOwnerType, TearOffType, IsDerivedFromSVGElement<UseOwnerType>::value>(this, LowerProperty##PropertyInfo())) { if (wrapper->isAnimating()) return wrapper->currentAnimatedValue(); } return m_##LowerProperty.value; } PropertyType& LowerProperty##BaseValue() const { return m_##LowerProperty.value; } void set##UpperProperty##BaseValue(const PropertyType& type) { m_##LowerProperty.value = type; } Any code outside of svg/, eg. in rendering/svg, does not need to care about any baseVal/animVal differences. During layout eg. RenderSVGRect calls rect->x().value(someLengthContext) to get the current 'x' as float. If an animation is running on that rect element it will automatically retrieve the last set animated value here - all under the hood. I hope that sheds some light in those myserious functions, they were designed with animVal in mind, but we never had that until now :-) (WebCore::SVGAnimatedPropertyTearOff::SVGAnimatedPropertyTearOff): Pass around AnimatedPropertyType. (WebCore::SVGAnimatedPropertyTearOff::~SVGAnimatedPropertyTearOff): Add destructor to debug builds veryifing that m_isAnimating is false. * svg/properties/SVGAnimatedStaticPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedStaticPropertyTearOff::create): (WebCore::SVGAnimatedStaticPropertyTearOff::SVGAnimatedStaticPropertyTearOff): * svg/properties/SVGAnimatedTransformListPropertyTearOff.h: Ditto. (WebCore::SVGAnimatedTransformListPropertyTearOff::create): (WebCore::SVGAnimatedTransformListPropertyTearOff::SVGAnimatedTransformListPropertyTearOff): * svg/properties/SVGPropertyInfo.h: Add SVGGenericAnimatedType definition. * svg/properties/SVGPropertyTearOff.h: Remove obsolete updateAnimVal method - switched to using setValue directly. LayoutTests: Update test expectations after turning on animVal support for SVGLength, the first primitive now support animVal. Added several new tests, checking additive behaviour with SVGLength objects, removing animation elements while animations are running (+ test repainting of those cases), etc. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.png: Added. * platform/mac/svg/repaint/repainting-after-animation-element-removal-expected.txt: Added. * svg/animations/additive-from-to-width-animation-expected.txt: Added. * svg/animations/additive-from-to-width-animation.html: Added. * svg/animations/additive-values-width-animation-expected.txt: Added. * svg/animations/additive-values-width-animation.html: Added. * svg/animations/animVal-basics-expected.txt: * svg/animations/animate-calcMode-spline-by-expected.txt: * svg/animations/animate-calcMode-spline-from-by-expected.txt: * svg/animations/animate-calcMode-spline-from-to-expected.txt: * svg/animations/animate-calcMode-spline-to-expected.txt: * svg/animations/animate-calcMode-spline-values-expected.txt: * svg/animations/animate-elem-02-t-drt-expected.txt: * svg/animations/animate-elem-09-t-drt-expected.txt: * svg/animations/animate-elem-10-t-drt-expected.txt: * svg/animations/animate-elem-11-t-drt-expected.txt: * svg/animations/animate-elem-12-t-drt-expected.txt: * svg/animations/animate-elem-13-t-drt-expected.txt: * svg/animations/animate-elem-14-t-drt-expected.txt: * svg/animations/animate-elem-15-t-drt-expected.txt: * svg/animations/animate-elem-16-t-drt-expected.txt: * svg/animations/animate-elem-17-t-drt-expected.txt: * svg/animations/animate-elem-18-t-drt-expected.txt: * svg/animations/animate-elem-19-t-drt-expected.txt: * svg/animations/animate-end-attribute-expected.txt: * svg/animations/animate-endElement-beginElement-expected.txt: * svg/animations/animate-from-to-keyTimes-expected.txt: * svg/animations/animate-insert-begin-expected.txt: * svg/animations/animate-insert-no-begin-expected.txt: * svg/animations/animate-keySplines-expected.txt: * svg/animations/animate-number-calcMode-discrete-keyTimes-expected.txt: * svg/animations/attributeTypes-expected.txt: * svg/animations/change-baseVal-while-animating-fill-freeze-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-freeze-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-freeze.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove-2.html: Added. * svg/animations/change-baseVal-while-animating-fill-remove-expected.txt: Added. * svg/animations/change-baseVal-while-animating-fill-remove.html: Added. * svg/animations/change-target-while-animating-SVG-property-expected.txt: Added. * svg/animations/change-target-while-animating-SVG-property.html: Added. * svg/animations/multiple-animations-fill-freeze-expected.txt: Added. * svg/animations/multiple-animations-fill-freeze.html: Added. * svg/animations/remove-animation-element-while-animation-is-running-expected.txt: Added. * svg/animations/remove-animation-element-while-animation-is-running.html: Added. * svg/animations/resources/additive-from-to-width-animation.svg: Added. * svg/animations/resources/additive-values-width-animation.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-freeze.svg: Added. * svg/animations/resources/change-baseVal-while-animating-fill-remove.svg: Added. * svg/animations/resources/change-target-while-animating-SVG-property.svg: Added. * svg/animations/resources/multiple-animations-fill-freeze.svg: Added. * svg/animations/resources/remove-animation-element-while-animation-is-running.svg: Added. * svg/animations/script-tests/additive-from-to-width-animation.js: Added. (sample1): (sample2): (sample3): (executeTest): * svg/animations/script-tests/additive-values-width-animation.js: Added. (sample1): (sample2): (sample3): (changeBaseVal): (sample4): (sample5): (executeTest): * svg/animations/script-tests/animVal-basics.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-by.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-from-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-to.js: (sample2): (sample3): * svg/animations/script-tests/animate-calcMode-spline-values.js: (sample2): (sample3): * svg/animations/script-tests/animate-elem-02-t-drt.js: (sampleAfterBegin): (sampleAfterMid): (sampleAfterBeginOfFirstRepetition): (sampleAfterMidOfFirstRepetition): * svg/animations/script-tests/animate-elem-09-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-10-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-11-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-12-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-13-t-drt.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-elem-14-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-15-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-16-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-17-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-18-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-elem-19-t-drt.js: (sample1): (sample2): (sample3): (sample4): * svg/animations/script-tests/animate-end-attribute.js: (sample2): (sample3): * svg/animations/script-tests/animate-endElement-beginElement.js: (sample1): * svg/animations/script-tests/animate-from-to-keyTimes.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-insert-no-begin.js: (sample1): (sample2): * svg/animations/script-tests/animate-keySplines.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/animate-number-calcMode-discrete-keyTimes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/attributeTypes.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove-2.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-baseVal-while-animating-fill-remove.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/change-target-while-animating-SVG-property.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (executeTest): * svg/animations/script-tests/multiple-animations-fill-freeze.js: Added. (sample1): (sample2): (sample3): (sample4): (sample5): (sample6): (sample7): (sample8): (executeTest): * svg/animations/script-tests/remove-animation-element-while-animation-is-running.js: Added. (sample1): (sample2): (sample3): (sample4): (executeTest): * svg/animations/script-tests/svglength-animation-LengthModeHeight.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeOther.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-LengthModeWidth.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-invalid-value-1.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-2.js: (sample2): * svg/animations/script-tests/svglength-animation-invalid-value-3.js: (sample2): * svg/animations/script-tests/svglength-animation-number-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-cm.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-ems.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-exs.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-in.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-number.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pc.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-percentage.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-pt.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-px-to-px.js: (sample2): (sample3): * svg/animations/script-tests/svglength-animation-unitType.js: (sample1): (sample2): (sample3): * svg/animations/script-tests/svglength-animation-values.js: (sample2): (sample3): (sample4): (sample5): * svg/animations/svglength-animation-LengthModeHeight-expected.txt: * svg/animations/svglength-animation-LengthModeOther-expected.txt: * svg/animations/svglength-animation-LengthModeWidth-expected.txt: * svg/animations/svglength-animation-invalid-value-1-expected.txt: * svg/animations/svglength-animation-invalid-value-2-expected.txt: * svg/animations/svglength-animation-invalid-value-3-expected.txt: * svg/animations/svglength-animation-number-to-number-expected.txt: * svg/animations/svglength-animation-px-to-cm-expected.txt: * svg/animations/svglength-animation-px-to-ems-expected.txt: * svg/animations/svglength-animation-px-to-exs-expected.txt: * svg/animations/svglength-animation-px-to-in-expected.txt: * svg/animations/svglength-animation-px-to-number-expected.txt: * svg/animations/svglength-animation-px-to-pc-expected.txt: * svg/animations/svglength-animation-px-to-percentage-expected.txt: * svg/animations/svglength-animation-px-to-pt-expected.txt: * svg/animations/svglength-animation-px-to-px-expected.txt: * svg/animations/svglength-animation-unitType-expected.txt: * svg/animations/svglength-animation-values-expected.txt: * svg/repaint/repainting-after-animation-element-removal.svg: Added. Canonical link: https://commits.webkit.org/98122@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@110545 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2012-03-13 08:27:14 +00:00
</body>
</html>