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

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

Issue 2720183003: Track the currently scrolling ScrollNode instead of the scrolling layer (Closed)
Patch Set: Ali did forsee a use-after-free with no stable id 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 2011 The Chromium Authors. All rights reserved. 1 // Copyright 2011 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/layer_tree_impl.h" 5 #include "cc/trees/layer_tree_impl.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <algorithm> 10 #include <algorithm>
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor, 56 scoped_refptr<SyncedProperty<ScaleGroup>> page_scale_factor,
57 scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio, 57 scoped_refptr<SyncedBrowserControls> top_controls_shown_ratio,
58 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll) 58 scoped_refptr<SyncedElasticOverscroll> elastic_overscroll)
59 : layer_tree_host_impl_(layer_tree_host_impl), 59 : layer_tree_host_impl_(layer_tree_host_impl),
60 source_frame_number_(-1), 60 source_frame_number_(-1),
61 is_first_frame_after_commit_tracker_(-1), 61 is_first_frame_after_commit_tracker_(-1),
62 root_layer_for_testing_(nullptr), 62 root_layer_for_testing_(nullptr),
63 hud_layer_(nullptr), 63 hud_layer_(nullptr),
64 background_color_(0), 64 background_color_(0),
65 has_transparent_background_(false), 65 has_transparent_background_(false),
66 last_scrolled_layer_id_(Layer::INVALID_ID), 66 last_scrolled_scroll_node_index_(ScrollTree::kInvalidNodeId),
67 overscroll_elasticity_layer_id_(Layer::INVALID_ID), 67 overscroll_elasticity_layer_id_(Layer::INVALID_ID),
68 page_scale_layer_id_(Layer::INVALID_ID), 68 page_scale_layer_id_(Layer::INVALID_ID),
69 inner_viewport_scroll_layer_id_(Layer::INVALID_ID), 69 inner_viewport_scroll_layer_id_(Layer::INVALID_ID),
70 outer_viewport_scroll_layer_id_(Layer::INVALID_ID), 70 outer_viewport_scroll_layer_id_(Layer::INVALID_ID),
71 page_scale_factor_(page_scale_factor), 71 page_scale_factor_(page_scale_factor),
72 min_page_scale_factor_(0), 72 min_page_scale_factor_(0),
73 max_page_scale_factor_(0), 73 max_page_scale_factor_(0),
74 device_scale_factor_(1.f), 74 device_scale_factor_(1.f),
75 painted_device_scale_factor_(1.f), 75 painted_device_scale_factor_(1.f),
76 elastic_overscroll_(elastic_overscroll), 76 elastic_overscroll_(elastic_overscroll),
(...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after
429 outer_container->bounds_delta()); 429 outer_container->bounds_delta());
430 if (inner_scroll) 430 if (inner_scroll)
431 property_trees_.SetInnerViewportScrollBoundsDelta( 431 property_trees_.SetInnerViewportScrollBoundsDelta(
432 inner_scroll->bounds_delta()); 432 inner_scroll->bounds_delta());
433 } 433 }
434 434
435 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) { 435 void LayerTreeImpl::PushPropertiesTo(LayerTreeImpl* target_tree) {
436 // The request queue should have been processed and does not require a push. 436 // The request queue should have been processed and does not require a push.
437 DCHECK_EQ(ui_resource_request_queue_.size(), 0u); 437 DCHECK_EQ(ui_resource_request_queue_.size(), 0u);
438 438
439 LayerImpl* layer = target_tree->CurrentlyScrollingLayer(); 439 // To maintain the correct currently scrolling node we need to use layer ids
440 // which are stable across the property tree update in SetPropertyTrees.
441 // TODO(pdr): Remove the use of owning_layer_id.
442 int scrolling_layer_id = Layer::INVALID_ID;
443 if (ScrollNode* node = target_tree->CurrentlyScrollingNode())
444 scrolling_layer_id = node->owning_layer_id;
445
440 target_tree->SetPropertyTrees(&property_trees_); 446 target_tree->SetPropertyTrees(&property_trees_);
441 target_tree->SetCurrentlyScrollingLayer(layer); 447
448 ScrollNode* scrolling_node = nullptr;
449 auto& scroll_node_index_map =
450 target_tree->property_trees()->layer_id_to_scroll_node_index;
451 auto scrolling_node_it = scroll_node_index_map.find(scrolling_layer_id);
452 if (scrolling_node_it != scroll_node_index_map.end()) {
453 int index = scrolling_node_it->second;
454 scrolling_node = target_tree->property_trees()->scroll_tree.Node(index);
455 }
456 target_tree->SetCurrentlyScrollingNode(scrolling_node);
457
442 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree( 458 target_tree->property_trees()->scroll_tree.PushScrollUpdatesFromPendingTree(
443 &property_trees_, target_tree); 459 &property_trees_, target_tree);
444 460
445 // This needs to be called early so that we don't clamp with incorrect max 461 // This needs to be called early so that we don't clamp with incorrect max
446 // offsets when UpdateViewportContainerSizes is called from e.g. 462 // offsets when UpdateViewportContainerSizes is called from e.g.
447 // PushBrowserControls 463 // PushBrowserControls
448 target_tree->UpdatePropertyTreesForBoundsDelta(); 464 target_tree->UpdatePropertyTreesForBoundsDelta();
449 465
450 if (next_activation_forces_redraw_) { 466 if (next_activation_forces_redraw_) {
451 target_tree->ForceRedrawNextActivation(); 467 target_tree->ForceRedrawNextActivation();
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after
622 ? InnerViewportScrollLayer()->scroll_clip_layer() 638 ? InnerViewportScrollLayer()->scroll_clip_layer()
623 : NULL; 639 : NULL;
624 } 640 }
625 641
626 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const { 642 LayerImpl* LayerTreeImpl::OuterViewportContainerLayer() const {
627 return OuterViewportScrollLayer() 643 return OuterViewportScrollLayer()
628 ? OuterViewportScrollLayer()->scroll_clip_layer() 644 ? OuterViewportScrollLayer()->scroll_clip_layer()
629 : NULL; 645 : NULL;
630 } 646 }
631 647
632 LayerImpl* LayerTreeImpl::CurrentlyScrollingLayer() const { 648 ScrollNode* LayerTreeImpl::CurrentlyScrollingNode() {
633 DCHECK(IsActiveTree()); 649 DCHECK(IsActiveTree());
634 const ScrollNode* scroll_node = 650 return property_trees_.scroll_tree.CurrentlyScrollingNode();
635 property_trees_.scroll_tree.CurrentlyScrollingNode();
636 return LayerById(scroll_node ? scroll_node->owning_layer_id
637 : Layer::INVALID_ID);
638 } 651 }
639 652
640 int LayerTreeImpl::LastScrolledLayerId() const { 653 const ScrollNode* LayerTreeImpl::CurrentlyScrollingNode() const {
641 return last_scrolled_layer_id_; 654 return property_trees_.scroll_tree.CurrentlyScrollingNode();
642 } 655 }
643 656
644 void LayerTreeImpl::SetCurrentlyScrollingLayer(LayerImpl* layer) { 657 int LayerTreeImpl::LastScrolledScrollNodeIndex() const {
658 return last_scrolled_scroll_node_index_;
659 }
660
661 void LayerTreeImpl::SetCurrentlyScrollingNode(ScrollNode* node) {
662 if (node)
663 last_scrolled_scroll_node_index_ = node->id;
664
645 ScrollTree& scroll_tree = property_trees()->scroll_tree; 665 ScrollTree& scroll_tree = property_trees()->scroll_tree;
646 ScrollNode* scroll_node = scroll_tree.CurrentlyScrollingNode(); 666 ScrollNode* old_node = scroll_tree.CurrentlyScrollingNode();
647 int old_id = scroll_node ? scroll_node->owning_layer_id : Layer::INVALID_ID; 667 // TODO(pdr): Refactor these to not use owning_layer_id.
648 int new_id = layer ? layer->id() : Layer::INVALID_ID; 668 int old_layer_id = old_node ? old_node->owning_layer_id : Layer::INVALID_ID;
649 int new_scroll_node_id = 669 int new_layer_id = node ? node->owning_layer_id : Layer::INVALID_ID;
650 layer ? layer->scroll_tree_index() : ScrollTree::kInvalidNodeId;
651 if (layer)
652 last_scrolled_layer_id_ = new_id;
653 670
654 if (old_id == new_id) 671 if (old_layer_id == new_layer_id)
655 return; 672 return;
656 673
657 ScrollbarAnimationController* old_animation_controller = 674 ScrollbarAnimationController* old_animation_controller =
658 layer_tree_host_impl_->ScrollbarAnimationControllerForId(old_id); 675 layer_tree_host_impl_->ScrollbarAnimationControllerForId(old_layer_id);
659 ScrollbarAnimationController* new_animation_controller = 676 ScrollbarAnimationController* new_animation_controller =
660 layer_tree_host_impl_->ScrollbarAnimationControllerForId(new_id); 677 layer_tree_host_impl_->ScrollbarAnimationControllerForId(new_layer_id);
661 678
662 if (old_animation_controller) 679 if (old_animation_controller)
663 old_animation_controller->DidScrollEnd(); 680 old_animation_controller->DidScrollEnd();
664 scroll_tree.set_currently_scrolling_node(new_scroll_node_id); 681 scroll_tree.set_currently_scrolling_node(node ? node->id
682 : ScrollTree::kInvalidNodeId);
665 if (new_animation_controller) 683 if (new_animation_controller)
666 new_animation_controller->DidScrollBegin(); 684 new_animation_controller->DidScrollBegin();
667 } 685 }
668 686
669 void LayerTreeImpl::ClearCurrentlyScrollingLayer() { 687 void LayerTreeImpl::ClearCurrentlyScrollingNode() {
670 SetCurrentlyScrollingLayer(NULL); 688 SetCurrentlyScrollingNode(nullptr);
671 } 689 }
672 690
673 float LayerTreeImpl::ClampPageScaleFactorToLimits( 691 float LayerTreeImpl::ClampPageScaleFactorToLimits(
674 float page_scale_factor) const { 692 float page_scale_factor) const {
675 if (min_page_scale_factor_ && page_scale_factor < min_page_scale_factor_) 693 if (min_page_scale_factor_ && page_scale_factor < min_page_scale_factor_)
676 page_scale_factor = min_page_scale_factor_; 694 page_scale_factor = min_page_scale_factor_;
677 else if (max_page_scale_factor_ && page_scale_factor > max_page_scale_factor_) 695 else if (max_page_scale_factor_ && page_scale_factor > max_page_scale_factor_)
678 page_scale_factor = max_page_scale_factor_; 696 page_scale_factor = max_page_scale_factor_;
679 return page_scale_factor; 697 return page_scale_factor;
680 } 698 }
(...skipping 1431 matching lines...) Expand 10 before | Expand all | Expand 10 after
2112 2130
2113 void LayerTreeImpl::ResetAllChangeTracking() { 2131 void LayerTreeImpl::ResetAllChangeTracking() {
2114 layers_that_should_push_properties_.clear(); 2132 layers_that_should_push_properties_.clear();
2115 // Iterate over all layers, including masks. 2133 // Iterate over all layers, including masks.
2116 for (auto& layer : *layers_) 2134 for (auto& layer : *layers_)
2117 layer->ResetChangeTracking(); 2135 layer->ResetChangeTracking();
2118 property_trees_.ResetAllChangeTracking(); 2136 property_trees_.ResetAllChangeTracking();
2119 } 2137 }
2120 2138
2121 } // namespace cc 2139 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698