OLD | NEW |
1 // Copyright 2011 The Chromium Authors. All rights reserved. | 1 // Copyright 2011 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_impl.h" | 5 #include "cc/trees/layer_tree_host_impl.h" |
6 | 6 |
7 #include <stddef.h> | 7 #include <stddef.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <cmath> | 10 #include <cmath> |
11 #include <utility> | 11 #include <utility> |
12 | 12 |
13 #include "base/bind.h" | 13 #include "base/bind.h" |
14 #include "base/command_line.h" | 14 #include "base/command_line.h" |
15 #include "base/containers/hash_tables.h" | 15 #include "base/containers/hash_tables.h" |
16 #include "base/containers/scoped_ptr_hash_map.h" | 16 #include "base/containers/scoped_ptr_hash_map.h" |
17 #include "base/location.h" | 17 #include "base/location.h" |
18 #include "base/thread_task_runner_handle.h" | 18 #include "base/thread_task_runner_handle.h" |
19 #include "cc/animation/animation_events.h" | 19 #include "cc/animation/animation_events.h" |
20 #include "cc/animation/animation_host.h" | 20 #include "cc/animation/animation_host.h" |
21 #include "cc/animation/animation_id_provider.h" | 21 #include "cc/animation/animation_id_provider.h" |
22 #include "cc/animation/scrollbar_animation_controller_thinning.h" | 22 #include "cc/animation/scrollbar_animation_controller_thinning.h" |
23 #include "cc/animation/transform_operations.h" | 23 #include "cc/animation/transform_operations.h" |
24 #include "cc/base/math_util.h" | 24 #include "cc/base/math_util.h" |
| 25 #include "cc/input/main_thread_scrolling_reason.h" |
25 #include "cc/input/page_scale_animation.h" | 26 #include "cc/input/page_scale_animation.h" |
26 #include "cc/input/top_controls_manager.h" | 27 #include "cc/input/top_controls_manager.h" |
27 #include "cc/layers/append_quads_data.h" | 28 #include "cc/layers/append_quads_data.h" |
28 #include "cc/layers/delegated_renderer_layer_impl.h" | 29 #include "cc/layers/delegated_renderer_layer_impl.h" |
29 #include "cc/layers/heads_up_display_layer_impl.h" | 30 #include "cc/layers/heads_up_display_layer_impl.h" |
30 #include "cc/layers/io_surface_layer_impl.h" | 31 #include "cc/layers/io_surface_layer_impl.h" |
31 #include "cc/layers/layer_impl.h" | 32 #include "cc/layers/layer_impl.h" |
32 #include "cc/layers/painted_scrollbar_layer_impl.h" | 33 #include "cc/layers/painted_scrollbar_layer_impl.h" |
33 #include "cc/layers/render_surface_impl.h" | 34 #include "cc/layers/render_surface_impl.h" |
34 #include "cc/layers/solid_color_layer_impl.h" | 35 #include "cc/layers/solid_color_layer_impl.h" |
(...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
617 } | 618 } |
618 | 619 |
619 TEST_F(LayerTreeHostImplTest, ScrollRootCallsCommitAndRedraw) { | 620 TEST_F(LayerTreeHostImplTest, ScrollRootCallsCommitAndRedraw) { |
620 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 621 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
621 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 622 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
622 DrawFrame(); | 623 DrawFrame(); |
623 | 624 |
624 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 625 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
625 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 626 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
626 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 627 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
627 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 628 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
628 status.main_thread_scrolling_reasons); | 629 status.main_thread_scrolling_reasons); |
629 | 630 |
630 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), | 631 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), |
631 InputHandler::WHEEL)); | 632 InputHandler::WHEEL)); |
632 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); | 633 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); |
633 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(0, 10), | 634 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(0, 10), |
634 InputHandler::WHEEL)); | 635 InputHandler::WHEEL)); |
635 host_impl_->ScrollEnd(EndState().get()); | 636 host_impl_->ScrollEnd(EndState().get()); |
636 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), | 637 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), |
637 InputHandler::WHEEL)); | 638 InputHandler::WHEEL)); |
638 EXPECT_TRUE(did_request_redraw_); | 639 EXPECT_TRUE(did_request_redraw_); |
639 EXPECT_TRUE(did_request_commit_); | 640 EXPECT_TRUE(did_request_commit_); |
640 } | 641 } |
641 | 642 |
642 TEST_F(LayerTreeHostImplTest, ScrollActiveOnlyAfterScrollMovement) { | 643 TEST_F(LayerTreeHostImplTest, ScrollActiveOnlyAfterScrollMovement) { |
643 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 644 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
644 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 645 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
645 DrawFrame(); | 646 DrawFrame(); |
646 | 647 |
647 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 648 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
648 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 649 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
649 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 650 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
650 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 651 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
651 status.main_thread_scrolling_reasons); | 652 status.main_thread_scrolling_reasons); |
652 | 653 |
653 EXPECT_FALSE(host_impl_->IsActivelyScrolling()); | 654 EXPECT_FALSE(host_impl_->IsActivelyScrolling()); |
654 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); | 655 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); |
655 EXPECT_TRUE(host_impl_->IsActivelyScrolling()); | 656 EXPECT_TRUE(host_impl_->IsActivelyScrolling()); |
656 host_impl_->ScrollEnd(EndState().get()); | 657 host_impl_->ScrollEnd(EndState().get()); |
657 EXPECT_FALSE(host_impl_->IsActivelyScrolling()); | 658 EXPECT_FALSE(host_impl_->IsActivelyScrolling()); |
658 } | 659 } |
659 | 660 |
660 TEST_F(LayerTreeHostImplTest, ScrollWithoutRootLayer) { | 661 TEST_F(LayerTreeHostImplTest, ScrollWithoutRootLayer) { |
661 // We should not crash when trying to scroll an empty layer tree. | 662 // We should not crash when trying to scroll an empty layer tree. |
662 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 663 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
663 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 664 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
664 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 665 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
665 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 666 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
666 status.main_thread_scrolling_reasons); | 667 status.main_thread_scrolling_reasons); |
667 } | 668 } |
668 | 669 |
669 TEST_F(LayerTreeHostImplTest, ScrollWithoutRenderer) { | 670 TEST_F(LayerTreeHostImplTest, ScrollWithoutRenderer) { |
670 scoped_ptr<TestWebGraphicsContext3D> context_owned = | 671 scoped_ptr<TestWebGraphicsContext3D> context_owned = |
671 TestWebGraphicsContext3D::Create(); | 672 TestWebGraphicsContext3D::Create(); |
672 context_owned->set_context_lost(true); | 673 context_owned->set_context_lost(true); |
673 | 674 |
674 // Initialization will fail. | 675 // Initialization will fail. |
675 EXPECT_FALSE( | 676 EXPECT_FALSE( |
676 CreateHostImpl(DefaultSettings(), | 677 CreateHostImpl(DefaultSettings(), |
677 FakeOutputSurface::Create3d(std::move(context_owned)))); | 678 FakeOutputSurface::Create3d(std::move(context_owned)))); |
678 | 679 |
679 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 680 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
680 | 681 |
681 // We should not crash when trying to scroll after the renderer initialization | 682 // We should not crash when trying to scroll after the renderer initialization |
682 // fails. | 683 // fails. |
683 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 684 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
684 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 685 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
685 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 686 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
686 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 687 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
687 status.main_thread_scrolling_reasons); | 688 status.main_thread_scrolling_reasons); |
688 } | 689 } |
689 | 690 |
690 TEST_F(LayerTreeHostImplTest, ReplaceTreeWhileScrolling) { | 691 TEST_F(LayerTreeHostImplTest, ReplaceTreeWhileScrolling) { |
691 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 692 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
692 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 693 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
693 DrawFrame(); | 694 DrawFrame(); |
694 | 695 |
695 // We should not crash if the tree is replaced while we are scrolling. | 696 // We should not crash if the tree is replaced while we are scrolling. |
696 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 697 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
(...skipping 19 matching lines...) Expand all Loading... |
716 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 717 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
717 DrawFrame(); | 718 DrawFrame(); |
718 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 719 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
719 | 720 |
720 // With registered event handlers, wheel scrolls don't necessarily | 721 // With registered event handlers, wheel scrolls don't necessarily |
721 // have to go to the main thread. | 722 // have to go to the main thread. |
722 root->SetHaveWheelEventHandlers(true); | 723 root->SetHaveWheelEventHandlers(true); |
723 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 724 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
724 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 725 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
725 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 726 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
726 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 727 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
727 status.main_thread_scrolling_reasons); | 728 status.main_thread_scrolling_reasons); |
728 host_impl_->ScrollEnd(EndState().get()); | 729 host_impl_->ScrollEnd(EndState().get()); |
729 | 730 |
730 // But typically the scroll-blocks-on mode will require them to. | 731 // But typically the scroll-blocks-on mode will require them to. |
731 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT | | 732 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT | |
732 SCROLL_BLOCKS_ON_START_TOUCH); | 733 SCROLL_BLOCKS_ON_START_TOUCH); |
733 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 734 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
734 InputHandler::WHEEL); | 735 InputHandler::WHEEL); |
735 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 736 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
736 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 737 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 738 status.main_thread_scrolling_reasons); |
737 | 739 |
738 // But gesture scrolls can still be handled. | 740 // But gesture scrolls can still be handled. |
739 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 741 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
740 InputHandler::GESTURE); | 742 InputHandler::GESTURE); |
741 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 743 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
742 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 744 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
743 status.main_thread_scrolling_reasons); | 745 status.main_thread_scrolling_reasons); |
744 host_impl_->ScrollEnd(EndState().get()); | 746 host_impl_->ScrollEnd(EndState().get()); |
745 | 747 |
746 // And if the handlers go away, wheel scrolls can again be processed | 748 // And if the handlers go away, wheel scrolls can again be processed |
747 // on impl (despite the scroll-blocks-on mode). | 749 // on impl (despite the scroll-blocks-on mode). |
748 root->SetHaveWheelEventHandlers(false); | 750 root->SetHaveWheelEventHandlers(false); |
749 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 751 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
750 InputHandler::WHEEL); | 752 InputHandler::WHEEL); |
751 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 753 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
752 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 754 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
753 status.main_thread_scrolling_reasons); | 755 status.main_thread_scrolling_reasons); |
754 host_impl_->ScrollEnd(EndState().get()); | 756 host_impl_->ScrollEnd(EndState().get()); |
755 } | 757 } |
756 | 758 |
757 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnTouchEventHandlers) { | 759 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnTouchEventHandlers) { |
758 LayerImpl* scroll = SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 760 LayerImpl* scroll = SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
759 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 761 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
760 DrawFrame(); | 762 DrawFrame(); |
761 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 763 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
762 | 764 |
(...skipping 13 matching lines...) Expand all Loading... |
776 root->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 100, 100)); | 778 root->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 100, 100)); |
777 EXPECT_FALSE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 10))); | 779 EXPECT_FALSE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 10))); |
778 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_START_TOUCH | | 780 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_START_TOUCH | |
779 SCROLL_BLOCKS_ON_WHEEL_EVENT); | 781 SCROLL_BLOCKS_ON_WHEEL_EVENT); |
780 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 10))); | 782 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 10))); |
781 | 783 |
782 // But they don't influence the actual handling of the scroll gestures. | 784 // But they don't influence the actual handling of the scroll gestures. |
783 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 785 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
784 BeginState(gfx::Point()).get(), InputHandler::GESTURE); | 786 BeginState(gfx::Point()).get(), InputHandler::GESTURE); |
785 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 787 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
786 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 788 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
787 status.main_thread_scrolling_reasons); | 789 status.main_thread_scrolling_reasons); |
788 host_impl_->ScrollEnd(EndState().get()); | 790 host_impl_->ScrollEnd(EndState().get()); |
789 | 791 |
790 // It's the union of scroll-blocks-on mode bits across all layers in the | 792 // It's the union of scroll-blocks-on mode bits across all layers in the |
791 // scroll paret chain that matters. | 793 // scroll paret chain that matters. |
792 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); | 794 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); |
793 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_NONE); | 795 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_NONE); |
794 EXPECT_FALSE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); | 796 EXPECT_FALSE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); |
795 child->SetScrollBlocksOn(SCROLL_BLOCKS_ON_START_TOUCH); | 797 child->SetScrollBlocksOn(SCROLL_BLOCKS_ON_START_TOUCH); |
796 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); | 798 EXPECT_TRUE(host_impl_->DoTouchEventsBlockScrollAt(gfx::Point(10, 30))); |
797 } | 799 } |
798 | 800 |
799 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnScrollEventHandlers) { | 801 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnScrollEventHandlers) { |
800 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 802 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
801 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 803 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
802 DrawFrame(); | 804 DrawFrame(); |
803 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 805 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
804 | 806 |
805 // With registered scroll handlers, scrolls don't generally have to go | 807 // With registered scroll handlers, scrolls don't generally have to go |
806 // to the main thread. | 808 // to the main thread. |
807 root->SetHaveScrollEventHandlers(true); | 809 root->SetHaveScrollEventHandlers(true); |
808 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 810 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
809 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 811 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
810 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 812 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
811 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 813 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
812 status.main_thread_scrolling_reasons); | 814 status.main_thread_scrolling_reasons); |
813 | 815 |
814 host_impl_->ScrollEnd(EndState().get()); | 816 host_impl_->ScrollEnd(EndState().get()); |
815 | 817 |
816 // Even the default scroll blocks on mode doesn't require this. | 818 // Even the default scroll blocks on mode doesn't require this. |
817 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT | | 819 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT | |
818 SCROLL_BLOCKS_ON_START_TOUCH); | 820 SCROLL_BLOCKS_ON_START_TOUCH); |
819 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 821 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
820 InputHandler::GESTURE); | 822 InputHandler::GESTURE); |
821 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 823 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
822 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 824 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
823 status.main_thread_scrolling_reasons); | 825 status.main_thread_scrolling_reasons); |
824 | 826 |
825 host_impl_->ScrollEnd(EndState().get()); | 827 host_impl_->ScrollEnd(EndState().get()); |
826 | 828 |
827 // But the page can opt in to blocking on scroll event handlers. | 829 // But the page can opt in to blocking on scroll event handlers. |
828 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); | 830 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); |
829 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 831 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
830 InputHandler::GESTURE); | 832 InputHandler::GESTURE); |
831 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 833 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
832 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 834 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 835 status.main_thread_scrolling_reasons); |
833 | 836 |
834 // GESTURE and WHEEL scrolls behave identically in this regard. | 837 // GESTURE and WHEEL scrolls behave identically in this regard. |
835 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 838 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
836 InputHandler::WHEEL); | 839 InputHandler::WHEEL); |
837 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 840 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
838 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 841 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 842 status.main_thread_scrolling_reasons); |
839 | 843 |
840 // And if the handlers go away, scrolls can again be processed on impl | 844 // And if the handlers go away, scrolls can again be processed on impl |
841 // (despite the scroll-blocks-on mode). | 845 // (despite the scroll-blocks-on mode). |
842 root->SetHaveScrollEventHandlers(false); | 846 root->SetHaveScrollEventHandlers(false); |
843 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 847 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
844 InputHandler::GESTURE); | 848 InputHandler::GESTURE); |
845 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 849 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
846 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 850 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
847 status.main_thread_scrolling_reasons); | 851 status.main_thread_scrolling_reasons); |
848 | 852 |
849 host_impl_->ScrollEnd(EndState().get()); | 853 host_impl_->ScrollEnd(EndState().get()); |
850 } | 854 } |
851 | 855 |
852 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnLayerTopology) { | 856 TEST_F(LayerTreeHostImplTest, ScrollBlocksOnLayerTopology) { |
853 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 857 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
854 | 858 |
855 // Create a normal scrollable root layer | 859 // Create a normal scrollable root layer |
856 LayerImpl* root_scroll = SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 860 LayerImpl* root_scroll = SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
(...skipping 29 matching lines...) Expand all Loading... |
886 scrollable_child_2->SetHaveScrollEventHandlers(true); | 890 scrollable_child_2->SetHaveScrollEventHandlers(true); |
887 scrollable_child_clip_2->AddChild(std::move(scrollable_child_2)); | 891 scrollable_child_clip_2->AddChild(std::move(scrollable_child_2)); |
888 root_child->AddChild(std::move(scrollable_child_clip_2)); | 892 root_child->AddChild(std::move(scrollable_child_clip_2)); |
889 RebuildPropertyTrees(); | 893 RebuildPropertyTrees(); |
890 } | 894 } |
891 | 895 |
892 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 896 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
893 BeginState(gfx::Point(10, 10)).get(), InputHandler::GESTURE); | 897 BeginState(gfx::Point(10, 10)).get(), InputHandler::GESTURE); |
894 // Scroll-blocks-on on a layer affects scrolls that hit that layer. | 898 // Scroll-blocks-on on a layer affects scrolls that hit that layer. |
895 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 899 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
896 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 900 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
897 status.main_thread_scrolling_reasons); | 901 status.main_thread_scrolling_reasons); |
898 host_impl_->ScrollEnd(EndState().get()); | 902 host_impl_->ScrollEnd(EndState().get()); |
899 | 903 |
900 child1->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); | 904 child1->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); |
901 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), | 905 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), |
902 InputHandler::GESTURE); | 906 InputHandler::GESTURE); |
903 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 907 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
904 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 908 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 909 status.main_thread_scrolling_reasons); |
905 | 910 |
906 // But not those that hit only other layers. | 911 // But not those that hit only other layers. |
907 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 912 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
908 InputHandler::GESTURE); | 913 InputHandler::GESTURE); |
909 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 914 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
910 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 915 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
911 status.main_thread_scrolling_reasons); | 916 status.main_thread_scrolling_reasons); |
912 host_impl_->ScrollEnd(EndState().get()); | 917 host_impl_->ScrollEnd(EndState().get()); |
913 | 918 |
914 // It's the union of bits set across the scroll ancestor chain that matters. | 919 // It's the union of bits set across the scroll ancestor chain that matters. |
915 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 920 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
916 InputHandler::GESTURE); | 921 InputHandler::GESTURE); |
917 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 922 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
918 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 923 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
919 status.main_thread_scrolling_reasons); | 924 status.main_thread_scrolling_reasons); |
920 | 925 |
921 host_impl_->ScrollEnd(EndState().get()); | 926 host_impl_->ScrollEnd(EndState().get()); |
922 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 927 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
923 InputHandler::WHEEL); | 928 InputHandler::WHEEL); |
924 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 929 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
925 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 930 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
926 status.main_thread_scrolling_reasons); | 931 status.main_thread_scrolling_reasons); |
927 | 932 |
928 host_impl_->ScrollEnd(EndState().get()); | 933 host_impl_->ScrollEnd(EndState().get()); |
929 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT); | 934 root->SetScrollBlocksOn(SCROLL_BLOCKS_ON_WHEEL_EVENT); |
930 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 935 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
931 InputHandler::GESTURE); | 936 InputHandler::GESTURE); |
932 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 937 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
933 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 938 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
934 status.main_thread_scrolling_reasons); | 939 status.main_thread_scrolling_reasons); |
935 | 940 |
936 host_impl_->ScrollEnd(EndState().get()); | 941 host_impl_->ScrollEnd(EndState().get()); |
937 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 942 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
938 InputHandler::WHEEL); | 943 InputHandler::WHEEL); |
939 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 944 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
940 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 945 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 946 status.main_thread_scrolling_reasons); |
941 | 947 |
942 child2->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); | 948 child2->SetScrollBlocksOn(SCROLL_BLOCKS_ON_SCROLL_EVENT); |
943 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 949 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
944 InputHandler::WHEEL); | 950 InputHandler::WHEEL); |
945 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 951 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
946 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 952 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 953 status.main_thread_scrolling_reasons); |
947 | 954 |
948 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), | 955 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 25)).get(), |
949 InputHandler::GESTURE); | 956 InputHandler::GESTURE); |
950 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 957 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
951 EXPECT_EQ(InputHandler::EVENT_HANDLERS, status.main_thread_scrolling_reasons); | 958 EXPECT_EQ(MainThreadScrollingReason::kEventHandlers, |
| 959 status.main_thread_scrolling_reasons); |
952 } | 960 } |
953 | 961 |
954 TEST_F(LayerTreeHostImplTest, FlingOnlyWhenScrollingTouchscreen) { | 962 TEST_F(LayerTreeHostImplTest, FlingOnlyWhenScrollingTouchscreen) { |
955 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 963 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
956 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 964 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
957 DrawFrame(); | 965 DrawFrame(); |
958 | 966 |
959 // Ignore the fling since no layer is being scrolled | 967 // Ignore the fling since no layer is being scrolled |
960 InputHandler::ScrollStatus status = host_impl_->FlingScrollBegin(); | 968 InputHandler::ScrollStatus status = host_impl_->FlingScrollBegin(); |
961 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 969 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
962 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 970 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
963 status.main_thread_scrolling_reasons); | 971 status.main_thread_scrolling_reasons); |
964 | 972 |
965 // Start scrolling a layer | 973 // Start scrolling a layer |
966 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 974 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
967 InputHandler::GESTURE); | 975 InputHandler::GESTURE); |
968 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 976 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
969 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 977 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
970 status.main_thread_scrolling_reasons); | 978 status.main_thread_scrolling_reasons); |
971 | 979 |
972 // Now the fling should go ahead since we've started scrolling a layer | 980 // Now the fling should go ahead since we've started scrolling a layer |
973 status = host_impl_->FlingScrollBegin(); | 981 status = host_impl_->FlingScrollBegin(); |
974 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 982 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
975 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 983 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
976 status.main_thread_scrolling_reasons); | 984 status.main_thread_scrolling_reasons); |
977 } | 985 } |
978 | 986 |
979 TEST_F(LayerTreeHostImplTest, FlingOnlyWhenScrollingTouchpad) { | 987 TEST_F(LayerTreeHostImplTest, FlingOnlyWhenScrollingTouchpad) { |
980 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 988 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
981 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 989 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
982 DrawFrame(); | 990 DrawFrame(); |
983 | 991 |
984 // Ignore the fling since no layer is being scrolled | 992 // Ignore the fling since no layer is being scrolled |
985 InputHandler::ScrollStatus status = host_impl_->FlingScrollBegin(); | 993 InputHandler::ScrollStatus status = host_impl_->FlingScrollBegin(); |
986 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 994 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
987 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 995 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
988 status.main_thread_scrolling_reasons); | 996 status.main_thread_scrolling_reasons); |
989 | 997 |
990 // Start scrolling a layer | 998 // Start scrolling a layer |
991 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 999 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
992 InputHandler::WHEEL); | 1000 InputHandler::WHEEL); |
993 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1001 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
994 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1002 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
995 status.main_thread_scrolling_reasons); | 1003 status.main_thread_scrolling_reasons); |
996 | 1004 |
997 // Now the fling should go ahead since we've started scrolling a layer | 1005 // Now the fling should go ahead since we've started scrolling a layer |
998 status = host_impl_->FlingScrollBegin(); | 1006 status = host_impl_->FlingScrollBegin(); |
999 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1007 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
1000 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1008 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
1001 status.main_thread_scrolling_reasons); | 1009 status.main_thread_scrolling_reasons); |
1002 } | 1010 } |
1003 | 1011 |
1004 TEST_F(LayerTreeHostImplTest, NoFlingWhenScrollingOnMain) { | 1012 TEST_F(LayerTreeHostImplTest, NoFlingWhenScrollingOnMain) { |
1005 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 1013 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
1006 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 1014 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
1007 DrawFrame(); | 1015 DrawFrame(); |
1008 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 1016 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
1009 | 1017 |
1010 root->set_main_thread_scrolling_reasons( | 1018 root->set_main_thread_scrolling_reasons( |
1011 InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS); | 1019 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
1012 | 1020 |
1013 // Start scrolling a layer | 1021 // Start scrolling a layer |
1014 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 1022 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
1015 BeginState(gfx::Point()).get(), InputHandler::GESTURE); | 1023 BeginState(gfx::Point()).get(), InputHandler::GESTURE); |
1016 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1024 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1017 EXPECT_EQ(InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS, | 1025 EXPECT_EQ(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, |
1018 status.main_thread_scrolling_reasons); | 1026 status.main_thread_scrolling_reasons); |
1019 | 1027 |
1020 // The fling should be ignored since there's no layer being scrolled impl-side | 1028 // The fling should be ignored since there's no layer being scrolled impl-side |
1021 status = host_impl_->FlingScrollBegin(); | 1029 status = host_impl_->FlingScrollBegin(); |
1022 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 1030 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
1023 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 1031 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
1024 status.main_thread_scrolling_reasons); | 1032 status.main_thread_scrolling_reasons); |
1025 } | 1033 } |
1026 | 1034 |
1027 TEST_F(LayerTreeHostImplTest, ShouldScrollOnMainThread) { | 1035 TEST_F(LayerTreeHostImplTest, ShouldScrollOnMainThread) { |
1028 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 1036 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
1029 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 1037 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
1030 DrawFrame(); | 1038 DrawFrame(); |
1031 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 1039 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
1032 | 1040 |
1033 root->set_main_thread_scrolling_reasons( | 1041 root->set_main_thread_scrolling_reasons( |
1034 InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS); | 1042 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
1035 | 1043 |
1036 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 1044 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
1037 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 1045 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
1038 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1046 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1039 EXPECT_EQ(InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS, | 1047 EXPECT_EQ(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, |
1040 status.main_thread_scrolling_reasons); | 1048 status.main_thread_scrolling_reasons); |
1041 | 1049 |
1042 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), | 1050 status = host_impl_->ScrollBegin(BeginState(gfx::Point()).get(), |
1043 InputHandler::GESTURE); | 1051 InputHandler::GESTURE); |
1044 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1052 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1045 EXPECT_EQ(InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS, | 1053 EXPECT_EQ(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, |
1046 status.main_thread_scrolling_reasons); | 1054 status.main_thread_scrolling_reasons); |
1047 } | 1055 } |
1048 | 1056 |
1049 TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionBasic) { | 1057 TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionBasic) { |
1050 SetupScrollAndContentsLayers(gfx::Size(200, 200)); | 1058 SetupScrollAndContentsLayers(gfx::Size(200, 200)); |
1051 host_impl_->SetViewportSize(gfx::Size(100, 100)); | 1059 host_impl_->SetViewportSize(gfx::Size(100, 100)); |
1052 | 1060 |
1053 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 1061 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
1054 root->SetNonFastScrollableRegion(gfx::Rect(0, 0, 50, 50)); | 1062 root->SetNonFastScrollableRegion(gfx::Rect(0, 0, 50, 50)); |
1055 | 1063 |
1056 DrawFrame(); | 1064 DrawFrame(); |
1057 | 1065 |
1058 // All scroll types inside the non-fast scrollable region should fail. | 1066 // All scroll types inside the non-fast scrollable region should fail. |
1059 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 1067 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
1060 BeginState(gfx::Point(25, 25)).get(), InputHandler::WHEEL); | 1068 BeginState(gfx::Point(25, 25)).get(), InputHandler::WHEEL); |
1061 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1069 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1062 EXPECT_EQ(InputHandler::NON_FAST_SCROLLABLE_REGION, | 1070 EXPECT_EQ(MainThreadScrollingReason::kNonFastScrollableRegion, |
1063 status.main_thread_scrolling_reasons); | 1071 status.main_thread_scrolling_reasons); |
1064 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), | 1072 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), |
1065 InputHandler::WHEEL)); | 1073 InputHandler::WHEEL)); |
1066 | 1074 |
1067 status = host_impl_->ScrollBegin(BeginState(gfx::Point(25, 25)).get(), | 1075 status = host_impl_->ScrollBegin(BeginState(gfx::Point(25, 25)).get(), |
1068 InputHandler::GESTURE); | 1076 InputHandler::GESTURE); |
1069 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1077 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1070 EXPECT_EQ(InputHandler::NON_FAST_SCROLLABLE_REGION, | 1078 EXPECT_EQ(MainThreadScrollingReason::kNonFastScrollableRegion, |
1071 status.main_thread_scrolling_reasons); | 1079 status.main_thread_scrolling_reasons); |
1072 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), | 1080 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), |
1073 InputHandler::GESTURE)); | 1081 InputHandler::GESTURE)); |
1074 | 1082 |
1075 // All scroll types outside this region should succeed. | 1083 // All scroll types outside this region should succeed. |
1076 status = host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), | 1084 status = host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), |
1077 InputHandler::WHEEL); | 1085 InputHandler::WHEEL); |
1078 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1086 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
1079 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1087 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
1080 status.main_thread_scrolling_reasons); | 1088 status.main_thread_scrolling_reasons); |
1081 | 1089 |
1082 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), | 1090 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), |
1083 InputHandler::GESTURE)); | 1091 InputHandler::GESTURE)); |
1084 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); | 1092 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); |
1085 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), | 1093 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(25, 25), |
1086 InputHandler::GESTURE)); | 1094 InputHandler::GESTURE)); |
1087 host_impl_->ScrollEnd(EndState().get()); | 1095 host_impl_->ScrollEnd(EndState().get()); |
1088 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), | 1096 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), |
1089 InputHandler::GESTURE)); | 1097 InputHandler::GESTURE)); |
1090 | 1098 |
1091 status = host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), | 1099 status = host_impl_->ScrollBegin(BeginState(gfx::Point(75, 75)).get(), |
1092 InputHandler::GESTURE); | 1100 InputHandler::GESTURE); |
1093 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1101 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
1094 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1102 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
1095 status.main_thread_scrolling_reasons); | 1103 status.main_thread_scrolling_reasons); |
1096 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), | 1104 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), |
1097 InputHandler::GESTURE)); | 1105 InputHandler::GESTURE)); |
1098 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); | 1106 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); |
1099 host_impl_->ScrollEnd(EndState().get()); | 1107 host_impl_->ScrollEnd(EndState().get()); |
1100 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), | 1108 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(75, 75), |
1101 InputHandler::GESTURE)); | 1109 InputHandler::GESTURE)); |
1102 } | 1110 } |
1103 | 1111 |
1104 TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionWithOffset) { | 1112 TEST_F(LayerTreeHostImplTest, NonFastScrollableRegionWithOffset) { |
1105 SetupScrollAndContentsLayers(gfx::Size(200, 200)); | 1113 SetupScrollAndContentsLayers(gfx::Size(200, 200)); |
1106 host_impl_->SetViewportSize(gfx::Size(100, 100)); | 1114 host_impl_->SetViewportSize(gfx::Size(100, 100)); |
1107 | 1115 |
1108 LayerImpl* root = host_impl_->active_tree()->root_layer(); | 1116 LayerImpl* root = host_impl_->active_tree()->root_layer(); |
1109 root->SetNonFastScrollableRegion(gfx::Rect(0, 0, 50, 50)); | 1117 root->SetNonFastScrollableRegion(gfx::Rect(0, 0, 50, 50)); |
1110 root->SetPosition(gfx::PointF(-25.f, 0.f)); | 1118 root->SetPosition(gfx::PointF(-25.f, 0.f)); |
1111 root->SetDrawsContent(true); | 1119 root->SetDrawsContent(true); |
1112 | 1120 |
1113 DrawFrame(); | 1121 DrawFrame(); |
1114 | 1122 |
1115 // This point would fall into the non-fast scrollable region except that we've | 1123 // This point would fall into the non-fast scrollable region except that we've |
1116 // moved the layer down by 25 pixels. | 1124 // moved the layer down by 25 pixels. |
1117 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 1125 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
1118 BeginState(gfx::Point(40, 10)).get(), InputHandler::WHEEL); | 1126 BeginState(gfx::Point(40, 10)).get(), InputHandler::WHEEL); |
1119 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1127 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
1120 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1128 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
1121 status.main_thread_scrolling_reasons); | 1129 status.main_thread_scrolling_reasons); |
1122 | 1130 |
1123 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(40, 10), | 1131 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(40, 10), |
1124 InputHandler::WHEEL)); | 1132 InputHandler::WHEEL)); |
1125 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 1)).get()); | 1133 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 1)).get()); |
1126 host_impl_->ScrollEnd(EndState().get()); | 1134 host_impl_->ScrollEnd(EndState().get()); |
1127 | 1135 |
1128 // This point is still inside the non-fast region. | 1136 // This point is still inside the non-fast region. |
1129 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), | 1137 status = host_impl_->ScrollBegin(BeginState(gfx::Point(10, 10)).get(), |
1130 InputHandler::WHEEL); | 1138 InputHandler::WHEEL); |
1131 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 1139 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
1132 EXPECT_EQ(InputHandler::NON_FAST_SCROLLABLE_REGION, | 1140 EXPECT_EQ(MainThreadScrollingReason::kNonFastScrollableRegion, |
1133 status.main_thread_scrolling_reasons); | 1141 status.main_thread_scrolling_reasons); |
1134 } | 1142 } |
1135 | 1143 |
1136 TEST_F(LayerTreeHostImplTest, ScrollHandlerNotPresent) { | 1144 TEST_F(LayerTreeHostImplTest, ScrollHandlerNotPresent) { |
1137 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200)); | 1145 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(200, 200)); |
1138 EXPECT_FALSE(scroll_layer->have_scroll_event_handlers()); | 1146 EXPECT_FALSE(scroll_layer->have_scroll_event_handlers()); |
1139 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 1147 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
1140 DrawFrame(); | 1148 DrawFrame(); |
1141 | 1149 |
1142 EXPECT_FALSE(host_impl_->scroll_affects_scroll_handler()); | 1150 EXPECT_FALSE(host_impl_->scroll_affects_scroll_handler()); |
(...skipping 20 matching lines...) Expand all Loading... |
1163 | 1171 |
1164 TEST_F(LayerTreeHostImplTest, ScrollByReturnsCorrectValue) { | 1172 TEST_F(LayerTreeHostImplTest, ScrollByReturnsCorrectValue) { |
1165 SetupScrollAndContentsLayers(gfx::Size(200, 200)); | 1173 SetupScrollAndContentsLayers(gfx::Size(200, 200)); |
1166 host_impl_->SetViewportSize(gfx::Size(100, 100)); | 1174 host_impl_->SetViewportSize(gfx::Size(100, 100)); |
1167 | 1175 |
1168 DrawFrame(); | 1176 DrawFrame(); |
1169 | 1177 |
1170 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 1178 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
1171 BeginState(gfx::Point()).get(), InputHandler::GESTURE); | 1179 BeginState(gfx::Point()).get(), InputHandler::GESTURE); |
1172 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 1180 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
1173 EXPECT_EQ(InputHandler::NOT_SCROLLING_ON_MAIN, | 1181 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
1174 status.main_thread_scrolling_reasons); | 1182 status.main_thread_scrolling_reasons); |
1175 | 1183 |
1176 // Trying to scroll to the left/top will not succeed. | 1184 // Trying to scroll to the left/top will not succeed. |
1177 EXPECT_FALSE( | 1185 EXPECT_FALSE( |
1178 host_impl_->ScrollBy( | 1186 host_impl_->ScrollBy( |
1179 UpdateState(gfx::Point(), gfx::Vector2d(-10, 0)).get()) | 1187 UpdateState(gfx::Point(), gfx::Vector2d(-10, 0)).get()) |
1180 .did_scroll); | 1188 .did_scroll); |
1181 EXPECT_FALSE( | 1189 EXPECT_FALSE( |
1182 host_impl_->ScrollBy( | 1190 host_impl_->ScrollBy( |
1183 UpdateState(gfx::Point(), gfx::Vector2d(0, -10)).get()) | 1191 UpdateState(gfx::Point(), gfx::Vector2d(0, -10)).get()) |
(...skipping 2585 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3769 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); | 3777 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); |
3770 root->SetScrollClipLayer(Layer::INVALID_ID); | 3778 root->SetScrollClipLayer(Layer::INVALID_ID); |
3771 root->SetForceRenderSurface(true); | 3779 root->SetForceRenderSurface(true); |
3772 host_impl_->active_tree()->SetRootLayer(std::move(root)); | 3780 host_impl_->active_tree()->SetRootLayer(std::move(root)); |
3773 DrawFrame(); | 3781 DrawFrame(); |
3774 | 3782 |
3775 // Scroll event is ignored because layer is not scrollable. | 3783 // Scroll event is ignored because layer is not scrollable. |
3776 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 3784 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
3777 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 3785 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
3778 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 3786 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
3779 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 3787 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
3780 status.main_thread_scrolling_reasons); | 3788 status.main_thread_scrolling_reasons); |
3781 EXPECT_FALSE(did_request_redraw_); | 3789 EXPECT_FALSE(did_request_redraw_); |
3782 EXPECT_FALSE(did_request_commit_); | 3790 EXPECT_FALSE(did_request_commit_); |
3783 } | 3791 } |
3784 | 3792 |
3785 TEST_F(LayerTreeHostImplTest, ClampingAfterActivation) { | 3793 TEST_F(LayerTreeHostImplTest, ClampingAfterActivation) { |
3786 host_impl_->CreatePendingTree(); | 3794 host_impl_->CreatePendingTree(); |
3787 host_impl_->pending_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); | 3795 host_impl_->pending_tree()->PushPageScaleFromMainThread(1.f, 1.f, 1.f); |
3788 CreateScrollAndContentsLayers(host_impl_->pending_tree(), | 3796 CreateScrollAndContentsLayers(host_impl_->pending_tree(), |
3789 gfx::Size(100, 100)); | 3797 gfx::Size(100, 100)); |
(...skipping 831 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4621 root->SetForceRenderSurface(true); | 4629 root->SetForceRenderSurface(true); |
4622 host_impl_->active_tree()->SetRootLayer(std::move(root)); | 4630 host_impl_->active_tree()->SetRootLayer(std::move(root)); |
4623 host_impl_->SetViewportSize(surface_size); | 4631 host_impl_->SetViewportSize(surface_size); |
4624 DrawFrame(); | 4632 DrawFrame(); |
4625 | 4633 |
4626 // Scroll event is ignored because the input coordinate is outside the layer | 4634 // Scroll event is ignored because the input coordinate is outside the layer |
4627 // boundaries. | 4635 // boundaries. |
4628 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 4636 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
4629 BeginState(gfx::Point(15, 5)).get(), InputHandler::WHEEL); | 4637 BeginState(gfx::Point(15, 5)).get(), InputHandler::WHEEL); |
4630 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 4638 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
4631 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 4639 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
4632 status.main_thread_scrolling_reasons); | 4640 status.main_thread_scrolling_reasons); |
4633 | 4641 |
4634 EXPECT_FALSE(did_request_redraw_); | 4642 EXPECT_FALSE(did_request_redraw_); |
4635 EXPECT_FALSE(did_request_commit_); | 4643 EXPECT_FALSE(did_request_commit_); |
4636 } | 4644 } |
4637 | 4645 |
4638 TEST_F(LayerTreeHostImplTest, ScrollMissesBackfacingChild) { | 4646 TEST_F(LayerTreeHostImplTest, ScrollMissesBackfacingChild) { |
4639 gfx::Size surface_size(10, 10); | 4647 gfx::Size surface_size(10, 10); |
4640 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); | 4648 scoped_ptr<LayerImpl> root = LayerImpl::Create(host_impl_->active_tree(), 1); |
4641 root->SetForceRenderSurface(true); | 4649 root->SetForceRenderSurface(true); |
4642 scoped_ptr<LayerImpl> child = | 4650 scoped_ptr<LayerImpl> child = |
4643 CreateScrollableLayer(2, surface_size, root.get()); | 4651 CreateScrollableLayer(2, surface_size, root.get()); |
4644 host_impl_->SetViewportSize(surface_size); | 4652 host_impl_->SetViewportSize(surface_size); |
4645 | 4653 |
4646 gfx::Transform matrix; | 4654 gfx::Transform matrix; |
4647 matrix.RotateAboutXAxis(180.0); | 4655 matrix.RotateAboutXAxis(180.0); |
4648 child->SetTransform(matrix); | 4656 child->SetTransform(matrix); |
4649 child->SetDoubleSided(false); | 4657 child->SetDoubleSided(false); |
4650 | 4658 |
4651 root->AddChild(std::move(child)); | 4659 root->AddChild(std::move(child)); |
4652 host_impl_->active_tree()->SetRootLayer(std::move(root)); | 4660 host_impl_->active_tree()->SetRootLayer(std::move(root)); |
4653 DrawFrame(); | 4661 DrawFrame(); |
4654 | 4662 |
4655 // Scroll event is ignored because the scrollable layer is not facing the | 4663 // Scroll event is ignored because the scrollable layer is not facing the |
4656 // viewer and there is nothing scrollable behind it. | 4664 // viewer and there is nothing scrollable behind it. |
4657 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 4665 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
4658 BeginState(gfx::Point(5, 5)).get(), InputHandler::WHEEL); | 4666 BeginState(gfx::Point(5, 5)).get(), InputHandler::WHEEL); |
4659 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); | 4667 EXPECT_EQ(InputHandler::SCROLL_IGNORED, status.thread); |
4660 EXPECT_EQ(InputHandler::NO_SCROLLING_LAYER, | 4668 EXPECT_EQ(MainThreadScrollingReason::kNoScrollingLayer, |
4661 status.main_thread_scrolling_reasons); | 4669 status.main_thread_scrolling_reasons); |
4662 | 4670 |
4663 EXPECT_FALSE(did_request_redraw_); | 4671 EXPECT_FALSE(did_request_redraw_); |
4664 EXPECT_FALSE(did_request_commit_); | 4672 EXPECT_FALSE(did_request_commit_); |
4665 } | 4673 } |
4666 | 4674 |
4667 TEST_F(LayerTreeHostImplTest, ScrollBlockedByContentLayer) { | 4675 TEST_F(LayerTreeHostImplTest, ScrollBlockedByContentLayer) { |
4668 gfx::Size surface_size(10, 10); | 4676 gfx::Size surface_size(10, 10); |
4669 scoped_ptr<LayerImpl> clip_layer = | 4677 scoped_ptr<LayerImpl> clip_layer = |
4670 LayerImpl::Create(host_impl_->active_tree(), 3); | 4678 LayerImpl::Create(host_impl_->active_tree(), 3); |
4671 scoped_ptr<LayerImpl> content_layer = | 4679 scoped_ptr<LayerImpl> content_layer = |
4672 CreateScrollableLayer(1, surface_size, clip_layer.get()); | 4680 CreateScrollableLayer(1, surface_size, clip_layer.get()); |
4673 content_layer->set_main_thread_scrolling_reasons( | 4681 content_layer->set_main_thread_scrolling_reasons( |
4674 InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS); | 4682 MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); |
4675 content_layer->SetScrollClipLayer(Layer::INVALID_ID); | 4683 content_layer->SetScrollClipLayer(Layer::INVALID_ID); |
4676 | 4684 |
4677 // Note: we can use the same clip layer for both since both calls to | 4685 // Note: we can use the same clip layer for both since both calls to |
4678 // CreateScrollableLayer() use the same surface size. | 4686 // CreateScrollableLayer() use the same surface size. |
4679 scoped_ptr<LayerImpl> scroll_layer = | 4687 scoped_ptr<LayerImpl> scroll_layer = |
4680 CreateScrollableLayer(2, surface_size, clip_layer.get()); | 4688 CreateScrollableLayer(2, surface_size, clip_layer.get()); |
4681 scroll_layer->AddChild(std::move(content_layer)); | 4689 scroll_layer->AddChild(std::move(content_layer)); |
4682 clip_layer->AddChild(std::move(scroll_layer)); | 4690 clip_layer->AddChild(std::move(scroll_layer)); |
4683 clip_layer->SetForceRenderSurface(true); | 4691 clip_layer->SetForceRenderSurface(true); |
4684 | 4692 |
4685 host_impl_->active_tree()->SetRootLayer(std::move(clip_layer)); | 4693 host_impl_->active_tree()->SetRootLayer(std::move(clip_layer)); |
4686 host_impl_->SetViewportSize(surface_size); | 4694 host_impl_->SetViewportSize(surface_size); |
4687 DrawFrame(); | 4695 DrawFrame(); |
4688 | 4696 |
4689 // Scrolling fails because the content layer is asking to be scrolled on the | 4697 // Scrolling fails because the content layer is asking to be scrolled on the |
4690 // main thread. | 4698 // main thread. |
4691 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 4699 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
4692 BeginState(gfx::Point(5, 5)).get(), InputHandler::WHEEL); | 4700 BeginState(gfx::Point(5, 5)).get(), InputHandler::WHEEL); |
4693 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); | 4701 EXPECT_EQ(InputHandler::SCROLL_ON_MAIN_THREAD, status.thread); |
4694 EXPECT_EQ(InputHandler::HAS_BACKGROUND_ATTACHMENT_FIXED_OBJECTS, | 4702 EXPECT_EQ(MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, |
4695 status.main_thread_scrolling_reasons); | 4703 status.main_thread_scrolling_reasons); |
4696 } | 4704 } |
4697 | 4705 |
4698 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) { | 4706 TEST_F(LayerTreeHostImplTest, ScrollRootAndChangePageScaleOnMainThread) { |
4699 gfx::Size viewport_size(20, 20); | 4707 gfx::Size viewport_size(20, 20); |
4700 float page_scale = 2.f; | 4708 float page_scale = 2.f; |
4701 | 4709 |
4702 SetupScrollAndContentsLayers(viewport_size); | 4710 SetupScrollAndContentsLayers(viewport_size); |
4703 | 4711 |
4704 // Setup the layers so that the outer viewport is scrollable. | 4712 // Setup the layers so that the outer viewport is scrollable. |
(...skipping 3087 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7792 occluder_layer->SetPosition(gfx::PointF()); | 7800 occluder_layer->SetPosition(gfx::PointF()); |
7793 | 7801 |
7794 // The parent of the occluder is *above* the scroller. | 7802 // The parent of the occluder is *above* the scroller. |
7795 page_scale_layer->AddChild(std::move(occluder_layer)); | 7803 page_scale_layer->AddChild(std::move(occluder_layer)); |
7796 | 7804 |
7797 DrawFrame(); | 7805 DrawFrame(); |
7798 | 7806 |
7799 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 7807 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
7800 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 7808 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
7801 EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); | 7809 EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); |
7802 EXPECT_EQ(InputHandler::FAILED_HIT_TEST, | 7810 EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest, |
7803 status.main_thread_scrolling_reasons); | 7811 status.main_thread_scrolling_reasons); |
7804 } | 7812 } |
7805 | 7813 |
7806 TEST_F(LayerTreeHostImplTest, ScrollUnknownScrollAncestorMismatch) { | 7814 TEST_F(LayerTreeHostImplTest, ScrollUnknownScrollAncestorMismatch) { |
7807 // If we ray cast a scroller this is on the first layer's ancestor chain, but | 7815 // If we ray cast a scroller this is on the first layer's ancestor chain, but |
7808 // is not the first scroller we encounter when walking up from the layer, we | 7816 // is not the first scroller we encounter when walking up from the layer, we |
7809 // should also return SCROLL_UNKNOWN. | 7817 // should also return SCROLL_UNKNOWN. |
7810 gfx::Size content_size(100, 100); | 7818 gfx::Size content_size(100, 100); |
7811 SetupScrollAndContentsLayers(content_size); | 7819 SetupScrollAndContentsLayers(content_size); |
7812 | 7820 |
(...skipping 20 matching lines...) Expand all Loading... |
7833 child_scroll->SetPosition(gfx::PointF(10.f, 10.f)); | 7841 child_scroll->SetPosition(gfx::PointF(10.f, 10.f)); |
7834 | 7842 |
7835 child_scroll->AddChild(std::move(occluder_layer)); | 7843 child_scroll->AddChild(std::move(occluder_layer)); |
7836 scroll_layer->AddChild(std::move(child_scroll)); | 7844 scroll_layer->AddChild(std::move(child_scroll)); |
7837 | 7845 |
7838 DrawFrame(); | 7846 DrawFrame(); |
7839 | 7847 |
7840 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 7848 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
7841 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 7849 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
7842 EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); | 7850 EXPECT_EQ(InputHandler::SCROLL_UNKNOWN, status.thread); |
7843 EXPECT_EQ(InputHandler::FAILED_HIT_TEST, | 7851 EXPECT_EQ(MainThreadScrollingReason::kFailedHitTest, |
7844 status.main_thread_scrolling_reasons); | 7852 status.main_thread_scrolling_reasons); |
7845 } | 7853 } |
7846 | 7854 |
7847 TEST_F(LayerTreeHostImplTest, NotScrollInvisibleScroller) { | 7855 TEST_F(LayerTreeHostImplTest, NotScrollInvisibleScroller) { |
7848 gfx::Size content_size(100, 100); | 7856 gfx::Size content_size(100, 100); |
7849 SetupScrollAndContentsLayers(content_size); | 7857 SetupScrollAndContentsLayers(content_size); |
7850 | 7858 |
7851 LayerImpl* root = host_impl_->active_tree()->LayerById(1); | 7859 LayerImpl* root = host_impl_->active_tree()->LayerById(1); |
7852 | 7860 |
7853 int scroll_layer_id = 2; | 7861 int scroll_layer_id = 2; |
(...skipping 2162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10016 // There should not be any jitter measured till we hit the fixed point hits | 10024 // There should not be any jitter measured till we hit the fixed point hits |
10017 // threshold. | 10025 // threshold. |
10018 float expected_jitter = | 10026 float expected_jitter = |
10019 (i == pending_tree->kFixedPointHitsThreshold) ? 500 : 0; | 10027 (i == pending_tree->kFixedPointHitsThreshold) ? 500 : 0; |
10020 EXPECT_EQ(jitter, expected_jitter); | 10028 EXPECT_EQ(jitter, expected_jitter); |
10021 } | 10029 } |
10022 } | 10030 } |
10023 | 10031 |
10024 } // namespace | 10032 } // namespace |
10025 } // namespace cc | 10033 } // namespace cc |
OLD | NEW |