| 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> |
| (...skipping 812 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 823 histogram_tester.ExpectTotalCount("Event.Scroll.ScrollerSize.OnScroll_Wheel", | 823 histogram_tester.ExpectTotalCount("Event.Scroll.ScrollerSize.OnScroll_Wheel", |
| 824 1); | 824 1); |
| 825 } | 825 } |
| 826 | 826 |
| 827 TEST_F(LayerTreeHostImplTest, ScrollRootCallsCommitAndRedraw) { | 827 TEST_F(LayerTreeHostImplTest, ScrollRootCallsCommitAndRedraw) { |
| 828 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 828 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| 829 host_impl_->active_tree()->BuildPropertyTreesForTesting(); | 829 host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
| 830 | 830 |
| 831 host_impl_->SetViewportSize(gfx::Size(50, 50)); | 831 host_impl_->SetViewportSize(gfx::Size(50, 50)); |
| 832 DrawFrame(); | 832 DrawFrame(); |
| 833 | 833 LOG(ERROR) << "Scroll begin"; |
| 834 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( | 834 InputHandler::ScrollStatus status = host_impl_->ScrollBegin( |
| 835 BeginState(gfx::Point()).get(), InputHandler::WHEEL); | 835 BeginState(gfx::Point()).get(), InputHandler::WHEEL); |
| 836 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); | 836 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, status.thread); |
| 837 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, | 837 EXPECT_EQ(MainThreadScrollingReason::kNotScrollingOnMain, |
| 838 status.main_thread_scrolling_reasons); | 838 status.main_thread_scrolling_reasons); |
| 839 | 839 |
| 840 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), | 840 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), |
| 841 InputHandler::WHEEL)); | 841 InputHandler::WHEEL)); |
| 842 LOG(ERROR) << "SCroll By"; |
| 842 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); | 843 host_impl_->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, 10)).get()); |
| 843 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(0, 10), | 844 EXPECT_TRUE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(0, 10), |
| 844 InputHandler::WHEEL)); | 845 InputHandler::WHEEL)); |
| 846 LOG(ERROR) << "scroll end"; |
| 845 host_impl_->ScrollEnd(EndState().get()); | 847 host_impl_->ScrollEnd(EndState().get()); |
| 846 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), | 848 EXPECT_FALSE(host_impl_->IsCurrentlyScrollingLayerAt(gfx::Point(), |
| 847 InputHandler::WHEEL)); | 849 InputHandler::WHEEL)); |
| 848 EXPECT_TRUE(did_request_redraw_); | 850 EXPECT_TRUE(did_request_redraw_); |
| 849 EXPECT_TRUE(did_request_commit_); | 851 EXPECT_TRUE(did_request_commit_); |
| 850 } | 852 } |
| 851 | 853 |
| 852 TEST_F(LayerTreeHostImplTest, ScrollActiveOnlyAfterScrollMovement) { | 854 TEST_F(LayerTreeHostImplTest, ScrollActiveOnlyAfterScrollMovement) { |
| 853 SetupScrollAndContentsLayers(gfx::Size(100, 100)); | 855 SetupScrollAndContentsLayers(gfx::Size(100, 100)); |
| 854 host_impl_->active_tree()->BuildPropertyTreesForTesting(); | 856 host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
| (...skipping 5187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6042 expected_scroll_delta)); | 6044 expected_scroll_delta)); |
| 6043 | 6045 |
| 6044 // The root scroll layer should not have scrolled, because the input delta | 6046 // The root scroll layer should not have scrolled, because the input delta |
| 6045 // was close to the layer's axis of movement. | 6047 // was close to the layer's axis of movement. |
| 6046 EXPECT_EQ(scroll_info->scrolls.size(), 1u); | 6048 EXPECT_EQ(scroll_info->scrolls.size(), 1u); |
| 6047 } | 6049 } |
| 6048 { | 6050 { |
| 6049 // Now reset and scroll the same amount horizontally. | 6051 // Now reset and scroll the same amount horizontally. |
| 6050 SetScrollOffsetDelta(child_ptr, gfx::Vector2dF()); | 6052 SetScrollOffsetDelta(child_ptr, gfx::Vector2dF()); |
| 6051 gfx::Vector2d gesture_scroll_delta(10, 0); | 6053 gfx::Vector2d gesture_scroll_delta(10, 0); |
| 6054 LOG(ERROR) << "scroll begin:\n"; |
| 6052 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 6055 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 6053 host_impl_ | 6056 host_impl_ |
| 6054 ->ScrollBegin(BeginState(gfx::Point(1, 1)).get(), | 6057 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 6055 InputHandler::TOUCHSCREEN) | 6058 InputHandler::TOUCHSCREEN) |
| 6056 .thread); | 6059 .thread); |
| 6060 LOG(ERROR) << "\nscroll by:\n"; |
| 6057 host_impl_->ScrollBy(UpdateState(gfx::Point(), gesture_scroll_delta).get()); | 6061 host_impl_->ScrollBy(UpdateState(gfx::Point(), gesture_scroll_delta).get()); |
| 6062 LOG(ERROR) << "\nscroll begin:\n"; |
| 6058 host_impl_->ScrollEnd(EndState().get()); | 6063 host_impl_->ScrollEnd(EndState().get()); |
| 6059 | 6064 |
| 6060 // The child layer shouldn't have scrolled. | 6065 // The child layer shouldn't have scrolled. |
| 6061 gfx::Vector2d expected_scroll_delta( | 6066 gfx::Vector2d expected_scroll_delta( |
| 6062 0, -gesture_scroll_delta.x() * | 6067 0, -gesture_scroll_delta.x() * |
| 6063 std::sin(MathUtil::Deg2Rad(child_layer_angle))); | 6068 std::sin(MathUtil::Deg2Rad(child_layer_angle))); |
| 6064 std::unique_ptr<ScrollAndScaleSet> scroll_info = | 6069 std::unique_ptr<ScrollAndScaleSet> scroll_info = |
| 6065 host_impl_->ProcessScrollDeltas(); | 6070 host_impl_->ProcessScrollDeltas(); |
| 6066 EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), child_layer_id, | 6071 EXPECT_TRUE(ScrollInfoContains(*scroll_info.get(), child_layer_id, |
| 6067 expected_scroll_delta)); | 6072 expected_scroll_delta)); |
| (...skipping 3685 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9753 // Verifies that the overscroll delta should not have accumulated in | 9758 // Verifies that the overscroll delta should not have accumulated in |
| 9754 // the browser controls if we do a hide and show without releasing finger. | 9759 // the browser controls if we do a hide and show without releasing finger. |
| 9755 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 200)); | 9760 LayerImpl* scroll_layer = SetupScrollAndContentsLayers(gfx::Size(100, 200)); |
| 9756 host_impl_->active_tree()->BuildPropertyTreesForTesting(); | 9761 host_impl_->active_tree()->BuildPropertyTreesForTesting(); |
| 9757 | 9762 |
| 9758 host_impl_->SetViewportSize(gfx::Size(100, 100)); | 9763 host_impl_->SetViewportSize(gfx::Size(100, 100)); |
| 9759 host_impl_->browser_controls_manager()->UpdateBrowserControlsState( | 9764 host_impl_->browser_controls_manager()->UpdateBrowserControlsState( |
| 9760 BOTH, SHOWN, false); | 9765 BOTH, SHOWN, false); |
| 9761 DrawFrame(); | 9766 DrawFrame(); |
| 9762 | 9767 |
| 9768 LOG(ERROR) << "\nscroll begin:\n"; |
| 9763 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 9769 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, |
| 9764 host_impl_ | 9770 host_impl_ |
| 9765 ->ScrollBegin(BeginState(gfx::Point()).get(), | 9771 ->ScrollBegin(BeginState(gfx::Point()).get(), |
| 9766 InputHandler::TOUCHSCREEN) | 9772 InputHandler::TOUCHSCREEN) |
| 9767 .thread); | 9773 .thread); |
| 9768 EXPECT_EQ(0, host_impl_->browser_controls_manager()->ControlsTopOffset()); | 9774 EXPECT_EQ(0, host_impl_->browser_controls_manager()->ControlsTopOffset()); |
| 9769 | 9775 |
| 9770 float offset = 50; | 9776 float offset = 50; |
| 9777 LOG(ERROR) << "\nscroll by 1:\n"; |
| 9771 EXPECT_TRUE( | 9778 EXPECT_TRUE( |
| 9772 host_impl_ | 9779 host_impl_ |
| 9773 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) | 9780 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) |
| 9774 .did_scroll); | 9781 .did_scroll); |
| 9775 EXPECT_EQ(-offset, | 9782 EXPECT_EQ(-offset, |
| 9776 host_impl_->browser_controls_manager()->ControlsTopOffset()); | 9783 host_impl_->browser_controls_manager()->ControlsTopOffset()); |
| 9777 EXPECT_EQ(gfx::Vector2dF().ToString(), | 9784 EXPECT_EQ(gfx::Vector2dF().ToString(), |
| 9778 scroll_layer->CurrentScrollOffset().ToString()); | 9785 scroll_layer->CurrentScrollOffset().ToString()); |
| 9779 | 9786 LOG(ERROR) << "\nscroll by 2:\n"; |
| 9780 EXPECT_TRUE( | 9787 EXPECT_TRUE( |
| 9781 host_impl_ | 9788 host_impl_ |
| 9782 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) | 9789 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) |
| 9783 .did_scroll); | 9790 .did_scroll); |
| 9784 EXPECT_EQ(gfx::Vector2dF(0, offset).ToString(), | 9791 EXPECT_EQ(gfx::Vector2dF(0, offset).ToString(), |
| 9785 scroll_layer->CurrentScrollOffset().ToString()); | 9792 scroll_layer->CurrentScrollOffset().ToString()); |
| 9786 | 9793 LOG(ERROR) << "\nscroll by 3:\n"; |
| 9787 EXPECT_TRUE( | 9794 EXPECT_TRUE( |
| 9788 host_impl_ | 9795 host_impl_ |
| 9789 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) | 9796 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, offset)).get()) |
| 9790 .did_scroll); | 9797 .did_scroll); |
| 9791 | 9798 |
| 9792 // Should have fully scrolled | 9799 // Should have fully scrolled |
| 9793 EXPECT_EQ(gfx::Vector2dF(0, scroll_layer->MaxScrollOffset().y()).ToString(), | 9800 EXPECT_EQ(gfx::Vector2dF(0, scroll_layer->MaxScrollOffset().y()).ToString(), |
| 9794 scroll_layer->CurrentScrollOffset().ToString()); | 9801 scroll_layer->CurrentScrollOffset().ToString()); |
| 9795 | 9802 |
| 9796 float overscrollamount = 10; | 9803 float overscrollamount = 10; |
| 9797 | 9804 LOG(ERROR) << "\nscroll by 4:\n"; |
| 9798 // Overscroll the content | 9805 // Overscroll the content |
| 9799 EXPECT_FALSE(host_impl_ | 9806 EXPECT_FALSE(host_impl_ |
| 9800 ->ScrollBy(UpdateState(gfx::Point(), | 9807 ->ScrollBy(UpdateState(gfx::Point(), |
| 9801 gfx::Vector2d(0, overscrollamount)) | 9808 gfx::Vector2d(0, overscrollamount)) |
| 9802 .get()) | 9809 .get()) |
| 9803 .did_scroll); | 9810 .did_scroll); |
| 9804 EXPECT_EQ(gfx::Vector2dF(0, 2 * offset).ToString(), | 9811 EXPECT_EQ(gfx::Vector2dF(0, 2 * offset).ToString(), |
| 9805 scroll_layer->CurrentScrollOffset().ToString()); | 9812 scroll_layer->CurrentScrollOffset().ToString()); |
| 9806 EXPECT_EQ(gfx::Vector2dF(0, overscrollamount).ToString(), | 9813 EXPECT_EQ(gfx::Vector2dF(0, overscrollamount).ToString(), |
| 9807 host_impl_->accumulated_root_overscroll().ToString()); | 9814 host_impl_->accumulated_root_overscroll().ToString()); |
| 9808 | 9815 LOG(ERROR) << "\nscroll by 5:\n"; |
| 9809 EXPECT_TRUE( | 9816 EXPECT_TRUE( |
| 9810 host_impl_ | 9817 host_impl_ |
| 9811 ->ScrollBy( | 9818 ->ScrollBy( |
| 9812 UpdateState(gfx::Point(), gfx::Vector2d(0, -2 * offset)).get()) | 9819 UpdateState(gfx::Point(), gfx::Vector2d(0, -2 * offset)).get()) |
| 9813 .did_scroll); | 9820 .did_scroll); |
| 9814 EXPECT_EQ(gfx::Vector2dF(0, 0).ToString(), | 9821 EXPECT_EQ(gfx::Vector2dF(0, 0).ToString(), |
| 9815 scroll_layer->CurrentScrollOffset().ToString()); | 9822 scroll_layer->CurrentScrollOffset().ToString()); |
| 9816 EXPECT_EQ(-offset, | 9823 EXPECT_EQ(-offset, |
| 9817 host_impl_->browser_controls_manager()->ControlsTopOffset()); | 9824 host_impl_->browser_controls_manager()->ControlsTopOffset()); |
| 9818 | 9825 LOG(ERROR) << "\nscroll by 6:\n"; |
| 9819 EXPECT_TRUE( | 9826 EXPECT_TRUE( |
| 9820 host_impl_ | 9827 host_impl_ |
| 9821 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, -offset)).get()) | 9828 ->ScrollBy(UpdateState(gfx::Point(), gfx::Vector2d(0, -offset)).get()) |
| 9822 .did_scroll); | 9829 .did_scroll); |
| 9823 EXPECT_EQ(gfx::Vector2dF(0, 0).ToString(), | 9830 EXPECT_EQ(gfx::Vector2dF(0, 0).ToString(), |
| 9824 scroll_layer->CurrentScrollOffset().ToString()); | 9831 scroll_layer->CurrentScrollOffset().ToString()); |
| 9825 | 9832 |
| 9826 // Browser controls should be fully visible | 9833 // Browser controls should be fully visible |
| 9827 EXPECT_EQ(0, host_impl_->browser_controls_manager()->ControlsTopOffset()); | 9834 EXPECT_EQ(0, host_impl_->browser_controls_manager()->ControlsTopOffset()); |
| 9828 | 9835 LOG(ERROR) << "\nscroll end:\n"; |
| 9829 host_impl_->ScrollEnd(EndState().get()); | 9836 host_impl_->ScrollEnd(EndState().get()); |
| 9830 } | 9837 } |
| 9831 | 9838 |
| 9832 // Tests that when we set a child scroller (e.g. a scrolling div) as the outer | 9839 // Tests that when we set a child scroller (e.g. a scrolling div) as the outer |
| 9833 // viewport, scrolling it controls the browser controls. | 9840 // viewport, scrolling it controls the browser controls. |
| 9834 TEST_F(LayerTreeHostImplBrowserControlsTest, | 9841 TEST_F(LayerTreeHostImplBrowserControlsTest, |
| 9835 ReplacedOuterViewportScrollsBrowserControls) { | 9842 ReplacedOuterViewportScrollsBrowserControls) { |
| 9836 const gfx::Size scroll_content_size(400, 400); | 9843 const gfx::Size scroll_content_size(400, 400); |
| 9837 const gfx::Size root_layer_size(200, 200); | 9844 const gfx::Size root_layer_size(200, 200); |
| 9838 const gfx::Size viewport_size(100, 100); | 9845 const gfx::Size viewport_size(100, 100); |
| (...skipping 980 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 10819 scrolling_layer->CurrentScrollOffset()); | 10826 scrolling_layer->CurrentScrollOffset()); |
| 10820 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingNode()); | 10827 EXPECT_EQ(nullptr, host_impl_->CurrentlyScrollingNode()); |
| 10821 host_impl_->DidFinishImplFrame(); | 10828 host_impl_->DidFinishImplFrame(); |
| 10822 } | 10829 } |
| 10823 | 10830 |
| 10824 TEST_F(LayerTreeHostImplTest, SecondScrollAnimatedBeginNotIgnored) { | 10831 TEST_F(LayerTreeHostImplTest, SecondScrollAnimatedBeginNotIgnored) { |
| 10825 const gfx::Size content_size(1000, 1000); | 10832 const gfx::Size content_size(1000, 1000); |
| 10826 const gfx::Size viewport_size(50, 100); | 10833 const gfx::Size viewport_size(50, 100); |
| 10827 CreateBasicVirtualViewportLayers(viewport_size, content_size); | 10834 CreateBasicVirtualViewportLayers(viewport_size, content_size); |
| 10828 | 10835 |
| 10829 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 10836 EXPECT_EQ( |
| 10830 host_impl_->ScrollAnimatedBegin(gfx::Point()).thread); | 10837 InputHandler::SCROLL_ON_IMPL_THREAD, |
| 10838 host_impl_->ScrollAnimatedBegin(BeginState(gfx::Point()).get()).thread); |
| 10831 | 10839 |
| 10832 // The second ScrollAnimatedBegin should not get ignored. | 10840 // The second ScrollAnimatedBegin should not get ignored. |
| 10833 EXPECT_EQ(InputHandler::SCROLL_ON_IMPL_THREAD, | 10841 EXPECT_EQ( |
| 10834 host_impl_->ScrollAnimatedBegin(gfx::Point()).thread); | 10842 InputHandler::SCROLL_ON_IMPL_THREAD, |
| 10843 host_impl_->ScrollAnimatedBegin(BeginState(gfx::Point()).get()).thread); |
| 10835 } | 10844 } |
| 10836 | 10845 |
| 10837 // Verfify that a smooth scroll animation doesn't jump when UpdateTarget gets | 10846 // Verfify that a smooth scroll animation doesn't jump when UpdateTarget gets |
| 10838 // called before the animation is started. | 10847 // called before the animation is started. |
| 10839 TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) { | 10848 TEST_F(LayerTreeHostImplTest, AnimatedScrollUpdateTargetBeforeStarting) { |
| 10840 const gfx::Size content_size(1000, 1000); | 10849 const gfx::Size content_size(1000, 1000); |
| 10841 const gfx::Size viewport_size(50, 100); | 10850 const gfx::Size viewport_size(50, 100); |
| 10842 CreateBasicVirtualViewportLayers(viewport_size, content_size); | 10851 CreateBasicVirtualViewportLayers(viewport_size, content_size); |
| 10843 | 10852 |
| 10844 DrawFrame(); | 10853 DrawFrame(); |
| (...skipping 1695 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 12540 // layer should be prioritized over the hidden layer. | 12549 // layer should be prioritized over the hidden layer. |
| 12541 hidden_layer->set_contributes_to_drawn_render_surface(false); | 12550 hidden_layer->set_contributes_to_drawn_render_surface(false); |
| 12542 hidden_layer->set_raster_even_if_not_drawn(true); | 12551 hidden_layer->set_raster_even_if_not_drawn(true); |
| 12543 queue = host_impl_->BuildRasterQueue(TreePriority::SMOOTHNESS_TAKES_PRIORITY, | 12552 queue = host_impl_->BuildRasterQueue(TreePriority::SMOOTHNESS_TAKES_PRIORITY, |
| 12544 RasterTilePriorityQueue::Type::ALL); | 12553 RasterTilePriorityQueue::Type::ALL); |
| 12545 EXPECT_EQ(queue->Top().tile()->layer_id(), 3); | 12554 EXPECT_EQ(queue->Top().tile()->layer_id(), 3); |
| 12546 } | 12555 } |
| 12547 | 12556 |
| 12548 } // namespace | 12557 } // namespace |
| 12549 } // namespace cc | 12558 } // namespace cc |
| OLD | NEW |