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

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

Issue 2451183002: Add sticky nodes affected by inner and outer viewport bounds deltas. (Closed)
Patch Set: Merge with master. 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 unified diff | Download patch
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 651 matching lines...) Expand 10 before | Expand all | Expand 10 after
662 if (is_overscroll_elasticity_layer) { 662 if (is_overscroll_elasticity_layer) {
663 DCHECK(!is_scrollable); 663 DCHECK(!is_scrollable);
664 node->scroll_offset = 664 node->scroll_offset =
665 gfx::ScrollOffset(data_from_ancestor.elastic_overscroll); 665 gfx::ScrollOffset(data_from_ancestor.elastic_overscroll);
666 } else if (!ScrollParent(layer)) { 666 } else if (!ScrollParent(layer)) {
667 node->scroll_offset = layer->CurrentScrollOffset(); 667 node->scroll_offset = layer->CurrentScrollOffset();
668 } 668 }
669 669
670 if (is_fixed) { 670 if (is_fixed) {
671 if (data_from_ancestor.affected_by_inner_viewport_bounds_delta) { 671 if (data_from_ancestor.affected_by_inner_viewport_bounds_delta) {
672 node->affected_by_inner_viewport_bounds_delta_x = 672 node->moved_by_inner_viewport_bounds_delta_x =
673 PositionConstraint(layer).is_fixed_to_right_edge(); 673 PositionConstraint(layer).is_fixed_to_right_edge();
674 node->affected_by_inner_viewport_bounds_delta_y = 674 node->moved_by_inner_viewport_bounds_delta_y =
675 PositionConstraint(layer).is_fixed_to_bottom_edge(); 675 PositionConstraint(layer).is_fixed_to_bottom_edge();
676 if (node->affected_by_inner_viewport_bounds_delta_x || 676 if (node->moved_by_inner_viewport_bounds_delta_x ||
677 node->affected_by_inner_viewport_bounds_delta_y) { 677 node->moved_by_inner_viewport_bounds_delta_y) {
678 data_for_children->property_trees->transform_tree 678 data_for_children->property_trees->transform_tree
679 .AddNodeAffectedByInnerViewportBoundsDelta(node->id); 679 .AddNodeAffectedByInnerViewportBoundsDelta(node->id);
680 } 680 }
681 } else if (data_from_ancestor.affected_by_outer_viewport_bounds_delta) { 681 } else if (data_from_ancestor.affected_by_outer_viewport_bounds_delta) {
682 node->affected_by_outer_viewport_bounds_delta_x = 682 node->moved_by_outer_viewport_bounds_delta_x =
683 PositionConstraint(layer).is_fixed_to_right_edge(); 683 PositionConstraint(layer).is_fixed_to_right_edge();
684 node->affected_by_outer_viewport_bounds_delta_y = 684 node->moved_by_outer_viewport_bounds_delta_y =
685 PositionConstraint(layer).is_fixed_to_bottom_edge(); 685 PositionConstraint(layer).is_fixed_to_bottom_edge();
686 if (node->affected_by_outer_viewport_bounds_delta_x || 686 if (node->moved_by_outer_viewport_bounds_delta_x ||
687 node->affected_by_outer_viewport_bounds_delta_y) { 687 node->moved_by_outer_viewport_bounds_delta_y) {
688 data_for_children->property_trees->transform_tree 688 data_for_children->property_trees->transform_tree
689 .AddNodeAffectedByOuterViewportBoundsDelta(node->id); 689 .AddNodeAffectedByOuterViewportBoundsDelta(node->id);
690 } 690 }
691 } 691 }
692 } 692 }
693 693
694 node->local = Transform(layer); 694 node->local = Transform(layer);
695 node->update_pre_local_transform(TransformOrigin(layer)); 695 node->update_pre_local_transform(TransformOrigin(layer));
696 696
697 if (StickyPositionConstraint(layer).is_sticky) { 697 if (StickyPositionConstraint(layer).is_sticky) {
698 StickyPositionNodeData* sticky_data = 698 StickyPositionNodeData* sticky_data =
699 data_for_children->property_trees->transform_tree.StickyPositionData( 699 data_for_children->property_trees->transform_tree.StickyPositionData(
700 node->id); 700 node->id);
701 sticky_data->constraints = StickyPositionConstraint(layer); 701 sticky_data->constraints = StickyPositionConstraint(layer);
702 sticky_data->scroll_ancestor = GetScrollParentId(data_from_ancestor, layer); 702 sticky_data->scroll_ancestor = GetScrollParentId(data_from_ancestor, layer);
703 ScrollNode* scroll_ancestor = 703 ScrollNode* scroll_ancestor =
704 data_for_children->property_trees->scroll_tree.Node( 704 data_for_children->property_trees->scroll_tree.Node(
705 sticky_data->scroll_ancestor); 705 sticky_data->scroll_ancestor);
706 if (scroll_ancestor->is_inner_viewport_scroll_layer) { 706 if (sticky_data->constraints.is_anchored_right ||
707 data_for_children->property_trees->transform_tree 707 sticky_data->constraints.is_anchored_bottom) {
708 .AddNodeAffectedByInnerViewportBoundsDelta(node->id); 708 // Sticky nodes whose ancestor scroller is the inner / outer viewport
709 // need to have their local transform updated when the inner / outer
710 // viewport bounds change, but do not unconditionally move by that delta
711 // like fixed position nodes.
712 if (scroll_ancestor->is_inner_viewport_scroll_layer) {
713 data_for_children->property_trees->transform_tree
714 .AddNodeAffectedByInnerViewportBoundsDelta(node->id);
715 } else if (scroll_ancestor->is_outer_viewport_scroll_layer) {
716 data_for_children->property_trees->transform_tree
717 .AddNodeAffectedByOuterViewportBoundsDelta(node->id);
718 }
709 } 719 }
710 sticky_data->main_thread_offset = 720 sticky_data->main_thread_offset =
711 layer->position().OffsetFromOrigin() - 721 layer->position().OffsetFromOrigin() -
712 sticky_data->constraints.parent_relative_sticky_box_offset 722 sticky_data->constraints.parent_relative_sticky_box_offset
713 .OffsetFromOrigin(); 723 .OffsetFromOrigin();
714 } 724 }
715 725
716 node->needs_local_transform_update = true; 726 node->needs_local_transform_update = true;
717 data_from_ancestor.property_trees->transform_tree.UpdateTransforms(node->id); 727 data_from_ancestor.property_trees->transform_tree.UpdateTransforms(node->id);
718 728
(...skipping 762 matching lines...) Expand 10 before | Expand all | Expand 10 after
1481 color = SkColorSetA(color, 255); 1491 color = SkColorSetA(color, 255);
1482 BuildPropertyTreesTopLevelInternal( 1492 BuildPropertyTreesTopLevelInternal(
1483 root_layer, page_scale_layer, inner_viewport_scroll_layer, 1493 root_layer, page_scale_layer, inner_viewport_scroll_layer,
1484 outer_viewport_scroll_layer, overscroll_elasticity_layer, 1494 outer_viewport_scroll_layer, overscroll_elasticity_layer,
1485 elastic_overscroll, page_scale_factor, device_scale_factor, viewport, 1495 elastic_overscroll, page_scale_factor, device_scale_factor, viewport,
1486 device_transform, property_trees, color); 1496 device_transform, property_trees, color);
1487 property_trees->ResetCachedData(); 1497 property_trees->ResetCachedData();
1488 } 1498 }
1489 1499
1490 } // namespace cc 1500 } // namespace cc
OLDNEW
« no previous file with comments | « cc/trees/property_tree.cc ('k') | cc/trees/property_tree_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698