Chromium Code Reviews| Index: ash/wm/window_animations_unittest.cc |
| diff --git a/ash/wm/window_animations_unittest.cc b/ash/wm/window_animations_unittest.cc |
| index c2ea1f6365f1dfa584e993235e801797ee8cd923..c2ef52059e29a6c0a2fd0b3fb9b1319850987f09 100644 |
| --- a/ash/wm/window_animations_unittest.cc |
| +++ b/ash/wm/window_animations_unittest.cc |
| @@ -6,13 +6,16 @@ |
| #include "ash/shell_window_ids.h" |
| #include "ash/test/ash_test_base.h" |
| +#include "ash/wm/window_state.h" |
| #include "ash/wm/workspace_controller.h" |
| #include "base/time/time.h" |
| #include "ui/aura/test/test_windows.h" |
| #include "ui/aura/window.h" |
| #include "ui/compositor/layer.h" |
| +#include "ui/compositor/layer_animation_observer.h" |
| #include "ui/compositor/layer_animator.h" |
| #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
| +#include "ui/compositor/scoped_layer_animation_settings.h" |
| #include "ui/gfx/animation/animation_container_element.h" |
| using aura::Window; |
| @@ -133,5 +136,107 @@ TEST_F(WindowAnimationsTest, CrossFadeToBounds) { |
| Step(base::TimeTicks::Now() + base::TimeDelta::FromSeconds(1)); |
| } |
| +TEST_F(WindowAnimationsTest, LockAnimationDuration) { |
| + ui::ScopedAnimationDurationScaleMode long_duration( |
|
James Cook
2013/12/02 18:33:51
Did you mean normal_duration? Or is this long rela
varkha
2013/12/02 20:18:09
I was meaning to do something else and ended up le
|
| + ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); |
| + |
| + scoped_ptr<Window> window(CreateTestWindowInShellWithId(0)); |
| + Layer* layer = window->layer(); |
| + window->SetBounds(gfx::Rect(5, 10, 320, 240)); |
| + window->Show(); |
| + |
| + // Test that it is possible to override transition duration when it is not |
| + // locked. |
| + { |
| + ui::ScopedLayerAnimationSettings settings1(layer->GetAnimator()); |
| + settings1.SetTransitionDuration(base::TimeDelta::FromMilliseconds(1000)); |
| + { |
| + ui::ScopedLayerAnimationSettings settings2(layer->GetAnimator()); |
| + // Duration is not locked so it gets overridden. |
| + settings2.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50)); |
| + wm::GetWindowState(window.get())->Minimize(); |
| + EXPECT_TRUE(layer->GetAnimator()->is_animating()); |
| + // Expect duration from the inner scope |
| + EXPECT_EQ(50, |
| + layer->GetAnimator()->GetTransitionDuration().InMilliseconds()); |
| + } |
| + window->Show(); |
| + layer->GetAnimator()->StopAnimating(); |
| + } |
| + |
| + // Test that it is possible to lock transition duration |
| + { |
| + ui::ScopedLayerAnimationSettings settings1(layer->GetAnimator()); |
| + settings1.SetTransitionDuration(base::TimeDelta::FromMilliseconds(1000)); |
| + // Duration is locked in outer scope. |
| + settings1.LockTransitionDuration(); |
| + { |
| + ui::ScopedLayerAnimationSettings settings2(layer->GetAnimator()); |
| + // Transition duration setting is ignored. |
| + settings2.SetTransitionDuration(base::TimeDelta::FromMilliseconds(50)); |
| + wm::GetWindowState(window.get())->Minimize(); |
| + EXPECT_TRUE(layer->GetAnimator()->is_animating()); |
| + // Expect duration from the outer scope |
| + EXPECT_EQ(1000, |
| + layer->GetAnimator()->GetTransitionDuration().InMilliseconds()); |
| + } |
| + window->Show(); |
| + layer->GetAnimator()->StopAnimating(); |
| + } |
| + |
| + // Listens to animation scheduled notifications. Remembers the transition |
| + // duration of the first sequence. |
| + class MinimizeAnimationObserver : public ui::LayerAnimationObserver { |
|
James Cook
2013/12/02 18:33:51
optional nit: It's unusual to see classes declared
varkha
2013/12/02 20:18:09
Done.
|
| + public: |
| + MinimizeAnimationObserver(ui::LayerAnimator* animator) |
|
James Cook
2013/12/02 18:33:51
nit: explicit
varkha
2013/12/02 20:18:09
Done.
|
| + : animator_(animator) { |
| + animator_->AddObserver(this); |
| + }; |
| + virtual ~MinimizeAnimationObserver() { |
| + animator_->RemoveObserver(this); |
| + }; |
| + base::TimeDelta duration() { return duration_; } |
| + |
| + protected: |
| + // ui::LayerAnimationObserver: |
| + virtual void OnLayerAnimationScheduled( |
| + ui::LayerAnimationSequence* sequence) OVERRIDE { |
| + duration_ = animator_->GetTransitionDuration(); |
| + animator_->RemoveObserver(this); |
|
James Cook
2013/12/02 18:33:51
Do you need to remove the observer in two places?
varkha
2013/12/02 20:18:09
I wanted to add an assert about !HasObserver in th
|
| + } |
| + virtual void OnLayerAnimationEnded( |
| + ui::LayerAnimationSequence* sequence) OVERRIDE {} |
| + virtual void OnLayerAnimationAborted( |
| + ui::LayerAnimationSequence* sequence) OVERRIDE {} |
| + |
| + private: |
| + ui::LayerAnimator* animator_; |
| + base::TimeDelta duration_; |
| + }; |
| + |
| + // Test that duration respects default. |
| + { |
| + // Query default duration. |
| + MinimizeAnimationObserver observer(layer->GetAnimator()); |
| + wm::GetWindowState(window.get())->Minimize(); |
| + EXPECT_TRUE(layer->GetAnimator()->is_animating()); |
| + base::TimeDelta default_duration(observer.duration()); |
| + window->Show(); |
| + layer->GetAnimator()->StopAnimating(); |
| + |
| + ui::ScopedLayerAnimationSettings settings(layer->GetAnimator()); |
| + settings.LockTransitionDuration(); |
| + // Setting transition duration is ignored since duration is locked |
| + settings.SetTransitionDuration(base::TimeDelta::FromMilliseconds(1000)); |
| + wm::GetWindowState(window.get())->Minimize(); |
| + EXPECT_TRUE(layer->GetAnimator()->is_animating()); |
| + // Expect default duration (200ms for stock ash minimizing animation). |
| + EXPECT_EQ(default_duration.InMilliseconds(), |
| + layer->GetAnimator()->GetTransitionDuration().InMilliseconds()); |
| + window->Show(); |
| + layer->GetAnimator()->StopAnimating(); |
| + } |
| +} |
| + |
| } // namespace internal |
| } // namespace ash |