| Index: Source/platform/animation/TimingFunction.h | 
| diff --git a/Source/platform/animation/TimingFunction.h b/Source/platform/animation/TimingFunction.h | 
| index c5c6c0620d38ae1f762554604c571b8f5a132474..e384dc5be6deba8b28bc7626503b09ac4f3a1041 100644 | 
| --- a/Source/platform/animation/TimingFunction.h | 
| +++ b/Source/platform/animation/TimingFunction.h | 
| @@ -38,7 +38,6 @@ | 
| #include "wtf/text/WTFString.h" | 
| #include <algorithm> | 
|  | 
| - | 
| namespace WebCore { | 
|  | 
| class PLATFORM_EXPORT TimingFunction : public RefCounted<TimingFunction> { | 
| @@ -56,7 +55,7 @@ public: | 
|  | 
| // Evaluates the timing function at the given fraction. The accuracy parameter provides a hint as to the required | 
| // accuracy and is not guaranteed. | 
| -    virtual double evaluate(double fraction, double accuracy) const =0; | 
| +    virtual double evaluate(double fraction, double accuracy) const = 0; | 
|  | 
| protected: | 
| TimingFunction(Type type) | 
| @@ -88,9 +87,6 @@ private: | 
| } | 
| }; | 
|  | 
| -// Forward declare so we can friend it below. Don't use in production code! | 
| -class ChainedTimingFunctionTestHelper; | 
| - | 
| class PLATFORM_EXPORT CubicBezierTimingFunction FINAL : public TimingFunction { | 
| public: | 
| enum SubType { | 
| @@ -172,12 +168,19 @@ public: | 
| enum SubType { | 
| Start, | 
| End, | 
| +        Middle, | 
| Custom | 
| }; | 
|  | 
| -    static PassRefPtr<StepsTimingFunction> create(int steps, bool stepAtStart) | 
| +    enum StepAtPosition { | 
| +        StepAtStart, | 
| +        StepAtMiddle, | 
| +        StepAtEnd | 
| +    }; | 
| + | 
| +    static PassRefPtr<StepsTimingFunction> create(int steps, StepAtPosition stepAtPosition) | 
| { | 
| -        return adoptRef(new StepsTimingFunction(Custom, steps, stepAtStart)); | 
| +        return adoptRef(new StepsTimingFunction(Custom, steps, stepAtPosition)); | 
| } | 
|  | 
| static StepsTimingFunction* preset(SubType subType) | 
| @@ -185,12 +188,17 @@ public: | 
| switch (subType) { | 
| case Start: | 
| { | 
| -                DEFINE_STATIC_REF(StepsTimingFunction, start, (adoptRef(new StepsTimingFunction(Start, 1, true)))); | 
| +                DEFINE_STATIC_REF(StepsTimingFunction, start, (adoptRef(new StepsTimingFunction(Start, 1, StepAtStart)))); | 
| return start; | 
| } | 
| +        case Middle: | 
| +            { | 
| +                DEFINE_STATIC_REF(StepsTimingFunction, middle, (adoptRef(new StepsTimingFunction(Middle, 1, StepAtMiddle)))); | 
| +                return middle; | 
| +            } | 
| case End: | 
| { | 
| -                DEFINE_STATIC_REF(StepsTimingFunction, end, (adoptRef(new StepsTimingFunction(End, 1, false)))); | 
| +                DEFINE_STATIC_REF(StepsTimingFunction, end, (adoptRef(new StepsTimingFunction(End, 1, StepAtEnd)))); | 
| return end; | 
| } | 
| default: | 
| @@ -207,21 +215,21 @@ public: | 
| virtual double evaluate(double fraction, double) const OVERRIDE; | 
|  | 
| int numberOfSteps() const { return m_steps; } | 
| -    bool stepAtStart() const { return m_stepAtStart; } | 
| +    StepAtPosition stepAtPosition() const { return m_stepAtPosition; } | 
|  | 
| SubType subType() const { return m_subType; } | 
|  | 
| private: | 
| -    StepsTimingFunction(SubType subType, int steps, bool stepAtStart) | 
| +    StepsTimingFunction(SubType subType, int steps, StepAtPosition stepAtPosition) | 
| : TimingFunction(StepsFunction) | 
| , m_steps(steps) | 
| -        , m_stepAtStart(stepAtStart) | 
| +        , m_stepAtPosition(stepAtPosition) | 
| , m_subType(subType) | 
| { | 
| } | 
|  | 
| int m_steps; | 
| -    bool m_stepAtStart; | 
| +    StepAtPosition m_stepAtPosition; | 
| SubType m_subType; | 
| }; | 
|  | 
| @@ -275,7 +283,6 @@ private: | 
|  | 
| // Allow PrintTo/operator== of the segments. Can be removed once | 
| // ChainedTimingFunction has a public API for segments. | 
| -        friend class ChainedTimingFunctionTestHelper; | 
| friend class ChainedTimingFunction; | 
| }; | 
|  | 
| @@ -298,6 +305,13 @@ private: | 
| friend class ChainedTimingFunctionTestHelper; | 
| }; | 
|  | 
| +PLATFORM_EXPORT bool operator==(const LinearTimingFunction&, const TimingFunction&); | 
| +PLATFORM_EXPORT bool operator==(const CubicBezierTimingFunction&, const TimingFunction&); | 
| +PLATFORM_EXPORT bool operator==(const StepsTimingFunction&, const TimingFunction&); | 
| + | 
| +PLATFORM_EXPORT bool operator==(const TimingFunction&, const TimingFunction&); | 
| +PLATFORM_EXPORT bool operator!=(const TimingFunction&, const TimingFunction&); | 
| + | 
| #define DEFINE_TIMING_FUNCTION_TYPE_CASTS(typeName) \ | 
| DEFINE_TYPE_CASTS( \ | 
| typeName##TimingFunction, TimingFunction, value, \ | 
|  |