| 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 2449788df4e23896abf10b90806008792ad85054..1517c9367892a1612a33dea3c2bc481127fc5d5a 100644
|
| --- a/cc/trees/layer_tree_host_impl.cc
|
| +++ b/cc/trees/layer_tree_host_impl.cc
|
| @@ -406,8 +406,8 @@ void LayerTreeHostImpl::Animate() {
|
| 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 && IsCurrentlyScrollingRoot();
|
| + bool ignore_fling = settings_.ignore_root_layer_flings &&
|
| + IsCurrentlyScrollingInnerViewport();
|
| if (!ignore_fling)
|
| input_handler_client_->Animate(monotonic_time);
|
| }
|
| @@ -475,12 +475,12 @@ void LayerTreeHostImpl::StartPageScaleAnimation(
|
| }
|
|
|
| void LayerTreeHostImpl::SetNeedsAnimateInput() {
|
| - DCHECK_IMPLIES(IsCurrentlyScrollingRoot(),
|
| + DCHECK_IMPLIES(IsCurrentlyScrollingInnerViewport(),
|
| !settings_.ignore_root_layer_flings);
|
| SetNeedsAnimate();
|
| }
|
|
|
| -bool LayerTreeHostImpl::IsCurrentlyScrollingRoot() const {
|
| +bool LayerTreeHostImpl::IsCurrentlyScrollingInnerViewport() const {
|
| LayerImpl* scrolling_layer = CurrentlyScrollingLayer();
|
| if (!scrolling_layer)
|
| return false;
|
| @@ -1866,7 +1866,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 && IsCurrentlyScrollingRoot())
|
| + if (settings_.ignore_root_layer_flings && IsCurrentlyScrollingInnerViewport())
|
| return false;
|
| return did_lock_scrolling_layer_;
|
| }
|
| @@ -2396,6 +2396,14 @@ LayerImpl* LayerTreeHostImpl::FindScrollLayerForDeviceViewportPoint(
|
| if (potentially_scrolling_layer_impl == OuterViewportScrollLayer())
|
| potentially_scrolling_layer_impl = InnerViewportScrollLayer();
|
|
|
| + // Animated wheel scrolls need to scroll the outer viewport layer, and do not
|
| + // go through Viewport::ScrollBy which would normally handle the distribution.
|
| + // NOTE: This will need refactoring if we want smooth scrolling on Android.
|
| + if (type == ANIMATED_WHEEL &&
|
| + potentially_scrolling_layer_impl == InnerViewportScrollLayer()) {
|
| + potentially_scrolling_layer_impl = OuterViewportScrollLayer();
|
| + }
|
| +
|
| return potentially_scrolling_layer_impl;
|
| }
|
|
|
| @@ -2419,7 +2427,7 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollBeginImpl(
|
| top_controls_manager_->ScrollBegin();
|
|
|
| active_tree_->SetCurrentlyScrollingLayer(scrolling_layer_impl);
|
| - wheel_scrolling_ = (type == WHEEL);
|
| + wheel_scrolling_ = (type == WHEEL || type == ANIMATED_WHEEL);
|
| client_->RenewTreePriority();
|
| UMA_HISTOGRAM_BOOLEAN("TryScroll.SlowScroll", false);
|
| return SCROLL_STARTED;
|
| @@ -2477,16 +2485,17 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated(
|
| ? SCROLL_STARTED
|
| : SCROLL_IGNORED;
|
| }
|
| - // ScrollAnimated is only used for wheel scrolls. We use the same bubbling
|
| - // behavior as ScrollBy to determine which layer to animate, but we do not
|
| - // do the Android-specific things in ScrollBy like showing top controls.
|
| - InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, WHEEL);
|
| + // ScrollAnimated is used for animated wheel scrolls. We find the first layer
|
| + // that can scroll and set up an animation of its scroll offset. Note that
|
| + // this does not currently go through the scroll customization and viewport
|
| + // machinery that ScrollBy uses for non-animated wheel scrolls.
|
| + InputHandler::ScrollStatus scroll_status =
|
| + ScrollBegin(viewport_point, ANIMATED_WHEEL);
|
| if (scroll_status == SCROLL_STARTED) {
|
| gfx::Vector2dF pending_delta = scroll_delta;
|
| for (LayerImpl* layer_impl = CurrentlyScrollingLayer(); layer_impl;
|
| layer_impl = NextLayerInScrollOrder(layer_impl)) {
|
| - // The inner viewport layer represents the viewport.
|
| - if (!layer_impl->scrollable() || layer_impl == OuterViewportScrollLayer())
|
| + if (!layer_impl->scrollable())
|
| continue;
|
|
|
| gfx::ScrollOffset current_offset = layer_impl->CurrentScrollOffset();
|
|
|