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 #include <stdint.h> | 8 #include <stdint.h> |
9 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
75 #include "cc/tiles/picture_layer_tiling.h" | 75 #include "cc/tiles/picture_layer_tiling.h" |
76 #include "cc/tiles/raster_tile_priority_queue.h" | 76 #include "cc/tiles/raster_tile_priority_queue.h" |
77 #include "cc/tiles/software_image_decode_controller.h" | 77 #include "cc/tiles/software_image_decode_controller.h" |
78 #include "cc/tiles/tile_task_manager.h" | 78 #include "cc/tiles/tile_task_manager.h" |
79 #include "cc/trees/damage_tracker.h" | 79 #include "cc/trees/damage_tracker.h" |
80 #include "cc/trees/draw_property_utils.h" | 80 #include "cc/trees/draw_property_utils.h" |
81 #include "cc/trees/latency_info_swap_promise_monitor.h" | 81 #include "cc/trees/latency_info_swap_promise_monitor.h" |
82 #include "cc/trees/layer_tree_host.h" | 82 #include "cc/trees/layer_tree_host.h" |
83 #include "cc/trees/layer_tree_host_common.h" | 83 #include "cc/trees/layer_tree_host_common.h" |
84 #include "cc/trees/layer_tree_impl.h" | 84 #include "cc/trees/layer_tree_impl.h" |
| 85 #include "cc/trees/scroll_node.h" |
85 #include "cc/trees/single_thread_proxy.h" | 86 #include "cc/trees/single_thread_proxy.h" |
86 #include "cc/trees/tree_synchronizer.h" | 87 #include "cc/trees/tree_synchronizer.h" |
87 #include "gpu/GLES2/gl2extchromium.h" | 88 #include "gpu/GLES2/gl2extchromium.h" |
88 #include "gpu/command_buffer/client/gles2_interface.h" | 89 #include "gpu/command_buffer/client/gles2_interface.h" |
89 #include "ui/gfx/geometry/point_conversions.h" | 90 #include "ui/gfx/geometry/point_conversions.h" |
90 #include "ui/gfx/geometry/rect_conversions.h" | 91 #include "ui/gfx/geometry/rect_conversions.h" |
91 #include "ui/gfx/geometry/scroll_offset.h" | 92 #include "ui/gfx/geometry/scroll_offset.h" |
92 #include "ui/gfx/geometry/size_conversions.h" | 93 #include "ui/gfx/geometry/size_conversions.h" |
93 #include "ui/gfx/geometry/vector2d_conversions.h" | 94 #include "ui/gfx/geometry/vector2d_conversions.h" |
94 | 95 |
(...skipping 2368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2463 } | 2464 } |
2464 | 2465 |
2465 InputHandler::ScrollStatus LayerTreeHostImpl::TryScroll( | 2466 InputHandler::ScrollStatus LayerTreeHostImpl::TryScroll( |
2466 const gfx::PointF& screen_space_point, | 2467 const gfx::PointF& screen_space_point, |
2467 InputHandler::ScrollInputType type, | 2468 InputHandler::ScrollInputType type, |
2468 const ScrollTree& scroll_tree, | 2469 const ScrollTree& scroll_tree, |
2469 ScrollNode* scroll_node) const { | 2470 ScrollNode* scroll_node) const { |
2470 InputHandler::ScrollStatus scroll_status; | 2471 InputHandler::ScrollStatus scroll_status; |
2471 scroll_status.main_thread_scrolling_reasons = | 2472 scroll_status.main_thread_scrolling_reasons = |
2472 MainThreadScrollingReason::kNotScrollingOnMain; | 2473 MainThreadScrollingReason::kNotScrollingOnMain; |
2473 if (!!scroll_node->data.main_thread_scrolling_reasons) { | 2474 if (!!scroll_node->main_thread_scrolling_reasons) { |
2474 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); | 2475 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Failed ShouldScrollOnMainThread"); |
2475 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 2476 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
2476 scroll_status.main_thread_scrolling_reasons = | 2477 scroll_status.main_thread_scrolling_reasons = |
2477 scroll_node->data.main_thread_scrolling_reasons; | 2478 scroll_node->main_thread_scrolling_reasons; |
2478 return scroll_status; | 2479 return scroll_status; |
2479 } | 2480 } |
2480 | 2481 |
2481 gfx::Transform screen_space_transform = | 2482 gfx::Transform screen_space_transform = |
2482 scroll_tree.ScreenSpaceTransform(scroll_node->id); | 2483 scroll_tree.ScreenSpaceTransform(scroll_node->id); |
2483 if (!screen_space_transform.IsInvertible()) { | 2484 if (!screen_space_transform.IsInvertible()) { |
2484 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); | 2485 TRACE_EVENT0("cc", "LayerImpl::TryScroll: Ignored NonInvertibleTransform"); |
2485 scroll_status.thread = InputHandler::SCROLL_IGNORED; | 2486 scroll_status.thread = InputHandler::SCROLL_IGNORED; |
2486 scroll_status.main_thread_scrolling_reasons = | 2487 scroll_status.main_thread_scrolling_reasons = |
2487 MainThreadScrollingReason::kNonInvertibleTransform; | 2488 MainThreadScrollingReason::kNonInvertibleTransform; |
2488 return scroll_status; | 2489 return scroll_status; |
2489 } | 2490 } |
2490 | 2491 |
2491 if (scroll_node->data.contains_non_fast_scrollable_region) { | 2492 if (scroll_node->contains_non_fast_scrollable_region) { |
2492 bool clipped = false; | 2493 bool clipped = false; |
2493 gfx::Transform inverse_screen_space_transform( | 2494 gfx::Transform inverse_screen_space_transform( |
2494 gfx::Transform::kSkipInitialization); | 2495 gfx::Transform::kSkipInitialization); |
2495 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform)) { | 2496 if (!screen_space_transform.GetInverse(&inverse_screen_space_transform)) { |
2496 // TODO(shawnsingh): We shouldn't be applying a projection if screen space | 2497 // TODO(shawnsingh): We shouldn't be applying a projection if screen space |
2497 // transform is uninvertible here. Perhaps we should be returning | 2498 // transform is uninvertible here. Perhaps we should be returning |
2498 // SCROLL_ON_MAIN_THREAD in this case? | 2499 // SCROLL_ON_MAIN_THREAD in this case? |
2499 } | 2500 } |
2500 | 2501 |
2501 gfx::PointF hit_test_point_in_layer_space = MathUtil::ProjectPoint( | 2502 gfx::PointF hit_test_point_in_layer_space = MathUtil::ProjectPoint( |
2502 inverse_screen_space_transform, screen_space_point, &clipped); | 2503 inverse_screen_space_transform, screen_space_point, &clipped); |
2503 if (!clipped && | 2504 if (!clipped && |
2504 active_tree() | 2505 active_tree() |
2505 ->LayerById(scroll_node->owner_id) | 2506 ->LayerById(scroll_node->owner_id) |
2506 ->non_fast_scrollable_region() | 2507 ->non_fast_scrollable_region() |
2507 .Contains(gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { | 2508 .Contains(gfx::ToRoundedPoint(hit_test_point_in_layer_space))) { |
2508 TRACE_EVENT0("cc", | 2509 TRACE_EVENT0("cc", |
2509 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); | 2510 "LayerImpl::tryScroll: Failed NonFastScrollableRegion"); |
2510 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; | 2511 scroll_status.thread = InputHandler::SCROLL_ON_MAIN_THREAD; |
2511 scroll_status.main_thread_scrolling_reasons = | 2512 scroll_status.main_thread_scrolling_reasons = |
2512 MainThreadScrollingReason::kNonFastScrollableRegion; | 2513 MainThreadScrollingReason::kNonFastScrollableRegion; |
2513 return scroll_status; | 2514 return scroll_status; |
2514 } | 2515 } |
2515 } | 2516 } |
2516 | 2517 |
2517 if (!scroll_node->data.scrollable) { | 2518 if (!scroll_node->scrollable) { |
2518 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); | 2519 TRACE_EVENT0("cc", "LayerImpl::tryScroll: Ignored not scrollable"); |
2519 scroll_status.thread = InputHandler::SCROLL_IGNORED; | 2520 scroll_status.thread = InputHandler::SCROLL_IGNORED; |
2520 scroll_status.main_thread_scrolling_reasons = | 2521 scroll_status.main_thread_scrolling_reasons = |
2521 MainThreadScrollingReason::kNotScrollable; | 2522 MainThreadScrollingReason::kNotScrollable; |
2522 return scroll_status; | 2523 return scroll_status; |
2523 } | 2524 } |
2524 | 2525 |
2525 gfx::ScrollOffset max_scroll_offset = | 2526 gfx::ScrollOffset max_scroll_offset = |
2526 scroll_tree.MaxScrollOffset(scroll_node->id); | 2527 scroll_tree.MaxScrollOffset(scroll_node->id); |
2527 if (max_scroll_offset.x() <= 0 && max_scroll_offset.y() <= 0) { | 2528 if (max_scroll_offset.x() <= 0 && max_scroll_offset.y() <= 0) { |
(...skipping 26 matching lines...) Expand all Loading... |
2554 if (layer_impl) { | 2555 if (layer_impl) { |
2555 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 2556 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
2556 ScrollNode* scroll_node = scroll_tree.Node(layer_impl->scroll_tree_index()); | 2557 ScrollNode* scroll_node = scroll_tree.Node(layer_impl->scroll_tree_index()); |
2557 for (; scroll_tree.parent(scroll_node); | 2558 for (; scroll_tree.parent(scroll_node); |
2558 scroll_node = scroll_tree.parent(scroll_node)) { | 2559 scroll_node = scroll_tree.parent(scroll_node)) { |
2559 // The content layer can also block attempts to scroll outside the main | 2560 // The content layer can also block attempts to scroll outside the main |
2560 // thread. | 2561 // thread. |
2561 ScrollStatus status = | 2562 ScrollStatus status = |
2562 TryScroll(device_viewport_point, type, scroll_tree, scroll_node); | 2563 TryScroll(device_viewport_point, type, scroll_tree, scroll_node); |
2563 if (status.thread == SCROLL_ON_MAIN_THREAD) { | 2564 if (status.thread == SCROLL_ON_MAIN_THREAD) { |
2564 if (!!scroll_node->data.main_thread_scrolling_reasons) { | 2565 if (!!scroll_node->main_thread_scrolling_reasons) { |
2565 DCHECK(MainThreadScrollingReason::MainThreadCanSetScrollReasons( | 2566 DCHECK(MainThreadScrollingReason::MainThreadCanSetScrollReasons( |
2566 status.main_thread_scrolling_reasons)); | 2567 status.main_thread_scrolling_reasons)); |
2567 } else { | 2568 } else { |
2568 DCHECK(MainThreadScrollingReason::CompositorCanSetScrollReasons( | 2569 DCHECK(MainThreadScrollingReason::CompositorCanSetScrollReasons( |
2569 status.main_thread_scrolling_reasons)); | 2570 status.main_thread_scrolling_reasons)); |
2570 } | 2571 } |
2571 | 2572 |
2572 *scroll_on_main_thread = true; | 2573 *scroll_on_main_thread = true; |
2573 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; | 2574 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; |
2574 return NULL; | 2575 return NULL; |
(...skipping 23 matching lines...) Expand all Loading... |
2598 // Similar to LayerImpl::HasAncestor, but walks up the scroll parents. | 2599 // Similar to LayerImpl::HasAncestor, but walks up the scroll parents. |
2599 static bool HasScrollAncestor(LayerImpl* child, LayerImpl* scroll_ancestor) { | 2600 static bool HasScrollAncestor(LayerImpl* child, LayerImpl* scroll_ancestor) { |
2600 DCHECK(scroll_ancestor); | 2601 DCHECK(scroll_ancestor); |
2601 if (!child) | 2602 if (!child) |
2602 return false; | 2603 return false; |
2603 ScrollTree& scroll_tree = | 2604 ScrollTree& scroll_tree = |
2604 child->layer_tree_impl()->property_trees()->scroll_tree; | 2605 child->layer_tree_impl()->property_trees()->scroll_tree; |
2605 ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index()); | 2606 ScrollNode* scroll_node = scroll_tree.Node(child->scroll_tree_index()); |
2606 for (; scroll_tree.parent(scroll_node); | 2607 for (; scroll_tree.parent(scroll_node); |
2607 scroll_node = scroll_tree.parent(scroll_node)) { | 2608 scroll_node = scroll_tree.parent(scroll_node)) { |
2608 if (scroll_node->data.scrollable) | 2609 if (scroll_node->scrollable) |
2609 return scroll_node->owner_id == scroll_ancestor->id(); | 2610 return scroll_node->owner_id == scroll_ancestor->id(); |
2610 } | 2611 } |
2611 return false; | 2612 return false; |
2612 } | 2613 } |
2613 | 2614 |
2614 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl( | 2615 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl( |
2615 ScrollState* scroll_state, | 2616 ScrollState* scroll_state, |
2616 LayerImpl* scrolling_layer_impl, | 2617 LayerImpl* scrolling_layer_impl, |
2617 InputHandler::ScrollInputType type) { | 2618 InputHandler::ScrollInputType type) { |
2618 DCHECK(scroll_state); | 2619 DCHECK(scroll_state); |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2748 } | 2749 } |
2749 | 2750 |
2750 gfx::Vector2dF LayerTreeHostImpl::ComputeScrollDelta( | 2751 gfx::Vector2dF LayerTreeHostImpl::ComputeScrollDelta( |
2751 ScrollNode* scroll_node, | 2752 ScrollNode* scroll_node, |
2752 const gfx::Vector2dF& delta) { | 2753 const gfx::Vector2dF& delta) { |
2753 ScrollTree& scroll_tree = active_tree()->property_trees()->scroll_tree; | 2754 ScrollTree& scroll_tree = active_tree()->property_trees()->scroll_tree; |
2754 float scale_factor = active_tree()->current_page_scale_factor(); | 2755 float scale_factor = active_tree()->current_page_scale_factor(); |
2755 | 2756 |
2756 gfx::Vector2dF adjusted_scroll(delta); | 2757 gfx::Vector2dF adjusted_scroll(delta); |
2757 adjusted_scroll.Scale(1.f / scale_factor); | 2758 adjusted_scroll.Scale(1.f / scale_factor); |
2758 if (!scroll_node->data.user_scrollable_horizontal) | 2759 if (!scroll_node->user_scrollable_horizontal) |
2759 adjusted_scroll.set_x(0); | 2760 adjusted_scroll.set_x(0); |
2760 if (!scroll_node->data.user_scrollable_vertical) | 2761 if (!scroll_node->user_scrollable_vertical) |
2761 adjusted_scroll.set_y(0); | 2762 adjusted_scroll.set_y(0); |
2762 | 2763 |
2763 gfx::ScrollOffset old_offset = | 2764 gfx::ScrollOffset old_offset = |
2764 scroll_tree.current_scroll_offset(scroll_node->owner_id); | 2765 scroll_tree.current_scroll_offset(scroll_node->owner_id); |
2765 gfx::ScrollOffset new_offset = scroll_tree.ClampScrollOffsetToLimits( | 2766 gfx::ScrollOffset new_offset = scroll_tree.ClampScrollOffsetToLimits( |
2766 old_offset + gfx::ScrollOffset(adjusted_scroll), scroll_node); | 2767 old_offset + gfx::ScrollOffset(adjusted_scroll), scroll_node); |
2767 | 2768 |
2768 gfx::ScrollOffset scrolled = new_offset - old_offset; | 2769 gfx::ScrollOffset scrolled = new_offset - old_offset; |
2769 return gfx::Vector2dF(scrolled.x(), scrolled.y()); | 2770 return gfx::Vector2dF(scrolled.x(), scrolled.y()); |
2770 } | 2771 } |
(...skipping 11 matching lines...) Expand all Loading... |
2782 } | 2783 } |
2783 | 2784 |
2784 scroll_tree.set_currently_scrolling_node(scroll_node->id); | 2785 scroll_tree.set_currently_scrolling_node(scroll_node->id); |
2785 | 2786 |
2786 gfx::ScrollOffset current_offset = | 2787 gfx::ScrollOffset current_offset = |
2787 scroll_tree.current_scroll_offset(scroll_node->owner_id); | 2788 scroll_tree.current_scroll_offset(scroll_node->owner_id); |
2788 gfx::ScrollOffset target_offset = scroll_tree.ClampScrollOffsetToLimits( | 2789 gfx::ScrollOffset target_offset = scroll_tree.ClampScrollOffsetToLimits( |
2789 current_offset + gfx::ScrollOffset(delta), scroll_node); | 2790 current_offset + gfx::ScrollOffset(delta), scroll_node); |
2790 DCHECK_EQ( | 2791 DCHECK_EQ( |
2791 ElementId(active_tree()->LayerById(scroll_node->owner_id)->element_id()), | 2792 ElementId(active_tree()->LayerById(scroll_node->owner_id)->element_id()), |
2792 scroll_node->data.element_id); | 2793 scroll_node->element_id); |
2793 | 2794 |
2794 animation_host_->ImplOnlyScrollAnimationCreate(scroll_node->data.element_id, | 2795 animation_host_->ImplOnlyScrollAnimationCreate(scroll_node->element_id, |
2795 target_offset, current_offset); | 2796 target_offset, current_offset); |
2796 | 2797 |
2797 SetNeedsOneBeginImplFrame(); | 2798 SetNeedsOneBeginImplFrame(); |
2798 | 2799 |
2799 return true; | 2800 return true; |
2800 } | 2801 } |
2801 | 2802 |
2802 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( | 2803 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
2803 const gfx::Point& viewport_point, | 2804 const gfx::Point& viewport_point, |
2804 const gfx::Vector2dF& scroll_delta) { | 2805 const gfx::Vector2dF& scroll_delta) { |
2805 InputHandler::ScrollStatus scroll_status; | 2806 InputHandler::ScrollStatus scroll_status; |
2806 scroll_status.main_thread_scrolling_reasons = | 2807 scroll_status.main_thread_scrolling_reasons = |
2807 MainThreadScrollingReason::kNotScrollingOnMain; | 2808 MainThreadScrollingReason::kNotScrollingOnMain; |
2808 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 2809 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
2809 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 2810 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
2810 if (scroll_node) { | 2811 if (scroll_node) { |
2811 gfx::Vector2dF delta = scroll_delta; | 2812 gfx::Vector2dF delta = scroll_delta; |
2812 if (!scroll_node->data.user_scrollable_horizontal) | 2813 if (!scroll_node->user_scrollable_horizontal) |
2813 delta.set_x(0); | 2814 delta.set_x(0); |
2814 if (!scroll_node->data.user_scrollable_vertical) | 2815 if (!scroll_node->user_scrollable_vertical) |
2815 delta.set_y(0); | 2816 delta.set_y(0); |
2816 | 2817 |
2817 if (ScrollAnimationUpdateTarget(scroll_node, delta)) { | 2818 if (ScrollAnimationUpdateTarget(scroll_node, delta)) { |
2818 scroll_status.thread = SCROLL_ON_IMPL_THREAD; | 2819 scroll_status.thread = SCROLL_ON_IMPL_THREAD; |
2819 } else { | 2820 } else { |
2820 scroll_status.thread = SCROLL_IGNORED; | 2821 scroll_status.thread = SCROLL_IGNORED; |
2821 scroll_status.main_thread_scrolling_reasons = | 2822 scroll_status.main_thread_scrolling_reasons = |
2822 MainThreadScrollingReason::kNotScrollable; | 2823 MainThreadScrollingReason::kNotScrollable; |
2823 } | 2824 } |
2824 return scroll_status; | 2825 return scroll_status; |
2825 } | 2826 } |
2826 | 2827 |
2827 ScrollStateData scroll_state_data; | 2828 ScrollStateData scroll_state_data; |
2828 scroll_state_data.position_x = viewport_point.x(); | 2829 scroll_state_data.position_x = viewport_point.x(); |
2829 scroll_state_data.position_y = viewport_point.y(); | 2830 scroll_state_data.position_y = viewport_point.y(); |
2830 scroll_state_data.is_in_inertial_phase = true; | 2831 scroll_state_data.is_in_inertial_phase = true; |
2831 ScrollState scroll_state(scroll_state_data); | 2832 ScrollState scroll_state(scroll_state_data); |
2832 | 2833 |
2833 // ScrollAnimated is used for animated wheel scrolls. We find the first layer | 2834 // ScrollAnimated is used for animated wheel scrolls. We find the first layer |
2834 // that can scroll and set up an animation of its scroll offset. Note that | 2835 // that can scroll and set up an animation of its scroll offset. Note that |
2835 // this does not currently go through the scroll customization machinery | 2836 // this does not currently go through the scroll customization machinery |
2836 // that ScrollBy uses for non-animated wheel scrolls. | 2837 // that ScrollBy uses for non-animated wheel scrolls. |
2837 scroll_status = ScrollBegin(&scroll_state, WHEEL); | 2838 scroll_status = ScrollBegin(&scroll_state, WHEEL); |
2838 scroll_node = scroll_tree.CurrentlyScrollingNode(); | 2839 scroll_node = scroll_tree.CurrentlyScrollingNode(); |
2839 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { | 2840 if (scroll_status.thread == SCROLL_ON_IMPL_THREAD) { |
2840 gfx::Vector2dF pending_delta = scroll_delta; | 2841 gfx::Vector2dF pending_delta = scroll_delta; |
2841 if (scroll_node) { | 2842 if (scroll_node) { |
2842 for (; scroll_tree.parent(scroll_node); | 2843 for (; scroll_tree.parent(scroll_node); |
2843 scroll_node = scroll_tree.parent(scroll_node)) { | 2844 scroll_node = scroll_tree.parent(scroll_node)) { |
2844 if (!scroll_node->data.scrollable || | 2845 if (!scroll_node->scrollable || |
2845 scroll_node->data.is_outer_viewport_scroll_layer) | 2846 scroll_node->is_outer_viewport_scroll_layer) |
2846 continue; | 2847 continue; |
2847 | 2848 |
2848 if (scroll_node->data.is_inner_viewport_scroll_layer) { | 2849 if (scroll_node->is_inner_viewport_scroll_layer) { |
2849 gfx::Vector2dF scrolled = viewport()->ScrollAnimated(pending_delta); | 2850 gfx::Vector2dF scrolled = viewport()->ScrollAnimated(pending_delta); |
2850 // Viewport::ScrollAnimated returns pending_delta as long as it | 2851 // Viewport::ScrollAnimated returns pending_delta as long as it |
2851 // starts an animation. | 2852 // starts an animation. |
2852 if (scrolled == pending_delta) | 2853 if (scrolled == pending_delta) |
2853 return scroll_status; | 2854 return scroll_status; |
2854 pending_delta -= scrolled; | 2855 pending_delta -= scrolled; |
2855 continue; | 2856 continue; |
2856 } | 2857 } |
2857 | 2858 |
2858 gfx::Vector2dF scroll_delta = | 2859 gfx::Vector2dF scroll_delta = |
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2988 ScrollState* scroll_state) { | 2989 ScrollState* scroll_state) { |
2989 DCHECK(scroll_state); | 2990 DCHECK(scroll_state); |
2990 gfx::Point viewport_point(scroll_state->position_x(), | 2991 gfx::Point viewport_point(scroll_state->position_x(), |
2991 scroll_state->position_y()); | 2992 scroll_state->position_y()); |
2992 const gfx::Vector2dF delta(scroll_state->delta_x(), scroll_state->delta_y()); | 2993 const gfx::Vector2dF delta(scroll_state->delta_x(), scroll_state->delta_y()); |
2993 gfx::Vector2dF applied_delta; | 2994 gfx::Vector2dF applied_delta; |
2994 // TODO(tdresser): Use a more rational epsilon. See crbug.com/510550 for | 2995 // TODO(tdresser): Use a more rational epsilon. See crbug.com/510550 for |
2995 // details. | 2996 // details. |
2996 const float kEpsilon = 0.1f; | 2997 const float kEpsilon = 0.1f; |
2997 | 2998 |
2998 if (scroll_node->data.is_inner_viewport_scroll_layer) { | 2999 if (scroll_node->is_inner_viewport_scroll_layer) { |
2999 bool affect_top_controls = !wheel_scrolling_; | 3000 bool affect_top_controls = !wheel_scrolling_; |
3000 Viewport::ScrollResult result = viewport()->ScrollBy( | 3001 Viewport::ScrollResult result = viewport()->ScrollBy( |
3001 delta, viewport_point, scroll_state->is_direct_manipulation(), | 3002 delta, viewport_point, scroll_state->is_direct_manipulation(), |
3002 affect_top_controls); | 3003 affect_top_controls); |
3003 applied_delta = result.consumed_delta; | 3004 applied_delta = result.consumed_delta; |
3004 scroll_state->set_caused_scroll( | 3005 scroll_state->set_caused_scroll( |
3005 std::abs(result.content_scrolled_delta.x()) > kEpsilon, | 3006 std::abs(result.content_scrolled_delta.x()) > kEpsilon, |
3006 std::abs(result.content_scrolled_delta.y()) > kEpsilon); | 3007 std::abs(result.content_scrolled_delta.y()) > kEpsilon); |
3007 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); | 3008 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); |
3008 } else { | 3009 } else { |
3009 applied_delta = ScrollSingleNode( | 3010 applied_delta = ScrollSingleNode( |
3010 scroll_node, delta, viewport_point, | 3011 scroll_node, delta, viewport_point, |
3011 scroll_state->is_direct_manipulation(), | 3012 scroll_state->is_direct_manipulation(), |
3012 &scroll_state->layer_tree_impl()->property_trees()->scroll_tree); | 3013 &scroll_state->layer_tree_impl()->property_trees()->scroll_tree); |
3013 } | 3014 } |
3014 | 3015 |
3015 // If the layer wasn't able to move, try the next one in the hierarchy. | 3016 // If the layer wasn't able to move, try the next one in the hierarchy. |
3016 bool scrolled = std::abs(applied_delta.x()) > kEpsilon; | 3017 bool scrolled = std::abs(applied_delta.x()) > kEpsilon; |
3017 scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon; | 3018 scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon; |
3018 | 3019 |
3019 if (scrolled && !scroll_node->data.is_inner_viewport_scroll_layer) { | 3020 if (scrolled && !scroll_node->is_inner_viewport_scroll_layer) { |
3020 // If the applied delta is within 45 degrees of the input | 3021 // If the applied delta is within 45 degrees of the input |
3021 // delta, bail out to make it easier to scroll just one layer | 3022 // delta, bail out to make it easier to scroll just one layer |
3022 // in one direction without affecting any of its parents. | 3023 // in one direction without affecting any of its parents. |
3023 float angle_threshold = 45; | 3024 float angle_threshold = 45; |
3024 if (MathUtil::SmallestAngleBetweenVectors(applied_delta, delta) < | 3025 if (MathUtil::SmallestAngleBetweenVectors(applied_delta, delta) < |
3025 angle_threshold) { | 3026 angle_threshold) { |
3026 applied_delta = delta; | 3027 applied_delta = delta; |
3027 } else { | 3028 } else { |
3028 // Allow further movement only on an axis perpendicular to the direction | 3029 // Allow further movement only on an axis perpendicular to the direction |
3029 // in which the layer moved. | 3030 // in which the layer moved. |
(...skipping 17 matching lines...) Expand all Loading... |
3047 // crbug.com/526462) | 3048 // crbug.com/526462) |
3048 std::list<const ScrollNode*> current_scroll_chain; | 3049 std::list<const ScrollNode*> current_scroll_chain; |
3049 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3050 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
3050 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3051 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
3051 if (scroll_node) { | 3052 if (scroll_node) { |
3052 for (; scroll_tree.parent(scroll_node); | 3053 for (; scroll_tree.parent(scroll_node); |
3053 scroll_node = scroll_tree.parent(scroll_node)) { | 3054 scroll_node = scroll_tree.parent(scroll_node)) { |
3054 // Skip the outer viewport scroll layer so that we try to scroll the | 3055 // Skip the outer viewport scroll layer so that we try to scroll the |
3055 // viewport only once. i.e. The inner viewport layer represents the | 3056 // viewport only once. i.e. The inner viewport layer represents the |
3056 // viewport. | 3057 // viewport. |
3057 if (!scroll_node->data.scrollable || | 3058 if (!scroll_node->scrollable || |
3058 scroll_node->data.is_outer_viewport_scroll_layer) | 3059 scroll_node->is_outer_viewport_scroll_layer) |
3059 continue; | 3060 continue; |
3060 current_scroll_chain.push_front(scroll_node); | 3061 current_scroll_chain.push_front(scroll_node); |
3061 } | 3062 } |
3062 } | 3063 } |
3063 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, | 3064 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, |
3064 active_tree()); | 3065 active_tree()); |
3065 scroll_state->DistributeToScrollChainDescendant(); | 3066 scroll_state->DistributeToScrollChainDescendant(); |
3066 } | 3067 } |
3067 | 3068 |
3068 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( | 3069 InputHandlerScrollResult LayerTreeHostImpl::ScrollBy( |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3148 bool LayerTreeHostImpl::ScrollVerticallyByPage(const gfx::Point& viewport_point, | 3149 bool LayerTreeHostImpl::ScrollVerticallyByPage(const gfx::Point& viewport_point, |
3149 ScrollDirection direction) { | 3150 ScrollDirection direction) { |
3150 DCHECK(wheel_scrolling_); | 3151 DCHECK(wheel_scrolling_); |
3151 | 3152 |
3152 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3153 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
3153 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3154 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
3154 if (scroll_node) { | 3155 if (scroll_node) { |
3155 for (; scroll_tree.parent(scroll_node); | 3156 for (; scroll_tree.parent(scroll_node); |
3156 scroll_node = scroll_tree.parent(scroll_node)) { | 3157 scroll_node = scroll_tree.parent(scroll_node)) { |
3157 // The inner viewport layer represents the viewport. | 3158 // The inner viewport layer represents the viewport. |
3158 if (!scroll_node->data.scrollable || | 3159 if (!scroll_node->scrollable || |
3159 scroll_node->data.is_outer_viewport_scroll_layer) | 3160 scroll_node->is_outer_viewport_scroll_layer) |
3160 continue; | 3161 continue; |
3161 | 3162 |
3162 float height = | 3163 float height = |
3163 scroll_tree.scroll_clip_layer_bounds(scroll_node->id).height(); | 3164 scroll_tree.scroll_clip_layer_bounds(scroll_node->id).height(); |
3164 | 3165 |
3165 // These magical values match WebKit and are designed to scroll nearly the | 3166 // These magical values match WebKit and are designed to scroll nearly the |
3166 // entire visible content height but leave a bit of overlap. | 3167 // entire visible content height but leave a bit of overlap. |
3167 float page = std::max(height * 0.875f, 1.f); | 3168 float page = std::max(height * 0.875f, 1.f); |
3168 if (direction == SCROLL_BACKWARD) | 3169 if (direction == SCROLL_BACKWARD) |
3169 page = -page; | 3170 page = -page; |
(...skipping 635 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3805 | 3806 |
3806 void LayerTreeHostImpl::ScrollAnimationAbort(LayerImpl* layer_impl) { | 3807 void LayerTreeHostImpl::ScrollAnimationAbort(LayerImpl* layer_impl) { |
3807 return animation_host_->ScrollAnimationAbort(false /* needs_completion */); | 3808 return animation_host_->ScrollAnimationAbort(false /* needs_completion */); |
3808 } | 3809 } |
3809 | 3810 |
3810 bool LayerTreeHostImpl::ScrollAnimationUpdateTarget( | 3811 bool LayerTreeHostImpl::ScrollAnimationUpdateTarget( |
3811 ScrollNode* scroll_node, | 3812 ScrollNode* scroll_node, |
3812 const gfx::Vector2dF& scroll_delta) { | 3813 const gfx::Vector2dF& scroll_delta) { |
3813 DCHECK_EQ( | 3814 DCHECK_EQ( |
3814 ElementId(active_tree()->LayerById(scroll_node->owner_id)->element_id()), | 3815 ElementId(active_tree()->LayerById(scroll_node->owner_id)->element_id()), |
3815 scroll_node->data.element_id); | 3816 scroll_node->element_id); |
3816 | 3817 |
3817 return animation_host_->ImplOnlyScrollAnimationUpdateTarget( | 3818 return animation_host_->ImplOnlyScrollAnimationUpdateTarget( |
3818 scroll_node->data.element_id, scroll_delta, | 3819 scroll_node->element_id, scroll_delta, |
3819 active_tree_->property_trees()->scroll_tree.MaxScrollOffset( | 3820 active_tree_->property_trees()->scroll_tree.MaxScrollOffset( |
3820 scroll_node->id), | 3821 scroll_node->id), |
3821 CurrentBeginFrameArgs().frame_time); | 3822 CurrentBeginFrameArgs().frame_time); |
3822 } | 3823 } |
3823 | 3824 |
3824 bool LayerTreeHostImpl::IsElementInList(ElementId element_id, | 3825 bool LayerTreeHostImpl::IsElementInList(ElementId element_id, |
3825 ElementListType list_type) const { | 3826 ElementListType list_type) const { |
3826 if (list_type == ElementListType::ACTIVE) { | 3827 if (list_type == ElementListType::ACTIVE) { |
3827 return active_tree() | 3828 return active_tree() |
3828 ? active_tree()->LayerByElementId(element_id) != nullptr | 3829 ? active_tree()->LayerByElementId(element_id) != nullptr |
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4018 return task_runner_provider_->HasImplThread(); | 4019 return task_runner_provider_->HasImplThread(); |
4019 } | 4020 } |
4020 | 4021 |
4021 bool LayerTreeHostImpl::CommitToActiveTree() const { | 4022 bool LayerTreeHostImpl::CommitToActiveTree() const { |
4022 // In single threaded mode we skip the pending tree and commit directly to the | 4023 // In single threaded mode we skip the pending tree and commit directly to the |
4023 // active tree. | 4024 // active tree. |
4024 return !task_runner_provider_->HasImplThread(); | 4025 return !task_runner_provider_->HasImplThread(); |
4025 } | 4026 } |
4026 | 4027 |
4027 } // namespace cc | 4028 } // namespace cc |
OLD | NEW |