| 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 434 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 445 // mithro(TODO): Enable these checks. | 445 // mithro(TODO): Enable these checks. |
| 446 // DCHECK(!current_begin_frame_tracker_.HasFinished()); | 446 // DCHECK(!current_begin_frame_tracker_.HasFinished()); |
| 447 // DCHECK(monotonic_time == current_begin_frame_tracker_.Current().frame_time) | 447 // DCHECK(monotonic_time == current_begin_frame_tracker_.Current().frame_time) |
| 448 // << "Called animate with unknown frame time!?"; | 448 // << "Called animate with unknown frame time!?"; |
| 449 | 449 |
| 450 bool did_animate = false; | 450 bool did_animate = false; |
| 451 | 451 |
| 452 if (input_handler_client_) { | 452 if (input_handler_client_) { |
| 453 // This animates fling scrolls. But on Android WebView root flings are | 453 // This animates fling scrolls. But on Android WebView root flings are |
| 454 // controlled by the application, so the compositor does not animate them. | 454 // controlled by the application, so the compositor does not animate them. |
| 455 bool ignore_fling = settings_.ignore_root_layer_flings && | 455 bool ignore_fling = |
| 456 IsCurrentlyScrollingInnerViewport(); | 456 settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport(); |
| 457 if (!ignore_fling) { | 457 if (!ignore_fling) { |
| 458 // This does not set did_animate, because if the InputHandlerClient | 458 // This does not set did_animate, because if the InputHandlerClient |
| 459 // changes anything it will be through the InputHandler interface which | 459 // changes anything it will be through the InputHandler interface which |
| 460 // does SetNeedsRedraw. | 460 // does SetNeedsRedraw. |
| 461 input_handler_client_->Animate(monotonic_time); | 461 input_handler_client_->Animate(monotonic_time); |
| 462 } | 462 } |
| 463 } | 463 } |
| 464 | 464 |
| 465 did_animate |= AnimatePageScale(monotonic_time); | 465 did_animate |= AnimatePageScale(monotonic_time); |
| 466 did_animate |= AnimateLayers(monotonic_time); | 466 did_animate |= AnimateLayers(monotonic_time); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 535 page_scale_animation_->ZoomTo(scaled_target_offset, page_scale, | 535 page_scale_animation_->ZoomTo(scaled_target_offset, page_scale, |
| 536 duration.InSecondsF()); | 536 duration.InSecondsF()); |
| 537 } | 537 } |
| 538 | 538 |
| 539 SetNeedsOneBeginImplFrame(); | 539 SetNeedsOneBeginImplFrame(); |
| 540 client_->SetNeedsCommitOnImplThread(); | 540 client_->SetNeedsCommitOnImplThread(); |
| 541 client_->RenewTreePriority(); | 541 client_->RenewTreePriority(); |
| 542 } | 542 } |
| 543 | 543 |
| 544 void LayerTreeHostImpl::SetNeedsAnimateInput() { | 544 void LayerTreeHostImpl::SetNeedsAnimateInput() { |
| 545 DCHECK(!IsCurrentlyScrollingInnerViewport() || | 545 DCHECK(!IsCurrentlyScrollingViewport() || |
| 546 !settings_.ignore_root_layer_flings); | 546 !settings_.ignore_root_layer_flings); |
| 547 SetNeedsOneBeginImplFrame(); | 547 SetNeedsOneBeginImplFrame(); |
| 548 } | 548 } |
| 549 | 549 |
| 550 bool LayerTreeHostImpl::IsCurrentlyScrollingInnerViewport() const { | 550 bool LayerTreeHostImpl::IsCurrentlyScrollingViewport() const { |
| 551 LayerImpl* scrolling_layer = CurrentlyScrollingLayer(); | 551 LayerImpl* scrolling_layer = CurrentlyScrollingLayer(); |
| 552 if (!scrolling_layer) | 552 if (!scrolling_layer) |
| 553 return false; | 553 return false; |
| 554 return scrolling_layer == InnerViewportScrollLayer(); | 554 DCHECK(viewport()); |
| 555 return scrolling_layer == viewport()->MainScrollLayer(); |
| 555 } | 556 } |
| 556 | 557 |
| 557 bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( | 558 bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( |
| 558 const gfx::Point& viewport_point, | 559 const gfx::Point& viewport_point, |
| 559 InputHandler::ScrollInputType type) const { | 560 InputHandler::ScrollInputType type) const { |
| 560 LayerImpl* scrolling_layer_impl = CurrentlyScrollingLayer(); | 561 LayerImpl* scrolling_layer_impl = CurrentlyScrollingLayer(); |
| 561 if (!scrolling_layer_impl) | 562 if (!scrolling_layer_impl) |
| 562 return false; | 563 return false; |
| 563 | 564 |
| 564 gfx::PointF device_viewport_point = gfx::ScalePoint( | 565 gfx::PointF device_viewport_point = gfx::ScalePoint( |
| 565 gfx::PointF(viewport_point), active_tree_->device_scale_factor()); | 566 gfx::PointF(viewport_point), active_tree_->device_scale_factor()); |
| 566 | 567 |
| 567 LayerImpl* layer_impl = | 568 LayerImpl* layer_impl = |
| 568 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); | 569 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); |
| 569 | 570 |
| 570 bool scroll_on_main_thread = false; | 571 bool scroll_on_main_thread = false; |
| 571 uint32_t main_thread_scrolling_reasons; | 572 uint32_t main_thread_scrolling_reasons; |
| 572 LayerImpl* test_layer_impl = FindScrollLayerForDeviceViewportPoint( | 573 LayerImpl* test_layer_impl = FindScrollLayerForDeviceViewportPoint( |
| 573 device_viewport_point, type, layer_impl, &scroll_on_main_thread, | 574 device_viewport_point, type, layer_impl, &scroll_on_main_thread, |
| 574 &main_thread_scrolling_reasons); | 575 &main_thread_scrolling_reasons); |
| 575 | 576 |
| 576 if (!test_layer_impl) | 577 if (!test_layer_impl) |
| 577 return false; | 578 return false; |
| 578 | 579 |
| 579 if (scrolling_layer_impl == test_layer_impl) | 580 if (scrolling_layer_impl == test_layer_impl) |
| 580 return true; | 581 return true; |
| 581 | 582 |
| 582 // For active scrolling state treat the inner/outer viewports interchangeably. | 583 // For active scrolling state treat the inner/outer viewports interchangeably. |
| 583 if ((scrolling_layer_impl == InnerViewportScrollLayer() && | 584 if (scrolling_layer_impl == InnerViewportScrollLayer() || |
| 584 test_layer_impl == OuterViewportScrollLayer()) || | 585 scrolling_layer_impl == OuterViewportScrollLayer()) { |
| 585 (scrolling_layer_impl == OuterViewportScrollLayer() && | 586 return test_layer_impl == viewport()->MainScrollLayer(); |
| 586 test_layer_impl == InnerViewportScrollLayer())) { | |
| 587 return true; | |
| 588 } | 587 } |
| 589 | 588 |
| 590 return false; | 589 return false; |
| 591 } | 590 } |
| 592 | 591 |
| 593 EventListenerProperties LayerTreeHostImpl::GetEventListenerProperties( | 592 EventListenerProperties LayerTreeHostImpl::GetEventListenerProperties( |
| 594 EventListenerClass event_class) const { | 593 EventListenerClass event_class) const { |
| 595 return active_tree_->event_listener_properties(event_class); | 594 return active_tree_->event_listener_properties(event_class); |
| 596 } | 595 } |
| 597 | 596 |
| (...skipping 1324 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1922 LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { | 1921 LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { |
| 1923 return active_tree_->CurrentlyScrollingLayer(); | 1922 return active_tree_->CurrentlyScrollingLayer(); |
| 1924 } | 1923 } |
| 1925 | 1924 |
| 1926 bool LayerTreeHostImpl::IsActivelyScrolling() const { | 1925 bool LayerTreeHostImpl::IsActivelyScrolling() const { |
| 1927 if (!CurrentlyScrollingLayer()) | 1926 if (!CurrentlyScrollingLayer()) |
| 1928 return false; | 1927 return false; |
| 1929 // On Android WebView root flings are controlled by the application, | 1928 // On Android WebView root flings are controlled by the application, |
| 1930 // so the compositor does not animate them and can't tell if they | 1929 // so the compositor does not animate them and can't tell if they |
| 1931 // are actually animating. So assume there are none. | 1930 // are actually animating. So assume there are none. |
| 1932 if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingInnerViewport()) | 1931 if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport()) |
| 1933 return false; | 1932 return false; |
| 1934 return did_lock_scrolling_layer_; | 1933 return did_lock_scrolling_layer_; |
| 1935 } | 1934 } |
| 1936 | 1935 |
| 1937 void LayerTreeHostImpl::CreatePendingTree() { | 1936 void LayerTreeHostImpl::CreatePendingTree() { |
| 1938 CHECK(!pending_tree_); | 1937 CHECK(!pending_tree_); |
| 1939 if (recycle_tree_) { | 1938 if (recycle_tree_) { |
| 1940 recycle_tree_.swap(pending_tree_); | 1939 recycle_tree_.swap(pending_tree_); |
| 1941 } else { | 1940 } else { |
| 1942 pending_tree_ = base::MakeUnique<LayerTreeImpl>( | 1941 pending_tree_ = base::MakeUnique<LayerTreeImpl>( |
| (...skipping 601 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2544 } | 2543 } |
| 2545 | 2544 |
| 2546 if (status.thread == InputHandler::SCROLL_ON_IMPL_THREAD && | 2545 if (status.thread == InputHandler::SCROLL_ON_IMPL_THREAD && |
| 2547 !potentially_scrolling_layer_impl) { | 2546 !potentially_scrolling_layer_impl) { |
| 2548 potentially_scrolling_layer_impl = | 2547 potentially_scrolling_layer_impl = |
| 2549 active_tree_->LayerById(scroll_node->owner_id); | 2548 active_tree_->LayerById(scroll_node->owner_id); |
| 2550 } | 2549 } |
| 2551 } | 2550 } |
| 2552 } | 2551 } |
| 2553 | 2552 |
| 2554 // Falling back to the root scroll layer ensures generation of root overscroll | 2553 // Falling back to the viewport layer ensures generation of root overscroll |
| 2555 // notifications. The inner viewport layer represents the viewport during | 2554 // notifications. We use the viewport's main scroll layer to represent the |
| 2556 // scrolling. | 2555 // viewport in scrolling code. |
| 2557 if (!potentially_scrolling_layer_impl) | 2556 if (!potentially_scrolling_layer_impl || |
| 2558 potentially_scrolling_layer_impl = InnerViewportScrollLayer(); | 2557 potentially_scrolling_layer_impl == OuterViewportScrollLayer() || |
| 2559 | 2558 potentially_scrolling_layer_impl == InnerViewportScrollLayer()) { |
| 2560 // The inner viewport layer represents the viewport. | 2559 potentially_scrolling_layer_impl = viewport()->MainScrollLayer(); |
| 2561 if (potentially_scrolling_layer_impl == OuterViewportScrollLayer()) | 2560 } |
| 2562 potentially_scrolling_layer_impl = InnerViewportScrollLayer(); | |
| 2563 | 2561 |
| 2564 if (potentially_scrolling_layer_impl) { | 2562 if (potentially_scrolling_layer_impl) { |
| 2565 // Ensure that final layer scrolls on impl thread (crbug.com/625100) | 2563 // Ensure that final layer scrolls on impl thread (crbug.com/625100) |
| 2566 ScrollNode* scroll_node = | 2564 ScrollNode* scroll_node = |
| 2567 scroll_tree.Node(potentially_scrolling_layer_impl->scroll_tree_index()); | 2565 scroll_tree.Node(potentially_scrolling_layer_impl->scroll_tree_index()); |
| 2568 ScrollStatus status = | 2566 ScrollStatus status = |
| 2569 TryScroll(device_viewport_point, type, scroll_tree, scroll_node); | 2567 TryScroll(device_viewport_point, type, scroll_tree, scroll_node); |
| 2570 if (IsMainThreadScrolling(status, scroll_node)) { | 2568 if (IsMainThreadScrolling(status, scroll_node)) { |
| 2571 *scroll_on_main_thread = true; | 2569 *scroll_on_main_thread = true; |
| 2572 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; | 2570 *main_thread_scrolling_reasons = status.main_thread_scrolling_reasons; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2629 return scroll_status; | 2627 return scroll_status; |
| 2630 } | 2628 } |
| 2631 | 2629 |
| 2632 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( | 2630 InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin( |
| 2633 ScrollState* scroll_state, | 2631 ScrollState* scroll_state, |
| 2634 InputHandler::ScrollInputType type) { | 2632 InputHandler::ScrollInputType type) { |
| 2635 TRACE_EVENT0("cc", "LayerTreeHostImpl::RootScrollBegin"); | 2633 TRACE_EVENT0("cc", "LayerTreeHostImpl::RootScrollBegin"); |
| 2636 | 2634 |
| 2637 ClearCurrentlyScrollingLayer(); | 2635 ClearCurrentlyScrollingLayer(); |
| 2638 | 2636 |
| 2639 return ScrollBeginImpl(scroll_state, InnerViewportScrollLayer(), type); | 2637 DCHECK(viewport()); |
| 2638 return ScrollBeginImpl(scroll_state, viewport()->MainScrollLayer(), type); |
| 2640 } | 2639 } |
| 2641 | 2640 |
| 2642 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( | 2641 InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin( |
| 2643 ScrollState* scroll_state, | 2642 ScrollState* scroll_state, |
| 2644 InputHandler::ScrollInputType type) { | 2643 InputHandler::ScrollInputType type) { |
| 2645 ScrollStatus scroll_status; | 2644 ScrollStatus scroll_status; |
| 2646 scroll_status.main_thread_scrolling_reasons = | 2645 scroll_status.main_thread_scrolling_reasons = |
| 2647 MainThreadScrollingReason::kNotScrollingOnMain; | 2646 MainThreadScrollingReason::kNotScrollingOnMain; |
| 2648 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin"); | 2647 TRACE_EVENT0("cc", "LayerTreeHostImpl::ScrollBegin"); |
| 2649 | 2648 |
| (...skipping 330 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2980 ScrollState* scroll_state) { | 2979 ScrollState* scroll_state) { |
| 2981 DCHECK(scroll_state); | 2980 DCHECK(scroll_state); |
| 2982 gfx::Point viewport_point(scroll_state->position_x(), | 2981 gfx::Point viewport_point(scroll_state->position_x(), |
| 2983 scroll_state->position_y()); | 2982 scroll_state->position_y()); |
| 2984 const gfx::Vector2dF delta(scroll_state->delta_x(), scroll_state->delta_y()); | 2983 const gfx::Vector2dF delta(scroll_state->delta_x(), scroll_state->delta_y()); |
| 2985 gfx::Vector2dF applied_delta; | 2984 gfx::Vector2dF applied_delta; |
| 2986 // TODO(tdresser): Use a more rational epsilon. See crbug.com/510550 for | 2985 // TODO(tdresser): Use a more rational epsilon. See crbug.com/510550 for |
| 2987 // details. | 2986 // details. |
| 2988 const float kEpsilon = 0.1f; | 2987 const float kEpsilon = 0.1f; |
| 2989 | 2988 |
| 2990 if (scroll_node->is_inner_viewport_scroll_layer) { | 2989 bool is_viewport_scroll_layer = |
| 2990 viewport()->MainScrollLayer() && |
| 2991 scroll_node->owner_id == viewport()->MainScrollLayer()->id(); |
| 2992 |
| 2993 if (is_viewport_scroll_layer) { |
| 2991 bool affect_top_controls = !wheel_scrolling_; | 2994 bool affect_top_controls = !wheel_scrolling_; |
| 2992 Viewport::ScrollResult result = viewport()->ScrollBy( | 2995 Viewport::ScrollResult result = viewport()->ScrollBy( |
| 2993 delta, viewport_point, scroll_state->is_direct_manipulation(), | 2996 delta, viewport_point, scroll_state->is_direct_manipulation(), |
| 2994 affect_top_controls); | 2997 affect_top_controls); |
| 2995 applied_delta = result.consumed_delta; | 2998 applied_delta = result.consumed_delta; |
| 2996 scroll_state->set_caused_scroll( | 2999 scroll_state->set_caused_scroll( |
| 2997 std::abs(result.content_scrolled_delta.x()) > kEpsilon, | 3000 std::abs(result.content_scrolled_delta.x()) > kEpsilon, |
| 2998 std::abs(result.content_scrolled_delta.y()) > kEpsilon); | 3001 std::abs(result.content_scrolled_delta.y()) > kEpsilon); |
| 2999 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); | 3002 scroll_state->ConsumeDelta(applied_delta.x(), applied_delta.y()); |
| 3000 } else { | 3003 } else { |
| 3001 applied_delta = ScrollSingleNode( | 3004 applied_delta = ScrollSingleNode( |
| 3002 scroll_node, delta, viewport_point, | 3005 scroll_node, delta, viewport_point, |
| 3003 scroll_state->is_direct_manipulation(), | 3006 scroll_state->is_direct_manipulation(), |
| 3004 &scroll_state->layer_tree_impl()->property_trees()->scroll_tree); | 3007 &scroll_state->layer_tree_impl()->property_trees()->scroll_tree); |
| 3005 } | 3008 } |
| 3006 | 3009 |
| 3007 // If the layer wasn't able to move, try the next one in the hierarchy. | 3010 // If the layer wasn't able to move, try the next one in the hierarchy. |
| 3008 bool scrolled = std::abs(applied_delta.x()) > kEpsilon; | 3011 bool scrolled = std::abs(applied_delta.x()) > kEpsilon; |
| 3009 scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon; | 3012 scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon; |
| 3010 | 3013 |
| 3011 if (scrolled && !scroll_node->is_inner_viewport_scroll_layer) { | 3014 if (scrolled && !is_viewport_scroll_layer) { |
| 3012 // If the applied delta is within 45 degrees of the input | 3015 // If the applied delta is within 45 degrees of the input |
| 3013 // delta, bail out to make it easier to scroll just one layer | 3016 // delta, bail out to make it easier to scroll just one layer |
| 3014 // in one direction without affecting any of its parents. | 3017 // in one direction without affecting any of its parents. |
| 3015 float angle_threshold = 45; | 3018 float angle_threshold = 45; |
| 3016 if (MathUtil::SmallestAngleBetweenVectors(applied_delta, delta) < | 3019 if (MathUtil::SmallestAngleBetweenVectors(applied_delta, delta) < |
| 3017 angle_threshold) { | 3020 angle_threshold) { |
| 3018 applied_delta = delta; | 3021 applied_delta = delta; |
| 3019 } else { | 3022 } else { |
| 3020 // Allow further movement only on an axis perpendicular to the direction | 3023 // Allow further movement only on an axis perpendicular to the direction |
| 3021 // in which the layer moved. | 3024 // in which the layer moved. |
| (...skipping 15 matching lines...) Expand all Loading... |
| 3037 // is not the case here. We eventually want to have the same behaviour on both | 3040 // is not the case here. We eventually want to have the same behaviour on both |
| 3038 // sides but it may become a non issue if we get rid of scroll chaining (see | 3041 // sides but it may become a non issue if we get rid of scroll chaining (see |
| 3039 // crbug.com/526462) | 3042 // crbug.com/526462) |
| 3040 std::list<const ScrollNode*> current_scroll_chain; | 3043 std::list<const ScrollNode*> current_scroll_chain; |
| 3041 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; | 3044 ScrollTree& scroll_tree = active_tree_->property_trees()->scroll_tree; |
| 3042 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); | 3045 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); |
| 3043 if (scroll_node) { | 3046 if (scroll_node) { |
| 3044 for (; scroll_tree.parent(scroll_node); | 3047 for (; scroll_tree.parent(scroll_node); |
| 3045 scroll_node = scroll_tree.parent(scroll_node)) { | 3048 scroll_node = scroll_tree.parent(scroll_node)) { |
| 3046 if (scroll_node->is_outer_viewport_scroll_layer) { | 3049 if (scroll_node->is_outer_viewport_scroll_layer) { |
| 3050 // TODO(bokan): This should use Viewport::MainScrollLayer once that |
| 3051 // returns the outer viewport scroll layer. |
| 3047 // Don't chain scrolls past the outer viewport scroll layer. Once we | 3052 // Don't chain scrolls past the outer viewport scroll layer. Once we |
| 3048 // reach that, we should scroll the viewport, which is represented by | 3053 // reach that, we should scroll the viewport which is represented by the |
| 3049 // the inner viewport scroll layer. | 3054 // main viewport scroll layer. |
| 3050 ScrollNode* inner_viewport_scroll_node = | 3055 DCHECK(viewport()->MainScrollLayer()); |
| 3051 scroll_tree.Node(InnerViewportScrollLayer()->scroll_tree_index()); | 3056 ScrollNode* viewport_scroll_node = scroll_tree.Node( |
| 3052 current_scroll_chain.push_front(inner_viewport_scroll_node); | 3057 viewport()->MainScrollLayer()->scroll_tree_index()); |
| 3058 DCHECK(viewport_scroll_node); |
| 3059 current_scroll_chain.push_front(viewport_scroll_node); |
| 3053 break; | 3060 break; |
| 3054 } | 3061 } |
| 3055 | 3062 |
| 3056 if (!scroll_node->scrollable) | 3063 if (!scroll_node->scrollable) |
| 3057 continue; | 3064 continue; |
| 3058 | 3065 |
| 3059 current_scroll_chain.push_front(scroll_node); | 3066 current_scroll_chain.push_front(scroll_node); |
| 3060 } | 3067 } |
| 3061 } | 3068 } |
| 3062 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, | 3069 scroll_state->set_scroll_chain_and_layer_tree(current_scroll_chain, |
| (...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3238 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); | 3245 active_tree_->FindLayerThatIsHitByPoint(device_viewport_point); |
| 3239 HandleMouseOverScrollbar(layer_impl); | 3246 HandleMouseOverScrollbar(layer_impl); |
| 3240 if (scroll_layer_id_when_mouse_over_scrollbar_ != Layer::INVALID_ID) | 3247 if (scroll_layer_id_when_mouse_over_scrollbar_ != Layer::INVALID_ID) |
| 3241 return; | 3248 return; |
| 3242 | 3249 |
| 3243 bool scroll_on_main_thread = false; | 3250 bool scroll_on_main_thread = false; |
| 3244 uint32_t main_thread_scrolling_reasons; | 3251 uint32_t main_thread_scrolling_reasons; |
| 3245 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint( | 3252 LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint( |
| 3246 device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl, | 3253 device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl, |
| 3247 &scroll_on_main_thread, &main_thread_scrolling_reasons); | 3254 &scroll_on_main_thread, &main_thread_scrolling_reasons); |
| 3255 // Scrollbars for the viewport are registered with the outer viewport layer. |
| 3248 if (scroll_layer_impl == InnerViewportScrollLayer()) | 3256 if (scroll_layer_impl == InnerViewportScrollLayer()) |
| 3249 scroll_layer_impl = OuterViewportScrollLayer(); | 3257 scroll_layer_impl = OuterViewportScrollLayer(); |
| 3250 if (scroll_on_main_thread || !scroll_layer_impl) | 3258 if (scroll_on_main_thread || !scroll_layer_impl) |
| 3251 return; | 3259 return; |
| 3252 | 3260 |
| 3253 ScrollbarAnimationController* animation_controller = | 3261 ScrollbarAnimationController* animation_controller = |
| 3254 ScrollbarAnimationControllerForId(scroll_layer_impl->id()); | 3262 ScrollbarAnimationControllerForId(scroll_layer_impl->id()); |
| 3255 if (!animation_controller) | 3263 if (!animation_controller) |
| 3256 return; | 3264 return; |
| 3257 | 3265 |
| (...skipping 28 matching lines...) Expand all Loading... |
| 3286 ScrollbarAnimationControllerForId( | 3294 ScrollbarAnimationControllerForId( |
| 3287 scroll_layer_id_when_mouse_over_scrollbar_); | 3295 scroll_layer_id_when_mouse_over_scrollbar_); |
| 3288 if (new_animation_controller) | 3296 if (new_animation_controller) |
| 3289 new_animation_controller->DidMouseMoveNear(0); | 3297 new_animation_controller->DidMouseMoveNear(0); |
| 3290 } | 3298 } |
| 3291 | 3299 |
| 3292 void LayerTreeHostImpl::PinchGestureBegin() { | 3300 void LayerTreeHostImpl::PinchGestureBegin() { |
| 3293 pinch_gesture_active_ = true; | 3301 pinch_gesture_active_ = true; |
| 3294 client_->RenewTreePriority(); | 3302 client_->RenewTreePriority(); |
| 3295 pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer(); | 3303 pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer(); |
| 3296 active_tree_->SetCurrentlyScrollingLayer( | 3304 active_tree_->SetCurrentlyScrollingLayer(viewport()->MainScrollLayer()); |
| 3297 active_tree_->InnerViewportScrollLayer()); | |
| 3298 top_controls_manager_->PinchBegin(); | 3305 top_controls_manager_->PinchBegin(); |
| 3299 } | 3306 } |
| 3300 | 3307 |
| 3301 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, | 3308 void LayerTreeHostImpl::PinchGestureUpdate(float magnify_delta, |
| 3302 const gfx::Point& anchor) { | 3309 const gfx::Point& anchor) { |
| 3303 TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate"); | 3310 TRACE_EVENT0("cc", "LayerTreeHostImpl::PinchGestureUpdate"); |
| 3304 if (!InnerViewportScrollLayer()) | 3311 if (!InnerViewportScrollLayer()) |
| 3305 return; | 3312 return; |
| 3306 viewport()->PinchUpdate(magnify_delta, anchor); | 3313 viewport()->PinchUpdate(magnify_delta, anchor); |
| 3307 client_->SetNeedsCommitOnImplThread(); | 3314 client_->SetNeedsCommitOnImplThread(); |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3365 active_tree_->elastic_overscroll()->PullDeltaForMainThread(); | 3372 active_tree_->elastic_overscroll()->PullDeltaForMainThread(); |
| 3366 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); | 3373 scroll_info->swap_promises.swap(swap_promises_for_main_thread_scroll_update_); |
| 3367 | 3374 |
| 3368 return scroll_info; | 3375 return scroll_info; |
| 3369 } | 3376 } |
| 3370 | 3377 |
| 3371 void LayerTreeHostImpl::SetFullViewportDamage() { | 3378 void LayerTreeHostImpl::SetFullViewportDamage() { |
| 3372 SetViewportDamage(gfx::Rect(DrawViewportSize())); | 3379 SetViewportDamage(gfx::Rect(DrawViewportSize())); |
| 3373 } | 3380 } |
| 3374 | 3381 |
| 3375 void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) { | |
| 3376 DCHECK(InnerViewportScrollLayer()); | |
| 3377 LayerImpl* scroll_layer = InnerViewportScrollLayer(); | |
| 3378 | |
| 3379 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta); | |
| 3380 if (!unused_delta.IsZero() && OuterViewportScrollLayer()) | |
| 3381 OuterViewportScrollLayer()->ScrollBy(unused_delta); | |
| 3382 } | |
| 3383 | |
| 3384 void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) { | |
| 3385 DCHECK(InnerViewportScrollLayer()); | |
| 3386 LayerImpl* scroll_layer = OuterViewportScrollLayer() | |
| 3387 ? OuterViewportScrollLayer() | |
| 3388 : InnerViewportScrollLayer(); | |
| 3389 | |
| 3390 gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta); | |
| 3391 | |
| 3392 if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer())) | |
| 3393 InnerViewportScrollLayer()->ScrollBy(unused_delta); | |
| 3394 } | |
| 3395 | |
| 3396 bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) { | 3382 bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) { |
| 3397 if (!page_scale_animation_) | 3383 if (!page_scale_animation_) |
| 3398 return false; | 3384 return false; |
| 3399 | 3385 |
| 3400 gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset(); | 3386 gfx::ScrollOffset scroll_total = active_tree_->TotalScrollOffset(); |
| 3401 | 3387 |
| 3402 if (!page_scale_animation_->IsAnimationStarted()) | 3388 if (!page_scale_animation_->IsAnimationStarted()) |
| 3403 page_scale_animation_->StartAnimation(monotonic_time); | 3389 page_scale_animation_->StartAnimation(monotonic_time); |
| 3404 | 3390 |
| 3405 active_tree_->SetPageScaleOnActiveTree( | 3391 active_tree_->SetPageScaleOnActiveTree( |
| 3406 page_scale_animation_->PageScaleFactorAtTime(monotonic_time)); | 3392 page_scale_animation_->PageScaleFactorAtTime(monotonic_time)); |
| 3407 gfx::ScrollOffset next_scroll = gfx::ScrollOffset( | 3393 gfx::ScrollOffset next_scroll = gfx::ScrollOffset( |
| 3408 page_scale_animation_->ScrollOffsetAtTime(monotonic_time)); | 3394 page_scale_animation_->ScrollOffsetAtTime(monotonic_time)); |
| 3409 | 3395 |
| 3410 ScrollViewportInnerFirst(next_scroll.DeltaFrom(scroll_total)); | 3396 DCHECK(viewport()); |
| 3397 viewport()->ScrollByInnerFirst(next_scroll.DeltaFrom(scroll_total)); |
| 3411 | 3398 |
| 3412 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { | 3399 if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) { |
| 3413 page_scale_animation_ = nullptr; | 3400 page_scale_animation_ = nullptr; |
| 3414 client_->SetNeedsCommitOnImplThread(); | 3401 client_->SetNeedsCommitOnImplThread(); |
| 3415 client_->RenewTreePriority(); | 3402 client_->RenewTreePriority(); |
| 3416 client_->DidCompletePageScaleAnimationOnImplThread(); | 3403 client_->DidCompletePageScaleAnimationOnImplThread(); |
| 3417 } else { | 3404 } else { |
| 3418 SetNeedsOneBeginImplFrame(); | 3405 SetNeedsOneBeginImplFrame(); |
| 3419 } | 3406 } |
| 3420 return true; | 3407 return true; |
| 3421 } | 3408 } |
| 3422 | 3409 |
| 3423 bool LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { | 3410 bool LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) { |
| 3424 if (!top_controls_manager_->has_animation()) | 3411 if (!top_controls_manager_->has_animation()) |
| 3425 return false; | 3412 return false; |
| 3426 | 3413 |
| 3427 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); | 3414 gfx::Vector2dF scroll = top_controls_manager_->Animate(time); |
| 3428 | 3415 |
| 3429 if (top_controls_manager_->has_animation()) | 3416 if (top_controls_manager_->has_animation()) |
| 3430 SetNeedsOneBeginImplFrame(); | 3417 SetNeedsOneBeginImplFrame(); |
| 3431 | 3418 |
| 3432 if (active_tree_->TotalScrollOffset().y() == 0.f) | 3419 if (active_tree_->TotalScrollOffset().y() == 0.f) |
| 3433 return false; | 3420 return false; |
| 3434 | 3421 |
| 3435 if (scroll.IsZero()) | 3422 if (scroll.IsZero()) |
| 3436 return false; | 3423 return false; |
| 3437 | 3424 |
| 3438 ScrollViewportBy(gfx::ScaleVector2d( | 3425 DCHECK(viewport()); |
| 3439 scroll, 1.f / active_tree_->current_page_scale_factor())); | 3426 viewport()->ScrollBy(scroll, gfx::Point(), false, false); |
| 3440 client_->SetNeedsCommitOnImplThread(); | 3427 client_->SetNeedsCommitOnImplThread(); |
| 3441 client_->RenewTreePriority(); | 3428 client_->RenewTreePriority(); |
| 3442 return true; | 3429 return true; |
| 3443 } | 3430 } |
| 3444 | 3431 |
| 3445 bool LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks monotonic_time) { | 3432 bool LayerTreeHostImpl::AnimateScrollbars(base::TimeTicks monotonic_time) { |
| 3446 bool animated = false; | 3433 bool animated = false; |
| 3447 for (auto& pair : scrollbar_animation_controllers_) | 3434 for (auto& pair : scrollbar_animation_controllers_) |
| 3448 animated |= pair.second->Animate(monotonic_time); | 3435 animated |= pair.second->Animate(monotonic_time); |
| 3449 return animated; | 3436 return animated; |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3513 } | 3500 } |
| 3514 | 3501 |
| 3515 void LayerTreeHostImpl::UnregisterScrollbarAnimationController( | 3502 void LayerTreeHostImpl::UnregisterScrollbarAnimationController( |
| 3516 int scroll_layer_id) { | 3503 int scroll_layer_id) { |
| 3517 scrollbar_animation_controllers_.erase(scroll_layer_id); | 3504 scrollbar_animation_controllers_.erase(scroll_layer_id); |
| 3518 } | 3505 } |
| 3519 | 3506 |
| 3520 ScrollbarAnimationController* | 3507 ScrollbarAnimationController* |
| 3521 LayerTreeHostImpl::ScrollbarAnimationControllerForId( | 3508 LayerTreeHostImpl::ScrollbarAnimationControllerForId( |
| 3522 int scroll_layer_id) const { | 3509 int scroll_layer_id) const { |
| 3510 // The viewport layers have only one set of scrollbars and their controller |
| 3511 // is registered with the outer viewport. |
| 3523 if (InnerViewportScrollLayer() && OuterViewportScrollLayer() && | 3512 if (InnerViewportScrollLayer() && OuterViewportScrollLayer() && |
| 3524 scroll_layer_id == InnerViewportScrollLayer()->id()) | 3513 scroll_layer_id == InnerViewportScrollLayer()->id()) |
| 3525 scroll_layer_id = OuterViewportScrollLayer()->id(); | 3514 scroll_layer_id = OuterViewportScrollLayer()->id(); |
| 3526 auto i = scrollbar_animation_controllers_.find(scroll_layer_id); | 3515 auto i = scrollbar_animation_controllers_.find(scroll_layer_id); |
| 3527 if (i == scrollbar_animation_controllers_.end()) | 3516 if (i == scrollbar_animation_controllers_.end()) |
| 3528 return nullptr; | 3517 return nullptr; |
| 3529 return i->second.get(); | 3518 return i->second.get(); |
| 3530 } | 3519 } |
| 3531 | 3520 |
| 3532 void LayerTreeHostImpl::PostDelayedScrollbarAnimationTask( | 3521 void LayerTreeHostImpl::PostDelayedScrollbarAnimationTask( |
| (...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4165 if (is_visible) { | 4154 if (is_visible) { |
| 4166 worker_context_visibility_ = | 4155 worker_context_visibility_ = |
| 4167 worker_context->CacheController()->ClientBecameVisible(); | 4156 worker_context->CacheController()->ClientBecameVisible(); |
| 4168 } else { | 4157 } else { |
| 4169 worker_context->CacheController()->ClientBecameNotVisible( | 4158 worker_context->CacheController()->ClientBecameNotVisible( |
| 4170 std::move(worker_context_visibility_)); | 4159 std::move(worker_context_visibility_)); |
| 4171 } | 4160 } |
| 4172 } | 4161 } |
| 4173 | 4162 |
| 4174 } // namespace cc | 4163 } // namespace cc |
| OLD | NEW |