| Index: cc/layers/layer.cc
|
| diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc
|
| index 43ad88a526794d27bb0563b93a9ea73d182b6970..572533298c8f767fbb151bc438018c96cae4d1f0 100644
|
| --- a/cc/layers/layer.cc
|
| +++ b/cc/layers/layer.cc
|
| @@ -771,8 +771,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())) {
|
| @@ -780,7 +782,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();
|
| @@ -790,22 +793,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())) {
|
| @@ -813,7 +827,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;
|
| @@ -828,11 +843,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();
|
| }
|
|
|
| @@ -1160,7 +1178,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);
|
| @@ -1343,6 +1362,7 @@ void Layer::LayerSpecificPropertiesToProto(proto::LayerProperties* proto,
|
| 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,
|
| @@ -1478,6 +1498,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
|
| @@ -1518,6 +1539,7 @@ void Layer::FromLayerSpecificPropertiesProto(
|
| }
|
|
|
| inputs_.scroll_offset = ProtoToScrollOffset(base.scroll_offset());
|
| + inputs_.overscroll = ProtoToScrollOffset(base.overscroll());
|
|
|
| inputs_.update_rect.Union(ProtoToRect(base.update_rect()));
|
|
|
|
|