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/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/geometry/IntSize.h" 42 #include "platform/graphics/filters/FilterOperations.h" 43 #include "platform/transforms/TransformOperations.h" 44 #include "platform/transforms/TranslateTransformOperation.h" 45 #include "public/platform/WebAnimation.h" 46 #include "wtf/HashFunctions.h" 47 #include "wtf/OwnPtr.h" 48 #include "wtf/PassOwnPtr.h" 49 #include "wtf/PassRefPtr.h" 50 #include "wtf/RefPtr.h" 51 52 #include <gmock/gmock.h> 53 #include <gtest/gtest.h> 54 55 namespace WebCore { 56 57 using ::testing::CloneToPassOwnPtr; 58 using ::testing::ExpectationSet; 59 using ::testing::Ref; 60 using ::testing::Return; 61 using ::testing::_; 62 63 class AnimationCompositorAnimationsTest : public AnimationCompositorAnimationsTestBase { 64 protected: 65 RefPtr<TimingFunction> m_linearTimingFunction; 66 RefPtr<TimingFunction> m_cubicEaseTimingFunction; 67 RefPtr<TimingFunction> m_cubicCustomTimingFunction; 68 RefPtr<TimingFunction> m_stepTimingFunction; 69 70 Timing m_timing; 71 CompositorAnimationsImpl::CompositorTiming m_compositorTiming; 72 OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector2; 73 RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect2; 74 OwnPtrWillBePersistent<AnimatableValueKeyframeVector> m_keyframeVector5; 75 RefPtrWillBePersistent<AnimatableValueKeyframeEffectModel> m_keyframeAnimationEffect5; 76 77 virtual void SetUp() 78 { 79 AnimationCompositorAnimationsTestBase::SetUp(); 80 81 m_linearTimingFunction = LinearTimingFunction::shared(); 82 m_cubicEaseTimingFunction = CubicBezierTimingFunction::preset(CubicBezierTimingFunction::Ease); 83 m_cubicCustomTimingFunction = CubicBezierTimingFunction::create(1, 2, 3, 4); 84 m_stepTimingFunction = StepsTimingFunction::create(1, StepsTimingFunction::StepAtEnd); 85 86 m_timing = createCompositableTiming(); 87 m_compositorTiming = CompositorAnimationsImpl::CompositorTiming(); 88 // Make sure the CompositableTiming is really compositable, otherwise 89 // most other tests will fail. 90 ASSERT(convertTimingForCompositor(m_timing, m_compositorTiming)); 91 92 m_keyframeVector2 = createCompositableFloatKeyframeVector(2); 93 m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2); 94 95 m_keyframeVector5 = createCompositableFloatKeyframeVector(5); 96 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 97 } 98 99 public: 100 101 bool convertTimingForCompositor(const Timing& t, CompositorAnimationsImpl::CompositorTiming& out) 102 { 103 return CompositorAnimationsImpl::convertTimingForCompositor(t, out); 104 } 105 bool isCandidateForAnimationOnCompositor(const Timing& timing, const AnimationEffect& effect) 106 { 107 return CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(timing, effect); 108 } 109 void getAnimationOnCompositor(Timing& timing, AnimatableValueKeyframeEffectModel& effect, Vector<OwnPtr<blink::WebAnimation> >& animations) 110 { 111 return CompositorAnimationsImpl::getAnimationOnCompositor(timing, std::numeric_limits<double>::quiet_NaN(), effect, animations); 112 } 113 114 bool duplicateSingleKeyframeAndTestIsCandidateOnResult(AnimatableValueKeyframe* frame) 115 { 116 EXPECT_EQ(frame->offset(), 0); 117 AnimatableValueKeyframeVector frames; 118 RefPtrWillBeRawPtr<Keyframe> second = frame->cloneWithOffset(1); 119 120 frames.append(frame); 121 frames.append(toAnimatableValueKeyframe(second.get())); 122 return isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(frames).get()); 123 } 124 125 // ------------------------------------------------------------------- 126 127 Timing createCompositableTiming() 128 { 129 Timing timing; 130 timing.startDelay = 0; 131 timing.fillMode = Timing::FillModeNone; 132 timing.iterationStart = 0; 133 timing.iterationCount = 1; 134 timing.iterationDuration = 1.0; 135 timing.playbackRate = 1.0; 136 timing.direction = Timing::PlaybackDirectionNormal; 137 ASSERT(m_linearTimingFunction); 138 timing.timingFunction = m_linearTimingFunction; 139 return timing; 140 } 141 142 PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createReplaceOpKeyframe(CSSPropertyID id, AnimatableValue* value, double offset = 0) 143 { 144 RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = AnimatableValueKeyframe::create(); 145 keyframe->setPropertyValue(id, value); 146 keyframe->setComposite(AnimationEffect::CompositeReplace); 147 keyframe->setOffset(offset); 148 keyframe->setEasing(LinearTimingFunction::shared()); 149 return keyframe; 150 } 151 152 PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> createDefaultKeyframe(CSSPropertyID id, AnimationEffect::CompositeOperation op, double offset = 0) 153 { 154 RefPtrWillBeRawPtr<AnimatableValue> value = nullptr; 155 if (id == CSSPropertyTransform) 156 value = AnimatableTransform::create(TransformOperations()); 157 else 158 value = AnimatableDouble::create(10.0); 159 160 RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframe = createReplaceOpKeyframe(id, value.get(), offset); 161 keyframe->setComposite(op); 162 return keyframe; 163 } 164 165 PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(size_t n) 166 { 167 Vector<double> values; 168 for (size_t i = 0; i < n; i++) { 169 values.append(static_cast<double>(i)); 170 } 171 return createCompositableFloatKeyframeVector(values); 172 } 173 174 PassOwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> createCompositableFloatKeyframeVector(Vector<double>& values) 175 { 176 OwnPtrWillBeRawPtr<AnimatableValueKeyframeVector> frames = adoptPtrWillBeNoop(new AnimatableValueKeyframeVector); 177 for (size_t i = 0; i < values.size(); i++) { 178 double offset = 1.0 / (values.size() - 1) * i; 179 RefPtrWillBeRawPtr<AnimatableDouble> value = AnimatableDouble::create(values[i]); 180 frames->append(createReplaceOpKeyframe(CSSPropertyOpacity, value.get(), offset).get()); 181 } 182 return frames.release(); 183 } 184 185 PassRefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> createKeyframeEffectModel(PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpFrom, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpTo, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpC = nullptr, PassRefPtrWillBeRawPtr<AnimatableValueKeyframe> prpD = nullptr) 186 { 187 RefPtrWillBeRawPtr<AnimatableValueKeyframe> from = prpFrom; 188 RefPtrWillBeRawPtr<AnimatableValueKeyframe> to = prpTo; 189 RefPtrWillBeRawPtr<AnimatableValueKeyframe> c = prpC; 190 RefPtrWillBeRawPtr<AnimatableValueKeyframe> d = prpD; 191 192 EXPECT_EQ(from->offset(), 0); 193 AnimatableValueKeyframeVector frames; 194 frames.append(from); 195 EXPECT_LE(from->offset(), to->offset()); 196 frames.append(to); 197 if (c) { 198 EXPECT_LE(to->offset(), c->offset()); 199 frames.append(c); 200 } 201 if (d) { 202 frames.append(d); 203 EXPECT_LE(c->offset(), d->offset()); 204 EXPECT_EQ(d->offset(), 1.0); 205 } else { 206 EXPECT_EQ(to->offset(), 1.0); 207 } 208 if (!HasFatalFailure()) { 209 return AnimatableValueKeyframeEffectModel::create(frames); 210 } 211 return nullptr; 212 } 213 214 }; 215 216 // ----------------------------------------------------------------------- 217 // ----------------------------------------------------------------------- 218 219 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeMultipleCSSProperties) 220 { 221 RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeGoodMultiple = createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace); 222 keyframeGoodMultiple->setPropertyValue(CSSPropertyTransform, AnimatableTransform::create(TransformOperations()).get()); 223 EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeGoodMultiple.get())); 224 225 RefPtrWillBeRawPtr<AnimatableValueKeyframe> keyframeBadMultipleID = createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace); 226 keyframeBadMultipleID->setPropertyValue(CSSPropertyOpacity, AnimatableDouble::create(10.0).get()); 227 EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(keyframeBadMultipleID.get())); 228 } 229 230 TEST_F(AnimationCompositorAnimationsTest, isNotCandidateForCompositorAnimationTransformDependsOnBoxSize) 231 { 232 TransformOperations ops; 233 ops.operations().append(TranslateTransformOperation::create(Length(2, WebCore::Fixed), Length(2, WebCore::Fixed), TransformOperation::TranslateX)); 234 RefPtrWillBeRawPtr<AnimatableValueKeyframe> goodKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get()); 235 EXPECT_TRUE(duplicateSingleKeyframeAndTestIsCandidateOnResult(goodKeyframe.get())); 236 237 ops.operations().append(TranslateTransformOperation::create(Length(50, WebCore::Percent), Length(2, WebCore::Fixed), TransformOperation::TranslateX)); 238 RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops).get()); 239 EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe.get())); 240 241 TransformOperations ops2; 242 Length calcLength = Length(100, WebCore::Percent).blend(Length(100, WebCore::Fixed), 0.5, WebCore::ValueRangeAll); 243 ops2.operations().append(TranslateTransformOperation::create(calcLength, Length(0, WebCore::Fixed), TransformOperation::TranslateX)); 244 RefPtrWillBeRawPtr<AnimatableValueKeyframe> badKeyframe2 = createReplaceOpKeyframe(CSSPropertyTransform, AnimatableTransform::create(ops2).get()); 245 EXPECT_FALSE(duplicateSingleKeyframeAndTestIsCandidateOnResult(badKeyframe2.get())); 246 } 247 248 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModelMultipleFramesOkay) 249 { 250 AnimatableValueKeyframeVector framesSame; 251 framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get()); 252 framesSame.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get()); 253 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get())); 254 255 AnimatableValueKeyframeVector framesMixed; 256 framesMixed.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get()); 257 framesMixed.append(createDefaultKeyframe(CSSPropertyTransform, AnimationEffect::CompositeReplace, 1.0).get()); 258 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixed).get())); 259 } 260 261 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorKeyframeEffectModel) 262 { 263 AnimatableValueKeyframeVector framesSame; 264 framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 0.0).get()); 265 framesSame.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get()); 266 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesSame).get())); 267 268 AnimatableValueKeyframeVector framesMixedProperties; 269 framesMixedProperties.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get()); 270 framesMixedProperties.append(createDefaultKeyframe(CSSPropertyColor, AnimationEffect::CompositeReplace, 1.0).get()); 271 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *AnimatableValueKeyframeEffectModel::create(framesMixedProperties).get())); 272 } 273 274 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorStartDelay) 275 { 276 m_timing.iterationDuration = 20.0; 277 278 m_timing.startDelay = 2.0; 279 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 280 EXPECT_DOUBLE_EQ(-2.0, m_compositorTiming.scaledTimeOffset); 281 282 m_timing.startDelay = -2.0; 283 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 284 EXPECT_DOUBLE_EQ(2.0, m_compositorTiming.scaledTimeOffset); 285 } 286 287 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationStart) 288 { 289 m_timing.iterationStart = 2.2; 290 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 291 } 292 293 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationCount) 294 { 295 m_timing.iterationCount = 5.0; 296 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 297 EXPECT_EQ(5, m_compositorTiming.adjustedIterationCount); 298 299 m_timing.iterationCount = 5.5; 300 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 301 302 // Asserts will only trigger on DEBUG build. 303 // EXPECT_DEATH tests are flaky on Android. 304 #if !defined(NDEBUG) && !OS(ANDROID) 305 m_timing.iterationCount = -1; 306 EXPECT_DEATH(convertTimingForCompositor(m_timing, m_compositorTiming), ""); 307 #endif 308 309 m_timing.iterationCount = std::numeric_limits<double>::infinity(); 310 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 311 EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount); 312 313 m_timing.iterationCount = std::numeric_limits<double>::infinity(); 314 m_timing.iterationDuration = 5.0; 315 m_timing.startDelay = -6.0; 316 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 317 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset); 318 EXPECT_EQ(-1, m_compositorTiming.adjustedIterationCount); 319 } 320 321 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorIterationsAndStartDelay) 322 { 323 m_timing.iterationCount = 4.0; 324 m_timing.iterationDuration = 5.0; 325 326 m_timing.startDelay = 6.0; 327 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 328 EXPECT_DOUBLE_EQ(-6.0, m_compositorTiming.scaledTimeOffset); 329 EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount); 330 331 m_timing.startDelay = -6.0; 332 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 333 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset); 334 EXPECT_DOUBLE_EQ(4.0, m_compositorTiming.adjustedIterationCount); 335 336 m_timing.startDelay = 21.0; 337 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 338 } 339 340 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorPlaybackRate) 341 { 342 m_timing.playbackRate = 2.0; 343 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 344 345 m_timing.playbackRate = 0.0; 346 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 347 348 m_timing.playbackRate = -2.0; 349 EXPECT_FALSE(convertTimingForCompositor(m_timing, m_compositorTiming)); 350 } 351 352 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirection) 353 { 354 m_timing.direction = Timing::PlaybackDirectionAlternate; 355 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 356 EXPECT_TRUE(m_compositorTiming.alternate); 357 EXPECT_FALSE(m_compositorTiming.reverse); 358 359 m_timing.direction = Timing::PlaybackDirectionAlternateReverse; 360 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 361 EXPECT_TRUE(m_compositorTiming.alternate); 362 EXPECT_TRUE(m_compositorTiming.reverse); 363 364 m_timing.direction = Timing::PlaybackDirectionReverse; 365 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 366 EXPECT_FALSE(m_compositorTiming.alternate); 367 EXPECT_TRUE(m_compositorTiming.reverse); 368 } 369 370 TEST_F(AnimationCompositorAnimationsTest, ConvertTimingForCompositorDirectionIterationsAndStartDelay) 371 { 372 m_timing.direction = Timing::PlaybackDirectionAlternate; 373 m_timing.iterationCount = 4.0; 374 m_timing.iterationDuration = 5.0; 375 m_timing.startDelay = -6.0; 376 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 377 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset); 378 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount); 379 EXPECT_TRUE(m_compositorTiming.alternate); 380 EXPECT_FALSE(m_compositorTiming.reverse); 381 382 m_timing.direction = Timing::PlaybackDirectionAlternate; 383 m_timing.iterationCount = 4.0; 384 m_timing.iterationDuration = 5.0; 385 m_timing.startDelay = -11.0; 386 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 387 EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset); 388 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount); 389 EXPECT_TRUE(m_compositorTiming.alternate); 390 EXPECT_FALSE(m_compositorTiming.reverse); 391 392 m_timing.direction = Timing::PlaybackDirectionAlternateReverse; 393 m_timing.iterationCount = 4.0; 394 m_timing.iterationDuration = 5.0; 395 m_timing.startDelay = -6.0; 396 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 397 EXPECT_DOUBLE_EQ(6.0, m_compositorTiming.scaledTimeOffset); 398 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount); 399 EXPECT_TRUE(m_compositorTiming.alternate); 400 EXPECT_TRUE(m_compositorTiming.reverse); 401 402 m_timing.direction = Timing::PlaybackDirectionAlternateReverse; 403 m_timing.iterationCount = 4.0; 404 m_timing.iterationDuration = 5.0; 405 m_timing.startDelay = -11.0; 406 EXPECT_TRUE(convertTimingForCompositor(m_timing, m_compositorTiming)); 407 EXPECT_DOUBLE_EQ(11.0, m_compositorTiming.scaledTimeOffset); 408 EXPECT_EQ(4, m_compositorTiming.adjustedIterationCount); 409 EXPECT_TRUE(m_compositorTiming.alternate); 410 EXPECT_TRUE(m_compositorTiming.reverse); 411 } 412 413 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingTimingFunctionPassThru) 414 { 415 m_timing.timingFunction = m_stepTimingFunction; 416 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 417 } 418 419 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionLinear) 420 { 421 m_timing.timingFunction = m_linearTimingFunction; 422 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 423 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 424 } 425 426 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionCubic) 427 { 428 m_timing.timingFunction = m_cubicEaseTimingFunction; 429 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 430 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 431 432 m_timing.timingFunction = m_cubicCustomTimingFunction; 433 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 434 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 435 } 436 437 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionSteps) 438 { 439 m_timing.timingFunction = m_stepTimingFunction; 440 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 441 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 442 } 443 444 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedLinear) 445 { 446 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 447 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 448 } 449 450 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionChainedCubicMatchingOffsets) 451 { 452 (*m_keyframeVector2)[0]->setEasing(m_cubicEaseTimingFunction.get()); 453 m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2); 454 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 455 456 (*m_keyframeVector2)[0]->setEasing(m_cubicCustomTimingFunction.get()); 457 m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2); 458 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 459 460 (*m_keyframeVector5)[0]->setEasing(m_cubicEaseTimingFunction.get()); 461 (*m_keyframeVector5)[1]->setEasing(m_cubicCustomTimingFunction.get()); 462 (*m_keyframeVector5)[2]->setEasing(m_cubicCustomTimingFunction.get()); 463 (*m_keyframeVector5)[3]->setEasing(m_cubicCustomTimingFunction.get()); 464 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 465 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 466 } 467 468 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionMixedGood) 469 { 470 (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get()); 471 (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get()); 472 (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get()); 473 (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get()); 474 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 475 EXPECT_TRUE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 476 } 477 478 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositorTimingFunctionWithStepNotOkay) 479 { 480 (*m_keyframeVector2)[0]->setEasing(m_stepTimingFunction.get()); 481 m_keyframeAnimationEffect2 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector2); 482 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect2.get())); 483 484 (*m_keyframeVector5)[0]->setEasing(m_stepTimingFunction.get()); 485 (*m_keyframeVector5)[1]->setEasing(m_linearTimingFunction.get()); 486 (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get()); 487 (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get()); 488 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 489 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 490 491 (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get()); 492 (*m_keyframeVector5)[1]->setEasing(m_stepTimingFunction.get()); 493 (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get()); 494 (*m_keyframeVector5)[3]->setEasing(m_linearTimingFunction.get()); 495 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 496 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 497 498 (*m_keyframeVector5)[0]->setEasing(m_linearTimingFunction.get()); 499 (*m_keyframeVector5)[1]->setEasing(m_cubicEaseTimingFunction.get()); 500 (*m_keyframeVector5)[2]->setEasing(m_cubicEaseTimingFunction.get()); 501 (*m_keyframeVector5)[3]->setEasing(m_stepTimingFunction.get()); 502 m_keyframeAnimationEffect5 = AnimatableValueKeyframeEffectModel::create(*m_keyframeVector5); 503 EXPECT_FALSE(isCandidateForAnimationOnCompositor(m_timing, *m_keyframeAnimationEffect5.get())); 504 } 505 506 TEST_F(AnimationCompositorAnimationsTest, isCandidateForAnimationOnCompositor) 507 { 508 Timing linearTiming(createCompositableTiming()); 509 510 AnimatableValueKeyframeVector basicFramesVector; 511 basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get()); 512 basicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get()); 513 514 AnimatableValueKeyframeVector nonBasicFramesVector; 515 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.0).get()); 516 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 0.5).get()); 517 nonBasicFramesVector.append(createDefaultKeyframe(CSSPropertyOpacity, AnimationEffect::CompositeReplace, 1.0).get()); 518 519 basicFramesVector[0]->setEasing(m_linearTimingFunction.get()); 520 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get(); 521 EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get())); 522 523 basicFramesVector[0]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn)); 524 basicFrames = AnimatableValueKeyframeEffectModel::create(basicFramesVector).get(); 525 EXPECT_TRUE(isCandidateForAnimationOnCompositor(linearTiming, *basicFrames.get())); 526 527 nonBasicFramesVector[0]->setEasing(m_linearTimingFunction.get()); 528 nonBasicFramesVector[1]->setEasing(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn)); 529 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> nonBasicFrames = AnimatableValueKeyframeEffectModel::create(nonBasicFramesVector).get(); 530 EXPECT_TRUE(CompositorAnimations::instance()->isCandidateForAnimationOnCompositor(linearTiming, *nonBasicFrames.get())); 531 } 532 533 // ----------------------------------------------------------------------- 534 // ----------------------------------------------------------------------- 535 536 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimation) 537 { 538 // Animation to convert 539 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel( 540 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0), 541 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 542 // -- 543 544 WebCompositorSupportMock mockCompositor; 545 546 // Curve is created 547 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock; 548 ExpectationSet usesMockCurve; 549 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 550 .WillOnce(Return(mockCurvePtr)); 551 552 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 553 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0))); 554 555 // Create animation 556 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 557 ExpectationSet usesMockAnimation; 558 559 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 560 .WillOnce(Return(mockAnimationPtr)); 561 562 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1)); 563 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0)); 564 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false)); 565 566 EXPECT_CALL(*mockAnimationPtr, delete_()) 567 .Times(1) 568 .After(usesMockAnimation); 569 EXPECT_CALL(*mockCurvePtr, delete_()) 570 .Times(1) 571 .After(usesMockCurve); 572 573 // Go! 574 setCompositorForTesting(mockCompositor); 575 Vector<OwnPtr<blink::WebAnimation> > result; 576 getAnimationOnCompositor(m_timing, *effect.get(), result); 577 EXPECT_EQ(1U, result.size()); 578 result[0].clear(); 579 } 580 581 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationDuration) 582 { 583 // Animation to convert 584 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel( 585 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0), 586 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 587 588 m_timing.iterationDuration = 10.0; 589 // -- 590 591 WebCompositorSupportMock mockCompositor; 592 593 // Curve is created 594 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock; 595 ExpectationSet usesMockCurve; 596 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 597 .WillOnce(Return(mockCurvePtr)); 598 599 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 600 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(10.0, 5.0))); 601 602 // Create animation 603 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 604 ExpectationSet usesMockAnimation; 605 606 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 607 .WillOnce(Return(mockAnimationPtr)); 608 609 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(1)); 610 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0)); 611 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false)); 612 613 EXPECT_CALL(*mockAnimationPtr, delete_()) 614 .Times(1) 615 .After(usesMockAnimation); 616 EXPECT_CALL(*mockCurvePtr, delete_()) 617 .Times(1) 618 .After(usesMockCurve); 619 620 // Go! 621 setCompositorForTesting(mockCompositor); 622 Vector<OwnPtr<blink::WebAnimation> > result; 623 getAnimationOnCompositor(m_timing, *effect.get(), result); 624 EXPECT_EQ(1U, result.size()); 625 result[0].clear(); 626 } 627 628 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationLinear) 629 { 630 // Animation to convert 631 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel( 632 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0), 633 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25), 634 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5), 635 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 636 637 m_timing.iterationCount = 5; 638 m_timing.direction = Timing::PlaybackDirectionAlternate; 639 // -- 640 641 WebCompositorSupportMock mockCompositor; 642 643 // Curve is created 644 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock(); 645 ExpectationSet usesMockCurve; 646 647 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 648 .WillOnce(Return(mockCurvePtr)); 649 650 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 651 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.25, -1.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 652 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 653 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 5.0))); 654 655 // Animation is created 656 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 657 ExpectationSet usesMockAnimation; 658 659 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 660 .WillOnce(Return(mockAnimationPtr)); 661 662 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5)); 663 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0)); 664 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true)); 665 666 EXPECT_CALL(*mockAnimationPtr, delete_()) 667 .Times(1) 668 .After(usesMockAnimation); 669 EXPECT_CALL(*mockCurvePtr, delete_()) 670 .Times(1) 671 .After(usesMockCurve); 672 673 // Go! 674 setCompositorForTesting(mockCompositor); 675 Vector<OwnPtr<blink::WebAnimation> > result; 676 getAnimationOnCompositor(m_timing, *effect.get(), result); 677 EXPECT_EQ(1U, result.size()); 678 result[0].clear(); 679 } 680 681 TEST_F(AnimationCompositorAnimationsTest, createSimpleOpacityAnimationStartDelay) 682 { 683 // Animation to convert 684 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel( 685 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0), 686 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 687 688 m_timing.iterationCount = 5.0; 689 m_timing.iterationDuration = 1.75; 690 m_timing.startDelay = 3.25; 691 // -- 692 693 WebCompositorSupportMock mockCompositor; 694 695 // Curve is created 696 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock; 697 ExpectationSet usesMockCurve; 698 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 699 .WillOnce(Return(mockCurvePtr)); 700 701 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 702 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.75, 5.0))); 703 704 // Create animation 705 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 706 ExpectationSet usesMockAnimation; 707 708 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 709 .WillOnce(Return(mockAnimationPtr)); 710 711 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5)); 712 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(-3.25)); 713 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(false)); 714 715 EXPECT_CALL(*mockAnimationPtr, delete_()) 716 .Times(1) 717 .After(usesMockAnimation); 718 EXPECT_CALL(*mockCurvePtr, delete_()) 719 .Times(1) 720 .After(usesMockCurve); 721 722 // Go! 723 setCompositorForTesting(mockCompositor); 724 Vector<OwnPtr<blink::WebAnimation> > result; 725 getAnimationOnCompositor(m_timing, *effect.get(), result); 726 EXPECT_EQ(1U, result.size()); 727 result[0].clear(); 728 } 729 730 TEST_F(AnimationCompositorAnimationsTest, createMultipleKeyframeOpacityAnimationChained) 731 { 732 // Animation to convert 733 AnimatableValueKeyframeVector frames; 734 frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0)); 735 frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(-1.0).get(), 0.25)); 736 frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(20.0).get(), 0.5)); 737 frames.append(createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 738 frames[0]->setEasing(m_cubicEaseTimingFunction.get()); 739 frames[1]->setEasing(m_linearTimingFunction.get()); 740 frames[2]->setEasing(m_cubicCustomTimingFunction.get()); 741 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames); 742 743 m_timing.timingFunction = m_linearTimingFunction.get(); 744 m_timing.iterationDuration = 2.0; 745 m_timing.iterationCount = 10; 746 m_timing.direction = Timing::PlaybackDirectionAlternate; 747 // -- 748 749 WebCompositorSupportMock mockCompositor; 750 751 // Curve is created 752 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock(); 753 ExpectationSet usesMockCurve; 754 755 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 756 .WillOnce(Return(mockCurvePtr)); 757 758 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 2.0), blink::WebAnimationCurve::TimingFunctionTypeEase)); 759 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, -1.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 760 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 20.0), 1.0, 2.0, 3.0, 4.0)); 761 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(2.0, 5.0))); 762 763 // Animation is created 764 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 765 ExpectationSet usesMockAnimation; 766 767 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 768 .WillOnce(Return(mockAnimationPtr)); 769 770 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10)); 771 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0)); 772 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true)); 773 774 EXPECT_CALL(*mockAnimationPtr, delete_()) 775 .Times(1) 776 .After(usesMockAnimation); 777 EXPECT_CALL(*mockCurvePtr, delete_()) 778 .Times(1) 779 .After(usesMockCurve); 780 781 // Go! 782 setCompositorForTesting(mockCompositor); 783 Vector<OwnPtr<blink::WebAnimation> > result; 784 getAnimationOnCompositor(m_timing, *effect.get(), result); 785 EXPECT_EQ(1U, result.size()); 786 result[0].clear(); 787 } 788 789 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimation) 790 { 791 RefPtr<TimingFunction> cubicEasyFlipTimingFunction = CubicBezierTimingFunction::create(0.0, 0.0, 0.0, 1.0); 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(CubicBezierTimingFunction::preset(CubicBezierTimingFunction::EaseIn)); 800 frames[1]->setEasing(m_linearTimingFunction.get()); 801 frames[2]->setEasing(cubicEasyFlipTimingFunction.get()); 802 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = AnimatableValueKeyframeEffectModel::create(frames); 803 804 m_timing.timingFunction = m_linearTimingFunction.get(); 805 m_timing.iterationCount = 10; 806 m_timing.direction = Timing::PlaybackDirectionAlternateReverse; 807 // -- 808 809 WebCompositorSupportMock mockCompositor; 810 811 // Curve is created 812 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock(); 813 ExpectationSet usesMockCurve; 814 815 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 816 .WillOnce(Return(mockCurvePtr)); 817 818 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 5.0), 1.0, 0.0, 1.0, 1.0)); 819 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.5, 20.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 820 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.75, -1.0), blink::WebAnimationCurve::TimingFunctionTypeEaseOut)); 821 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.0, 2.0))); 822 823 // Create the animation 824 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 825 ExpectationSet usesMockAnimation; 826 827 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 828 .WillOnce(Return(mockAnimationPtr)); 829 830 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(10)); 831 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(0.0)); 832 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true)); 833 834 EXPECT_CALL(*mockAnimationPtr, delete_()) 835 .Times(1) 836 .After(usesMockAnimation); 837 EXPECT_CALL(*mockCurvePtr, delete_()) 838 .Times(1) 839 .After(usesMockCurve); 840 841 // Go! 842 setCompositorForTesting(mockCompositor); 843 Vector<OwnPtr<blink::WebAnimation> > result; 844 getAnimationOnCompositor(m_timing, *effect.get(), result); 845 EXPECT_EQ(1U, result.size()); 846 result[0].clear(); 847 } 848 849 TEST_F(AnimationCompositorAnimationsTest, createReversedOpacityAnimationNegativeStartDelay) 850 { 851 // Animation to convert 852 RefPtrWillBeRawPtr<AnimatableValueKeyframeEffectModel> effect = createKeyframeEffectModel( 853 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(2.0).get(), 0), 854 createReplaceOpKeyframe(CSSPropertyOpacity, AnimatableDouble::create(5.0).get(), 1.0)); 855 856 m_timing.iterationCount = 5.0; 857 m_timing.iterationDuration = 1.5; 858 m_timing.startDelay = -3; 859 m_timing.direction = Timing::PlaybackDirectionAlternateReverse; 860 // -- 861 862 WebCompositorSupportMock mockCompositor; 863 864 // Curve is created 865 blink::WebFloatAnimationCurveMock* mockCurvePtr = new blink::WebFloatAnimationCurveMock; 866 ExpectationSet usesMockCurve; 867 EXPECT_CALL(mockCompositor, createFloatAnimationCurve()) 868 .WillOnce(Return(mockCurvePtr)); 869 870 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(0.0, 5.0), blink::WebAnimationCurve::TimingFunctionTypeLinear)); 871 usesMockCurve += EXPECT_CALL(*mockCurvePtr, add(blink::WebFloatKeyframe(1.5, 2.0))); 872 873 // Create animation 874 blink::WebAnimationMock* mockAnimationPtr = new blink::WebAnimationMock(blink::WebAnimation::TargetPropertyOpacity); 875 ExpectationSet usesMockAnimation; 876 877 usesMockCurve += EXPECT_CALL(mockCompositor, createAnimation(Ref(*mockCurvePtr), blink::WebAnimation::TargetPropertyOpacity, _)) 878 .WillOnce(Return(mockAnimationPtr)); 879 880 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setIterations(5)); 881 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setTimeOffset(3.0)); 882 usesMockAnimation += EXPECT_CALL(*mockAnimationPtr, setAlternatesDirection(true)); 883 884 EXPECT_CALL(*mockAnimationPtr, delete_()) 885 .Times(1) 886 .After(usesMockAnimation); 887 EXPECT_CALL(*mockCurvePtr, delete_()) 888 .Times(1) 889 .After(usesMockCurve); 890 891 // Go! 892 setCompositorForTesting(mockCompositor); 893 Vector<OwnPtr<blink::WebAnimation> > result; 894 getAnimationOnCompositor(m_timing, *effect.get(), result); 895 EXPECT_EQ(1U, result.size()); 896 result[0].clear(); 897 } 898 899 900 } // namespace WebCore 901