| Index: cc/animation/layer_animation_controller.cc | 
| diff --git a/cc/animation/layer_animation_controller.cc b/cc/animation/layer_animation_controller.cc | 
| index 3bac4a99c71ee3467d39f7054ad0767a3eb64d6a..527959107a80e88b4d312a0cd7f414b3c976de4d 100644 | 
| --- a/cc/animation/layer_animation_controller.cc | 
| +++ b/cc/animation/layer_animation_controller.cc | 
| @@ -19,8 +19,7 @@ | 
| namespace cc { | 
|  | 
| LayerAnimationController::LayerAnimationController(int id) | 
| -    : force_sync_(false), | 
| -      registrar_(0), | 
| +    : registrar_(0), | 
| id_(id), | 
| is_active_(false), | 
| last_tick_time_(0), | 
| @@ -106,20 +105,17 @@ void LayerAnimationController::AbortAnimations( | 
| void LayerAnimationController::PushAnimationUpdatesTo( | 
| LayerAnimationController* controller_impl) { | 
| DCHECK(this != controller_impl); | 
| -  if (force_sync_) { | 
| -    ReplaceImplThreadAnimations(controller_impl); | 
| -    force_sync_ = false; | 
| -  } else { | 
| -    PurgeAnimationsMarkedForDeletion(); | 
| -    PushNewAnimationsToImplThread(controller_impl); | 
| - | 
| -    // Remove finished impl side animations only after pushing, | 
| -    // and only after the animations are deleted on the main thread | 
| -    // this insures we will never push an animation twice. | 
| -    RemoveAnimationsCompletedOnMainThread(controller_impl); | 
| - | 
| -    PushPropertiesToImplThread(controller_impl); | 
| -  } | 
| +  if (!has_any_animation() && !controller_impl->has_any_animation()) | 
| +    return; | 
| +  PurgeAnimationsMarkedForDeletion(); | 
| +  PushNewAnimationsToImplThread(controller_impl); | 
| + | 
| +  // Remove finished impl side animations only after pushing, | 
| +  // and only after the animations are deleted on the main thread | 
| +  // this insures we will never push an animation twice. | 
| +  RemoveAnimationsCompletedOnMainThread(controller_impl); | 
| + | 
| +  PushPropertiesToImplThread(controller_impl); | 
| controller_impl->UpdateActivation(NormalActivation); | 
| UpdateActivation(NormalActivation); | 
| } | 
| @@ -601,6 +597,8 @@ void LayerAnimationController::ResolveConflicts(double monotonic_time) { | 
|  | 
| void LayerAnimationController::MarkAnimationsForDeletion( | 
| double monotonic_time, AnimationEventsVector* events) { | 
| +  bool marked_animations_for_deletions = false; | 
| + | 
| // Non-aborted animations are marked for deletion after a corresponding | 
| // AnimationEvent::Finished event is sent or received. This means that if | 
| // we don't have an events vector, we must ensure that non-aborted animations | 
| @@ -619,6 +617,7 @@ void LayerAnimationController::MarkAnimationsForDeletion( | 
| } | 
| active_animations_[i]->SetRunState(Animation::WaitingForDeletion, | 
| monotonic_time); | 
| +      marked_animations_for_deletions = true; | 
| continue; | 
| } | 
|  | 
| @@ -667,8 +666,11 @@ void LayerAnimationController::MarkAnimationsForDeletion( | 
| monotonic_time); | 
| } | 
| } | 
| +      marked_animations_for_deletions = true; | 
| } | 
| } | 
| +  if (marked_animations_for_deletions) | 
| +    NotifyObserversAnimationWaitingForDeletion(); | 
| } | 
|  | 
| static bool IsWaitingForDeletion(Animation* animation) { | 
| @@ -684,27 +686,6 @@ void LayerAnimationController::PurgeAnimationsMarkedForDeletion() { | 
| animations.end()); | 
| } | 
|  | 
| -void LayerAnimationController::ReplaceImplThreadAnimations( | 
| -    LayerAnimationController* controller_impl) const { | 
| -  controller_impl->active_animations_.clear(); | 
| -  for (size_t i = 0; i < active_animations_.size(); ++i) { | 
| -    scoped_ptr<Animation> to_add; | 
| -    if (active_animations_[i]->needs_synchronized_start_time()) { | 
| -      // We haven't received an animation started notification yet, so it | 
| -      // is important that we add it in a 'waiting' and not 'running' state. | 
| -      Animation::RunState initial_run_state = | 
| -          Animation::WaitingForTargetAvailability; | 
| -      double start_time = 0; | 
| -      to_add = active_animations_[i]->CloneAndInitialize( | 
| -          initial_run_state, start_time).Pass(); | 
| -    } else { | 
| -      to_add = active_animations_[i]->Clone().Pass(); | 
| -    } | 
| - | 
| -    controller_impl->AddAnimation(to_add.Pass()); | 
| -  } | 
| -} | 
| - | 
| void LayerAnimationController::TickAnimations(double monotonic_time) { | 
| for (size_t i = 0; i < active_animations_.size(); ++i) { | 
| if (active_animations_[i]->run_state() == Animation::Starting || | 
| @@ -792,6 +773,12 @@ void LayerAnimationController::NotifyObserversFilterAnimated( | 
| OnFilterAnimated(filters)); | 
| } | 
|  | 
| +void LayerAnimationController::NotifyObserversAnimationWaitingForDeletion() { | 
| +  FOR_EACH_OBSERVER(LayerAnimationValueObserver, | 
| +                    value_observers_, | 
| +                    OnAnimationWaitingForDeletion()); | 
| +} | 
| + | 
| bool LayerAnimationController::HasValueObserver() { | 
| if (value_observers_.might_have_observers()) { | 
| ObserverListBase<LayerAnimationValueObserver>::Iterator it( | 
|  |