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