OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/aura/window.h" | 5 #include "ui/aura/window.h" |
6 | 6 |
7 #include <string> | 7 #include <string> |
8 #include <utility> | 8 #include <utility> |
9 #include <vector> | 9 #include <vector> |
10 | 10 |
(...skipping 13 matching lines...) Expand all Loading... |
24 #include "ui/aura/test/test_window_delegate.h" | 24 #include "ui/aura/test/test_window_delegate.h" |
25 #include "ui/aura/test/test_windows.h" | 25 #include "ui/aura/test/test_windows.h" |
26 #include "ui/aura/test/window_test_api.h" | 26 #include "ui/aura/test/window_test_api.h" |
27 #include "ui/aura/window_delegate.h" | 27 #include "ui/aura/window_delegate.h" |
28 #include "ui/aura/window_event_dispatcher.h" | 28 #include "ui/aura/window_event_dispatcher.h" |
29 #include "ui/aura/window_observer.h" | 29 #include "ui/aura/window_observer.h" |
30 #include "ui/aura/window_property.h" | 30 #include "ui/aura/window_property.h" |
31 #include "ui/aura/window_tree_host.h" | 31 #include "ui/aura/window_tree_host.h" |
32 #include "ui/base/hit_test.h" | 32 #include "ui/base/hit_test.h" |
33 #include "ui/compositor/layer.h" | 33 #include "ui/compositor/layer.h" |
| 34 #include "ui/compositor/layer_animation_observer.h" |
34 #include "ui/compositor/scoped_animation_duration_scale_mode.h" | 35 #include "ui/compositor/scoped_animation_duration_scale_mode.h" |
35 #include "ui/compositor/scoped_layer_animation_settings.h" | 36 #include "ui/compositor/scoped_layer_animation_settings.h" |
36 #include "ui/compositor/test/test_layers.h" | 37 #include "ui/compositor/test/test_layers.h" |
37 #include "ui/events/event.h" | 38 #include "ui/events/event.h" |
38 #include "ui/events/event_utils.h" | 39 #include "ui/events/event_utils.h" |
39 #include "ui/events/gestures/gesture_configuration.h" | 40 #include "ui/events/gestures/gesture_configuration.h" |
40 #include "ui/events/keycodes/keyboard_codes.h" | 41 #include "ui/events/keycodes/keyboard_codes.h" |
41 #include "ui/gfx/canvas.h" | 42 #include "ui/gfx/canvas.h" |
42 #include "ui/gfx/screen.h" | 43 #include "ui/gfx/screen.h" |
43 #include "ui/gfx/skia_util.h" | 44 #include "ui/gfx/skia_util.h" |
(...skipping 1574 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1618 TEST_F(WindowTest, SetBoundsInternalShouldCheckTargetBounds) { | 1619 TEST_F(WindowTest, SetBoundsInternalShouldCheckTargetBounds) { |
1619 // We cannot short-circuit animations in this test. | 1620 // We cannot short-circuit animations in this test. |
1620 ui::ScopedAnimationDurationScaleMode normal_duration_mode( | 1621 ui::ScopedAnimationDurationScaleMode normal_duration_mode( |
1621 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); | 1622 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); |
1622 | 1623 |
1623 scoped_ptr<Window> w1( | 1624 scoped_ptr<Window> w1( |
1624 CreateTestWindowWithBounds(gfx::Rect(0, 0, 100, 100), root_window())); | 1625 CreateTestWindowWithBounds(gfx::Rect(0, 0, 100, 100), root_window())); |
1625 | 1626 |
1626 EXPECT_FALSE(!w1->layer()); | 1627 EXPECT_FALSE(!w1->layer()); |
1627 w1->layer()->GetAnimator()->set_disable_timer_for_test(true); | 1628 w1->layer()->GetAnimator()->set_disable_timer_for_test(true); |
1628 gfx::AnimationContainerElement* element = w1->layer()->GetAnimator(); | 1629 ui::LayerAnimator* animator = w1->layer()->GetAnimator(); |
1629 | 1630 |
1630 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); | 1631 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); |
1631 EXPECT_EQ("0,0 100x100", w1->layer()->GetTargetBounds().ToString()); | 1632 EXPECT_EQ("0,0 100x100", w1->layer()->GetTargetBounds().ToString()); |
1632 | 1633 |
1633 // Animate to a different position. | 1634 // Animate to a different position. |
1634 { | 1635 { |
1635 ui::ScopedLayerAnimationSettings settings(w1->layer()->GetAnimator()); | 1636 ui::ScopedLayerAnimationSettings settings(w1->layer()->GetAnimator()); |
1636 w1->SetBounds(gfx::Rect(100, 100, 100, 100)); | 1637 w1->SetBounds(gfx::Rect(100, 100, 100, 100)); |
1637 } | 1638 } |
1638 | 1639 |
1639 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); | 1640 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); |
1640 EXPECT_EQ("100,100 100x100", w1->layer()->GetTargetBounds().ToString()); | 1641 EXPECT_EQ("100,100 100x100", w1->layer()->GetTargetBounds().ToString()); |
1641 | 1642 |
1642 // Animate back to the first position. The animation hasn't started yet, so | 1643 // Animate back to the first position. The animation hasn't started yet, so |
1643 // the current bounds are still (0, 0, 100, 100), but the target bounds are | 1644 // the current bounds are still (0, 0, 100, 100), but the target bounds are |
1644 // (100, 100, 100, 100). If we step the animator ahead, we should find that | 1645 // (100, 100, 100, 100). If we step the animator ahead, we should find that |
1645 // we're at (0, 0, 100, 100). That is, the second animation should be applied. | 1646 // we're at (0, 0, 100, 100). That is, the second animation should be applied. |
1646 { | 1647 { |
1647 ui::ScopedLayerAnimationSettings settings(w1->layer()->GetAnimator()); | 1648 ui::ScopedLayerAnimationSettings settings(w1->layer()->GetAnimator()); |
1648 w1->SetBounds(gfx::Rect(0, 0, 100, 100)); | 1649 w1->SetBounds(gfx::Rect(0, 0, 100, 100)); |
1649 } | 1650 } |
1650 | 1651 |
1651 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); | 1652 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); |
1652 EXPECT_EQ("0,0 100x100", w1->layer()->GetTargetBounds().ToString()); | 1653 EXPECT_EQ("0,0 100x100", w1->layer()->GetTargetBounds().ToString()); |
1653 | 1654 |
1654 // Confirm that the target bounds are reached. | 1655 // Confirm that the target bounds are reached. |
1655 base::TimeTicks start_time = | 1656 base::TimeTicks start_time = |
1656 w1->layer()->GetAnimator()->last_step_time(); | 1657 w1->layer()->GetAnimator()->last_step_time(); |
1657 | 1658 |
1658 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); | 1659 animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); |
1659 | 1660 |
1660 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); | 1661 EXPECT_EQ("0,0 100x100", w1->bounds().ToString()); |
1661 } | 1662 } |
1662 | 1663 |
1663 | 1664 |
1664 typedef std::pair<const void*, intptr_t> PropertyChangeInfo; | 1665 typedef std::pair<const void*, intptr_t> PropertyChangeInfo; |
1665 | 1666 |
1666 class WindowObserverTest : public WindowTest, | 1667 class WindowObserverTest : public WindowTest, |
1667 public WindowObserver { | 1668 public WindowObserver { |
1668 public: | 1669 public: |
(...skipping 698 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2367 window->SetBounds(gfx::Rect(100, 100, 100, 100)); | 2368 window->SetBounds(gfx::Rect(100, 100, 100, 100)); |
2368 } | 2369 } |
2369 | 2370 |
2370 // Bounds shouldn't immediately have changed. | 2371 // Bounds shouldn't immediately have changed. |
2371 EXPECT_EQ("0,0 100x100", window->bounds().ToString()); | 2372 EXPECT_EQ("0,0 100x100", window->bounds().ToString()); |
2372 EXPECT_FALSE(delegate.bounds_changed()); | 2373 EXPECT_FALSE(delegate.bounds_changed()); |
2373 | 2374 |
2374 // Animate to the end, which should notify of the change. | 2375 // Animate to the end, which should notify of the change. |
2375 base::TimeTicks start_time = | 2376 base::TimeTicks start_time = |
2376 window->layer()->GetAnimator()->last_step_time(); | 2377 window->layer()->GetAnimator()->last_step_time(); |
2377 gfx::AnimationContainerElement* element = window->layer()->GetAnimator(); | 2378 ui::LayerAnimator* animator = window->layer()->GetAnimator(); |
2378 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); | 2379 animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); |
2379 EXPECT_TRUE(delegate.bounds_changed()); | 2380 EXPECT_TRUE(delegate.bounds_changed()); |
2380 EXPECT_NE("0,0 100x100", window->bounds().ToString()); | 2381 EXPECT_NE("0,0 100x100", window->bounds().ToString()); |
2381 } | 2382 } |
2382 | 2383 |
2383 // Verifies the delegate is notified when the actual bounds of the layer | 2384 // Verifies the delegate is notified when the actual bounds of the layer |
2384 // change even when the window is not the layer's delegate | 2385 // change even when the window is not the layer's delegate |
2385 TEST_F(WindowTest, DelegateNotifiedAsBoundsChangeInHiddenLayer) { | 2386 TEST_F(WindowTest, DelegateNotifiedAsBoundsChangeInHiddenLayer) { |
2386 BoundsChangeDelegate delegate; | 2387 BoundsChangeDelegate delegate; |
2387 | 2388 |
2388 // We cannot short-circuit animations in this test. | 2389 // We cannot short-circuit animations in this test. |
(...skipping 20 matching lines...) Expand all Loading... |
2409 | 2410 |
2410 // Layer delegate is NULL but we should still get bounds changed notification. | 2411 // Layer delegate is NULL but we should still get bounds changed notification. |
2411 EXPECT_EQ("100,100 110x100", window->GetTargetBounds().ToString()); | 2412 EXPECT_EQ("100,100 110x100", window->GetTargetBounds().ToString()); |
2412 EXPECT_TRUE(delegate.bounds_changed()); | 2413 EXPECT_TRUE(delegate.bounds_changed()); |
2413 | 2414 |
2414 delegate.clear_bounds_changed(); | 2415 delegate.clear_bounds_changed(); |
2415 | 2416 |
2416 // Animate to the end: will *not* notify of the change since we are hidden. | 2417 // Animate to the end: will *not* notify of the change since we are hidden. |
2417 base::TimeTicks start_time = | 2418 base::TimeTicks start_time = |
2418 window->layer()->GetAnimator()->last_step_time(); | 2419 window->layer()->GetAnimator()->last_step_time(); |
2419 gfx::AnimationContainerElement* element = window->layer()->GetAnimator(); | 2420 ui::LayerAnimator* animator = window->layer()->GetAnimator(); |
2420 element->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); | 2421 animator->Step(start_time + base::TimeDelta::FromMilliseconds(1000)); |
2421 | 2422 |
2422 // No bounds changed notification at the end of animation since layer | 2423 // No bounds changed notification at the end of animation since layer |
2423 // delegate is NULL. | 2424 // delegate is NULL. |
2424 EXPECT_FALSE(delegate.bounds_changed()); | 2425 EXPECT_FALSE(delegate.bounds_changed()); |
2425 EXPECT_NE("0,0 100x100", window->layer()->bounds().ToString()); | 2426 EXPECT_NE("0,0 100x100", window->layer()->bounds().ToString()); |
2426 } | 2427 } |
2427 | 2428 |
2428 namespace { | 2429 namespace { |
2429 | 2430 |
2430 // Used by AddChildNotifications to track notification counts. | 2431 // Used by AddChildNotifications to track notification counts. |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3340 } | 3341 } |
3341 EXPECT_EQ(data[i].expected_layer_description, | 3342 EXPECT_EQ(data[i].expected_layer_description, |
3342 BuildRootLayerTreeDescription(*root.layer())) | 3343 BuildRootLayerTreeDescription(*root.layer())) |
3343 << "layer tree doesn't match at " << i; | 3344 << "layer tree doesn't match at " << i; |
3344 EXPECT_EQ(data[i].expected_description, | 3345 EXPECT_EQ(data[i].expected_description, |
3345 BuildRootWindowTreeDescription(root)) | 3346 BuildRootWindowTreeDescription(root)) |
3346 << "window tree doesn't match at " << i; | 3347 << "window tree doesn't match at " << i; |
3347 } | 3348 } |
3348 } | 3349 } |
3349 | 3350 |
| 3351 namespace { |
| 3352 |
| 3353 class TestLayerAnimationObserver : public ui::LayerAnimationObserver { |
| 3354 public: |
| 3355 TestLayerAnimationObserver() |
| 3356 : animation_completed_(false), |
| 3357 animation_aborted_(false) {} |
| 3358 virtual ~TestLayerAnimationObserver() {} |
| 3359 |
| 3360 bool animation_completed() const { return animation_completed_; } |
| 3361 bool animation_aborted() const { return animation_aborted_; } |
| 3362 |
| 3363 void Reset() { |
| 3364 animation_completed_ = false; |
| 3365 animation_aborted_ = false; |
| 3366 } |
| 3367 |
| 3368 private: |
| 3369 // ui::LayerAnimationObserver: |
| 3370 virtual void OnLayerAnimationEnded( |
| 3371 ui::LayerAnimationSequence* sequence) OVERRIDE { |
| 3372 animation_completed_ = true; |
| 3373 } |
| 3374 |
| 3375 virtual void OnLayerAnimationAborted( |
| 3376 ui::LayerAnimationSequence* sequence) OVERRIDE { |
| 3377 animation_aborted_ = true; |
| 3378 } |
| 3379 |
| 3380 virtual void OnLayerAnimationScheduled( |
| 3381 ui::LayerAnimationSequence* sequence) OVERRIDE { |
| 3382 } |
| 3383 |
| 3384 bool animation_completed_; |
| 3385 bool animation_aborted_; |
| 3386 |
| 3387 DISALLOW_COPY_AND_ASSIGN(TestLayerAnimationObserver); |
| 3388 }; |
| 3389 |
| 3390 } |
| 3391 |
| 3392 TEST_F(WindowTest, WindowDestroyCompletesAnimations) { |
| 3393 ui::ScopedAnimationDurationScaleMode normal_duration_mode( |
| 3394 ui::ScopedAnimationDurationScaleMode::NORMAL_DURATION); |
| 3395 scoped_refptr<ui::LayerAnimator> animator = |
| 3396 ui::LayerAnimator::CreateImplicitAnimator(); |
| 3397 TestLayerAnimationObserver observer; |
| 3398 animator->AddObserver(&observer); |
| 3399 // Make sure destroying a Window completes the animation. |
| 3400 { |
| 3401 scoped_ptr<Window> window(CreateTestWindowWithId(1, root_window())); |
| 3402 window->layer()->SetAnimator(animator); |
| 3403 |
| 3404 gfx::Transform transform; |
| 3405 transform.Scale(0.5f, 0.5f); |
| 3406 window->SetTransform(transform); |
| 3407 |
| 3408 EXPECT_TRUE(animator->is_animating()); |
| 3409 EXPECT_FALSE(observer.animation_completed()); |
| 3410 } |
| 3411 EXPECT_TRUE(animator); |
| 3412 EXPECT_FALSE(animator->is_animating()); |
| 3413 EXPECT_TRUE(observer.animation_completed()); |
| 3414 EXPECT_FALSE(observer.animation_aborted()); |
| 3415 animator->RemoveObserver(&observer); |
| 3416 observer.Reset(); |
| 3417 |
| 3418 animator = ui::LayerAnimator::CreateImplicitAnimator(); |
| 3419 animator->AddObserver(&observer); |
| 3420 ui::Layer layer; |
| 3421 layer.SetAnimator(animator); |
| 3422 { |
| 3423 scoped_ptr<Window> window(CreateTestWindowWithId(1, root_window())); |
| 3424 window->layer()->Add(&layer); |
| 3425 |
| 3426 gfx::Transform transform; |
| 3427 transform.Scale(0.5f, 0.5f); |
| 3428 layer.SetTransform(transform); |
| 3429 |
| 3430 EXPECT_TRUE(animator->is_animating()); |
| 3431 EXPECT_FALSE(observer.animation_completed()); |
| 3432 } |
| 3433 |
| 3434 EXPECT_TRUE(animator); |
| 3435 EXPECT_FALSE(animator->is_animating()); |
| 3436 EXPECT_TRUE(observer.animation_completed()); |
| 3437 EXPECT_FALSE(observer.animation_aborted()); |
| 3438 animator->RemoveObserver(&observer); |
| 3439 } |
| 3440 |
3350 } // namespace test | 3441 } // namespace test |
3351 } // namespace aura | 3442 } // namespace aura |
OLD | NEW |