Chromium Code Reviews| Index: Source/core/animation/CompositorAnimations.cpp | 
| diff --git a/Source/core/animation/CompositorAnimations.cpp b/Source/core/animation/CompositorAnimations.cpp | 
| index 260a736d9f38e9f9cf54bf9f12237b104dcc4fef..728bf360866e564f76a4758ee1f5e8b792ed3eea 100644 | 
| --- a/Source/core/animation/CompositorAnimations.cpp | 
| +++ b/Source/core/animation/CompositorAnimations.cpp | 
| @@ -123,7 +123,7 @@ PassRefPtr<TimingFunction> CompositorAnimationsTimingFunctionReverser::reverse(c | 
| // CompositorAnimations public API | 
| // ----------------------------------------------------------------------- | 
| -bool CompositorAnimations::isCandidateForCompositorAnimation(const Timing& timing, const AnimationEffect& effect) | 
| +bool CompositorAnimations::isCandidateForCompositorAnimations(const Timing& timing, const AnimationEffect& effect) | 
| { | 
| const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(&effect); | 
| @@ -131,15 +131,16 @@ bool CompositorAnimations::isCandidateForCompositorAnimation(const Timing& timin | 
| && CompositorAnimationsImpl::isCandidateForCompositor(timing, keyframeEffect.getFrames()); | 
| } | 
| -bool CompositorAnimations::canStartCompositorAnimation(const Element& element) | 
| +bool CompositorAnimations::canStartCompositorAnimations(const Element& element) | 
| { | 
| return element.renderer() && element.renderer()->compositingState() == PaintsIntoOwnBacking; | 
| } | 
| -void CompositorAnimations::startCompositorAnimation(const Element& element, const Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimationIds) | 
| +bool CompositorAnimations::startCompositorAnimations(const Element& element, const Timing& timing, const AnimationEffect& effect, Vector<int>& startedAnimationIds) | 
| { | 
| - ASSERT(isCandidateForCompositorAnimation(timing, effect)); | 
| - ASSERT(canStartCompositorAnimation(element)); | 
| + ASSERT(startedAnimationIds.isEmpty()); | 
| + ASSERT(isCandidateForCompositorAnimations(timing, effect)); | 
| + ASSERT(canStartCompositorAnimations(element)); | 
| const KeyframeAnimationEffect& keyframeEffect = *toKeyframeAnimationEffect(&effect); | 
| @@ -147,19 +148,27 @@ void CompositorAnimations::startCompositorAnimation(const Element& element, cons | 
| ASSERT(layer); | 
| ASSERT(layer->renderBox()); | 
| - // FIXME: Should we check in some way if there is an animation already created? | 
| Vector<OwnPtr<blink::WebAnimation> > animations; | 
| CompositorAnimationsImpl::getCompositorAnimations(timing, keyframeEffect, animations, layer->renderBox()->pixelSnappedBorderBoxRect().size()); | 
| for (size_t i = 0; i < animations.size(); ++i) { | 
| - startedAnimationIds.append(animations[i]->id()); | 
| - layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(animations[i].release()); | 
| + int id = animations[i]->id(); | 
| + if (!layer->compositedLayerMapping()->mainGraphicsLayer()->addAnimation(animations[i].release())) { | 
| + // FIXME: We should know ahead of time whether these animations can be started. | 
| 
 
ajuma
2013/11/18 21:21:17
Note that for the old path, there's logic to avoid
 
dstockwell
2013/11/18 21:34:03
Thanks for taking a look. We have the same logic h
 
 | 
| + for (size_t j = 0; j < startedAnimationIds.size(); ++j) | 
| + cancelCompositorAnimations(element, startedAnimationIds[j]); | 
| + startedAnimationIds.clear(); | 
| + return false; | 
| + } | 
| + startedAnimationIds.append(id); | 
| } | 
| + return true; | 
| } | 
| -void CompositorAnimations::cancelCompositorAnimation(const Element& element, int id) | 
| +void CompositorAnimations::cancelCompositorAnimations(const Element& element, int id) | 
| { | 
| - // FIXME: Implement. | 
| - ASSERT_NOT_REACHED(); | 
| + if (!element.renderer() || element.renderer()->compositingState() != PaintsIntoOwnBacking) | 
| + return; | 
| + toRenderBoxModelObject(element.renderer())->layer()->compositedLayerMapping()->mainGraphicsLayer()->removeAnimation(id); | 
| } | 
| // ----------------------------------------------------------------------- | 
| @@ -246,7 +255,6 @@ bool CompositorAnimationsImpl::isCandidateForCompositor(const KeyframeAnimationE | 
| bool CompositorAnimationsImpl::isCandidateForCompositor(const Timing& timing, const KeyframeAnimationEffect::KeyframeVector& frames) | 
| { | 
| - | 
| CompositorTiming out; | 
| if (!convertTimingForCompositor(timing, out)) | 
| return false; |