Index: cc/layers/layer_impl.cc |
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc |
index 4865fe2bd2c4376e93b9248ac1f6e0bdb37a0780..95d1da7a61fb5c6a03a220a7355e591d0ea213e4 100644 |
--- a/cc/layers/layer_impl.cc |
+++ b/cc/layers/layer_impl.cc |
@@ -265,11 +265,24 @@ gfx::Vector2dF LayerImpl::ScrollBy(gfx::Vector2dF scroll) { |
new_delta.SetToMax(min_delta); |
new_delta.SetToMin(max_delta); |
gfx::Vector2dF unscrolled = ScrollDelta() + scroll - new_delta; |
- |
SetScrollDelta(new_delta); |
return unscrolled; |
} |
+void LayerImpl::ApplySentScrollDeltas() { |
+ // Pending tree never has sent scroll deltas |
+ DCHECK(layer_tree_impl()->IsActiveTree()); |
+ |
+ // Apply sent scroll deltas to scroll position / scroll delta as if the |
+ // main thread had applied them and then committed those values. |
+ gfx::Vector2dF previous_scroll_delta = ScrollDelta(); |
+ gfx::Vector2d previous_sent_scroll_delta = sent_scroll_delta_; |
+ |
+ SetSentScrollDelta(gfx::Vector2d()); |
+ SetScrollOffset(scroll_offset_ + previous_sent_scroll_delta); |
+ SetScrollDelta(previous_scroll_delta - previous_sent_scroll_delta); |
+} |
+ |
InputHandler::ScrollStatus LayerImpl::TryScroll( |
gfx::PointF screen_space_point, |
InputHandler::ScrollInputType type) const { |
@@ -893,8 +906,13 @@ void LayerImpl::SetScrollDelta(gfx::Vector2dF scroll_delta) { |
} else { |
scroll_delta_ = scroll_delta; |
} |
- NoteLayerPropertyChangedForSubtree(); |
+ DCHECK_GE(TotalScrollOffset().x(), 0); |
+ DCHECK_GE(TotalScrollOffset().y(), 0); |
+ DCHECK_LE(TotalScrollOffset().x(), max_scroll_offset_.x()); |
+ DCHECK_LE(TotalScrollOffset().y(), max_scroll_offset_.y()); |
+ |
+ NoteLayerPropertyChangedForSubtree(); |
UpdateScrollbarPositions(); |
} |