Merge from Chromium at DEPS revision r198571

This commit was generated by merge_to_master.py.

Change-Id: I3a7f89ea6b8c017335bd52739166aed708cad1e5
diff --git a/Source/core/svg/SVGAnimationElement.h b/Source/core/svg/SVGAnimationElement.h
new file mode 100644
index 0000000..fc7c399
--- /dev/null
+++ b/Source/core/svg/SVGAnimationElement.h
@@ -0,0 +1,259 @@
+/*
+ * Copyright (C) 2004, 2005 Nikolas Zimmermann <zimmermann@kde.org>
+ * Copyright (C) 2004, 2005, 2006 Rob Buis <buis@kde.org>
+ * Copyright (C) 2007 Eric Seidel <eric@webkit.org>
+ * Copyright (C) 2008 Apple Inc. All rights reserved.
+ * Copyright (C) 2008 Cameron McCormack <cam@mcc.id.au>
+ * Copyright (C) Research In Motion Limited 2011. All rights reserved.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB.  If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#ifndef SVGAnimationElement_h
+#define SVGAnimationElement_h
+
+#if ENABLE(SVG)
+#include "core/platform/graphics/UnitBezier.h"
+#include "core/svg/ElementTimeControl.h"
+#include "core/svg/SVGAnimatedBoolean.h"
+#include "core/svg/SVGExternalResourcesRequired.h"
+#include "core/svg/SVGStringList.h"
+#include "core/svg/SVGTests.h"
+#include "core/svg/animation/SMILTime.h"
+#include "core/svg/animation/SVGSMILElement.h"
+
+namespace WebCore {
+
+enum AnimationMode {
+    NoAnimation,
+    FromToAnimation,
+    FromByAnimation,
+    ToAnimation,
+    ByAnimation,
+    ValuesAnimation,
+    PathAnimation // Used by AnimateMotion.
+};
+
+// If we have 'currentColor' or 'inherit' as animation value, we need to grab
+// the value during the animation since the value can be animated itself.
+enum AnimatedPropertyValueType {
+    RegularPropertyValue,
+    CurrentColorValue,
+    InheritValue
+};
+
+enum CalcMode {
+    CalcModeDiscrete,
+    CalcModeLinear,
+    CalcModePaced,
+    CalcModeSpline
+};
+
+class ConditionEventListener;
+class TimeContainer;
+class SVGAnimatedType;
+
+class SVGAnimationElement : public SVGSMILElement,
+                            public SVGTests,
+                            public SVGExternalResourcesRequired,
+                            public ElementTimeControl {
+public:
+    // SVGAnimationElement
+    float getStartTime() const;
+    float getCurrentTime() const;
+    float getSimpleDuration(ExceptionCode&) const;
+
+    // ElementTimeControl
+    virtual void beginElement();
+    virtual void beginElementAt(float offset);
+    virtual void endElement();
+    virtual void endElementAt(float offset);
+
+    static bool isTargetAttributeCSSProperty(SVGElement*, const QualifiedName&);
+
+    virtual bool isAdditive() const;
+    bool isAccumulated() const;
+    AnimationMode animationMode() const { return m_animationMode; }
+    CalcMode calcMode() const { return m_calcMode; }
+
+    enum ShouldApplyAnimation {
+        DontApplyAnimation,
+        ApplyCSSAnimation,
+        ApplyXMLAnimation
+    };
+
+    ShouldApplyAnimation shouldApplyAnimation(SVGElement* targetElement, const QualifiedName& attributeName);
+
+    AnimatedPropertyValueType fromPropertyValueType() const { return m_fromPropertyValueType; }
+    AnimatedPropertyValueType toPropertyValueType() const { return m_toPropertyValueType; }
+
+    template<typename AnimatedType>
+    void adjustForInheritance(AnimatedType (*parseTypeFromString)(SVGAnimationElement*, const String&),
+                              AnimatedPropertyValueType valueType, AnimatedType& animatedType, SVGElement* contextElement)
+    {
+        if (valueType != InheritValue)
+            return;
+        // Replace 'inherit' by its computed property value.
+        ASSERT(parseTypeFromString);
+        String typeString;
+        adjustForInheritance(contextElement, attributeName(), typeString);
+        animatedType = (*parseTypeFromString)(this, typeString);
+    }
+
+    template<typename AnimatedType>
+    bool adjustFromToListValues(const AnimatedType& fromList, const AnimatedType& toList, AnimatedType& animatedList, float percentage, bool resizeAnimatedListIfNeeded = true)
+    {
+        // If no 'to' value is given, nothing to animate.
+        unsigned toListSize = toList.size();
+        if (!toListSize)
+            return false;
+
+        // If the 'from' value is given and it's length doesn't match the 'to' value list length, fallback to a discrete animation.
+        unsigned fromListSize = fromList.size();
+        if (fromListSize != toListSize && fromListSize) {
+            if (percentage < 0.5) {
+                if (animationMode() != ToAnimation)
+                    animatedList = AnimatedType(fromList);
+            } else
+                animatedList = AnimatedType(toList);
+
+            return false;
+        }
+
+        ASSERT(!fromListSize || fromListSize == toListSize);
+        if (resizeAnimatedListIfNeeded && animatedList.size() < toListSize)
+            animatedList.resize(toListSize);
+
+        return true;
+    }
+
+    template<typename AnimatedType>
+    void animateDiscreteType(float percentage, const AnimatedType& fromType, const AnimatedType& toType, AnimatedType& animatedType)
+    {
+        if ((animationMode() == FromToAnimation && percentage > 0.5) || animationMode() == ToAnimation || percentage == 1) {
+            animatedType = AnimatedType(toType);
+            return;
+        }
+        animatedType = AnimatedType(fromType);
+    }
+
+    void animateAdditiveNumber(float percentage, unsigned repeatCount, float fromNumber, float toNumber, float toAtEndOfDurationNumber, float& animatedNumber)
+    {
+        float number;
+        if (calcMode() == CalcModeDiscrete)
+            number = percentage < 0.5 ? fromNumber : toNumber;
+        else
+            number = (toNumber - fromNumber) * percentage + fromNumber;
+
+        if (isAccumulated() && repeatCount)
+            number += toAtEndOfDurationNumber * repeatCount;
+
+        if (isAdditive() && animationMode() != ToAnimation)
+            animatedNumber += number;
+        else
+            animatedNumber = number;
+    }
+
+protected:
+    SVGAnimationElement(const QualifiedName&, Document*);
+
+    void computeCSSPropertyValue(SVGElement*, CSSPropertyID, String& value);
+    virtual void determinePropertyValueTypes(const String& from, const String& to);
+
+    bool isSupportedAttribute(const QualifiedName&);
+    virtual void parseAttribute(const QualifiedName&, const AtomicString&) OVERRIDE;
+    virtual void svgAttributeChanged(const QualifiedName&) OVERRIDE;
+
+    enum AttributeType {
+        AttributeTypeCSS,
+        AttributeTypeXML,
+        AttributeTypeAuto
+    };
+    AttributeType attributeType() const { return m_attributeType; }
+
+    String toValue() const;
+    String byValue() const;
+    String fromValue() const;
+
+    String targetAttributeBaseValue();
+
+    // from SVGSMILElement
+    virtual void startedActiveInterval() OVERRIDE;
+    virtual void updateAnimation(float percent, unsigned repeat, SVGSMILElement* resultElement) OVERRIDE;
+
+    AnimatedPropertyValueType m_fromPropertyValueType;
+    AnimatedPropertyValueType m_toPropertyValueType;
+
+    virtual void setTargetElement(SVGElement*) OVERRIDE;
+    virtual void setAttributeName(const QualifiedName&) OVERRIDE;
+    bool hasInvalidCSSAttributeType() const { return m_hasInvalidCSSAttributeType; }
+
+    virtual void updateAnimationMode();
+    void setAnimationMode(AnimationMode animationMode) { m_animationMode = animationMode; }
+    void setCalcMode(CalcMode calcMode) { m_calcMode = calcMode; }
+
+private:
+    virtual void animationAttributeChanged() OVERRIDE;
+    void setAttributeType(const AtomicString&);
+
+    void checkInvalidCSSAttributeType(SVGElement*);
+
+    virtual bool calculateToAtEndOfDurationValue(const String& toAtEndOfDurationString) = 0;
+    virtual bool calculateFromAndToValues(const String& fromString, const String& toString) = 0;
+    virtual bool calculateFromAndByValues(const String& fromString, const String& byString) = 0;
+    virtual void calculateAnimatedValue(float percent, unsigned repeatCount, SVGSMILElement* resultElement) = 0;
+    virtual float calculateDistance(const String& /*fromString*/, const String& /*toString*/) { return -1.f; }
+
+    void currentValuesForValuesAnimation(float percent, float& effectivePercent, String& from, String& to);
+    void calculateKeyTimesForCalcModePaced();
+    float calculatePercentFromKeyPoints(float percent) const;
+    void currentValuesFromKeyPoints(float percent, float& effectivePercent, String& from, String& to) const;
+    float calculatePercentForSpline(float percent, unsigned splineIndex) const;
+    float calculatePercentForFromTo(float percent) const;
+    unsigned calculateKeyTimesIndex(float percent) const;
+
+    void applyAnimatedValue(ShouldApplyAnimation, SVGElement* targetElement, const QualifiedName& attributeName, SVGAnimatedType*);
+    void adjustForInheritance(SVGElement* targetElement, const QualifiedName& attributeName, String&);
+
+    BEGIN_DECLARE_ANIMATED_PROPERTIES(SVGAnimationElement)
+        DECLARE_ANIMATED_BOOLEAN(ExternalResourcesRequired, externalResourcesRequired)
+    END_DECLARE_ANIMATED_PROPERTIES
+
+    // SVGTests
+    virtual void synchronizeRequiredFeatures() { SVGTests::synchronizeRequiredFeatures(this); }
+    virtual void synchronizeRequiredExtensions() { SVGTests::synchronizeRequiredExtensions(this); }
+    virtual void synchronizeSystemLanguage() { SVGTests::synchronizeSystemLanguage(this); }
+
+    void setCalcMode(const AtomicString&);
+
+    bool m_animationValid;
+
+    AttributeType m_attributeType;
+    Vector<String> m_values;
+    Vector<float> m_keyTimes;
+    Vector<float> m_keyPoints;
+    Vector<UnitBezier> m_keySplines;
+    String m_lastValuesAnimationFrom;
+    String m_lastValuesAnimationTo;
+    bool m_hasInvalidCSSAttributeType;
+    CalcMode m_calcMode;
+    AnimationMode m_animationMode;
+};
+
+} // namespace WebCore
+
+#endif // ENABLE(SVG)
+#endif // SVGAnimationElement_h