Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 "cc/trees/layer_tree_host.h" | 5 #include "cc/trees/layer_tree_host.h" |
| 6 | 6 |
| 7 #include "cc/animation/animation_curve.h" | 7 #include "cc/animation/animation_curve.h" |
| 8 #include "cc/animation/animation_host.h" | 8 #include "cc/animation/animation_host.h" |
| 9 #include "cc/animation/animation_id_provider.h" | 9 #include "cc/animation/animation_id_provider.h" |
| 10 #include "cc/animation/animation_player.h" | 10 #include "cc/animation/animation_player.h" |
| (...skipping 559 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 570 int prevented_draw_; | 570 int prevented_draw_; |
| 571 int added_animations_; | 571 int added_animations_; |
| 572 int started_times_; | 572 int started_times_; |
| 573 FakeContentLayerClient client_; | 573 FakeContentLayerClient client_; |
| 574 scoped_refptr<FakePictureLayer> picture_; | 574 scoped_refptr<FakePictureLayer> picture_; |
| 575 }; | 575 }; |
| 576 | 576 |
| 577 MULTI_THREAD_TEST_F( | 577 MULTI_THREAD_TEST_F( |
| 578 LayerTreeHostTimelinesTestCheckerboardDoesntStartAnimations); | 578 LayerTreeHostTimelinesTestCheckerboardDoesntStartAnimations); |
| 579 | 579 |
| 580 // Verifies that scroll offset animations are only accepted when impl-scrolling | |
| 581 // is supported, and that when scroll offset animations are accepted, | |
| 582 // scroll offset updates are sent back to the main thread. | |
| 583 // Evolved from LayerTreeHostAnimationTestScrollOffsetChangesArePropagated | |
| 584 class LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated | |
| 585 : public LayerTreeHostTimelinesTest { | |
| 586 public: | |
| 587 LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated() {} | |
| 588 | |
| 589 void SetupTree() override { | |
| 590 LayerTreeHostTimelinesTest::SetupTree(); | |
| 591 | |
| 592 scroll_layer_ = FakePictureLayer::Create(layer_settings(), &client_); | |
| 593 scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id()); | |
| 594 scroll_layer_->SetBounds(gfx::Size(1000, 1000)); | |
| 595 scroll_layer_->SetScrollOffset(gfx::ScrollOffset(10, 20)); | |
| 596 layer_tree_host()->root_layer()->AddChild(scroll_layer_); | |
| 597 | |
| 598 AttachPlayersToTimeline(); | |
| 599 player_child_->AttachLayer(scroll_layer_->id()); | |
| 600 } | |
| 601 | |
| 602 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 603 | |
| 604 void DidCommit() override { | |
| 605 switch (layer_tree_host()->source_frame_number()) { | |
| 606 case 1: { | |
| 607 scoped_ptr<ScrollOffsetAnimationCurve> curve( | |
| 608 ScrollOffsetAnimationCurve::Create( | |
| 609 gfx::ScrollOffset(500.f, 550.f), | |
| 610 EaseInOutTimingFunction::Create())); | |
| 611 scoped_ptr<Animation> animation( | |
| 612 Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); | |
| 613 animation->set_needs_synchronized_start_time(true); | |
| 614 bool impl_scrolling_supported = | |
| 615 layer_tree_host()->proxy()->SupportsImplScrolling(); | |
| 616 if (impl_scrolling_supported) | |
| 617 player_child_->AddAnimation(animation.Pass()); | |
| 618 else | |
| 619 EndTest(); | |
| 620 break; | |
| 621 } | |
| 622 default: | |
| 623 if (scroll_layer_->scroll_offset().x() > 10 && | |
| 624 scroll_layer_->scroll_offset().y() > 20) | |
| 625 EndTest(); | |
| 626 } | |
| 627 } | |
| 628 | |
| 629 void AfterTest() override {} | |
| 630 | |
| 631 private: | |
| 632 FakeContentLayerClient client_; | |
| 633 scoped_refptr<FakePictureLayer> scroll_layer_; | |
| 634 }; | |
| 635 | |
| 636 SINGLE_AND_MULTI_THREAD_TEST_F( | |
| 637 LayerTreeHostTimelinesTestScrollOffsetChangesArePropagated); | |
| 638 | |
| 639 // Verifies that when the main thread removes a scroll animation and sets a new | |
| 640 // scroll position, the active tree takes on exactly this new scroll position | |
| 641 // after activation, and the main thread doesn't receive a spurious scroll | |
| 642 // delta. | |
| 643 // Evolved from LayerTreeHostAnimationTestScrollOffsetAnimationRemoval | |
| 644 class LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval | |
| 645 : public LayerTreeHostTimelinesTest { | |
| 646 public: | |
| 647 LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval() | |
| 648 : final_postion_(50.0, 100.0) {} | |
| 649 | |
| 650 void SetupTree() override { | |
| 651 LayerTreeHostTimelinesTest::SetupTree(); | |
| 652 | |
| 653 scroll_layer_ = FakePictureLayer::Create(layer_settings(), &client_); | |
| 654 scroll_layer_->SetScrollClipLayerId(layer_tree_host()->root_layer()->id()); | |
| 655 scroll_layer_->SetBounds(gfx::Size(10000, 10000)); | |
| 656 scroll_layer_->SetScrollOffset(gfx::ScrollOffset(100.0, 200.0)); | |
| 657 layer_tree_host()->root_layer()->AddChild(scroll_layer_); | |
| 658 | |
| 659 scoped_ptr<ScrollOffsetAnimationCurve> curve( | |
| 660 ScrollOffsetAnimationCurve::Create(gfx::ScrollOffset(6500.f, 7500.f), | |
| 661 EaseInOutTimingFunction::Create())); | |
| 662 scoped_ptr<Animation> animation( | |
| 663 Animation::Create(curve.Pass(), 1, 0, Animation::SCROLL_OFFSET)); | |
| 664 animation->set_needs_synchronized_start_time(true); | |
| 665 | |
| 666 AttachPlayersToTimeline(); | |
| 667 player_child_->AttachLayer(scroll_layer_->id()); | |
| 668 player_child_->AddAnimation(animation.Pass()); | |
| 669 } | |
| 670 | |
| 671 void BeginTest() override { PostSetNeedsCommitToMainThread(); } | |
| 672 | |
| 673 void BeginMainFrame(const BeginFrameArgs& args) override { | |
| 674 switch (layer_tree_host()->source_frame_number()) { | |
| 675 case 0: | |
| 676 break; | |
| 677 case 1: { | |
| 678 Animation* animation = player_child_->element_animations() | |
| 679 ->layer_animation_controller() | |
| 680 ->GetAnimation(Animation::SCROLL_OFFSET); | |
| 681 player_child_->RemoveAnimation(animation->id()); | |
| 682 scroll_layer_->SetScrollOffset(final_postion_); | |
| 683 break; | |
| 684 } | |
| 685 default: | |
| 686 EXPECT_EQ(final_postion_, scroll_layer_->scroll_offset()); | |
| 687 } | |
| 688 } | |
| 689 | |
| 690 void BeginCommitOnThread(LayerTreeHostImpl* host_impl) override { | |
| 691 host_impl->BlockNotifyReadyToActivateForTesting(true); | |
| 692 } | |
| 693 | |
| 694 void WillBeginImplFrameOnThread(LayerTreeHostImpl* host_impl, | |
| 695 const BeginFrameArgs& args) override { | |
| 696 if (!host_impl->pending_tree()) | |
| 697 return; | |
| 698 | |
| 699 if (!host_impl->active_tree()->root_layer()) { | |
| 700 host_impl->BlockNotifyReadyToActivateForTesting(false); | |
| 701 return; | |
| 702 } | |
| 703 | |
| 704 scoped_refptr<AnimationTimeline> timeline_impl = | |
| 705 host_impl->animation_host()->GetTimelineById(timeline_id_); | |
| 706 scoped_refptr<AnimationPlayer> player_impl = | |
| 707 timeline_impl->GetPlayerById(player_child_id_); | |
| 708 | |
| 709 LayerImpl* scroll_layer_impl = | |
| 710 host_impl->active_tree()->root_layer()->children()[0]; | |
| 711 Animation* animation = player_impl->element_animations() | |
| 712 ->layer_animation_controller() | |
| 713 ->GetAnimation(Animation::SCROLL_OFFSET); | |
| 714 | |
| 715 if (!animation || animation->run_state() != Animation::RUNNING) { | |
| 716 host_impl->BlockNotifyReadyToActivateForTesting(false); | |
| 717 return; | |
| 718 } | |
| 719 | |
| 720 // Block activation until the running animation has a chance to produce a | |
| 721 // scroll delta. | |
| 722 gfx::Vector2dF scroll_delta = scroll_layer_impl->ScrollDelta(); | |
| 723 if (scroll_delta.x() < 1.f || scroll_delta.y() < 1.f) | |
| 724 return; | |
| 725 | |
| 726 host_impl->BlockNotifyReadyToActivateForTesting(false); | |
| 727 } | |
| 728 | |
| 729 void WillActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { | |
| 730 if (host_impl->pending_tree()->source_frame_number() != 1) | |
| 731 return; | |
| 732 LayerImpl* scroll_layer_impl = | |
| 733 host_impl->pending_tree()->root_layer()->children()[0]; | |
| 734 EXPECT_EQ(final_postion_, scroll_layer_impl->CurrentScrollOffset()); | |
| 735 } | |
| 736 | |
| 737 void DidActivateTreeOnThread(LayerTreeHostImpl* host_impl) override { | |
| 738 if (host_impl->active_tree()->source_frame_number() != 1) | |
| 739 return; | |
| 740 LayerImpl* scroll_layer_impl = | |
| 741 host_impl->active_tree()->root_layer()->children()[0]; | |
| 742 EXPECT_EQ(final_postion_, scroll_layer_impl->CurrentScrollOffset()); | |
| 743 EndTest(); | |
| 744 } | |
| 745 | |
| 746 void AfterTest() override { | |
| 747 EXPECT_EQ(final_postion_, scroll_layer_->scroll_offset()); | |
| 748 } | |
| 749 | |
| 750 private: | |
| 751 FakeContentLayerClient client_; | |
| 752 scoped_refptr<FakePictureLayer> scroll_layer_; | |
| 753 const gfx::ScrollOffset final_postion_; | |
| 754 }; | |
| 755 | |
| 756 MULTI_THREAD_TEST_F(LayerTreeHostTimelinesTestScrollOffsetAnimationRemoval); | |
| 757 | |
|
ajuma
2015/07/06 17:41:00
Thanks for porting over these tests! These don't u
loyso (OOO)
2015/07/07 04:14:38
Done.
| |
| 580 // When animations are simultaneously added to an existing layer and to a new | 758 // When animations are simultaneously added to an existing layer and to a new |
| 581 // layer, they should start at the same time, even when there's already a | 759 // layer, they should start at the same time, even when there's already a |
| 582 // running animation on the existing layer. | 760 // running animation on the existing layer. |
| 583 // Evolved from LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers. | 761 // Evolved from LayerTreeHostAnimationTestAnimationsAddedToNewAndExistingLayers. |
| 584 class LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers | 762 class LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers |
| 585 : public LayerTreeHostTimelinesTest { | 763 : public LayerTreeHostTimelinesTest { |
| 586 public: | 764 public: |
| 587 LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers() | 765 LayerTreeHostTimelinesTestAnimationsAddedToNewAndExistingLayers() |
| 588 : frame_count_with_pending_tree_(0) {} | 766 : frame_count_with_pending_tree_(0) {} |
| 589 | 767 |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 736 | 914 |
| 737 private: | 915 private: |
| 738 scoped_refptr<Layer> content_; | 916 scoped_refptr<Layer> content_; |
| 739 }; | 917 }; |
| 740 | 918 |
| 741 SINGLE_AND_MULTI_THREAD_TEST_F( | 919 SINGLE_AND_MULTI_THREAD_TEST_F( |
| 742 LayerTreeHostTimelinesTestAddAnimationAfterAnimating); | 920 LayerTreeHostTimelinesTestAddAnimationAfterAnimating); |
| 743 | 921 |
| 744 } // namespace | 922 } // namespace |
| 745 } // namespace cc | 923 } // namespace cc |
| OLD | NEW |