Home | History | Annotate | Download | only in animation
      1 /*
      2  * Copyright (c) 2013, Google Inc. All rights reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions are
      6  * met:
      7  *
      8  *     * Redistributions of source code must retain the above copyright
      9  * notice, this list of conditions and the following disclaimer.
     10  *     * Redistributions in binary form must reproduce the above
     11  * copyright notice, this list of conditions and the following disclaimer
     12  * in the documentation and/or other materials provided with the
     13  * distribution.
     14  *     * Neither the name of Google Inc. nor the names of its
     15  * contributors may be used to endorse or promote products derived from
     16  * this software without specific prior written permission.
     17  *
     18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     29  */
     30 
     31 #include "config.h"
     32 
     33 #include "core/animation/CompositorAnimations.h"
     34 
     35 #include "core/animation/CompositorAnimationsImpl.h"
     36 #include "core/animation/CompositorAnimationsTestHelper.h"
     37 #include "core/animation/animatable/AnimatableDouble.h"
     38 #include "core/animation/animatable/AnimatableFilterOperations.h"
     39 #include "core/animation/animatable/AnimatableTransform.h"
     40 #include "core/animation/animatable/AnimatableValueTestHelper.h"
     41 #include "platform/geometry/FloatBox.h"
     42 #include "platform/geometry/IntSize.h"
     43 #include "platform/graphics/filters/FilterOperations.h"
     44 #include "platform/transforms/TransformOperations.h"
     45 #include "platform/transforms/TranslateTransformOperation.h"
     46 #include "public/platform/WebCompositorAnimation.h"
     47 #include "wtf/HashFunctions.h"
     48 #include "wtf/OwnPtr.h"
     49 #include "wtf/PassOwnPtr.h"
     50 #include "wtf/PassRefPtr.h"
     51 #include "wtf/RefPtr.h"
     52 
     53 #include <gmock/gmock.h>
     54 #include <gtest/gtest.h>
     55 
     56 namespace blink {
     57 
     58 using ::testing::CloneToPassOwnPtr;
     59 using ::testing::ExpectationSet;
     60 using ::testing::Ref;
     61 using ::testing::Return;
     62 using ::testing::_;
     63 
     64 class AnimationCompositorAnimationsTest : public AnimationCompositorAnimationsTestBase {
     65 protected:
     66     RefPtr<TimingFunction> m_linearTimingFunction;
     67     RefPtr<TimingFunction> m_cubicEaseTimingFunction;
     68     RefPtr<TimingFunction> m_cubicCustomTimingFunction;
     69     RefPtr<TimingFunction> m_stepTimingFunction;
     70 
     71     Timing m_timing;
     72     CompositorAnimationsImpl::CompositorTiming m_compositorTiming;
     73     OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector2;
     74     RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect2;
     75     OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector5;
     76     RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect5;
     77 
     78     virtual void SetUp()
     79     {
     80         AnimationCompositorAnimationsTestBase::SetUp();
     81 
     82         m_linearTimingFunction = LinearTimingFunction::shared();
     83         m_cubicEaseTimingFunction = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
     84         m_cubicCustomTimingFunction = CubicBezierTimingFunction::create(1, 2, 3, 4);
     85         m_stepTimingFunction = StepsTimingFunction::create(1, StepsTimingFunction::End);
     86 
     87         m_timing = createCompositableTiming();
     88         m_compositorTiming = CompositorAnimationsImpl::CompositorTiming();
     89         // Make sure the CompositableTiming is really compositable, otherwise
     90         // most other tests will fail.
     91         ASSERT(convertTimingForCompositor(m_timing, m_compositorTiming));
     92 
     93         m_keyframeVector2 = createCompositableFloatKeyframeVector(2);
     94         m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
     95 
     96         m_keyframeVector5 = createCompositableFloatKeyframeVector(5);
     97         m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
     98     }
     99 
    100 public:
    101 
    102     bool convertTimingForCompositor(const Timing& t, CompositorAnimationsImpl::CompositorTiming& out)
    103     {
    104         return CompositorAnimationsImpl::convertTimingForCompositor(t, 0, out, 1);
    105     }
    106     bool isCandidateForAnimationOnCompositor(const Timing& timing, const AnimationEffect& effect)
    107     {
    108         return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(timing, effect, 1);
    109     }
    110     void getAnimationOnCompositor(Timing& timing, AnimatableValueKeyframeEffectModel& effect, Vector<OwnPtr<WebCompositorAnimation> >& animations)
    111     {
    112         return getAnimationOnCompositor(timing, effect, animations, 1);
    113     }
    114     void getAnimationOnCompositor(Timing& timing, AnimatableValueKeyframeEffectModel& effect, Vector<OwnPtr<WebCompositorAnimation> >& animations, double playerPlaybackRate)
    115     {
    116         return CompositorAnimationsImpl::getAnimationOnCompositor(timing, std::numeric_limits<double>::quiet_NaN(), 0, effect, animations, playerPlaybackRate);
    117     }
    118     bool getAnimationBounds(FloatBox& boundingBox, const AnimationEffect& effect, double minValue, double maxValue)
    119     {
    120         return CompositorAnimations::instance()->getAnimatedBoundingBox(boundingBox, effect, minValue, maxValue);
    121     }
    122 
    123     bool duplicateSingleKeyframeAndTestIsCandidateOnResult(AnimatableValueKeyframe* frame)
    124     {
    125         EXPECT_EQ(frame->offset(), 0);
    126         AnimatableValueKeyframeVector frames;
    127         RefPtrWillBeRawPtr<Keyframe> second = frame->cloneWithOffset(1);
    128 
    129         frames.append(frame);
    130         frames.append(toAnimatableValueKeyframe(second.get()));
    131         return isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(frames).get());
    132     }
    133 
    134     // -------------------------------------------------------------------
    135 
    136     Timing createCompositableTiming()
    137     {
    138         Timing timing;
    139         timing.startDelay = 0;
    140         timing.fillMode = Timing::FillModeNone;
    141         timing.iterationStart = 0;
    142         timing.iterationCount = 1;
    143         timing.iterationDuration = 1.0;
    144         timing.playbackRate = 1.0;
    145         timing.direction = Timing::PlaybackDirectionNormal;
    146         ASSERT(m_linearTimingFunction);
    147         timing.timingFunction = m_linearTimingFunction;
    148         return timing;
    149     }
    150 
    151     PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createReplaceOpKeyframe(CSSPropertyID id, AnimatableValue* value, double offset = 0)
    152     {
    153         RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = AnimatableValueKeyframe::create();
    154         keyframe->setPropertyValue(id, value);
    155         keyframe->setComposite(AnimationEffect::CompositeReplace);
    156         keyframe->setOffset(offset);
    157         keyframe->setEasing(LinearTimingFunction::shared());
    158         return keyframe;
    159     }
    160 
    161     PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createDefaultKeyframe(CSSPropertyID id, AnimationEffect::CompositeOperation op, double offset = 0)
    162     {
    163         RefPtrWillBeRawPtr<AnimatableValue> value = nullptr;
    164         if (id == CSSPropertyTransform)
    165             value = AnimatableTransform::create(TransformOperations());
    166         else
    167             value = AnimatableDouble::create(10.0);
    168 
    169         RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = createReplaceOpKeyframe(id, value.get(), offset);
    170         keyframe->setComposite(op);
    171         return keyframe;
    172     }
    173 
    174     PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(size_t n)
    175     {
    176         Vector<double> values;
    177         for (size_t i = 0; i < n; i++) {
    178             values.append(static_cast<double>(i));
    179         }
    180         return createCompositableFloatKeyframeVector(values);
    181     }
    182 
    183     PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(Vector<double>& values)
    184     {
    185         OwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> frames = adoptPtrWillBeNoop(new AnimatableValueKeyframeVector);
    186         for (size_t i = 0; i < values.size(); i++) {
    187             double offset = 1.0 / (values.size() - 1) * i;
    188             RefPtrWillBeRawPtr<AnimatableDouble> value = AnimatableDouble::create(values[i]);
    189             frames->append(createReplaceOpKeyframe(CSSPropertyOpacity, value.get(), offset).get());
    190         }
    191         return frames.release();
    192     }
    193 
    194     PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableTransformKeyframeVector(const Vector<TransformOperations>& values)
    195     {
    196         OwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> frames = adoptPtrWillBeNoop(new AnimatableValueKeyframeVector);
    197         for (size_t i = 0; i < values.size(); ++i) {
    198             double offset = 1.0f / (values.size() - 1) * i;
    199             RefPtrWillBeRawPtr<AnimatableTransform> value = AnimatableTransform::create(values[i]);
    200             frames->append(createReplaceOpKeyframe(CSSPropertyTransform, value.get(), offset).get());
    201         }
    202         return frames.release();
    203     }
    204 
    205     PassRefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> createKeyframeEffectModel(PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpFrom, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpTo, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpC = nullptr, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpD = nullptr)
    206     {
    207         RefPtrWillBeRawPtr<AnimatableValueKeyframe> from = prpFrom;
    208         RefPtrWillBeRawPtr<AnimatableValueKeyframe> to = prpTo;
    209         RefPtrWillBeRawPtr<AnimatableValueKeyframe> c = prpC;
    210         RefPtrWillBeRawPtr<AnimatableValueKeyframe> d = prpD;
    211 
    212         EXPECT_EQ(from->offset(), 0);
    213         AnimatableValueKeyframeVector frames;
    214         frames.append(from);
    215         EXPECT_LE(from->offset(), to->offset());
    216         frames.append(to);
    217         if (c) {
    218             EXPECT_LE(to->offset(), c->offset());
    219             frames.append(c);
    220         }
    221         if (d) {
    222             frames.append(d);
    223             EXPECT_LE(c->offset(), d->offset());
    224             EXPECT_EQ(d->offset(), 1.0);
    225         } else {
    226             EXPECT_EQ(to->offset(), 1.0);
    227         }
    228         if (!HasFatalFailure()) {
    229             return AnimatableValueKeyframeEffectModel::create(frames);
    230         }
    231         return nullptr;
    232     }
    233 
    234 };
    235 
    236 // -----------------------------------------------------------------------
    237 // -----------------------------------------------------------------------
    238 
    239 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeMultipleCSSProperties)
    240 {
    241     RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeGoodMultiple = createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace);
    242     keyframeGoodMultiple->setPropertyValue(CSSPropertyTransform, AnimatableTransform::create(TransformOperations()).get());
    243     EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeGoodMultiple.get()));
    244 
    245     RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeBadMultipleID = createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace);
    246     keyframeBadMultipleID->setPropertyValue(CSSPropertyOpacity, AnimatableDouble::create(10.0).get());
    247     EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeBadMultipleID.get()));
    248 }
    249 
    250 TEST_F(AnimationCompositorAnimationsTest, isNotCandidateForCompositorAnimationTransformDependsOnBoxSize)
    251 {
    252     TransformOperations ops;
    253     ops.operations().append(TranslateTransformOperation::create(Length(2, Fixed), Length(2, Fixed), TransformOperation::TranslateX));
    254     RefPtrWillBeRawPtr<AnimatableValueKeyframe> goodKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get());
    255     EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(goodKeyframe.get()));
    256 
    257     ops.operations().append(TranslateTransformOperation::create(Length(50, Percent), Length(2, Fixed), TransformOperation::TranslateX));
    258     RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get());
    259     EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe.get()));
    260 
    261     TransformOperations ops2;
    262     Length calcLength = Length(100, Percent).blend(Length(100, Fixed), 0.5, ValueRangeAll);
    263     ops2.operations().append(TranslateTransformOperation::create(calcLength, Length(0, Fixed), TransformOperation::TranslateX));
    264     RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe2 = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops2).get());
    265     EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe2.get()));
    266 }
    267 
    268 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModelMultipleFramesOkay)
    269 {
    270     AnimatableValueKeyframeVector framesSame;
    271     framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
    272     framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
    273     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get()));
    274 
    275     AnimatableValueKeyframeVector framesMixed;
    276     framesMixed.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
    277     framesMixed.append(createDefaultKeyframe(CSSPropertyTransform, AnimationEffect::CompositeReplace, 1.0).get());
    278     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixed).get()));
    279 }
    280 
    281 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModel)
    282 {
    283     AnimatableValueKeyframeVector framesSame;
    284     framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 0.0).get());
    285     framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
    286     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get()));
    287 
    288     AnimatableValueKeyframeVector framesMixedProperties;
    289     framesMixedProperties.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
    290     framesMixedProperties.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
    291     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixedProperties).get()));
    292 }
    293 
    294 TEST_F(AnimationCompositorAnimationsTest, AnimatedBoundingBox)
    295 {
    296     Vector<TransformOperations> transformVector;
    297     transformVector.append(TransformOperations());
    298     transformVector.last().operations().append(TranslateTransformOperation::create(Length(0, Fixed), Length(0, Fixed), 0.0, TransformOperation::Translate3D));
    299     transformVector.append(TransformOperations());
    300     transformVector.last().operations().append(TranslateTransformOperation::create(Length(200, Fixed), Length(200, Fixed), 0.0, TransformOperation::Translate3D));
    301     OwnPtrWillBePersistent<AnimatableValueKeyframeVector> frames = createCompositableTransformKeyframeVector(transformVector);
    302     FloatBox bounds;
    303     EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), 0, 1));
    304     EXPECT_EQ(FloatBox(0.0f, 0.f, 0.0f, 200.0f, 200.0f, 0.0f), bounds);
    305     bounds = FloatBox();
    306     EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), -1, 1));
    307     EXPECT_EQ(FloatBox(-200.0f, -200.0, 0.0, 400.0f, 400.0f, 0.0f), bounds);
    308     transformVector.append(TransformOperations());
    309     transformVector.last().operations().append(TranslateTransformOperation::create(Length(-300, Fixed), Length(-400, Fixed), 1.0f, TransformOperation::Translate3D));
    310     bounds = FloatBox();
    311     frames = createCompositableTransformKeyframeVector(transformVector);
    312     EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), 0, 1));
    313     EXPECT_EQ(FloatBox(-300.0f, -400.f, 0.0f, 500.0f, 600.0f, 1.0f), bounds);
    314     bounds = FloatBox();
    315     EXPECT_TRUE(getAnimationBounds(bounds, *AnimatableValueKeyframeEffectModel::create(*frames).get(), -1, 2));
    316     EXPECT_EQ(FloatBox(-1300.0f, -1600.f, 0.0f, 1500.0f, 1800.0f, 3.0f), bounds);
    317 }
    318 
    319 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorStartDelay)
    320 {
    321     m_timing.iterationDuration = 20.0;
    322 
    323     m_timing.startDelay = 2.0;
    324     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    325     EXPECT_DOUBLE_EQ(-2.0, m_compositorTiming.scaledTimeOffset);
    326 
    327     m_timing.startDelay = -2.0;
    328     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    329     EXPECT_DOUBLE_EQ(2.0, m_compositorTiming.scaledTimeOffset);
    330 }
    331 
    332 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationStart)
    333 {
    334     m_timing.iterationStart = 2.2;
    335     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    336 }
    337 
    338 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationCount)
    339 {
    340     m_timing.iterationCount = 5.0;
    341     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    342     EXPECT_EQ(5, m_compositorTiming.adjustedIterationCount);
    343 
    344     m_timing.iterationCount = 5.5;
    345     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    346     EXPECT_EQ(5.5, m_compositorTiming.adjustedIterationCount);
    347 
    348     // EXPECT_DEATH tests are flaky on Android.
    349 #if ENABLE(ASSERT) && !OS(ANDROID)
    350     m_timing.iterationCount = -1;
    351     EXPECT_DEATH(convertTimingForCompositor(m_timing, m_compositorTiming), "");
    352 #endif
    353 
    354     m_timing.iterationCount = std::numeric_limits<double>::infinity();
    355     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    356     EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
    357 
    358     m_timing.iterationCount = std::numeric_limits<double>::infinity();
    359     m_timing.iterationDuration = 5.0;
    360     m_timing.startDelay = -6.0;
    361     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    362     EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
    363     EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
    364 }
    365 
    366 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationsAndStartDelay)
    367 {
    368     m_timing.iterationCount = 4.0;
    369     m_timing.iterationDuration = 5.0;
    370 
    371     m_timing.startDelay = 6.0;
    372     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    373     EXPECT_DOUBLE_EQ(-6.0, m_compositorTiming.scaledTimeOffset);
    374     EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
    375 
    376     m_timing.startDelay = -6.0;
    377     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    378     EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
    379     EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
    380 
    381     m_timing.startDelay = 21.0;
    382     EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
    383 }
    384 
    385 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorPlaybackRate)
    386 {
    387     m_timing.playbackRate = 1.0;
    388     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    389     EXPECT_DOUBLE_EQ(1.0, m_compositorTiming.playbackRate);
    390 
    391     m_timing.playbackRate = -2.3;
    392     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    393     EXPECT_DOUBLE_EQ(-2.3, m_compositorTiming.playbackRate);
    394 
    395     m_timing.playbackRate = 1.6;
    396     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    397     EXPECT_DOUBLE_EQ(1.6, m_compositorTiming.playbackRate);
    398 }
    399 
    400 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection)
    401 {
    402     m_timing.direction = Timing::PlaybackDirectionNormal;
    403     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    404     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionNormal);
    405 
    406     m_timing.direction = Timing::PlaybackDirectionAlternate;
    407     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    408     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
    409 
    410     m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
    411     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    412     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
    413 
    414     m_timing.direction = Timing::PlaybackDirectionReverse;
    415     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    416     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionReverse);
    417 }
    418 
    419 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirectionIterationsAndStartDelay)
    420 {
    421     m_timing.direction = Timing::PlaybackDirectionAlternate;
    422     m_timing.iterationCount = 4.0;
    423     m_timing.iterationDuration = 5.0;
    424     m_timing.startDelay = -6.0;
    425     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    426     EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
    427     EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
    428     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
    429 
    430     m_timing.direction = Timing::PlaybackDirectionAlternate;
    431     m_timing.iterationCount = 4.0;
    432     m_timing.iterationDuration = 5.0;
    433     m_timing.startDelay = -11.0;
    434     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    435     EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
    436     EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
    437     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternate);
    438 
    439     m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
    440     m_timing.iterationCount = 4.0;
    441     m_timing.iterationDuration = 5.0;
    442     m_timing.startDelay = -6.0;
    443     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    444     EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
    445     EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
    446     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
    447 
    448     m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
    449     m_timing.iterationCount = 4.0;
    450     m_timing.iterationDuration = 5.0;
    451     m_timing.startDelay = -11.0;
    452     EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
    453     EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
    454     EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
    455     EXPECT_EQ(m_compositorTiming.direction, Timing::PlaybackDirectionAlternateReverse);
    456 }
    457 
    458 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingTimingFunctionPassThru)
    459 {
    460     m_timing.timingFunction = m_stepTimingFunction;
    461     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    462 }
    463 
    464 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionLinear)
    465 {
    466     m_timing.timingFunction = m_linearTimingFunction;
    467     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    468     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    469 }
    470 
    471 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionCubic)
    472 {
    473     m_timing.timingFunction = m_cubicEaseTimingFunction;
    474     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    475     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    476 
    477     m_timing.timingFunction = m_cubicCustomTimingFunction;
    478     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    479     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    480 }
    481 
    482 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionSteps)
    483 {
    484     m_timing.timingFunction = m_stepTimingFunction;
    485     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    486     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    487 }
    488 
    489 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedLinear)
    490 {
    491     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    492     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    493 }
    494 
    495 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorNonLinearTimingFunctionOnFirstFrame)
    496 {
    497     m_timing.timingFunction = m_cubicEaseTimingFunction;
    498 
    499     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    500 
    501     (*m_keyframeVector2)[0]->setEasing(m_cubicEaseTimingFunction.get());
    502     m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
    503     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    504 }
    505 
    506 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedCubicMatchingOffsets)
    507 {
    508     (*m_keyframeVector2)[0]->setEasing(m_cubicEaseTimingFunction.get());
    509     m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
    510     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    511 
    512     (*m_keyframeVector2)[0]->setEasing(m_cubicCustomTimingFunction.get());
    513     m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
    514     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    515 
    516     (*m_keyframeVector5)[0]->setEasing(m_cubicEaseTimingFunction.get());
    517     (*m_keyframeVector5)[1]->setEasing(m_cubicCustomTimingFunction.get());
    518     (*m_keyframeVector5)[2]->setEasing(m_cubicCustomTimingFunction.get());
    519     (*m_keyframeVector5)[3]->setEasing(m_cubicCustomTimingFunction.get());
    520     m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
    521     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    522 }
    523 
    524 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionMixedGood)
    525 {
    526     (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
    527     (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get());
    528     (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
    529     (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
    530     m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
    531     EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    532 }
    533 
    534 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionWithStepNotOkay)
    535 {
    536     (*m_keyframeVector2)[0]->setEasing(m_stepTimingFunction.get());
    537     m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2);
    538     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
    539 
    540     (*m_keyframeVector5)[0]->setEasing(m_stepTimingFunction.get());
    541     (*m_keyframeVector5)[1]->setEasing(m_linearTimingFunction.get());
    542     (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
    543     (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
    544     m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
    545     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    546 
    547     (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
    548     (*m_keyframeVector5)[1]->setEasing(m_stepTimingFunction.get());
    549     (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
    550     (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get());
    551     m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
    552     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    553 
    554     (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get());
    555     (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get());
    556     (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get());
    557     (*m_keyframeVector5)[3]->setEasing(m_stepTimingFunction.get());
    558     m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5);
    559     EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
    560 }
    561 
    562 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositor)
    563 {
    564     Timing linearTiming(createCompositableTiming());
    565 
    566     AnimatableValueKeyframeVector basicFramesVector;
    567     basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
    568     basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
    569 
    570     AnimatableValueKeyframeVector nonBasicFramesVector;
    571     nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
    572     nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.5).get());
    573     nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
    574 
    575     basicFramesVector[0]->setEasing(m_linearTimingFunction.get());
    576     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get();
    577     EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get()));
    578 
    579     basicFramesVector[0]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
    580     basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get();
    581     EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get()));
    582 
    583     nonBasicFramesVector[0]->setEasing(m_linearTimingFunction.get());
    584     nonBasicFramesVector[1]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
    585     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> nonBasicFrames = AnimatableValueKeyframeEffectModel::create(nonBasicFramesVector).get();
    586     EXPECT_TRUE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(linearTiming, *nonBasicFrames.get(), 1));
    587 }
    588 
    589 // -----------------------------------------------------------------------
    590 // -----------------------------------------------------------------------
    591 
    592 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimation)
    593 {
    594     // Animation to convert
    595     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    596         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    597         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    598     // --
    599 
    600     WebCompositorSupportMock mockCompositor;
    601 
    602     // Curve is created
    603     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
    604     ExpectationSet usesMockCurve;
    605     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    606         .WillOnce(Return(mockCurvePtr));
    607 
    608     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    609     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
    610 
    611     // Create animation
    612     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    613     ExpectationSet usesMockAnimation;
    614 
    615     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    616         .WillOnce(Return(mockAnimationPtr));
    617 
    618     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
    619     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    620     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
    621     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    622 
    623     EXPECT_CALL(*mockAnimationPtr, delete_())
    624         .Times(1)
    625         .After(usesMockAnimation);
    626     EXPECT_CALL(*mockCurvePtr, delete_())
    627         .Times(1)
    628         .After(usesMockCurve);
    629 
    630     // Go!
    631     setCompositorForTesting(mockCompositor);
    632     Vector<OwnPtr<WebCompositorAnimation> > result;
    633     getAnimationOnCompositor(m_timing, *effect.get(), result);
    634     EXPECT_EQ(1U, result.size());
    635     result[0].clear();
    636 }
    637 
    638 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationDuration)
    639 {
    640     // Animation to convert
    641     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    642         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    643         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    644 
    645     m_timing.iterationDuration = 10.0;
    646     // --
    647 
    648     WebCompositorSupportMock mockCompositor;
    649 
    650     // Curve is created
    651     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
    652     ExpectationSet usesMockCurve;
    653     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    654         .WillOnce(Return(mockCurvePtr));
    655 
    656     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    657     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(10.0, 5.0)));
    658 
    659     // Create animation
    660     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    661     ExpectationSet usesMockAnimation;
    662 
    663     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    664         .WillOnce(Return(mockAnimationPtr));
    665 
    666     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
    667     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    668     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
    669     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    670 
    671     EXPECT_CALL(*mockAnimationPtr, delete_())
    672         .Times(1)
    673         .After(usesMockAnimation);
    674     EXPECT_CALL(*mockCurvePtr, delete_())
    675         .Times(1)
    676         .After(usesMockCurve);
    677 
    678     // Go!
    679     setCompositorForTesting(mockCompositor);
    680     Vector<OwnPtr<WebCompositorAnimation> > result;
    681     getAnimationOnCompositor(m_timing, *effect.get(), result);
    682     EXPECT_EQ(1U, result.size());
    683     result[0].clear();
    684 }
    685 
    686 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationLinear)
    687 {
    688     // Animation to convert
    689     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    690         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    691         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25),
    692         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5),
    693         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    694 
    695     m_timing.iterationCount = 5;
    696     m_timing.direction = Timing::PlaybackDirectionAlternate;
    697     m_timing.playbackRate = 2.0;
    698     // --
    699 
    700     WebCompositorSupportMock mockCompositor;
    701 
    702     // Curve is created
    703     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
    704     ExpectationSet usesMockCurve;
    705 
    706     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    707         .WillOnce(Return(mockCurvePtr));
    708 
    709     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    710     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.25, -1.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    711     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.5, 20.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    712     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
    713 
    714     // Animation is created
    715     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    716     ExpectationSet usesMockAnimation;
    717 
    718     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    719         .WillOnce(Return(mockAnimationPtr));
    720 
    721     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
    722     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    723     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternate));
    724     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(2.0));
    725 
    726     EXPECT_CALL(*mockAnimationPtr, delete_())
    727         .Times(1)
    728         .After(usesMockAnimation);
    729     EXPECT_CALL(*mockCurvePtr, delete_())
    730         .Times(1)
    731         .After(usesMockCurve);
    732 
    733     // Go!
    734     setCompositorForTesting(mockCompositor);
    735     Vector<OwnPtr<WebCompositorAnimation> > result;
    736     getAnimationOnCompositor(m_timing, *effect.get(), result);
    737     EXPECT_EQ(1U, result.size());
    738     result[0].clear();
    739 }
    740 
    741 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationStartDelay)
    742 {
    743     // Animation to convert
    744     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    745         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    746         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    747 
    748     m_timing.iterationCount = 5.0;
    749     m_timing.iterationDuration = 1.75;
    750     m_timing.startDelay = 3.25;
    751     // --
    752 
    753     WebCompositorSupportMock mockCompositor;
    754 
    755     // Curve is created
    756     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
    757     ExpectationSet usesMockCurve;
    758     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    759         .WillOnce(Return(mockCurvePtr));
    760 
    761     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    762     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.75, 5.0)));
    763 
    764     // Create animation
    765     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    766     ExpectationSet usesMockAnimation;
    767 
    768     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    769         .WillOnce(Return(mockAnimationPtr));
    770 
    771     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
    772     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(-3.25));
    773     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
    774     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    775 
    776     EXPECT_CALL(*mockAnimationPtr, delete_())
    777         .Times(1)
    778         .After(usesMockAnimation);
    779     EXPECT_CALL(*mockCurvePtr, delete_())
    780         .Times(1)
    781         .After(usesMockCurve);
    782 
    783     // Go!
    784     setCompositorForTesting(mockCompositor);
    785     Vector<OwnPtr<WebCompositorAnimation> > result;
    786     getAnimationOnCompositor(m_timing, *effect.get(), result);
    787     EXPECT_EQ(1U, result.size());
    788     result[0].clear();
    789 }
    790 
    791 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationChained)
    792 {
    793     // Animation to convert
    794     AnimatableValueKeyframeVector frames;
    795     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0));
    796     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25));
    797     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5));
    798     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    799     frames[0]->setEasing(m_cubicEaseTimingFunction.get());
    800     frames[1]->setEasing(m_linearTimingFunction.get());
    801     frames[2]->setEasing(m_cubicCustomTimingFunction.get());
    802     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames);
    803 
    804     m_timing.timingFunction = m_linearTimingFunction.get();
    805     m_timing.iterationDuration = 2.0;
    806     m_timing.iterationCount = 10;
    807     m_timing.direction = Timing::PlaybackDirectionAlternate;
    808     // --
    809 
    810     WebCompositorSupportMock mockCompositor;
    811 
    812     // Curve is created
    813     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
    814     ExpectationSet usesMockCurve;
    815 
    816     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    817         .WillOnce(Return(mockCurvePtr));
    818 
    819     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeEase));
    820     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.5, -1.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    821     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 20.0), 1.0, 2.0, 3.0, 4.0));
    822     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(2.0, 5.0)));
    823 
    824     // Animation is created
    825     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    826     ExpectationSet usesMockAnimation;
    827 
    828     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    829         .WillOnce(Return(mockAnimationPtr));
    830 
    831     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
    832     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    833     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternate));
    834     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    835 
    836     EXPECT_CALL(*mockAnimationPtr, delete_())
    837         .Times(1)
    838         .After(usesMockAnimation);
    839     EXPECT_CALL(*mockCurvePtr, delete_())
    840         .Times(1)
    841         .After(usesMockCurve);
    842 
    843     // Go!
    844     setCompositorForTesting(mockCompositor);
    845     Vector<OwnPtr<WebCompositorAnimation> > result;
    846     getAnimationOnCompositor(m_timing, *effect.get(), result);
    847     EXPECT_EQ(1U, result.size());
    848     result[0].clear();
    849 }
    850 
    851 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimation)
    852 {
    853     RefPtr<TimingFunction> cubicEasyFlipTimingFunction = CubicBezierTimingFunction::create(0.0, 0.0, 0.0, 1.0);
    854 
    855     // Animation to convert
    856     AnimatableValueKeyframeVector frames;
    857     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0));
    858     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25));
    859     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5));
    860     frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    861     frames[0]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
    862     frames[1]->setEasing(m_linearTimingFunction.get());
    863     frames[2]->setEasing(cubicEasyFlipTimingFunction.get());
    864     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames);
    865 
    866     m_timing.timingFunction = m_linearTimingFunction.get();
    867     m_timing.iterationCount = 10;
    868     m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
    869     // --
    870 
    871     WebCompositorSupportMock mockCompositor;
    872 
    873     // Curve is created
    874     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock();
    875     ExpectationSet usesMockCurve;
    876 
    877     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    878         .WillOnce(Return(mockCurvePtr));
    879 
    880     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeEaseIn));
    881     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.25, -1.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    882     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), 0.0, 0.0, 0.0, 1.0));
    883     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0)));
    884 
    885     // Create the animation
    886     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    887     ExpectationSet usesMockAnimation;
    888 
    889     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    890         .WillOnce(Return(mockAnimationPtr));
    891 
    892     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
    893     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    894     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternateReverse));
    895     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    896 
    897     EXPECT_CALL(*mockAnimationPtr, delete_())
    898         .Times(1)
    899         .After(usesMockAnimation);
    900     EXPECT_CALL(*mockCurvePtr, delete_())
    901         .Times(1)
    902         .After(usesMockCurve);
    903 
    904     // Go!
    905     setCompositorForTesting(mockCompositor);
    906     Vector<OwnPtr<WebCompositorAnimation> > result;
    907     getAnimationOnCompositor(m_timing, *effect.get(), result);
    908     EXPECT_EQ(1U, result.size());
    909     result[0].clear();
    910 }
    911 
    912 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimationNegativeStartDelay)
    913 {
    914     // Animation to convert
    915     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    916         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    917         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    918 
    919     m_timing.iterationCount = 5.0;
    920     m_timing.iterationDuration = 1.5;
    921     m_timing.startDelay = -3;
    922     m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
    923     // --
    924 
    925     WebCompositorSupportMock mockCompositor;
    926 
    927     // Curve is created
    928     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
    929     ExpectationSet usesMockCurve;
    930     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    931         .WillOnce(Return(mockCurvePtr));
    932 
    933     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    934     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.5, 5.0)));
    935 
    936     // Create animation
    937     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    938     ExpectationSet usesMockAnimation;
    939 
    940     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    941         .WillOnce(Return(mockAnimationPtr));
    942 
    943     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
    944     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(3.0));
    945     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionAlternateReverse));
    946     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
    947 
    948     EXPECT_CALL(*mockAnimationPtr, delete_())
    949         .Times(1)
    950         .After(usesMockAnimation);
    951     EXPECT_CALL(*mockCurvePtr, delete_())
    952         .Times(1)
    953         .After(usesMockCurve);
    954 
    955     // Go!
    956     setCompositorForTesting(mockCompositor);
    957     Vector<OwnPtr<WebCompositorAnimation> > result;
    958     getAnimationOnCompositor(m_timing, *effect.get(), result);
    959     EXPECT_EQ(1U, result.size());
    960     result[0].clear();
    961 }
    962 
    963 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationPlaybackRates)
    964 {
    965     // Animation to convert
    966     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
    967         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
    968         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
    969 
    970     m_timing.playbackRate = 2;
    971     // --
    972 
    973     WebCompositorSupportMock mockCompositor;
    974 
    975     // Curve is created
    976     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
    977     ExpectationSet usesMockCurve;
    978     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
    979         .WillOnce(Return(mockCurvePtr));
    980 
    981     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
    982     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
    983 
    984     // Create animation
    985     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
    986     ExpectationSet usesMockAnimation;
    987 
    988     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
    989         .WillOnce(Return(mockAnimationPtr));
    990 
    991     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
    992     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
    993     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
    994     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(-3));
    995 
    996     EXPECT_CALL(*mockAnimationPtr, delete_())
    997         .Times(1)
    998         .After(usesMockAnimation);
    999     EXPECT_CALL(*mockCurvePtr, delete_())
   1000         .Times(1)
   1001         .After(usesMockCurve);
   1002 
   1003     // Go!
   1004     setCompositorForTesting(mockCompositor);
   1005     Vector<OwnPtr<WebCompositorAnimation> > result;
   1006     // Set player plaback rate also
   1007     getAnimationOnCompositor(m_timing, *effect.get(), result, -1.5);
   1008     EXPECT_EQ(1U, result.size());
   1009     result[0].clear();
   1010 }
   1011 
   1012 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationFillModeNone)
   1013 {
   1014     // Animation to convert
   1015     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
   1016         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
   1017         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
   1018 
   1019     m_timing.fillMode = Timing::FillModeNone;
   1020 
   1021     WebCompositorSupportMock mockCompositor;
   1022 
   1023     // Curve is created
   1024     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
   1025     ExpectationSet usesMockCurve;
   1026     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
   1027         .WillOnce(Return(mockCurvePtr));
   1028 
   1029     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
   1030     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
   1031 
   1032     // Create animation
   1033     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
   1034     ExpectationSet usesMockAnimation;
   1035 
   1036     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
   1037         .WillOnce(Return(mockAnimationPtr));
   1038 
   1039     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
   1040     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
   1041     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
   1042     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
   1043     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setFillMode(blink::WebCompositorAnimation::FillModeNone));
   1044 
   1045     EXPECT_CALL(*mockAnimationPtr, delete_())
   1046         .Times(1)
   1047         .After(usesMockAnimation);
   1048     EXPECT_CALL(*mockCurvePtr, delete_())
   1049         .Times(1)
   1050         .After(usesMockCurve);
   1051 
   1052     // Go!
   1053     setCompositorForTesting(mockCompositor);
   1054     Vector<OwnPtr<WebCompositorAnimation> > result;
   1055     getAnimationOnCompositor(m_timing, *effect.get(), result);
   1056     EXPECT_EQ(1U, result.size());
   1057     result[0].clear();
   1058 }
   1059 
   1060 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationFillModeAuto)
   1061 {
   1062     // Animation to convert
   1063     RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel(
   1064         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
   1065         createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
   1066 
   1067     m_timing.fillMode = Timing::FillModeAuto;
   1068 
   1069     WebCompositorSupportMock mockCompositor;
   1070 
   1071     // Curve is created
   1072     WebFloatAnimationCurveMock* mockCurvePtr = new WebFloatAnimationCurveMock;
   1073     ExpectationSet usesMockCurve;
   1074     EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
   1075         .WillOnce(Return(mockCurvePtr));
   1076 
   1077     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(0.0, 2.0), WebCompositorAnimationCurve::TimingFunctionTypeLinear));
   1078     usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(WebFloatKeyframe(1.0, 5.0)));
   1079 
   1080     // Create animation
   1081     WebCompositorAnimationMock* mockAnimationPtr = new WebCompositorAnimationMock(WebCompositorAnimation::TargetPropertyOpacity);
   1082     ExpectationSet usesMockAnimation;
   1083 
   1084     usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), WebCompositorAnimation::TargetPropertyOpacity, _))
   1085         .WillOnce(Return(mockAnimationPtr));
   1086 
   1087     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
   1088     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
   1089     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setDirection(blink::WebCompositorAnimation::DirectionNormal));
   1090     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setPlaybackRate(1));
   1091     usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setFillMode(blink::WebCompositorAnimation::FillModeNone));
   1092 
   1093     EXPECT_CALL(*mockAnimationPtr, delete_())
   1094         .Times(1)
   1095         .After(usesMockAnimation);
   1096     EXPECT_CALL(*mockCurvePtr, delete_())
   1097         .Times(1)
   1098         .After(usesMockCurve);
   1099 
   1100     // Go!
   1101     setCompositorForTesting(mockCompositor);
   1102     Vector<OwnPtr<WebCompositorAnimation> > result;
   1103     getAnimationOnCompositor(m_timing, *effect.get(), result);
   1104     EXPECT_EQ(1U, result.size());
   1105     result[0].clear();
   1106 }
   1107 
   1108 } // namespace blink
   1109