| Index: cc/layers/layer_impl.cc
|
| diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc
|
| index 761b1df837f9d28eac2d180ecd3e745abd5cb4c5..3c4f948f4cb0a1645fa2240bfc8662f913903682 100644
|
| --- a/cc/layers/layer_impl.cc
|
| +++ b/cc/layers/layer_impl.cc
|
| @@ -57,6 +57,7 @@ LayerImpl::LayerImpl(LayerTreeImpl* tree_impl, int id)
|
| MainThreadScrollingReason::kNotScrollingOnMain),
|
| user_scrollable_horizontal_(true),
|
| user_scrollable_vertical_(true),
|
| + can_overscroll_(false),
|
| should_flatten_transform_from_property_tree_(false),
|
| layer_property_changed_(false),
|
| may_contain_video_(false),
|
| @@ -287,12 +288,15 @@ gfx::Vector2dF LayerImpl::ScrollBy(const gfx::Vector2dF& scroll) {
|
| return scroll_tree.ScrollBy(scroll_node, scroll, layer_tree_impl());
|
| }
|
|
|
| -void LayerImpl::SetScrollClipLayer(int scroll_clip_layer_id) {
|
| - if (scroll_clip_layer_id_ == scroll_clip_layer_id)
|
| +void LayerImpl::SetScrollClipAndCanOverscroll(int scroll_clip_layer_id,
|
| + bool can_overscroll) {
|
| + if (scroll_clip_layer_id_ == scroll_clip_layer_id &&
|
| + can_overscroll_ == can_overscroll)
|
| return;
|
|
|
| layer_tree_impl()->UnregisterScrollLayer(this);
|
| scroll_clip_layer_id_ = scroll_clip_layer_id;
|
| + can_overscroll_ = can_overscroll;
|
| layer_tree_impl()->RegisterScrollLayer(this);
|
| }
|
|
|
| @@ -368,7 +372,7 @@ void LayerImpl::PushPropertiesTo(LayerImpl* layer) {
|
| if (layer->has_render_surface() != has_render_surface())
|
| layer->layer_tree_impl()->set_needs_update_draw_properties();
|
| layer->SetBounds(bounds_);
|
| - layer->SetScrollClipLayer(scroll_clip_layer_id_);
|
| + layer->SetScrollClipAndCanOverscroll(scroll_clip_layer_id_, can_overscroll_);
|
| layer->SetElementId(element_id_);
|
| layer->SetMutableProperties(mutable_properties_);
|
|
|
| @@ -833,8 +837,8 @@ void LayerImpl::AddDamageRect(const gfx::Rect& damage_rect) {
|
|
|
| void LayerImpl::SetCurrentScrollOffset(const gfx::ScrollOffset& scroll_offset) {
|
| DCHECK(IsActive());
|
| - if (layer_tree_impl()->property_trees()->scroll_tree.SetScrollOffset(
|
| - id(), scroll_offset))
|
| + ScrollTree& scroll_tree = layer_tree_impl()->property_trees()->scroll_tree;
|
| + if (scroll_tree.SetScrollOffset(id(), scroll_offset, CurrentOverscroll()))
|
| layer_tree_impl()->DidUpdateScrollOffset(id());
|
| }
|
|
|
| @@ -843,15 +847,27 @@ gfx::ScrollOffset LayerImpl::CurrentScrollOffset() const {
|
| id());
|
| }
|
|
|
| +void LayerImpl::SetCurrentOverscroll(const gfx::ScrollOffset& overscroll) {
|
| + ScrollTree& scroll_tree = layer_tree_impl()->property_trees()->scroll_tree;
|
| + if (scroll_tree.SetScrollOffset(id(), CurrentScrollOffset(), overscroll))
|
| + layer_tree_impl()->DidUpdateScrollOffset(id());
|
| +}
|
| +
|
| +gfx::ScrollOffset LayerImpl::CurrentOverscroll() const {
|
| + return layer_tree_impl()->property_trees()->scroll_tree.current_overscroll(
|
| + id());
|
| +}
|
| +
|
| void LayerImpl::UpdatePropertyTreeScrollOffset() {
|
| // TODO(enne): in the future, scrolling should update the scroll tree
|
| // directly instead of going through layers.
|
| TransformTree& transform_tree =
|
| layer_tree_impl()->property_trees()->transform_tree;
|
| TransformNode* node = transform_tree.Node(transform_tree_index_);
|
| - gfx::ScrollOffset current_offset = CurrentScrollOffset();
|
| - if (node->scroll_offset != current_offset) {
|
| - node->scroll_offset = current_offset;
|
| + gfx::ScrollOffset current_offset =
|
| + CurrentScrollOffset() + CurrentOverscroll();
|
| + if (node->scroll_offset_with_overscroll != current_offset) {
|
| + node->scroll_offset_with_overscroll = current_offset;
|
| node->needs_local_transform_update = true;
|
| transform_tree.set_needs_update(true);
|
| }
|
|
|