2 * Copyright (c) 2013, Google Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are
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
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.
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.
33 #include "core/animation/CompositorAnimations.h"
35 #include "core/animation/AnimatableDouble.h"
36 #include "core/animation/AnimatableFilterOperations.h"
37 #include "core/animation/AnimatableTransform.h"
38 #include "core/animation/AnimatableValueTestHelper.h"
39 #include "core/animation/CompositorAnimationsImpl.h"
40 #include "core/animation/CompositorAnimationsTestHelper.h"
41 #include "platform/animation/TimingFunctionTestHelper.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/WebAnimation.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"
53 #include <gmock/gmock.h>
54 #include <gtest/gtest.h>
58 using ::testing::CloneToPassOwnPtr;
59 using ::testing::ExpectationSet;
61 using ::testing::Return;
64 class AnimationCompositorAnimationsTest : public AnimationCompositorAnimationsTestBase {
67 RefPtr<TimingFunction> m_linearTimingFunction;
68 RefPtr<TimingFunction> m_cubicEaseTimingFunction;
69 RefPtr<TimingFunction> m_cubicCustomTimingFunction;
70 RefPtr<TimingFunction> m_stepTimingFunction;
73 CompositorAnimationsImpl::CompositorTiming m_compositorTiming;
74 KeyframeEffectModel::KeyframeVector m_keyframeVector2;
75 RefPtr<KeyframeEffectModel> m_keyframeAnimationEffect2;
76 KeyframeEffectModel::KeyframeVector m_keyframeVector5;
77 RefPtr<KeyframeEffectModel> m_keyframeAnimationEffect5;
81 AnimationCompositorAnimationsTestBase::SetUp();
83 m_linearTimingFunction = LinearTimingFunction::create();
84 m_cubicEaseTimingFunction = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease);
85 m_cubicCustomTimingFunction = CubicBezierTimingFunction::create(1, 2, 3, 4);
86 m_stepTimingFunction = StepsTimingFunction::create(1, false);
88 m_timing = createCompositableTiming();
89 m_compositorTiming = CompositorAnimationsImpl::CompositorTiming();
90 // Make sure the CompositableTiming is really compositable, otherwise
91 // most other tests will fail.
92 ASSERT(convertTimingForCompositor(m_timing, m_compositorTiming));
94 m_keyframeVector2 = createCompositableFloatKeyframeVector(2);
95 m_keyframeAnimationEffect2 = KeyframeEffectModel::create(m_keyframeVector2);
97 m_keyframeVector5 = createCompositableFloatKeyframeVector(5);
98 m_keyframeAnimationEffect5 = KeyframeEffectModel::create(m_keyframeVector5);
103 bool convertTimingForCompositor(const Timing& t, CompositorAnimationsImpl::CompositorTiming& out)
105 return CompositorAnimationsImpl::convertTimingForCompositor(t, out);
107 bool isCandidateForAnimationOnCompositor(const Timing& timing, const AnimationEffect& effect)
109 return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(timing, effect);
111 void getAnimationOnCompositor(Timing& timing, KeyframeEffectModel& effect, Vector<OwnPtr<blink::WebAnimation> >& animations)
113 return CompositorAnimationsImpl::getAnimationOnCompositor(timing, effect, animations);
116 bool isCandidateHelperForSingleKeyframe(Keyframe* frame)
118 EXPECT_EQ(frame->offset(), 0);
119 KeyframeEffectModel::KeyframeVector frames;
120 frames.append(frame);
121 EXPECT_EQ(m_keyframeVector2[1]->offset(), 1.0);
122 frames.append(m_keyframeVector2[1]);
123 return isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(frames).get());
126 // -------------------------------------------------------------------
128 Timing createCompositableTiming()
131 timing.startDelay = 0;
132 timing.fillMode = Timing::FillModeNone;
133 timing.iterationStart = 0;
134 timing.iterationCount = 1;
135 timing.iterationDuration = 1.0;
136 timing.playbackRate = 1.0;
137 timing.direction = Timing::PlaybackDirectionNormal;
138 ASSERT(m_linearTimingFunction);
139 timing.timingFunction = m_linearTimingFunction;
143 PassRefPtr<Keyframe> createReplaceOpKeyframe(CSSPropertyID id, AnimatableValue* value, double offset = 0)
145 RefPtr<Keyframe> keyframe = Keyframe::create();
146 keyframe->setPropertyValue(id, value);
147 keyframe->setComposite(AnimationEffect::CompositeReplace);
148 keyframe->setOffset(offset);
152 PassRefPtr<Keyframe> createDefaultKeyframe(CSSPropertyID id, AnimationEffect::CompositeOperation op, double offset = 0)
154 RefPtr<AnimatableValue> value;
155 if (id == CSSPropertyWebkitTransform)
156 value = AnimatableTransform::create(TransformOperations());
158 value = AnimatableDouble::create(10.0);
160 RefPtr<Keyframe> keyframe = createReplaceOpKeyframe(id, value.get(), offset);
161 keyframe->setComposite(op);
165 KeyframeEffectModel::KeyframeVector createCompositableFloatKeyframeVector(size_t n)
167 Vector<double> values;
168 for (size_t i = 0; i < n; i++) {
169 values.append(static_cast<double>(i));
171 return createCompositableFloatKeyframeVector(values);
174 KeyframeEffectModel::KeyframeVector createCompositableFloatKeyframeVector(Vector<double>& values)
176 KeyframeEffectModel::KeyframeVector frames;
177 for (size_t i = 0; i < values.size(); i++) {
178 double offset = 1.0 / (values.size() - 1) * i;
179 RefPtr<AnimatableDouble> value = AnimatableDouble::create(values[i]);
180 frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, value.get(), offset).get());
185 PassRefPtr<KeyframeEffectModel> createKeyframeEffectModel(PassRefPtr<Keyframe> prpFrom, PassRefPtr<Keyframe> prpTo, PassRefPtr<Keyframe> prpC = 0, PassRefPtr<Keyframe> prpD = 0)
187 RefPtr<Keyframe> from = prpFrom;
188 RefPtr<Keyframe> to = prpTo;
189 RefPtr<Keyframe> c = prpC;
190 RefPtr<Keyframe> d = prpD;
192 EXPECT_EQ(from->offset(), 0);
193 KeyframeEffectModel::KeyframeVector frames;
195 EXPECT_LE(from->offset(), to->offset());
198 EXPECT_LE(to->offset(), c->offset());
203 EXPECT_LE(c->offset(), d->offset());
204 EXPECT_EQ(d->offset(), 1.0);
206 EXPECT_EQ(to->offset(), 1.0);
208 if (!HasFatalFailure()) {
209 return KeyframeEffectModel::create(frames);
211 return PassRefPtr<KeyframeEffectModel>();
216 // -----------------------------------------------------------------------
217 // -----------------------------------------------------------------------
219 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeMultipleCSSProperties)
221 RefPtr<Keyframe> keyframeGoodMultiple = createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace);
222 keyframeGoodMultiple->setPropertyValue(CSSPropertyWebkitTransform, AnimatableTransform::create(TransformOperations()).get());
223 EXPECT_TRUE(isCandidateHelperForSingleKeyframe(keyframeGoodMultiple.get()));
225 RefPtr<Keyframe> keyframeBadMultipleOp = createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeAdd);
226 keyframeBadMultipleOp->setPropertyValue(CSSPropertyWebkitTransform, AnimatableDouble::create(10.0).get());
227 EXPECT_FALSE(isCandidateHelperForSingleKeyframe(keyframeBadMultipleOp.get()));
229 RefPtr<Keyframe> keyframeBadMultipleID = createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace);
230 keyframeBadMultipleID->setPropertyValue(CSSPropertyOpacity, AnimatableDouble::create(10.0).get());
231 EXPECT_FALSE(isCandidateHelperForSingleKeyframe(keyframeBadMultipleID.get()));
234 TEST_F(AnimationCompositorAnimationsTest, isNotCandidateForCompositorAnimationTransformDependsOnBoxSize)
236 TransformOperations ops;
237 ops.operations().append(TranslateTransformOperation::create(Length(2, WebCore::Fixed), Length(2, WebCore::Fixed), TransformOperation::TranslateX));
238 RefPtr<Keyframe> goodKeyframe = createReplaceOpKeyframe(CSSPropertyWebkitTransform, AnimatableTransform::create(ops).get());
239 EXPECT_TRUE(isCandidateHelperForSingleKeyframe(goodKeyframe.get()));
241 ops.operations().append(TranslateTransformOperation::create(Length(50, WebCore::Percent), Length(2, WebCore::Fixed), TransformOperation::TranslateX));
242 RefPtr<Keyframe> badKeyframe = createReplaceOpKeyframe(CSSPropertyWebkitTransform, AnimatableTransform::create(ops).get());
243 EXPECT_FALSE(isCandidateHelperForSingleKeyframe(badKeyframe.get()));
245 TransformOperations ops2;
246 Length calcLength = Length(100, WebCore::Percent).blend(Length(100, WebCore::Fixed), 0.5, WebCore::ValueRangeAll);
247 ops2.operations().append(TranslateTransformOperation::create(calcLength, Length(0, WebCore::Fixed), TransformOperation::TranslateX));
248 RefPtr<Keyframe> badKeyframe2 = createReplaceOpKeyframe(CSSPropertyWebkitTransform, AnimatableTransform::create(ops2).get());
249 EXPECT_FALSE(isCandidateHelperForSingleKeyframe(badKeyframe2.get()));
252 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModelMultipleFramesOkay)
254 KeyframeEffectModel::KeyframeVector framesSame;
255 framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
256 framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
257 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(framesSame).get()));
259 KeyframeEffectModel::KeyframeVector framesMixed;
260 framesMixed.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
261 framesMixed.append(createDefaultKeyframe(CSSPropertyWebkitTransform, AnimationEffect::CompositeReplace, 1.0).get());
262 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(framesMixed).get()));
265 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModel)
267 KeyframeEffectModel::KeyframeVector framesSame;
268 framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 0.0).get());
269 framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
270 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(framesSame).get()));
272 KeyframeEffectModel::KeyframeVector framesMixedProperties;
273 framesMixedProperties.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
274 framesMixedProperties.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get());
275 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(framesMixedProperties).get()));
277 KeyframeEffectModel::KeyframeVector framesMixedOps;
278 framesMixedOps.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
279 framesMixedOps.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeAdd, 1.0).get());
280 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *KeyframeEffectModel::create(framesMixedOps).get()));
283 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorStartDelay)
285 m_timing.iterationDuration = 20.0;
287 m_timing.startDelay = 2.0;
288 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
289 EXPECT_DOUBLE_EQ(-2.0, m_compositorTiming.scaledTimeOffset);
291 m_timing.startDelay = -2.0;
292 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
293 EXPECT_DOUBLE_EQ(2.0, m_compositorTiming.scaledTimeOffset);
296 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationStart)
298 m_timing.iterationStart = 2.2;
299 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
302 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationCount)
304 m_timing.iterationCount = 5.0;
305 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
306 EXPECT_EQ(5, m_compositorTiming.adjustedIterationCount);
308 m_timing.iterationCount = 5.5;
309 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
311 // Asserts will only trigger on DEBUG build.
312 // EXPECT_DEATH tests are flaky on Android.
313 #if !defined(NDEBUG) && !OS(ANDROID)
314 m_timing.iterationCount = -1;
315 EXPECT_DEATH(convertTimingForCompositor(m_timing, m_compositorTiming), "");
318 m_timing.iterationCount = std::numeric_limits<double>::infinity();
319 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
320 EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
322 m_timing.iterationCount = std::numeric_limits<double>::infinity();
323 m_timing.iterationDuration = 5.0;
324 m_timing.startDelay = -6.0;
325 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
326 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
327 EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount);
330 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationsAndStartDelay)
332 m_timing.iterationCount = 4.0;
333 m_timing.iterationDuration = 5.0;
335 m_timing.startDelay = 6.0;
336 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
337 EXPECT_DOUBLE_EQ(-6.0, m_compositorTiming.scaledTimeOffset);
338 EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
340 m_timing.startDelay = -6.0;
341 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
342 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
343 EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount);
345 m_timing.startDelay = 21.0;
346 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
349 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorPlaybackRate)
351 m_timing.playbackRate = 2.0;
352 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
354 m_timing.playbackRate = 0.0;
355 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
357 m_timing.playbackRate = -2.0;
358 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming));
361 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection)
363 m_timing.direction = Timing::PlaybackDirectionAlternate;
364 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
365 EXPECT_TRUE(m_compositorTiming.alternate);
366 EXPECT_FALSE(m_compositorTiming.reverse);
368 m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
369 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
370 EXPECT_TRUE(m_compositorTiming.alternate);
371 EXPECT_TRUE(m_compositorTiming.reverse);
373 m_timing.direction = Timing::PlaybackDirectionReverse;
374 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
375 EXPECT_FALSE(m_compositorTiming.alternate);
376 EXPECT_TRUE(m_compositorTiming.reverse);
379 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirectionIterationsAndStartDelay)
381 m_timing.direction = Timing::PlaybackDirectionAlternate;
382 m_timing.iterationCount = 4.0;
383 m_timing.iterationDuration = 5.0;
384 m_timing.startDelay = -6.0;
385 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
386 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
387 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
388 EXPECT_TRUE(m_compositorTiming.alternate);
389 EXPECT_FALSE(m_compositorTiming.reverse);
391 m_timing.direction = Timing::PlaybackDirectionAlternate;
392 m_timing.iterationCount = 4.0;
393 m_timing.iterationDuration = 5.0;
394 m_timing.startDelay = -11.0;
395 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
396 EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
397 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
398 EXPECT_TRUE(m_compositorTiming.alternate);
399 EXPECT_FALSE(m_compositorTiming.reverse);
401 m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
402 m_timing.iterationCount = 4.0;
403 m_timing.iterationDuration = 5.0;
404 m_timing.startDelay = -6.0;
405 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
406 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset);
407 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
408 EXPECT_TRUE(m_compositorTiming.alternate);
409 EXPECT_TRUE(m_compositorTiming.reverse);
411 m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
412 m_timing.iterationCount = 4.0;
413 m_timing.iterationDuration = 5.0;
414 m_timing.startDelay = -11.0;
415 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming));
416 EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset);
417 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount);
418 EXPECT_TRUE(m_compositorTiming.alternate);
419 EXPECT_TRUE(m_compositorTiming.reverse);
422 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingTimingFunctionPassThru)
424 m_timing.timingFunction = m_stepTimingFunction;
425 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
428 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionLinear)
430 m_timing.timingFunction = m_linearTimingFunction;
431 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
432 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
435 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionCubic)
437 // Cubic bezier are okay if we only have two keyframes
438 m_timing.timingFunction = m_cubicEaseTimingFunction;
439 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
440 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
442 m_timing.timingFunction = m_cubicCustomTimingFunction;
443 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
444 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
447 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionSteps)
449 m_timing.timingFunction = m_stepTimingFunction;
450 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
451 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
454 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedEmpty)
456 RefPtr<ChainedTimingFunction> chainedEmpty = ChainedTimingFunction::create();
457 m_timing.timingFunction = chainedEmpty;
458 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
459 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
462 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedLinear)
464 RefPtr<ChainedTimingFunction> chainedLinearSingle = ChainedTimingFunction::create();
465 chainedLinearSingle->appendSegment(1.0, m_linearTimingFunction.get());
466 m_timing.timingFunction = chainedLinearSingle;
467 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
469 RefPtr<ChainedTimingFunction> chainedLinearMultiple = ChainedTimingFunction::create();
470 chainedLinearMultiple->appendSegment(0.25, m_linearTimingFunction.get());
471 chainedLinearMultiple->appendSegment(0.5, m_linearTimingFunction.get());
472 chainedLinearMultiple->appendSegment(0.75, m_linearTimingFunction.get());
473 chainedLinearMultiple->appendSegment(1.0, m_linearTimingFunction.get());
474 m_timing.timingFunction = chainedLinearMultiple;
475 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
477 // FIXME: Technically a chained timing function of linear functions don't
478 // have to be aligned to keyframes. We don't support that currently as
479 // nothing generates that yet.
482 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedCubicMatchingOffsets)
484 RefPtr<ChainedTimingFunction> chainedSingleAGood = ChainedTimingFunction::create();
485 chainedSingleAGood->appendSegment(1.0, m_cubicEaseTimingFunction.get());
486 m_timing.timingFunction = chainedSingleAGood;
487 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
489 RefPtr<ChainedTimingFunction> chainedSingleBGood = ChainedTimingFunction::create();
490 chainedSingleBGood->appendSegment(1.0, m_cubicCustomTimingFunction.get());
491 m_timing.timingFunction = chainedSingleBGood;
492 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
494 RefPtr<ChainedTimingFunction> chainedMultipleGood = ChainedTimingFunction::create();
495 chainedMultipleGood->appendSegment(0.25, m_cubicEaseTimingFunction.get());
496 chainedMultipleGood->appendSegment(0.5, m_cubicCustomTimingFunction.get());
497 chainedMultipleGood->appendSegment(0.75, m_cubicCustomTimingFunction.get());
498 chainedMultipleGood->appendSegment(1.0, m_cubicCustomTimingFunction.get());
499 m_timing.timingFunction = chainedMultipleGood;
500 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
503 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedCubicNonMatchingOffsets)
505 RefPtr<ChainedTimingFunction> chained0 = ChainedTimingFunction::create();
506 chained0->appendSegment(0.5, m_cubicEaseTimingFunction.get());
507 m_timing.timingFunction = chained0;
508 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
510 RefPtr<ChainedTimingFunction> chained1 = ChainedTimingFunction::create();
511 chained1->appendSegment(0.24, m_cubicEaseTimingFunction.get());
512 chained1->appendSegment(0.5, m_cubicEaseTimingFunction.get());
513 chained1->appendSegment(0.75, m_cubicEaseTimingFunction.get());
514 chained1->appendSegment(1.0, m_cubicEaseTimingFunction.get());
515 m_timing.timingFunction = chained1;
516 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
518 RefPtr<ChainedTimingFunction> chained2 = ChainedTimingFunction::create();
519 chained2->appendSegment(0.25, m_cubicEaseTimingFunction.get());
520 chained2->appendSegment(0.51, m_cubicEaseTimingFunction.get());
521 chained2->appendSegment(0.75, m_cubicEaseTimingFunction.get());
522 chained2->appendSegment(1.0, m_cubicEaseTimingFunction.get());
523 m_timing.timingFunction = chained2;
524 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
526 RefPtr<ChainedTimingFunction> chained3 = ChainedTimingFunction::create();
527 chained3->appendSegment(0.25, m_cubicEaseTimingFunction.get());
528 chained3->appendSegment(0.5, m_cubicEaseTimingFunction.get());
529 chained3->appendSegment(0.75, m_cubicEaseTimingFunction.get());
530 chained3->appendSegment(0.8, m_cubicEaseTimingFunction.get());
531 m_timing.timingFunction = chained3;
532 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
534 RefPtr<ChainedTimingFunction> chained4 = ChainedTimingFunction::create();
535 chained4->appendSegment(0.25, m_cubicEaseTimingFunction.get());
536 chained4->appendSegment(0.5, m_cubicEaseTimingFunction.get());
537 chained4->appendSegment(0.75, m_cubicEaseTimingFunction.get());
538 chained4->appendSegment(1.1, m_cubicEaseTimingFunction.get());
539 m_timing.timingFunction = chained4;
540 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
543 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionMissingFrames)
546 RefPtr<ChainedTimingFunction> chained1 = ChainedTimingFunction::create();
547 chained1->appendSegment(0.5, m_cubicEaseTimingFunction.get());
548 chained1->appendSegment(0.75, m_cubicEaseTimingFunction.get());
549 chained1->appendSegment(1.0, m_cubicEaseTimingFunction.get());
550 m_timing.timingFunction = chained1;
551 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
554 RefPtr<ChainedTimingFunction> chained2 = ChainedTimingFunction::create();
555 chained2->appendSegment(0.25, m_cubicEaseTimingFunction.get());
556 chained2->appendSegment(0.75, m_cubicEaseTimingFunction.get());
557 chained2->appendSegment(1.0, m_cubicEaseTimingFunction.get());
558 m_timing.timingFunction = chained2;
559 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
562 RefPtr<ChainedTimingFunction> chained3 = ChainedTimingFunction::create();
563 chained3->appendSegment(0.25, m_cubicEaseTimingFunction.get());
564 chained3->appendSegment(0.5, m_cubicEaseTimingFunction.get());
565 chained3->appendSegment(0.75, m_cubicEaseTimingFunction.get());
566 m_timing.timingFunction = chained3;
567 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
570 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionToManyFrames)
572 RefPtr<ChainedTimingFunction> chained1 = ChainedTimingFunction::create();
573 chained1->appendSegment(0.1, m_cubicEaseTimingFunction.get());
574 chained1->appendSegment(0.5, m_cubicEaseTimingFunction.get());
575 m_timing.timingFunction = chained1;
576 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
578 RefPtr<ChainedTimingFunction> chained2 = ChainedTimingFunction::create();
579 chained2->appendSegment(0.1, m_cubicEaseTimingFunction.get());
580 chained2->appendSegment(0.25, m_cubicEaseTimingFunction.get());
581 chained2->appendSegment(0.5, m_cubicEaseTimingFunction.get());
582 chained2->appendSegment(0.75, m_cubicEaseTimingFunction.get());
583 chained2->appendSegment(1.0, m_cubicEaseTimingFunction.get());
584 m_timing.timingFunction = chained2;
585 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
588 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionMixedGood)
590 RefPtr<ChainedTimingFunction> chainedMixed = ChainedTimingFunction::create();
591 chainedMixed->appendSegment(0.25, m_linearTimingFunction.get());
592 chainedMixed->appendSegment(0.5, m_cubicEaseTimingFunction.get());
593 chainedMixed->appendSegment(0.75, m_cubicEaseTimingFunction.get());
594 chainedMixed->appendSegment(1.0, m_linearTimingFunction.get());
595 m_timing.timingFunction = chainedMixed;
596 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
599 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionWithStepNotOkay)
601 RefPtr<ChainedTimingFunction> chainedStepSingle = ChainedTimingFunction::create();
602 chainedStepSingle->appendSegment(1.0, m_stepTimingFunction.get());
603 m_timing.timingFunction = chainedStepSingle;
604 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get()));
606 RefPtr<ChainedTimingFunction> chainedStepMixedA = ChainedTimingFunction::create();
607 chainedStepMixedA->appendSegment(0.25, m_stepTimingFunction.get());
608 chainedStepMixedA->appendSegment(0.5, m_linearTimingFunction.get());
609 chainedStepMixedA->appendSegment(1.0, m_cubicEaseTimingFunction.get());
610 m_timing.timingFunction = chainedStepMixedA;
611 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
613 RefPtr<ChainedTimingFunction> chainedStepMixedB = ChainedTimingFunction::create();
614 chainedStepMixedB->appendSegment(0.25, m_linearTimingFunction.get());
615 chainedStepMixedB->appendSegment(0.5, m_stepTimingFunction.get());
616 chainedStepMixedB->appendSegment(1.0, m_cubicEaseTimingFunction.get());
617 m_timing.timingFunction = chainedStepMixedB;
618 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
620 RefPtr<ChainedTimingFunction> chainedStepMixedC = ChainedTimingFunction::create();
621 chainedStepMixedC->appendSegment(0.25, m_linearTimingFunction.get());
622 chainedStepMixedC->appendSegment(0.5, m_cubicEaseTimingFunction.get());
623 chainedStepMixedC->appendSegment(1.0, m_stepTimingFunction.get());
624 m_timing.timingFunction = chainedStepMixedC;
625 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
628 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionNestedNotOkay)
630 RefPtr<ChainedTimingFunction> chainedChild = ChainedTimingFunction::create();
631 chainedChild->appendSegment(1.0, m_linearTimingFunction.get());
633 RefPtr<ChainedTimingFunction> chainedParent = ChainedTimingFunction::create();
634 chainedParent->appendSegment(0.25, m_linearTimingFunction.get());
635 chainedParent->appendSegment(0.5, chainedChild.get());
636 chainedParent->appendSegment(0.75, m_linearTimingFunction.get());
637 chainedParent->appendSegment(1.0, m_linearTimingFunction.get());
638 m_timing.timingFunction = chainedParent;
639 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get()));
642 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositor)
644 Timing linearTiming(createCompositableTiming());
646 RefPtr<TimingFunction> cubicTimingFunc = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn);
647 Timing cubicTiming(createCompositableTiming());
648 cubicTiming.timingFunction = cubicTimingFunc;
650 RefPtr<ChainedTimingFunction> chainedTimingFunc = ChainedTimingFunction::create();
651 chainedTimingFunc->appendSegment(0.5, m_linearTimingFunction.get());
652 chainedTimingFunc->appendSegment(1.0, cubicTimingFunc.get());
653 Timing chainedTiming(createCompositableTiming());
654 chainedTiming.timingFunction = chainedTimingFunc;
656 KeyframeEffectModel::KeyframeVector basicFramesVector;
657 basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
658 basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
659 RefPtr<KeyframeEffectModel> basicFrames = KeyframeEffectModel::create(basicFramesVector).get();
661 EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get()));
662 EXPECT_TRUE(isCandidateForAnimationOnCompositor(cubicTiming, *basicFrames.get()));
663 // number of timing function and keyframes don't match
664 EXPECT_FALSE(isCandidateForAnimationOnCompositor(chainedTiming, *basicFrames.get()));
666 KeyframeEffectModel::KeyframeVector nonBasicFramesVector;
667 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get());
668 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.5).get());
669 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get());
670 RefPtr<KeyframeEffectModel> nonBasicFrames = KeyframeEffectModel::create(nonBasicFramesVector).get();
672 EXPECT_TRUE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(linearTiming, *nonBasicFrames.get()));
673 EXPECT_FALSE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(cubicTiming, *nonBasicFrames.get()));
674 EXPECT_TRUE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(chainedTiming, *nonBasicFrames.get()));
677 // -----------------------------------------------------------------------
678 // -----------------------------------------------------------------------
680 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimation)
682 // Animation to convert
683 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
684 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
685 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
688 WebCompositorSupportMock mockCompositor;
691 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock;
692 ExpectationSet usesMockCurve;
693 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
694 .WillOnce(Return(mockCurvePtr));
696 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
697 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0)));
700 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
701 ExpectationSet usesMockAnimation;
703 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
704 .WillOnce(Return(mockAnimationPtr));
706 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
707 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
708 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false));
710 EXPECT_CALL(*mockAnimationPtr, delete_())
712 .After(usesMockAnimation);
713 EXPECT_CALL(*mockCurvePtr, delete_())
715 .After(usesMockCurve);
718 setCompositorForTesting(mockCompositor);
719 Vector<OwnPtr<blink::WebAnimation> > result;
720 getAnimationOnCompositor(m_timing, *effect.get(), result);
721 EXPECT_EQ(1U, result.size());
725 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationDuration)
727 // Animation to convert
728 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
729 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
730 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
732 m_timing.iterationDuration = 10.0;
735 WebCompositorSupportMock mockCompositor;
738 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock;
739 ExpectationSet usesMockCurve;
740 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
741 .WillOnce(Return(mockCurvePtr));
743 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
744 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(10.0, 5.0)));
747 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
748 ExpectationSet usesMockAnimation;
750 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
751 .WillOnce(Return(mockAnimationPtr));
753 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1));
754 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
755 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false));
757 EXPECT_CALL(*mockAnimationPtr, delete_())
759 .After(usesMockAnimation);
760 EXPECT_CALL(*mockCurvePtr, delete_())
762 .After(usesMockCurve);
765 setCompositorForTesting(mockCompositor);
766 Vector<OwnPtr<blink::WebAnimation> > result;
767 getAnimationOnCompositor(m_timing, *effect.get(), result);
768 EXPECT_EQ(1U, result.size());
772 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationLinear)
774 // Animation to convert
775 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
776 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
777 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25),
778 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5),
779 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
781 m_timing.iterationCount = 5;
782 m_timing.direction = Timing::PlaybackDirectionAlternate;
785 WebCompositorSupportMock mockCompositor;
788 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock();
789 ExpectationSet usesMockCurve;
791 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
792 .WillOnce(Return(mockCurvePtr));
794 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
795 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.25, -1.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
796 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
797 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0)));
799 // Animation is created
800 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
801 ExpectationSet usesMockAnimation;
803 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
804 .WillOnce(Return(mockAnimationPtr));
806 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
807 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
808 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true));
810 EXPECT_CALL(*mockAnimationPtr, delete_())
812 .After(usesMockAnimation);
813 EXPECT_CALL(*mockCurvePtr, delete_())
815 .After(usesMockCurve);
818 setCompositorForTesting(mockCompositor);
819 Vector<OwnPtr<blink::WebAnimation> > result;
820 getAnimationOnCompositor(m_timing, *effect.get(), result);
821 EXPECT_EQ(1U, result.size());
825 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationStartDelay)
827 // Animation to convert
828 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
829 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
830 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
832 m_timing.iterationCount = 5.0;
833 m_timing.iterationDuration = 1.75;
834 m_timing.startDelay = 3.25;
837 WebCompositorSupportMock mockCompositor;
840 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock;
841 ExpectationSet usesMockCurve;
842 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
843 .WillOnce(Return(mockCurvePtr));
845 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
846 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.75, 5.0)));
849 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
850 ExpectationSet usesMockAnimation;
852 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
853 .WillOnce(Return(mockAnimationPtr));
855 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
856 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(-3.25));
857 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false));
859 EXPECT_CALL(*mockAnimationPtr, delete_())
861 .After(usesMockAnimation);
862 EXPECT_CALL(*mockCurvePtr, delete_())
864 .After(usesMockCurve);
867 setCompositorForTesting(mockCompositor);
868 Vector<OwnPtr<blink::WebAnimation> > result;
869 getAnimationOnCompositor(m_timing, *effect.get(), result);
870 EXPECT_EQ(1U, result.size());
874 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationChained)
876 // Animation to convert
877 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
878 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
879 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25),
880 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5),
881 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
883 RefPtr<ChainedTimingFunction> chainedTimingFunction = ChainedTimingFunction::create();
884 chainedTimingFunction->appendSegment(0.25, m_cubicEaseTimingFunction.get());
885 chainedTimingFunction->appendSegment(0.5, m_linearTimingFunction.get());
886 chainedTimingFunction->appendSegment(1.0, m_cubicCustomTimingFunction.get());
888 m_timing.timingFunction = chainedTimingFunction;
889 m_timing.iterationDuration = 2.0;
890 m_timing.iterationCount = 10;
891 m_timing.direction = Timing::PlaybackDirectionAlternate;
894 WebCompositorSupportMock mockCompositor;
897 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock();
898 ExpectationSet usesMockCurve;
900 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
901 .WillOnce(Return(mockCurvePtr));
903 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeEase));
904 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, -1.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
905 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 20.0), 1.0, 2.0, 3.0, 4.0));
906 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(2.0, 5.0)));
908 // Animation is created
909 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
910 ExpectationSet usesMockAnimation;
912 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
913 .WillOnce(Return(mockAnimationPtr));
915 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
916 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
917 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true));
919 EXPECT_CALL(*mockAnimationPtr, delete_())
921 .After(usesMockAnimation);
922 EXPECT_CALL(*mockCurvePtr, delete_())
924 .After(usesMockCurve);
927 setCompositorForTesting(mockCompositor);
928 Vector<OwnPtr<blink::WebAnimation> > result;
929 getAnimationOnCompositor(m_timing, *effect.get(), result);
930 EXPECT_EQ(1U, result.size());
934 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimation)
936 // Animation to convert
937 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
938 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
939 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25),
940 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5),
941 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
943 RefPtr<TimingFunction> cubicEasyFlipTimingFunction = CubicBezierTimingFunction::create(0.0, 0.0, 0.0, 1.0);
944 RefPtr<ChainedTimingFunction> chainedTimingFunction = ChainedTimingFunction::create();
945 chainedTimingFunction->appendSegment(0.25, CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn));
946 chainedTimingFunction->appendSegment(0.5, m_linearTimingFunction.get());
947 chainedTimingFunction->appendSegment(1.0, cubicEasyFlipTimingFunction.get());
949 m_timing.timingFunction = chainedTimingFunction;
950 m_timing.iterationCount = 10;
951 m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
954 WebCompositorSupportMock mockCompositor;
957 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock();
958 ExpectationSet usesMockCurve;
960 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
961 .WillOnce(Return(mockCurvePtr));
963 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 5.0), 1.0, 0.0, 1.0, 1.0));
964 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
965 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.75, -1.0), blink::WebAnimationCurve::TimingFunctionTypeEaseOut));
966 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 2.0)));
968 // Create the animation
969 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
970 ExpectationSet usesMockAnimation;
972 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
973 .WillOnce(Return(mockAnimationPtr));
975 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10));
976 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0));
977 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true));
979 EXPECT_CALL(*mockAnimationPtr, delete_())
981 .After(usesMockAnimation);
982 EXPECT_CALL(*mockCurvePtr, delete_())
984 .After(usesMockCurve);
987 setCompositorForTesting(mockCompositor);
988 Vector<OwnPtr<blink::WebAnimation> > result;
989 getAnimationOnCompositor(m_timing, *effect.get(), result);
990 EXPECT_EQ(1U, result.size());
994 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimationNegativeStartDelay)
996 // Animation to convert
997 RefPtr<KeyframeEffectModel> effect = createKeyframeEffectModel(
998 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0),
999 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0));
1001 m_timing.iterationCount = 5.0;
1002 m_timing.iterationDuration = 1.5;
1003 m_timing.startDelay = -3;
1004 m_timing.direction = Timing::PlaybackDirectionAlternateReverse;
1007 WebCompositorSupportMock mockCompositor;
1010 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock;
1011 ExpectationSet usesMockCurve;
1012 EXPECT_CALL(mockCompositor, createFloatAnimationCurve())
1013 .WillOnce(Return(mockCurvePtr));
1015 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 5.0), blink::WebAnimationCurve::TimingFunctionTypeLinear));
1016 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.5, 2.0)));
1019 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity);
1020 ExpectationSet usesMockAnimation;
1022 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _))
1023 .WillOnce(Return(mockAnimationPtr));
1025 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5));
1026 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(3.0));
1027 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true));
1029 EXPECT_CALL(*mockAnimationPtr, delete_())
1031 .After(usesMockAnimation);
1032 EXPECT_CALL(*mockCurvePtr, delete_())
1034 .After(usesMockCurve);
1037 setCompositorForTesting(mockCompositor);
1038 Vector<OwnPtr<blink::WebAnimation> > result;
1039 getAnimationOnCompositor(m_timing, *effect.get(), result);
1040 EXPECT_EQ(1U, result.size());
1045 } // namespace WebCore