Chromium Code Reviews| 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..bb454fed6624bd48cb9322f2a211280405d8b031 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; |
| @@ -2480,13 +2488,13 @@ InputHandler::ScrollStatus LayerTreeHostImpl::ScrollAnimated( |
| // 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 |
|
tdresser
2015/10/20 12:29:40
We might want to update the comment here - we don'
skobes
2015/10/20 18:28:15
Done.
|
| // do the Android-specific things in ScrollBy like showing top controls. |
| - InputHandler::ScrollStatus scroll_status = ScrollBegin(viewport_point, WHEEL); |
| + 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(); |