Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3636)

Unified Diff: cc/layers/layer.cc

Issue 2194833002: Overscroll and Elasticity for views::ScrollView Base URL: https://chromium.googlesource.com/chromium/src.git@20160728-MacViews-RouteThroughInputHandler
Patch Set: Restore functionality and fix bugs \o/ Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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()));
« no previous file with comments | « cc/layers/layer.h ('k') | cc/layers/layer_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698