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

Unified Diff: cc/trees/draw_property_utils.cc

Issue 2733633002: Handle nested position:sticky elements correctly (compositor) (Closed)
Patch Set: Fix unittest Created 3 years, 9 months 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
Index: cc/trees/draw_property_utils.cc
diff --git a/cc/trees/draw_property_utils.cc b/cc/trees/draw_property_utils.cc
index c5128934db98361f1c752b674aa0a11b06d49455..7baa04e779ba1fbfd9220931408396e5c1f81122 100644
--- a/cc/trees/draw_property_utils.cc
+++ b/cc/trees/draw_property_utils.cc
@@ -1500,6 +1500,41 @@ void UpdateElasticOverscroll(PropertyTrees* property_trees,
elastic_overscroll);
}
+gfx::Vector2dF CalculateTotalStickyOffsetToScroller(
+ Layer* layer,
+ int scroll_ancestor_layer_id) {
+ // Find nearest ancestor which is sticky, up to the scroller.
flackr 2017/03/09 20:22:08 Isn't this ancestor part of the constraints passed
smcgruer 2017/03/10 16:37:10 |layer| might not be sticky.
smcgruer 2017/03/10 16:38:38 Oh I think I just realized what you meant. We only
smcgruer 2017/03/14 22:04:06 Done.
+ while (layer && !layer->sticky_position_constraint().is_sticky) {
+ layer = layer->parent();
flackr 2017/03/09 20:22:08 Can you verify whether this chain is correct in th
smcgruer 2017/03/14 22:04:05 No longer relevant, we don't do this walk.
+ if (!layer || layer->id() == scroll_ancestor_layer_id)
+ return gfx::Vector2dF();
+ }
+
+ // Walk all sticky layers from the current layer to the ancestor scroller
+ // layer. We achieve this by walking the |nearest_layer_shifting_sticky_box|
+ // when available (which is the nearest sticky element between us and our
+ // containing block), and |nearest_layer_shifting_containing_block| otherwise
+ // (which is the nearest sticky element between our containing block and the
+ // ancestor scroller).
+ //
+ // Once both of these are null, we have no more sticky ancestors to our scroll
+ // ancestor layer.
+ LayerStickyPositionConstraint constraints =
+ layer->sticky_position_constraint();
+ gfx::Vector2dF sticky_to_remove(constraints.local_sticky_offset);
+ Layer* nextSticky = constraints.nearest_layer_shifting_sticky_box
+ ? constraints.nearest_layer_shifting_sticky_box
+ : constraints.nearest_layer_shifting_containing_block;
+ while (nextSticky) {
flackr 2017/03/09 20:22:08 Can we cache the accumulated offset like we do on
smcgruer 2017/03/14 22:04:06 No longer relevant, this code is gone.
+ constraints = nextSticky->sticky_position_constraint();
+ sticky_to_remove += constraints.local_sticky_offset;
+ nextSticky = constraints.nearest_layer_shifting_sticky_box
+ ? constraints.nearest_layer_shifting_sticky_box
+ : constraints.nearest_layer_shifting_containing_block;
+ }
+ return sticky_to_remove;
+}
+
} // namespace draw_property_utils
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698