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 c90087641c359b49dec6150e13fb4196a0eeed4c..187704651a732a0855f8beaa62b6316e56a7a788 100644 |
--- a/cc/trees/layer_tree_host_impl.cc |
+++ b/cc/trees/layer_tree_host_impl.cc |
@@ -390,8 +390,11 @@ bool LayerTreeHostImpl::CanDraw() const { |
} |
void LayerTreeHostImpl::Animate(base::TimeTicks monotonic_time) { |
- if (input_handler_client_) |
- input_handler_client_->Animate(monotonic_time); |
+ if (!root_layer_scroll_offset_delegate_ || |
+ (CurrentlyScrollingLayer() != InnerViewportScrollLayer() && |
+ CurrentlyScrollingLayer() != OuterViewportScrollLayer())) { |
+ AnimateInput(monotonic_time); |
+ } |
AnimatePageScale(monotonic_time); |
AnimateLayers(monotonic_time); |
AnimateScrollbars(monotonic_time); |
@@ -450,6 +453,22 @@ void LayerTreeHostImpl::StartPageScaleAnimation( |
client_->RenewTreePriority(); |
} |
+void LayerTreeHostImpl::SetNeedsAnimateInput() { |
+ if (root_layer_scroll_offset_delegate_ && |
+ (CurrentlyScrollingLayer() == InnerViewportScrollLayer() || |
+ CurrentlyScrollingLayer() == OuterViewportScrollLayer())) { |
+ if (root_layer_animation_callback_.is_null()) { |
+ root_layer_animation_callback_ = |
+ base::Bind(&LayerTreeHostImpl::AnimateInput, AsWeakPtr()); |
+ } |
+ root_layer_scroll_offset_delegate_->SetNeedsAnimate( |
+ root_layer_animation_callback_); |
+ return; |
+ } |
+ |
+ SetNeedsAnimate(); |
+} |
+ |
bool LayerTreeHostImpl::IsCurrentlyScrollingLayerAt( |
const gfx::Point& viewport_point, |
InputHandler::ScrollInputType type) { |
@@ -1754,9 +1773,9 @@ LayerImpl* LayerTreeHostImpl::CurrentlyScrollingLayer() const { |
bool LayerTreeHostImpl::IsActivelyScrolling() const { |
return (did_lock_scrolling_layer_ && CurrentlyScrollingLayer()) || |
(InnerViewportScrollLayer() && |
- InnerViewportScrollLayer()->IsExternalFlingActive()) || |
+ InnerViewportScrollLayer()->IsExternalScrollActive()) || |
(OuterViewportScrollLayer() && |
- OuterViewportScrollLayer()->IsExternalFlingActive()); |
+ OuterViewportScrollLayer()->IsExternalScrollActive()); |
} |
// Content layers can be either directly scrollable or contained in an outer |
@@ -2712,13 +2731,6 @@ InputHandler::ScrollStatus LayerTreeHostImpl::FlingScrollBegin() { |
if (!active_tree_->CurrentlyScrollingLayer()) |
return SCROLL_IGNORED; |
- if (settings_.ignore_root_layer_flings && |
- (active_tree_->CurrentlyScrollingLayer() == InnerViewportScrollLayer() || |
- active_tree_->CurrentlyScrollingLayer() == OuterViewportScrollLayer())) { |
- ClearCurrentlyScrollingLayer(); |
- return SCROLL_IGNORED; |
- } |
- |
if (!wheel_scrolling_) { |
// Allow the fling to lock to the first layer that moves after the initial |
// fling |ScrollBy()| event. |
@@ -2951,6 +2963,13 @@ void LayerTreeHostImpl::ScrollViewportBy(gfx::Vector2dF scroll_delta) { |
InnerViewportScrollLayer()->ScrollBy(unused_delta); |
} |
+void LayerTreeHostImpl::AnimateInput(base::TimeTicks monotonic_time) { |
+ DCHECK(proxy_->IsImplThread()); |
+ // TODO(jdduke): Skip when scrolling the root layer with an offset delegate? |
aelias_OOO_until_Jul13
2015/05/09 03:32:05
Maybe unnecessary optimization?
hush (inactive)
2015/05/13 23:26:20
Actually I think we can't skip even when scrolling
|
+ if (input_handler_client_) |
+ input_handler_client_->Animate(monotonic_time); |
+} |
+ |
void LayerTreeHostImpl::AnimatePageScale(base::TimeTicks monotonic_time) { |
if (!page_scale_animation_) |
return; |