| Index: cc/layers/layer.cc
|
| diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
|
| index 517a1c6a634511b8774f01d285dcac06f1038d5d..73f5dae54fabd7a63b55933868768829a9eb889b 100644
|
| --- a/cc/layers/layer.cc
|
| +++ b/cc/layers/layer.cc
|
| @@ -772,8 +772,10 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
|
| return;
|
|
|
| PropertyTrees* property_trees = layer_tree_->property_trees();
|
| - if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable())
|
| - property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset);
|
| + if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) {
|
| + property_trees->scroll_tree.SetScrollOffset(id(), inputs_.scroll_offset,
|
| + inputs_.overscroll);
|
| + }
|
|
|
| if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
|
| id())) {
|
| @@ -781,7 +783,8 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
|
| property_trees->transform_id_to_index_map[id()]);
|
| TransformNode* transform_node =
|
| property_trees->transform_tree.Node(transform_tree_index());
|
| - transform_node->scroll_offset = CurrentScrollOffset();
|
| + transform_node->scroll_offset_with_overscroll =
|
| + inputs_.scroll_offset + inputs_.overscroll;
|
| transform_node->needs_local_transform_update = true;
|
| property_trees->transform_tree.set_needs_update(true);
|
| SetNeedsCommitNoRebuild();
|
| @@ -791,22 +794,33 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) {
|
| SetNeedsCommit();
|
| }
|
|
|
| -void Layer::SetScrollOffsetFromImplSide(
|
| - const gfx::ScrollOffset& scroll_offset) {
|
| +void Layer::SetScrollOffsetFromImplSide(const gfx::ScrollOffset& scroll_offset,
|
| + gfx::Vector2dF* overscroll_delta) {
|
| DCHECK(IsPropertyChangeAllowed());
|
| // This function only gets called during a BeginMainFrame, so there
|
| // is no need to call SetNeedsUpdate here.
|
| DCHECK(layer_tree_host_ && layer_tree_host_->CommitRequested());
|
| - if (inputs_.scroll_offset == scroll_offset)
|
| +
|
| + gfx::ScrollOffset overscroll = inputs_.overscroll;
|
| + if (inputs_.can_overscroll && overscroll_delta) {
|
| + overscroll = gfx::ScrollOffsetWithDelta(overscroll, *overscroll_delta);
|
| + *overscroll_delta = gfx::Vector2dF();
|
| + }
|
| + if (inputs_.scroll_offset == scroll_offset &&
|
| + inputs_.overscroll == overscroll)
|
| return;
|
| +
|
| inputs_.scroll_offset = scroll_offset;
|
| + inputs_.overscroll = overscroll;
|
| SetNeedsPushProperties();
|
|
|
| bool needs_rebuild = true;
|
|
|
| PropertyTrees* property_trees = layer_tree_->property_trees();
|
| - if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable())
|
| - property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset);
|
| + if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) {
|
| + property_trees->scroll_tree.SetScrollOffset(id(), inputs_.scroll_offset,
|
| + inputs_.overscroll);
|
| + }
|
|
|
| if (property_trees->IsInIdToIndexMap(PropertyTrees::TreeType::TRANSFORM,
|
| id())) {
|
| @@ -814,7 +828,8 @@ void Layer::SetScrollOffsetFromImplSide(
|
| property_trees->transform_id_to_index_map[id()]);
|
| TransformNode* transform_node =
|
| property_trees->transform_tree.Node(transform_tree_index());
|
| - transform_node->scroll_offset = CurrentScrollOffset();
|
| + transform_node->scroll_offset_with_overscroll =
|
| + inputs_.scroll_offset + inputs_.overscroll;
|
| transform_node->needs_local_transform_update = true;
|
| property_trees->transform_tree.set_needs_update(true);
|
| needs_rebuild = false;
|
| @@ -829,11 +844,14 @@ void Layer::SetScrollOffsetFromImplSide(
|
| // "this" may have been destroyed during the process.
|
| }
|
|
|
| -void Layer::SetScrollClipLayerId(int clip_layer_id) {
|
| +void Layer::SetScrollClipAndCanOverscroll(int clip_layer_id,
|
| + bool can_overscroll) {
|
| DCHECK(IsPropertyChangeAllowed());
|
| - if (inputs_.scroll_clip_layer_id == clip_layer_id)
|
| + if (inputs_.scroll_clip_layer_id == clip_layer_id &&
|
| + inputs_.can_overscroll == can_overscroll)
|
| return;
|
| inputs_.scroll_clip_layer_id = clip_layer_id;
|
| + inputs_.can_overscroll = can_overscroll;
|
| SetNeedsCommit();
|
| }
|
|
|
| @@ -1165,7 +1183,8 @@ void Layer::PushPropertiesTo(LayerImpl* layer) {
|
| layer->SetShouldCheckBackfaceVisibility(should_check_backface_visibility_);
|
| layer->Set3dSortingContextId(inputs_.sorting_context_id);
|
|
|
| - layer->SetScrollClipLayer(inputs_.scroll_clip_layer_id);
|
| + layer->SetScrollClipAndCanOverscroll(inputs_.scroll_clip_layer_id,
|
| + inputs_.can_overscroll);
|
| layer->set_user_scrollable_horizontal(inputs_.user_scrollable_horizontal);
|
| layer->set_user_scrollable_vertical(inputs_.user_scrollable_vertical);
|
| layer->SetElementId(inputs_.element_id);
|
| @@ -1349,9 +1368,11 @@ void Layer::LayerSpecificPropertiesToProto(proto::LayerProperties* proto,
|
| inputs_.use_parent_backface_visibility);
|
| base->set_background_color(inputs_.background_color);
|
| ScrollOffsetToProto(inputs_.scroll_offset, base->mutable_scroll_offset());
|
| + ScrollOffsetToProto(inputs_.overscroll, base->mutable_overscroll());
|
| base->set_scroll_clip_layer_id(inputs_.scroll_clip_layer_id);
|
| base->set_user_scrollable_horizontal(inputs_.user_scrollable_horizontal);
|
| base->set_user_scrollable_vertical(inputs_.user_scrollable_vertical);
|
| + base->set_can_overscroll(inputs_.can_overscroll);
|
| base->set_main_thread_scrolling_reasons(
|
| inputs_.main_thread_scrolling_reasons);
|
| RegionToProto(inputs_.non_fast_scrollable_region,
|
| @@ -1487,6 +1508,7 @@ void Layer::FromLayerSpecificPropertiesProto(
|
| inputs_.scroll_clip_layer_id = base.scroll_clip_layer_id();
|
| inputs_.user_scrollable_horizontal = base.user_scrollable_horizontal();
|
| inputs_.user_scrollable_vertical = base.user_scrollable_vertical();
|
| + inputs_.can_overscroll = base.can_overscroll();
|
|
|
| inputs_.scroll_parent = base.scroll_parent_id() == INVALID_ID
|
| ? nullptr
|
| @@ -1527,6 +1549,7 @@ void Layer::FromLayerSpecificPropertiesProto(
|
| }
|
|
|
| inputs_.scroll_offset = ProtoToScrollOffset(base.scroll_offset());
|
| + inputs_.overscroll = ProtoToScrollOffset(base.overscroll());
|
|
|
| inputs_.update_rect.Union(ProtoToRect(base.update_rect()));
|
|
|
|
|