| Index: cc/trees/layer_tree_host_impl.cc
|
| diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc
|
| index 4aa0886dfb80d80425acf157f5d0e7d8daf1e872..e2f030db3572957978629a976ba005350b1499db 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -452,8 +452,8 @@ void LayerTreeHostImpl::AnimateInternal(bool active_tree) {
|
| if (input_handler_client_) {
|
| // This animates fling scrolls. But on Android WebView root flings are
|
| // controlled by the application, so the compositor does not animate them.
|
| - bool ignore_fling = settings_.ignore_root_layer_flings &&
|
| - IsCurrentlyScrollingInnerViewport();
|
| + bool ignore_fling =
|
| + settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport();
|
| if (!ignore_fling) {
|
| // This does not set did_animate, because if the InputHandlerClient
|
| // changes anything it will be through the InputHandler interface which
|
| @@ -542,16 +542,17 @@ void LayerTreeHostImpl::StartPageScaleAnimation(
|
| }
|
|
|
| void LayerTreeHostImpl::SetNeedsAnimateInput() {
|
| - DCHECK(!IsCurrentlyScrollingInnerViewport() ||
|
| + DCHECK(!IsCurrentlyScrollingViewport() ||
|
| !settings_.ignore_root_layer_flings);
|
| SetNeedsOneBeginImplFrame();
|
| }
|
|
|
| -bool LayerTreeHostImpl::IsCurrentlyScrollingInnerViewport() const {
|
| +bool LayerTreeHostImpl::IsCurrentlyScrollingViewport() const {
|
| LayerImpl* scrolling_layer = CurrentlyScrollingLayer();
|
| if (!scrolling_layer)
|
| return false;
|
| - return scrolling_layer == InnerViewportScrollLayer();
|
| + DCHECK(viewport());
|
| + return scrolling_layer == viewport()->MainScrollLayer();
|
| }
|
|
|
| bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt(
|
| @@ -580,11 +581,9 @@ bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt(
|
| return true;
|
|
|
| // For active scrolling state treat the inner/outer viewports interchangeably.
|
| - if ((scrolling_layer_impl == InnerViewportScrollLayer() &&
|
| - test_layer_impl == OuterViewportScrollLayer()) ||
|
| - (scrolling_layer_impl == OuterViewportScrollLayer() &&
|
| - test_layer_impl == InnerViewportScrollLayer())) {
|
| - return true;
|
| + if (scrolling_layer_impl == InnerViewportScrollLayer() ||
|
| + scrolling_layer_impl == OuterViewportScrollLayer()) {
|
| + return test_layer_impl == viewport()->MainScrollLayer();
|
| }
|
|
|
| return false;
|
| @@ -1929,7 +1928,7 @@ bool LayerTreeHostImpl::IsActivelyScrolling() const {
|
| // On Android WebView root flings are controlled by the application,
|
| // so the compositor does not animate them and can't tell if they
|
| // are actually animating. So assume there are none.
|
| - if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingInnerViewport())
|
| + if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingViewport())
|
| return false;
|
| return did_lock_scrolling_layer_;
|
| }
|
| @@ -2551,15 +2550,14 @@ LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
|
| }
|
| }
|
|
|
| - // Falling back to the root scroll layer ensures generation of root overscroll
|
| - // notifications. The inner viewport layer represents the viewport during
|
| - // scrolling.
|
| - if (!potentially_scrolling_layer_impl)
|
| - potentially_scrolling_layer_impl = InnerViewportScrollLayer();
|
| -
|
| - // The inner viewport layer represents the viewport.
|
| - if (potentially_scrolling_layer_impl == OuterViewportScrollLayer())
|
| - potentially_scrolling_layer_impl = InnerViewportScrollLayer();
|
| + // Falling back to the viewport layer ensures generation of root overscroll
|
| + // notifications. We use the viewport's main scroll layer to represent the
|
| + // viewport in scrolling code.
|
| + if (!potentially_scrolling_layer_impl ||
|
| + potentially_scrolling_layer_impl == OuterViewportScrollLayer() ||
|
| + potentially_scrolling_layer_impl == InnerViewportScrollLayer()) {
|
| + potentially_scrolling_layer_impl = viewport()->MainScrollLayer();
|
| + }
|
|
|
| if (potentially_scrolling_layer_impl) {
|
| // Ensure that final layer scrolls on impl thread (crbug.com/625100)
|
| @@ -2636,7 +2634,8 @@ InputHandler::ScrollStatus LayerTreeHostImpl::RootScrollBegin(
|
|
|
| ClearCurrentlyScrollingLayer();
|
|
|
| - return ScrollBeginImpl(scroll_state, InnerViewportScrollLayer(), type);
|
| + DCHECK(viewport());
|
| + return ScrollBeginImpl(scroll_state, viewport()->MainScrollLayer(), type);
|
| }
|
|
|
| InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBegin(
|
| @@ -2987,7 +2986,11 @@ void LayerTreeHostImpl::ApplyScroll(ScrollNode* scroll_node,
|
| // details.
|
| const float kEpsilon = 0.1f;
|
|
|
| - if (scroll_node->is_inner_viewport_scroll_layer) {
|
| + bool is_viewport_scroll_layer =
|
| + viewport()->MainScrollLayer() &&
|
| + scroll_node->owner_id == viewport()->MainScrollLayer()->id();
|
| +
|
| + if (is_viewport_scroll_layer) {
|
| bool affect_top_controls = !wheel_scrolling_;
|
| Viewport::ScrollResult result = viewport()->ScrollBy(
|
| delta, viewport_point, scroll_state->is_direct_manipulation(),
|
| @@ -3008,7 +3011,7 @@ void LayerTreeHostImpl::ApplyScroll(ScrollNode* scroll_node,
|
| bool scrolled = std::abs(applied_delta.x()) > kEpsilon;
|
| scrolled = scrolled || std::abs(applied_delta.y()) > kEpsilon;
|
|
|
| - if (scrolled && !scroll_node->is_inner_viewport_scroll_layer) {
|
| + if (scrolled && !is_viewport_scroll_layer) {
|
| // If the applied delta is within 45 degrees of the input
|
| // delta, bail out to make it easier to scroll just one layer
|
| // in one direction without affecting any of its parents.
|
| @@ -3044,12 +3047,16 @@ void LayerTreeHostImpl::DistributeScrollDelta(ScrollState* scroll_state) {
|
| for (; scroll_tree.parent(scroll_node);
|
| scroll_node = scroll_tree.parent(scroll_node)) {
|
| if (scroll_node->is_outer_viewport_scroll_layer) {
|
| + // TODO(bokan): This should use Viewport::MainScrollLayer once that
|
| + // returns the outer viewport scroll layer.
|
| // Don't chain scrolls past the outer viewport scroll layer. Once we
|
| - // reach that, we should scroll the viewport, which is represented by
|
| - // the inner viewport scroll layer.
|
| - ScrollNode* inner_viewport_scroll_node =
|
| - scroll_tree.Node(InnerViewportScrollLayer()->scroll_tree_index());
|
| - current_scroll_chain.push_front(inner_viewport_scroll_node);
|
| + // reach that, we should scroll the viewport which is represented by the
|
| + // main viewport scroll layer.
|
| + DCHECK(viewport()->MainScrollLayer());
|
| + ScrollNode* viewport_scroll_node = scroll_tree.Node(
|
| + viewport()->MainScrollLayer()->scroll_tree_index());
|
| + DCHECK(viewport_scroll_node);
|
| + current_scroll_chain.push_front(viewport_scroll_node);
|
| break;
|
| }
|
|
|
| @@ -3245,6 +3252,7 @@ void LayerTreeHostImpl::MouseMoveAt(const gfx::Point& viewport_point) {
|
| LayerImpl* scroll_layer_impl = FindScrollLayerForDeviceViewportPoint(
|
| device_viewport_point, InputHandler::TOUCHSCREEN, layer_impl,
|
| &scroll_on_main_thread, &main_thread_scrolling_reasons);
|
| + // Scrollbars for the viewport are registered with the outer viewport layer.
|
| if (scroll_layer_impl == InnerViewportScrollLayer())
|
| scroll_layer_impl = OuterViewportScrollLayer();
|
| if (scroll_on_main_thread || !scroll_layer_impl)
|
| @@ -3293,8 +3301,7 @@ void LayerTreeHostImpl::PinchGestureBegin() {
|
| pinch_gesture_active_ = true;
|
| client_->RenewTreePriority();
|
| pinch_gesture_end_should_clear_scrolling_layer_ = !CurrentlyScrollingLayer();
|
| - active_tree_->SetCurrentlyScrollingLayer(
|
| - active_tree_->InnerViewportScrollLayer());
|
| + active_tree_->SetCurrentlyScrollingLayer(viewport()->MainScrollLayer());
|
| top_controls_manager_->PinchBegin();
|
| }
|
|
|
| @@ -3372,27 +3379,6 @@ void LayerTreeHostImpl::SetFullViewportDamage() {
|
| SetViewportDamage(gfx::Rect(DrawViewportSize()));
|
| }
|
|
|
| -void LayerTreeHostImpl::ScrollViewportInnerFirst(gfx::Vector2dF scroll_delta) {
|
| - DCHECK(InnerViewportScrollLayer());
|
| - LayerImpl* scroll_layer = InnerViewportScrollLayer();
|
| -
|
| - gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
|
| - if (!unused_delta.IsZero() && OuterViewportScrollLayer())
|
| - OuterViewportScrollLayer()->ScrollBy(unused_delta);
|
| -}
|
| -
|
| -void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) {
|
| - DCHECK(InnerViewportScrollLayer());
|
| - LayerImpl* scroll_layer = OuterViewportScrollLayer()
|
| - ? OuterViewportScrollLayer()
|
| - : InnerViewportScrollLayer();
|
| -
|
| - gfx::Vector2dF unused_delta = scroll_layer->ScrollBy(scroll_delta);
|
| -
|
| - if (!unused_delta.IsZero() && (scroll_layer == OuterViewportScrollLayer()))
|
| - InnerViewportScrollLayer()->ScrollBy(unused_delta);
|
| -}
|
| -
|
| bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
|
| if (!page_scale_animation_)
|
| return false;
|
| @@ -3407,7 +3393,8 @@ bool LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) {
|
| gfx::ScrollOffset next_scroll = gfx::ScrollOffset(
|
| page_scale_animation_->ScrollOffsetAtTime(monotonic_time));
|
|
|
| - ScrollViewportInnerFirst(next_scroll.DeltaFrom(scroll_total));
|
| + DCHECK(viewport());
|
| + viewport()->ScrollByInnerFirst(next_scroll.DeltaFrom(scroll_total));
|
|
|
| if (page_scale_animation_->IsAnimationCompleteAtTime(monotonic_time)) {
|
| page_scale_animation_ = nullptr;
|
| @@ -3435,8 +3422,8 @@ bool LayerTreeHostImpl::AnimateTopControls(base::TimeTicks time) {
|
| if (scroll.IsZero())
|
| return false;
|
|
|
| - ScrollViewportBy(gfx::ScaleVector2d(
|
| - scroll, 1.f / active_tree_->current_page_scale_factor()));
|
| + DCHECK(viewport());
|
| + viewport()->ScrollBy(scroll, gfx::Point(), false, false);
|
| client_->SetNeedsCommitOnImplThread();
|
| client_->RenewTreePriority();
|
| return true;
|
| @@ -3520,6 +3507,8 @@ void LayerTreeHostImpl::UnregisterScrollbarAnimationController(
|
| ScrollbarAnimationController*
|
| LayerTreeHostImpl::ScrollbarAnimationControllerForId(
|
| int scroll_layer_id) const {
|
| + // The viewport layers have only one set of scrollbars and their controller
|
| + // is registered with the outer viewport.
|
| if (InnerViewportScrollLayer() && OuterViewportScrollLayer() &&
|
| scroll_layer_id == InnerViewportScrollLayer()->id())
|
| scroll_layer_id = OuterViewportScrollLayer()->id();
|
|
|