109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)// found in the LICENSE file.
409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "config.h"
609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/animation/Animation.h"
709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/Dictionary.h"
9e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)#include "bindings/core/v8/Nullable.h"
1009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/animation/AnimationClock.h"
11d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/AnimationNodeTiming.h"
12d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/animation/AnimationTestHelper.h"
13d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#include "core/animation/AnimationTimeline.h"
1409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/animation/KeyframeEffectModel.h"
15d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/animation/Timing.h"
165d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles)#include "core/dom/Document.h"
177242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#include "core/testing/DummyPageHolder.h"
1809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include <gtest/gtest.h>
19f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)#include <v8.h>
2009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
21c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
2209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
2309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class AnimationAnimationTest : public ::testing::Test {
2409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)protected:
25d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    AnimationAnimationTest()
267242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        : pageHolder(DummyPageHolder::create())
277242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , document(pageHolder->document())
287242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        , element(document.createElement("foo", ASSERT_NO_EXCEPTION))
2909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
307242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        document.animationClock().resetTimeForTesting(document.timeline().zeroTime());
317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        EXPECT_EQ(0, document.timeline().currentTime());
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
347242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    OwnPtr<DummyPageHolder> pageHolder;
357242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    Document& document;
36d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBePersistent<Element> element;
3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    TrackExceptionState exceptionState;
38d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)};
3909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class AnimationAnimationV8Test : public AnimationAnimationTest {
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)protected:
42d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    AnimationAnimationV8Test()
43d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        : m_isolate(v8::Isolate::GetCurrent())
44f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)        , m_scope(m_isolate)
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
4609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
4709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
48d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    template<typename T>
49d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<Animation> createAnimation(Element* element, Vector<Dictionary> keyframeDictionaryVector, T timingInput, ExceptionState& exceptionState)
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
5176c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return Animation::create(element, EffectInput::convert(element, keyframeDictionaryVector, exceptionState), timingInput);
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
53d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    static PassRefPtrWillBeRawPtr<Animation> createAnimation(Element* element, Vector<Dictionary> keyframeDictionaryVector, ExceptionState& exceptionState)
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    {
5576c265b59aa821ccbf8c75ab2bb0d036e97d2956Torne (Richard Coles)        return Animation::create(element, EffectInput::convert(element, keyframeDictionaryVector, exceptionState));
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
5709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
58d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Isolate* m_isolate;
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
60d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)private:
61f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    V8TestingScope m_scope;
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)};
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
64d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, CanCreateAnAnimation)
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary> jsKeyframes;
67d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> keyframe1 = v8::Object::New(m_isolate);
68d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> keyframe2 = v8::Object::New(m_isolate);
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe1, "width", "100px");
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe1, "offset", "0");
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe1, "easing", "ease-in-out");
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe2, "width", "0px");
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe2, "offset", "1");
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(keyframe2, "easing", "cubic-bezier(1, 1, 0.3, 0.3)");
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    jsKeyframes.append(Dictionary(keyframe1, m_isolate));
78d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    jsKeyframes.append(Dictionary(keyframe2, m_isolate));
7909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String value1;
81197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT_TRUE(DictionaryHelper::get(jsKeyframes[0], "width", value1));
8209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_EQ("100px", value1);
8309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    String value2;
85197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ASSERT_TRUE(DictionaryHelper::get(jsKeyframes[1], "width", value2));
8609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_EQ("0px", value2);
8709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
88d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, 0, exceptionState);
8909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Element* target = animation->target();
9109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(*element.get(), *target);
9209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
93a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    const KeyframeVector keyframes = toKeyframeEffectModelBase(animation->effect())->getFrames();
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, keyframes[0]->offset());
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(1, keyframes[1]->offset());
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
98a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    const CSSValue* keyframe1Width = toStringKeyframe(keyframes[0].get())->propertyValue(CSSPropertyWidth);
99a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    const CSSValue* keyframe2Width = toStringKeyframe(keyframes[1].get())->propertyValue(CSSPropertyWidth);
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(keyframe1Width);
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT(keyframe2Width);
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
103a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_EQ("100px", keyframe1Width->cssText());
104a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    EXPECT_EQ("0px", keyframe2Width->cssText());
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(*(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseInOut)), keyframes[0]->easing());
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    EXPECT_EQ(*(CubicBezierTimingFunction::create(1, 1, 0.3, 0.3).get()), keyframes[1]->easing());
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, CanSetDuration)
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
11310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    double duration = 2000;
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
115d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, duration, exceptionState);
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
11710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_EQ(duration / 1000, animation->specifiedTiming().iterationDuration);
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
11909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
120d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, CanOmitSpecifiedDuration)
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
123d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, exceptionState);
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_TRUE(std::isnan(animation->specifiedTiming().iterationDuration));
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
127d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, NegativeDurationIsAuto)
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
130d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, -2, exceptionState);
131d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    EXPECT_TRUE(std::isnan(animation->specifiedTiming().iterationDuration));
13209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
13309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
13407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochTEST_F(AnimationAnimationV8Test, MismatchedKeyframePropertyRaisesException)
13507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
13607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Vector<Dictionary> jsKeyframes;
13707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe1 = v8::Object::New(m_isolate);
13807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe2 = v8::Object::New(m_isolate);
13907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "width", "100px");
14107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "offset", "0");
14207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    // Height property appears only in keyframe2
14407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "height", "100px");
14507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "width", "0px");
14607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "offset", "1");
14707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
14807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe1, m_isolate));
14907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe2, m_isolate));
15007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
151d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    createAnimation(element.get(), jsKeyframes, 0, exceptionState);
15207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_TRUE(exceptionState.hadException());
15407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_EQ(NotSupportedError, exceptionState.code());
15507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
15607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
15707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochTEST_F(AnimationAnimationV8Test, MissingOffsetZeroRaisesException)
15807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
15907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Vector<Dictionary> jsKeyframes;
16007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe1 = v8::Object::New(m_isolate);
16107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe2 = v8::Object::New(m_isolate);
16207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
16307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "width", "100px");
16407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "offset", "0.1");
16507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "width", "0px");
16607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "offset", "1");
16707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
16807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe1, m_isolate));
16907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe2, m_isolate));
17007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
171d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    createAnimation(element.get(), jsKeyframes, 0, exceptionState);
17207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_TRUE(exceptionState.hadException());
17407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_EQ(NotSupportedError, exceptionState.code());
17507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
17607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
17707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochTEST_F(AnimationAnimationV8Test, MissingOffsetOneRaisesException)
17807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
17907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Vector<Dictionary> jsKeyframes;
18007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe1 = v8::Object::New(m_isolate);
18107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe2 = v8::Object::New(m_isolate);
18207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
18307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "width", "100px");
18407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "offset", "0");
18507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "width", "0px");
18607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "offset", "0.1");
18707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
18807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe1, m_isolate));
18907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe2, m_isolate));
19007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
191d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    createAnimation(element.get(), jsKeyframes, 0, exceptionState);
19207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
19307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_TRUE(exceptionState.hadException());
19407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_EQ(NotSupportedError, exceptionState.code());
19507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
19607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
19707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben MurdochTEST_F(AnimationAnimationV8Test, MissingOffsetZeroAndOneRaisesException)
19807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
19907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    Vector<Dictionary> jsKeyframes;
20007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe1 = v8::Object::New(m_isolate);
20107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    v8::Handle<v8::Object> keyframe2 = v8::Object::New(m_isolate);
20207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
20307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "width", "100px");
20407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe1, "offset", "0.1");
20507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "width", "0px");
20607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    setV8ObjectPropertyAsString(keyframe2, "offset", "0.2");
20707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
20807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe1, m_isolate));
20907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    jsKeyframes.append(Dictionary(keyframe2, m_isolate));
21007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
211d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    createAnimation(element.get(), jsKeyframes, 0, exceptionState);
21207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
21307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_TRUE(exceptionState.hadException());
21407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    EXPECT_EQ(NotSupportedError, exceptionState.code());
21507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
21607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
217d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, SpecifiedGetters)
21809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
21909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
22009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
221d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate);
22209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInput, "delay", 2);
22309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInput, "endDelay", 0.5);
22409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(timingInput, "fill", "backwards");
22509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInput, "iterationStart", 2);
22609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInput, "iterations", 10);
22709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInput, "playbackRate", 2);
22809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(timingInput, "direction", "reverse");
22909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsString(timingInput, "easing", "step-start");
230d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate);
23109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
232d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, timingInputDictionary, exceptionState);
23309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
234d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationNodeTiming> specified = animation->timing();
23509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->delay());
23609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0.5, specified->endDelay());
23709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("backwards", specified->fill());
23809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->iterationStart());
23909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(10, specified->iterations());
24009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->playbackRate());
24109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("reverse", specified->direction());
24209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("step-start", specified->easing());
24309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
24409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
245d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, SpecifiedDurationGetter)
24609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
24709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
24809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
249d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> timingInputWithDuration = v8::Object::New(m_isolate);
25009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    setV8ObjectPropertyAsNumber(timingInputWithDuration, "duration", 2.5);
251d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Dictionary timingInputDictionaryWithDuration = Dictionary(v8::Handle<v8::Value>::Cast(timingInputWithDuration), m_isolate);
25209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
253d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animationWithDuration = createAnimation(element.get(), jsKeyframes, timingInputDictionaryWithDuration, exceptionState);
25409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
255d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationNodeTiming> specifiedWithDuration = animationWithDuration->timing();
256e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Nullable<double> numberDuration;
257e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    String stringDuration;
258e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    specifiedWithDuration->getDuration("duration", numberDuration, stringDuration);
259e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_FALSE(numberDuration.isNull());
260e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ(2.5, numberDuration.get());
261e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_TRUE(stringDuration.isNull());
26209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
26309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
264d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> timingInputNoDuration = v8::Object::New(m_isolate);
265d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Dictionary timingInputDictionaryNoDuration = Dictionary(v8::Handle<v8::Value>::Cast(timingInputNoDuration), m_isolate);
26609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
267d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animationNoDuration = createAnimation(element.get(), jsKeyframes, timingInputDictionaryNoDuration, exceptionState);
26809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
269d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationNodeTiming> specifiedNoDuration = animationNoDuration->timing();
270e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Nullable<double> numberDuration2;
271e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    String stringDuration2;
272e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    specifiedNoDuration->getDuration("duration", numberDuration2, stringDuration2);
273e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_TRUE(numberDuration2.isNull());
274e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_FALSE(stringDuration2.isNull());
275e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ("auto", stringDuration2);
27609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
27709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
278d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, SpecifiedSetters)
27909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
28009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
281d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate);
282d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate);
283d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, timingInputDictionary, exceptionState);
28409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
285d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationNodeTiming> specified = animation->timing();
28609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
28709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, specified->delay());
28809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setDelay(2);
28909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->delay());
29009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
29109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, specified->endDelay());
29209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setEndDelay(0.5);
29309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0.5, specified->endDelay());
29409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
29509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("auto", specified->fill());
29609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setFill("backwards");
29709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("backwards", specified->fill());
29809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
29909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, specified->iterationStart());
30009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setIterationStart(2);
30109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->iterationStart());
30209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
30309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(1, specified->iterations());
30409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setIterations(10);
30509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(10, specified->iterations());
30609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
30709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(1, specified->playbackRate());
30809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setPlaybackRate(2);
30909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(2, specified->playbackRate());
31009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("normal", specified->direction());
31209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setDirection("reverse");
31309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("reverse", specified->direction());
31409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
31509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("linear", specified->easing());
31609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setEasing("step-start");
31709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("step-start", specified->easing());
31809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
31909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
320d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)TEST_F(AnimationAnimationV8Test, SetSpecifiedDuration)
32109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
32209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Vector<Dictionary, 0> jsKeyframes;
323d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    v8::Handle<v8::Object> timingInput = v8::Object::New(m_isolate);
324d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    Dictionary timingInputDictionary = Dictionary(v8::Handle<v8::Value>::Cast(timingInput), m_isolate);
325d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = createAnimation(element.get(), jsKeyframes, timingInputDictionary, exceptionState);
32609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
327d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<AnimationNodeTiming> specified = animation->timing();
32809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
329e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Nullable<double> numberDuration;
330e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    String stringDuration;
331e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    specified->getDuration("duration", numberDuration, stringDuration);
332e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_TRUE(numberDuration.isNull());
333e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_FALSE(stringDuration.isNull());
33409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ("auto", stringDuration);
33509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
33609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    specified->setDuration("duration", 2.5);
337e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    Nullable<double> numberDuration2;
338e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    String stringDuration2;
339e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    specified->getDuration("duration", numberDuration2, stringDuration2);
340e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_FALSE(numberDuration2.isNull());
341e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_EQ(2.5, numberDuration2.get());
342e38fbeeb576b5094e34e038ab88d9d6a5c5c2214Torne (Richard Coles)    EXPECT_TRUE(stringDuration2.isNull());
34309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
34409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
34509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(AnimationAnimationTest, TimeToEffectChange)
34609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
34709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Timing timing;
34809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.iterationDuration = 100;
34909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.startDelay = 100;
35009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.endDelay = 100;
35109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.fillMode = Timing::FillModeNone;
352d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = Animation::create(0, nullptr, timing);
3537242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimationPlayer> player = document.timeline().play(animation.get());
35409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double inf = std::numeric_limits<double>::infinity();
35509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(100, animation->timeToForwardsEffectChange());
35709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToReverseEffectChange());
35809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
35910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(100);
36009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
36109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
36209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(199);
36409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
36509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
36609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
36710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(200);
36809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // End-exclusive.
36909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
37009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
37109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
37210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(300);
37309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
37409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(100, animation->timeToReverseEffectChange());
37509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
37609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
37709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(AnimationAnimationTest, TimeToEffectChangeWithPlaybackRate)
37809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
37909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Timing timing;
38009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.iterationDuration = 100;
38109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.startDelay = 100;
38209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.endDelay = 100;
38309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.playbackRate = 2;
38409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.fillMode = Timing::FillModeNone;
385d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = Animation::create(0, nullptr, timing);
3867242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimationPlayer> player = document.timeline().play(animation.get());
38709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double inf = std::numeric_limits<double>::infinity();
38809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
38909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(100, animation->timeToForwardsEffectChange());
39009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToReverseEffectChange());
39109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
39210f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(100);
39309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
39409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
39509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
39610f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(149);
39709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
39809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
39909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40010f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(150);
40109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    // End-exclusive.
40209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
40309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
40409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
40510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(200);
40609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
40709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(50, animation->timeToReverseEffectChange());
40809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
40909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
41009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)TEST_F(AnimationAnimationTest, TimeToEffectChangeWithNegativePlaybackRate)
41109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
41209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    Timing timing;
41309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.iterationDuration = 100;
41409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.startDelay = 100;
41509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.endDelay = 100;
41609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.playbackRate = -2;
41709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    timing.fillMode = Timing::FillModeNone;
418d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = Animation::create(0, nullptr, timing);
4197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeRawPtr<AnimationPlayer> player = document.timeline().play(animation.get());
42009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    double inf = std::numeric_limits<double>::infinity();
42109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
42209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(100, animation->timeToForwardsEffectChange());
42309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToReverseEffectChange());
42409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
42510f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(100);
42609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
42709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
42809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
42910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(149);
43009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToForwardsEffectChange());
43109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
43209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
43310f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(150);
43409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
43509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(0, animation->timeToReverseEffectChange());
43609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
43710f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    player->setCurrentTimeInternal(200);
43809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(inf, animation->timeToForwardsEffectChange());
43909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    EXPECT_EQ(50, animation->timeToReverseEffectChange());
44009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
44109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
4426f543c786fc42989f552b4daa774ca5ff32fa697Ben MurdochTEST_F(AnimationAnimationTest, ElementDestructorClearsAnimationTarget)
4436f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch{
4446f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // This test expects incorrect behaviour should be removed once Element
4456f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    // and Animation are moved to Oilpan. See crbug.com/362404 for context.
4466f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    Timing timing;
4476f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    timing.iterationDuration = 5;
448d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    RefPtrWillBeRawPtr<Animation> animation = Animation::create(element.get(), nullptr, timing);
44910f88d5669dbd969c059d61ba09fa37dd72ac559Ben Murdoch    EXPECT_EQ(element.get(), animation->target());
4507242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    document.timeline().play(animation.get());
4517242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    pageHolder.clear();
4526f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    element.clear();
453d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#if !ENABLE(OILPAN)
4546f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch    EXPECT_EQ(0, animation->target());
455d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)#endif
4566f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch}
4576f543c786fc42989f552b4daa774ca5ff32fa697Ben Murdoch
458c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
459