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

Side by Side Diff: cc/trees/property_tree_builder.cc

Issue 2733633002: Handle nested position:sticky elements correctly (compositor) (Closed)
Patch Set: Address reviewer comments 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "cc/trees/property_tree_builder.h" 5 #include "cc/trees/property_tree_builder.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 8
9 #include <map> 9 #include <map>
10 #include <set> 10 #include <set>
(...skipping 741 matching lines...) Expand 10 before | Expand all | Expand 10 after
752 // viewport bounds change, but do not unconditionally move by that delta 752 // viewport bounds change, but do not unconditionally move by that delta
753 // like fixed position nodes. 753 // like fixed position nodes.
754 if (scroll_ancestor->scrolls_inner_viewport) { 754 if (scroll_ancestor->scrolls_inner_viewport) {
755 data_for_children->property_trees->transform_tree 755 data_for_children->property_trees->transform_tree
756 .AddNodeAffectedByInnerViewportBoundsDelta(node->id); 756 .AddNodeAffectedByInnerViewportBoundsDelta(node->id);
757 } else if (scroll_ancestor->scrolls_outer_viewport) { 757 } else if (scroll_ancestor->scrolls_outer_viewport) {
758 data_for_children->property_trees->transform_tree 758 data_for_children->property_trees->transform_tree
759 .AddNodeAffectedByOuterViewportBoundsDelta(node->id); 759 .AddNodeAffectedByOuterViewportBoundsDelta(node->id);
760 } 760 }
761 } 761 }
762 // This calculation will be incorrect if we have an ancestor sticky element
763 // that is not composited: http://crbug.com/702229
762 sticky_data->main_thread_offset = 764 sticky_data->main_thread_offset =
763 layer->position().OffsetFromOrigin() - 765 layer->position().OffsetFromOrigin() -
764 sticky_data->constraints.parent_relative_sticky_box_offset 766 sticky_data->constraints.parent_relative_sticky_box_offset
765 .OffsetFromOrigin(); 767 .OffsetFromOrigin();
768
769 // Copy the ancestor nodes for later use. These layers are guaranteed to
770 // have transform nodes at this point because they are our ancestors (so
771 // have already been processed) and are sticky (so have transform nodes).
772 int x = sticky_data->constraints.nearest_layer_shifting_sticky_box;
flackr 2017/03/17 18:04:08 nit: Use descriptive variable names
smcgruer 2017/03/17 18:42:42 Done.
773 if (x >= 0) {
flackr 2017/03/17 18:04:08 Compare to the invalid id constant.
smcgruer 2017/03/17 18:42:42 Done.
774 DCHECK(data_for_children->property_trees->IsInIdToIndexMap(
775 PropertyTrees::TreeType::TRANSFORM, x));
776 sticky_data->nearest_node_shifting_sticky_box =
777 data_for_children->property_trees
778 ->layer_id_to_transform_node_index[x];
779 }
780 int y = sticky_data->constraints.nearest_layer_shifting_containing_block;
781 if (y >= 0) {
782 DCHECK(data_for_children->property_trees->IsInIdToIndexMap(
783 PropertyTrees::TreeType::TRANSFORM, y));
784 sticky_data->nearest_node_shifting_containing_block =
785 data_for_children->property_trees
786 ->layer_id_to_transform_node_index[y];
787 }
766 } 788 }
767 789
768 node->needs_local_transform_update = true; 790 node->needs_local_transform_update = true;
769 data_from_ancestor.property_trees->transform_tree.UpdateTransforms(node->id); 791 data_from_ancestor.property_trees->transform_tree.UpdateTransforms(node->id);
770 792
771 layer->set_offset_to_transform_parent(gfx::Vector2dF()); 793 layer->set_offset_to_transform_parent(gfx::Vector2dF());
772 794
773 // Flattening (if needed) will be handled by |node|. 795 // Flattening (if needed) will be handled by |node|.
774 layer->set_should_flatten_transform_from_property_tree(false); 796 layer->set_should_flatten_transform_from_property_tree(false);
775 797
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
1547 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1569 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1548 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1570 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1549 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1571 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1550 device_transform, property_trees, color); 1572 device_transform, property_trees, color);
1551 property_trees->effect_tree.CreateOrReuseRenderSurfaces( 1573 property_trees->effect_tree.CreateOrReuseRenderSurfaces(
1552 &render_surfaces, root_layer->layer_tree_impl()); 1574 &render_surfaces, root_layer->layer_tree_impl());
1553 property_trees->ResetCachedData(); 1575 property_trees->ResetCachedData();
1554 } 1576 }
1555 1577
1556 } // namespace cc 1578 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698