diff options
author | Jayadev Dasika <jaydasika@chromium.org> | 2016-01-22 14:58:47 -0800 |
---|---|---|
committer | Jayadev Dasika <jaydasika@chromium.org> | 2016-01-22 23:00:52 +0000 |
commit | ee950747adc785578172af999236bed357a23138 (patch) | |
tree | 37251354726df3266d1098e9308d532e22d1579f /cc | |
parent | dc29fb99b7b01e04385ac2f72c9b45ef7ad60155 (diff) | |
download | chromium_src-ee950747adc785578172af999236bed357a23138.zip chromium_src-ee950747adc785578172af999236bed357a23138.tar.gz chromium_src-ee950747adc785578172af999236bed357a23138.tar.bz2 |
cc:: Add Transform node for scroll child in property trees
During property tree building, scroll child is called from
its scroll parent and not its parent. When the scroll parent
and the scroll child have different targets, we need to
create a transform node for scroll child to set the right
target for the subtree.
BUG=576959,577930
CQ_INCLUDE_TRYBOTS=tryserver.blink:linux_blink_rel
Review URL: https://codereview.chromium.org/1601523010
Cr-Commit-Position: refs/heads/master@{#370447}
(cherry picked from commit 8ccff3d46f9c13ca98ceb4c3df4e8878008260b8)
Review URL: https://codereview.chromium.org/1622743004 .
Cr-Commit-Position: refs/branch-heads/2623@{#90}
Cr-Branched-From: 92d77538a86529ca35f9220bd3cd512cbea1f086-refs/heads/master@{#369907}
Diffstat (limited to 'cc')
-rw-r--r-- | cc/trees/layer_tree_host_common_unittest.cc | 38 | ||||
-rw-r--r-- | cc/trees/property_tree_builder.cc | 14 |
2 files changed, 51 insertions, 1 deletions
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index c65a2cf..54f5534 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc @@ -6405,6 +6405,44 @@ TEST_F(LayerTreeHostCommonTest, ClippedByScrollParent) { EXPECT_TRUE(scroll_child->is_clipped()); } +TEST_F(LayerTreeHostCommonTest, ScrollChildAndScrollParentDifferentTargets) { + // Tests the computation of draw transform for the scroll child when its + // target is different from its scroll parent's target. + LayerImpl* root = root_layer(); + LayerImpl* scroll_child_target = AddChildToRoot<LayerImpl>(); + LayerImpl* scroll_child = AddChild<LayerImpl>(scroll_child_target); + LayerImpl* scroll_parent_target = AddChild<LayerImpl>(scroll_child_target); + LayerImpl* scroll_parent = AddChild<LayerImpl>(scroll_parent_target); + + scroll_parent->SetDrawsContent(true); + scroll_child->SetDrawsContent(true); + + scroll_child->SetScrollParent(scroll_parent); + scoped_ptr<std::set<LayerImpl*>> scroll_children(new std::set<LayerImpl*>); + scroll_children->insert(scroll_child); + scroll_parent->SetScrollChildren(scroll_children.release()); + + gfx::Transform identity_transform; + SetLayerPropertiesForTesting(root, identity_transform, gfx::Point3F(), + gfx::PointF(), gfx::Size(50, 50), true, false, + true); + SetLayerPropertiesForTesting(scroll_child_target, identity_transform, + gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50), + true, false, true); + SetLayerPropertiesForTesting(scroll_child, identity_transform, gfx::Point3F(), + gfx::PointF(), gfx::Size(50, 50), true, false, + false); + SetLayerPropertiesForTesting(scroll_parent_target, identity_transform, + gfx::Point3F(), gfx::PointF(10, 10), + gfx::Size(50, 50), true, false, true); + SetLayerPropertiesForTesting(scroll_parent, identity_transform, + gfx::Point3F(), gfx::PointF(), gfx::Size(50, 50), + true, false, true); + + ExecuteCalculateDrawProperties(root); + EXPECT_EQ(scroll_child->DrawTransform(), identity_transform); +} + TEST_F(LayerTreeHostCommonTest, SingularTransformSubtreesDoNotDraw) { LayerImpl* root = root_layer(); root->SetDrawsContent(true); diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index 85bdbec..a27bd3c 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc @@ -224,9 +224,18 @@ bool AddTransformNodeIfNeeded( const bool has_surface = created_render_surface; + // A transform node is needed to change the render target for subtree when + // a scroll child's render target is different from the scroll parent's render + // target. + const bool scroll_child_has_different_target = + layer->scroll_parent() && + layer->parent()->effect_tree_index() != + layer->scroll_parent()->effect_tree_index(); + bool requires_node = is_root || is_scrollable || has_significant_transform || has_any_transform_animation || has_surface || is_fixed || - is_page_scale_layer || is_overscroll_elasticity_layer; + is_page_scale_layer || is_overscroll_elasticity_layer || + scroll_child_has_different_target; LayerType* transform_parent = GetTransformParent(data_from_ancestor, layer); DCHECK(is_root || transform_parent); @@ -659,6 +668,9 @@ void BuildPropertyTreesInternal( for (LayerType* scroll_child : *layer->scroll_children()) { DCHECK_EQ(scroll_child->scroll_parent(), layer); DataForRecursionFromChild<LayerType> data_from_child; + DCHECK(scroll_child->parent()); + data_for_children.render_target = + scroll_child->parent()->effect_tree_index(); BuildPropertyTreesInternal(scroll_child, data_for_children, &data_from_child); data_to_parent->Merge(data_from_child); |