Index: cc/layers/layer.cc |
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc |
index 6845f0e111c893527bec976f40f4d929b911ae45..ee9580fda59e92804f7b2b247418e834138f6a21 100644 |
--- a/cc/layers/layer.cc |
+++ b/cc/layers/layer.cc |
@@ -776,16 +776,11 @@ void Layer::SetScrollOffset(const gfx::ScrollOffset& scroll_offset) { |
if (!layer_tree_host_) |
return; |
- PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
- if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
- property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
+ DCHECK(scrollable()); |
- if (TransformNode* transform_node = |
- property_trees->transform_tree.UpdateNodeFromOwningLayerId(id())) { |
- DCHECK_EQ(transform_tree_index(), transform_node->id); |
- transform_node->scroll_offset = CurrentScrollOffset(); |
- transform_node->needs_local_transform_update = true; |
- property_trees->transform_tree.set_needs_update(true); |
+ if (!UpdateExistingScrollOffsetPropertyTreeNodes(scroll_offset)) { |
+ // Ensure property trees will be updated which will set the scroll offset. |
+ DCHECK(layer_tree_host_->property_trees()->needs_rebuild); |
} |
SetNeedsCommit(); |
@@ -802,16 +797,11 @@ void Layer::SetScrollOffsetFromImplSide( |
inputs_.scroll_offset = scroll_offset; |
SetNeedsPushProperties(); |
- PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
- if (scroll_tree_index() != ScrollTree::kInvalidNodeId && scrollable()) |
- property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
+ DCHECK(scrollable()); |
- if (TransformNode* transform_node = |
- property_trees->transform_tree.UpdateNodeFromOwningLayerId(id())) { |
- DCHECK_EQ(transform_tree_index(), transform_node->id); |
- transform_node->scroll_offset = CurrentScrollOffset(); |
- transform_node->needs_local_transform_update = true; |
- property_trees->transform_tree.set_needs_update(true); |
+ if (!UpdateExistingScrollOffsetPropertyTreeNodes(scroll_offset)) { |
+ // Ensure property trees will be updated which will set the scroll offset. |
+ DCHECK(layer_tree_host_->property_trees()->needs_rebuild); |
} |
if (!inputs_.did_scroll_callback.is_null()) |
@@ -821,6 +811,25 @@ void Layer::SetScrollOffsetFromImplSide( |
// "this" may have been destroyed during the process. |
} |
+bool Layer::UpdateExistingScrollOffsetPropertyTreeNodes( |
wkorman
2017/05/11 17:42:13
Add unit test for this?
pdr.
2017/05/11 18:03:37
This function is really just a refactoring of the
wkorman
2017/05/11 18:21:37
It looks like a public method on layer, so I would
|
+ const gfx::ScrollOffset& scroll_offset) { |
+ if (scroll_tree_index() == ScrollTree::kInvalidNodeId) |
+ return false; |
wkorman
2017/05/11 17:42:13
Why not put DCHECK in two places above in here, an
pdr.
2017/05/11 18:03:37
Done.
|
+ |
+ // If a scroll node exists, it should have an associated transform node. |
+ DCHECK(transform_tree_index() != TransformTree::kInvalidNodeId); |
+ |
+ PropertyTrees* property_trees = layer_tree_host_->property_trees(); |
wkorman
2017/05/11 17:42:13
Use auto& like you did in other patch?
pdr.
2017/05/11 18:03:37
Done
|
+ property_trees->scroll_tree.SetScrollOffset(id(), scroll_offset); |
+ TransformNode* transform_node = |
+ property_trees->transform_tree.Node(transform_tree_index()); |
+ DCHECK_EQ(transform_tree_index(), transform_node->id); |
+ transform_node->scroll_offset = CurrentScrollOffset(); |
+ transform_node->needs_local_transform_update = true; |
+ property_trees->transform_tree.set_needs_update(true); |
+ return true; |
+} |
+ |
void Layer::SetScrollClipLayerId(int clip_layer_id) { |
DCHECK(IsPropertyChangeAllowed()); |
if (inputs_.scroll_clip_layer_id == clip_layer_id) |