| Index: ui/gfx/compositor/layer_animator.cc | 
| diff --git a/ui/gfx/compositor/layer_animator.cc b/ui/gfx/compositor/layer_animator.cc | 
| index e737377c86c600ca0674470eba190fc75b18ee7f..8004c5cdea2d08439903dcbcbde340f8e4605d5b 100644 | 
| --- a/ui/gfx/compositor/layer_animator.cc | 
| +++ b/ui/gfx/compositor/layer_animator.cc | 
| @@ -10,7 +10,7 @@ | 
| #include "ui/base/animation/animation_container.h" | 
| #include "ui/gfx/compositor/compositor.h" | 
| #include "ui/gfx/compositor/layer.h" | 
| -#include "ui/gfx/compositor/layer_animation_delegate.h" | 
| +#include "ui/gfx/compositor/layer_animator_delegate.h" | 
| #include "ui/gfx/compositor/layer_animation_sequence.h" | 
|  | 
| namespace ui { | 
| @@ -20,7 +20,7 @@ class LayerAnimator; | 
| namespace { | 
|  | 
| static const base::TimeDelta kDefaultTransitionDuration = | 
| -    base::TimeDelta::FromMilliseconds(250); | 
| +    base::TimeDelta::FromMilliseconds(200); | 
|  | 
| static const base::TimeDelta kTimerInterval = | 
| base::TimeDelta::FromMilliseconds(10); | 
| @@ -55,30 +55,45 @@ void LayerAnimator::SetTransform(const Transform& transform) { | 
| if (transition_duration_ == base::TimeDelta()) | 
| delegate_->SetTransformFromAnimation(transform); | 
| else | 
| -    StartAnimation(new LayerAnimationSequence( | 
| -        LayerAnimationElement::CreateTransformElement(transform, | 
| -                                                      transition_duration_))); | 
| +    StartAnimationElement(LayerAnimationElement::CreateTransformElement( | 
| +        transform, transition_duration_)); | 
| +} | 
| + | 
| +Transform LayerAnimator::GetTargetTransform() const { | 
| +  LayerAnimationElement::TargetValue target; | 
| +  GetTargetValue(&target); | 
| +  return target.transform; | 
| } | 
|  | 
| void LayerAnimator::SetBounds(const gfx::Rect& bounds) { | 
| if (transition_duration_ == base::TimeDelta()) | 
| delegate_->SetBoundsFromAnimation(bounds); | 
| else | 
| -    StartAnimation(new LayerAnimationSequence( | 
| -        LayerAnimationElement::CreateBoundsElement(bounds, | 
| -                                                   transition_duration_))); | 
| +    StartAnimationElement(LayerAnimationElement::CreateBoundsElement( | 
| +        bounds, transition_duration_)); | 
| +} | 
| + | 
| +gfx::Rect LayerAnimator::GetTargetBounds() const { | 
| +  LayerAnimationElement::TargetValue target; | 
| +  GetTargetValue(&target); | 
| +  return target.bounds; | 
| } | 
|  | 
| void LayerAnimator::SetOpacity(float opacity) { | 
| if (transition_duration_ == base::TimeDelta()) | 
| delegate_->SetOpacityFromAnimation(opacity); | 
| else | 
| -    StartAnimation(new LayerAnimationSequence( | 
| -        LayerAnimationElement::CreateOpacityElement(opacity, | 
| -                                                    transition_duration_))); | 
| +    StartAnimationElement(LayerAnimationElement::CreateOpacityElement( | 
| +        opacity, transition_duration_)); | 
| } | 
|  | 
| -void LayerAnimator::SetDelegate(LayerAnimationDelegate* delegate) { | 
| +float LayerAnimator::GetTargetOpacity() const { | 
| +  LayerAnimationElement::TargetValue target; | 
| +  GetTargetValue(&target); | 
| +  return target.opacity; | 
| +} | 
| + | 
| +void LayerAnimator::SetDelegate(LayerAnimatorDelegate* delegate) { | 
| DCHECK(delegate); | 
| delegate_ = delegate; | 
| } | 
| @@ -107,6 +122,7 @@ void LayerAnimator::StartAnimation(LayerAnimationSequence* animation) { | 
| } | 
| } | 
| FinishAnyAnimationWithZeroDuration(); | 
| +  UpdateAnimationState(); | 
| } | 
|  | 
| void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) { | 
| @@ -116,6 +132,7 @@ void LayerAnimator::ScheduleAnimation(LayerAnimationSequence* animation) { | 
| } else { | 
| StartSequenceImmediately(animation); | 
| } | 
| +  UpdateAnimationState(); | 
| } | 
|  | 
| void LayerAnimator::ScheduleTogether( | 
| @@ -141,6 +158,24 @@ void LayerAnimator::ScheduleTogether( | 
| for (iter = animations.begin(); iter != animations.end(); ++iter) { | 
| ScheduleAnimation(*iter); | 
| } | 
| + | 
| +  UpdateAnimationState(); | 
| +} | 
| + | 
| +void LayerAnimator::StartAnimationElement(LayerAnimationElement* animation) { | 
| +  StartAnimation(new LayerAnimationSequence(animation)); | 
| +} | 
| + | 
| +void LayerAnimator::ScheduleAnimationElement(LayerAnimationElement* animation) { | 
| +  ScheduleAnimation(new LayerAnimationSequence(animation)); | 
| +} | 
| + | 
| +void LayerAnimator::ScheduleElementsTogether( | 
| +    const std::vector<LayerAnimationElement*>& animations) { | 
| +  std::vector<LayerAnimationSequence*> sequences; | 
| +  for (size_t i = 0; i < animations.size(); ++i) | 
| +    sequences.push_back(new LayerAnimationSequence(animations[i])); | 
| +  ScheduleTogether(sequences); | 
| } | 
|  | 
| void LayerAnimator::StopAnimatingProperty( | 
| @@ -158,10 +193,24 @@ void LayerAnimator::StopAnimating() { | 
| FinishAnimation(running_animations_[0].sequence); | 
| } | 
|  | 
| +LayerAnimator::ScopedSettings::ScopedSettings(LayerAnimator* animator) | 
| +    : animator_(animator), | 
| +      old_transition_duration_(animator->transition_duration_) { | 
| +  SetTransitionDuration(kDefaultTransitionDuration); | 
| +} | 
| + | 
| +LayerAnimator::ScopedSettings::~ScopedSettings() { | 
| +  animator_->transition_duration_ = old_transition_duration_; | 
| +} | 
| + | 
| +void LayerAnimator::ScopedSettings::SetTransitionDuration( | 
| +    base::TimeDelta duration) { | 
| +  animator_->transition_duration_ = duration; | 
| +} | 
| + | 
| // LayerAnimator private ------------------------------------------------------- | 
|  | 
| void LayerAnimator::Step(base::TimeTicks now) { | 
| -  TRACE_EVENT0("LayerAnimator", "Step"); | 
| last_step_time_ = now; | 
| std::vector<LayerAnimationSequence*> to_finish; | 
| for (RunningAnimations::iterator iter = running_animations_.begin(); | 
| @@ -228,6 +277,7 @@ void LayerAnimator::RemoveAnimation(LayerAnimationSequence* sequence) { | 
|  | 
| void LayerAnimator::FinishAnimation(LayerAnimationSequence* sequence) { | 
| sequence->Progress(sequence->duration(), delegate()); | 
| +  delegate()->OnLayerAnimationEnded(sequence); | 
| RemoveAnimation(sequence); | 
| ProcessQueue(); | 
| UpdateAnimationState(); | 
| @@ -243,6 +293,7 @@ void LayerAnimator::FinishAnyAnimationWithZeroDuration() { | 
| if (running_animations_[i].sequence->duration() == base::TimeDelta()) { | 
| running_animations_[i].sequence->Progress( | 
| running_animations_[i].sequence->duration(), delegate()); | 
| +      delegate()->OnLayerAnimationEnded(running_animations_[i].sequence); | 
| RemoveAnimation(running_animations_[i].sequence); | 
| } else { | 
| ++i; | 
| @@ -300,11 +351,13 @@ void LayerAnimator::RemoveAllAnimationsWithACommonProperty( | 
| if (running_animations_[i].sequence->HasCommonProperty( | 
| sequence->properties())) { | 
| // Finish the animation. | 
| -      if (abort) | 
| +      if (abort){ | 
| running_animations_[i].sequence->Abort(); | 
| -      else | 
| +      } else { | 
| running_animations_[i].sequence->Progress( | 
| running_animations_[i].sequence->duration(), delegate()); | 
| +        delegate()->OnLayerAnimationEnded(running_animations_[i].sequence); | 
| +      } | 
| RemoveAnimation(running_animations_[i].sequence); | 
| } else { | 
| ++i; | 
| @@ -331,6 +384,7 @@ void LayerAnimator::ImmediatelySetNewTarget(LayerAnimationSequence* sequence) { | 
| const bool abort = false; | 
| RemoveAllAnimationsWithACommonProperty(sequence, abort); | 
| sequence->Progress(sequence->duration(), delegate()); | 
| +  delegate()->OnLayerAnimationEnded(sequence); | 
| RemoveAnimation(sequence); | 
| } | 
|  | 
| @@ -377,10 +431,8 @@ void LayerAnimator::ProcessQueue() { | 
| bool started_sequence = false; | 
| do { | 
| started_sequence = false; | 
| - | 
| // Build a list of all currently animated properties. | 
| LayerAnimationElement::AnimatableProperties animated; | 
| - | 
| for (RunningAnimations::const_iterator iter = running_animations_.begin(); | 
| iter != running_animations_.end(); ++iter) { | 
| animated.insert((*iter).sequence->properties().begin(), | 
| @@ -440,4 +492,12 @@ bool LayerAnimator::StartSequenceImmediately(LayerAnimationSequence* sequence) { | 
| return true; | 
| } | 
|  | 
| +void LayerAnimator::GetTargetValue( | 
| +    LayerAnimationElement::TargetValue* target) const { | 
| +  for (RunningAnimations::const_iterator iter = running_animations_.begin(); | 
| +       iter != running_animations_.end(); ++iter) { | 
| +    (*iter).sequence->GetTargetValue(target); | 
| +  } | 
| +} | 
| + | 
| }  // namespace ui | 
|  |