Chromium Code Reviews| Index: content/browser/web_contents/aura/overscroll_window_animation_unittest.cc |
| diff --git a/content/browser/web_contents/aura/overscroll_window_animation_unittest.cc b/content/browser/web_contents/aura/overscroll_window_animation_unittest.cc |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..a96834ef772723f5136444bd39d938848f17e5c1 |
| --- /dev/null |
| +++ b/content/browser/web_contents/aura/overscroll_window_animation_unittest.cc |
| @@ -0,0 +1,226 @@ |
| +// Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| +// Use of this source code is governed by a BSD-style license that can be |
| +// found in the LICENSE file. |
| + |
| +#include "content/browser/web_contents/aura/overscroll_window_animation.h" |
|
mfomitchev
2015/03/26 15:36:00
I think we need a test for overscroll_window_deleg
Nina
2015/03/27 17:52:36
Done.
|
| + |
| +#include "testing/gtest/include/gtest/gtest.h" |
|
mfomitchev
2015/03/26 15:36:01
The old window slider tests have three tests which
Nina
2015/03/27 17:52:36
This should not be a problem IMHO, if the contents
|
| +#include "ui/aura/test/aura_test_base.h" |
| +#include "ui/aura/window.h" |
| +#include "ui/compositor/scoped_animation_duration_scale_mode.h" |
| +#include "ui/compositor/scoped_layer_animation_settings.h" |
| +#include "ui/compositor/test/layer_animator_test_controller.h" |
| +#include "ui/gfx/frame_time.h" |
| + |
| +namespace content { |
| + |
| +class OverscrollWindowAnimationTest |
| + : public OverscrollWindowAnimation::Delegate, |
| + public aura::test::AuraTestBase { |
| + public: |
| + OverscrollWindowAnimationTest() |
| + : create_window_(true), |
| + overscroll_started_(false), |
| + overscroll_completing_(false), |
| + overscroll_completed_(false), |
| + overscroll_aborted_(false), |
| + target_window_(nullptr) {} |
| + |
| + ~OverscrollWindowAnimationTest() override {} |
| + |
| + OverscrollWindowAnimation* owa() { return owa_.get(); } |
| + |
| + // Set to true to return a window in the Create*Window functions, false to |
| + // return null. |
| + void set_create_window(bool create_window) { create_window_ = create_window; } |
| + |
| + // The following functions indicate if the events have been called on this |
| + // delegate. |
| + bool overscroll_started() { return overscroll_started_; } |
| + bool overscroll_completing() { return overscroll_completing_; } |
| + bool overscroll_completed() { return overscroll_completed_; } |
| + bool overscroll_aborted() { return overscroll_aborted_; } |
| + |
| + void ResetFlags() { |
| + overscroll_started_ = false; |
| + overscroll_completing_ = false; |
| + overscroll_completed_ = false; |
| + overscroll_aborted_ = false; |
| + } |
| + |
| + protected: |
| + // aura::test::AuraTestBase: |
| + void SetUp() override { |
| + aura::test::AuraTestBase::SetUp(); |
| + target_window_.reset(CreateNormalWindow(0, root_window(), nullptr)); |
| + ResetFlags(); |
| + create_window_ = true; |
| + last_window_id_ = 0; |
| + owa_.reset(new OverscrollWindowAnimation(this)); |
| + } |
| + |
| + void TearDown() override { |
| + owa_.reset(); |
| + target_window_.reset(); |
| + aura::test::AuraTestBase::TearDown(); |
| + } |
| + |
| + // OverscrollWindowAnimation::Delegate: |
| + scoped_ptr<aura::Window> CreateFrontWindow() override { |
| + return CreateWindow(); |
| + } |
| + |
| + scoped_ptr<aura::Window> CreateBackWindow() override { |
| + return CreateWindow(); |
| + } |
| + |
| + aura::Window* GetTargetWindow() const override { |
| + return target_window_.get(); |
| + } |
| + |
| + void OnOverscrollCompleting() override { overscroll_completing_ = true; } |
| + |
| + void OnOverscrollCompleted(scoped_ptr<aura::Window> window) override { |
| + overscroll_completed_ = true; |
| + } |
| + |
| + void OnOverscrollAborted() override { overscroll_aborted_ = true; } |
| + |
| + private: |
| + // The overscroll window animation under test. |
| + scoped_ptr<OverscrollWindowAnimation> owa_; |
| + |
| + scoped_ptr<aura::Window> CreateWindow() { |
| + overscroll_started_ = true; |
| + if (create_window_) { |
| + return scoped_ptr<aura::Window>( |
| + CreateNormalWindow(++last_window_id_, root_window(), nullptr)); |
| + } |
| + return nullptr; |
| + } |
| + |
| + // Controls if we return a window for the window creation callbacks or not. |
| + bool create_window_; |
| + |
| + // State flags. |
| + bool overscroll_started_; |
| + bool overscroll_completing_; |
| + bool overscroll_completed_; |
| + bool overscroll_aborted_; |
| + |
| + int last_window_id_; |
| + |
| + // The dummy target window we provide. |
| + scoped_ptr<aura::Window> target_window_; |
| + |
| + DISALLOW_COPY_AND_ASSIGN(OverscrollWindowAnimationTest); |
| +}; |
| + |
| +// Tests a simple overscroll gesture. |
| +TEST_F(OverscrollWindowAnimationTest, BasicOverscroll) { |
|
mfomitchev
2015/03/26 15:36:00
what about north/south overscroll?
Nina
2015/03/27 17:52:36
We don't support it in OWD as we didn't support it
|
| + EXPECT_FALSE(owa()->is_active()); |
| + EXPECT_FALSE(overscroll_started()); |
| + EXPECT_FALSE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| + |
| + // Start an OVERSCROLL_EAST gesture. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_NONE, OVERSCROLL_EAST); |
| + EXPECT_TRUE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_FALSE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| + |
| + // Complete the overscroll. |
| + owa()->OnOverscrollComplete(OVERSCROLL_EAST); |
| + EXPECT_FALSE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_TRUE(overscroll_completing()); |
| + EXPECT_TRUE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| +} |
| + |
| +// Tests aborting an overscroll gesture. |
| +TEST_F(OverscrollWindowAnimationTest, BasicAbort) { |
| + // Start an OVERSCROLL_EAST gesture. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_NONE, OVERSCROLL_EAST); |
| + // Abort the overscroll. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_EAST, OVERSCROLL_NONE); |
| + EXPECT_FALSE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_FALSE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_TRUE(overscroll_aborted()); |
| +} |
| + |
| +// Tests starting an overscroll gesture when navigation is impossible. |
|
mfomitchev
2015/03/26 15:36:00
"when navigation is impossible" -> "when xyz windo
Nina
2015/03/27 17:52:36
Done.
|
| +TEST_F(OverscrollWindowAnimationTest, BasicCannotNavigate) { |
| + set_create_window(false); |
| + // Start an OVERSCROLL_EAST gesture. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_NONE, OVERSCROLL_EAST); |
| + EXPECT_FALSE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_FALSE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| +} |
| + |
| +// Tests starting an overscroll gesture while another one was in progress |
| +// completes the first one. |
| +TEST_F(OverscrollWindowAnimationTest, NewOverscrollCompletesPreviousGesture) { |
| + // This test requires a normal animation duration so that |
| + // OnImplicitAnimationsCancelled is not called as soon as the first overscroll |
| + // finishes. |
| + ui::ScopedAnimationDurationScaleMode normal_duration( |
| + ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); |
| + ui::LayerAnimator* animator = GetTargetWindow()->layer()->GetAnimator(); |
| + ui::ScopedLayerAnimationSettings settings(animator); |
| + animator->set_disable_timer_for_test(true); |
| + ui::LayerAnimatorTestController test_controller(animator); |
| + // Start an OVERSCROLL_EAST gesture. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_NONE, OVERSCROLL_EAST); |
| + |
| + // Finishes the OVERSCROLL_EAST gesture. At this point the window should be |
| + // being animated to its final position. |
| + owa()->OnOverscrollComplete(OVERSCROLL_EAST); |
| + EXPECT_TRUE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_TRUE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| + |
| + // Start another OVERSCROLL_EAST gesture. |
| + owa()->OnOverscrollModeChange(OVERSCROLL_NONE, OVERSCROLL_EAST); |
| + EXPECT_TRUE(owa()->is_active()); |
| + EXPECT_TRUE(overscroll_started()); |
| + EXPECT_TRUE(overscroll_completing()); |
| + EXPECT_TRUE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| + |
| + // Complete the overscroll gesture. |
| + ResetFlags(); |
| + owa()->OnOverscrollComplete(OVERSCROLL_EAST); |
| + |
| + base::TimeDelta duration = settings.GetTransitionDuration(); |
| + test_controller.StartThreadedAnimationsIfNeeded(); |
| + base::TimeTicks start_time = gfx::FrameTime::Now(); |
| + |
| + // Halfway through the animation, OverscrollCompleting should have been fired. |
| + animator->Step(start_time + duration / 2); |
| + EXPECT_TRUE(owa()->is_active()); |
| + EXPECT_FALSE(overscroll_started()); |
| + EXPECT_TRUE(overscroll_completing()); |
| + EXPECT_FALSE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| + |
| + // The animation has finished, OverscrollCompleted should have been fired. |
| + animator->Step(start_time + duration); |
| + EXPECT_FALSE(owa()->is_active()); |
| + EXPECT_FALSE(overscroll_started()); |
| + EXPECT_TRUE(overscroll_completing()); |
| + EXPECT_TRUE(overscroll_completed()); |
| + EXPECT_FALSE(overscroll_aborted()); |
| +} |
| + |
| +} // namespace content |