From 0ec86f59706a0870ea91248a63ec10ad496398ed Mon Sep 17 00:00:00 2001 From: "vollick@chromium.org" Date: Thu, 12 Jun 2014 20:54:03 +0000 Subject: Clean up PointIsClippedBySurfaceOrClipRect This function made unnecessary use of the render target and didn't walk its clipping ancestor chain correctly. This CL refactors the function and fixes that walk (and adds test to show that the walk is correct). R=danakj@chromium.org Review URL: https://codereview.chromium.org/328753002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@276799 0039d316-1c4b-4281-b951-d872f2087c98 --- cc/trees/layer_tree_impl_unittest.cc | 138 +++++++++++++++++++++++++++++++++++ 1 file changed, 138 insertions(+) (limited to 'cc/trees/layer_tree_impl_unittest.cc') diff --git a/cc/trees/layer_tree_impl_unittest.cc b/cc/trees/layer_tree_impl_unittest.cc index 8db2b95..91bad3e 100644 --- a/cc/trees/layer_tree_impl_unittest.cc +++ b/cc/trees/layer_tree_impl_unittest.cc @@ -1117,6 +1117,144 @@ TEST_F(LayerTreeImplTest, HitTestingForMultipleLayersAtVaryingDepths) { EXPECT_EQ(4, result_layer->id()); } +TEST_F(LayerTreeImplTest, HitTestingRespectsClipParents) { + scoped_ptr root = LayerImpl::Create(host_impl().active_tree(), 1); + gfx::Transform identity_matrix; + gfx::Point3F transform_origin; + gfx::PointF position; + gfx::Size bounds(100, 100); + SetLayerPropertiesForTesting(root.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + root->SetDrawsContent(true); + { + scoped_ptr child = + LayerImpl::Create(host_impl().active_tree(), 2); + scoped_ptr grand_child = + LayerImpl::Create(host_impl().active_tree(), 4); + + position = gfx::PointF(10.f, 10.f); + bounds = gfx::Size(1, 1); + SetLayerPropertiesForTesting(child.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + child->SetDrawsContent(true); + child->SetMasksToBounds(true); + + position = gfx::PointF(0.f, 40.f); + bounds = gfx::Size(100, 50); + SetLayerPropertiesForTesting(grand_child.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + grand_child->SetDrawsContent(true); + grand_child->SetForceRenderSurface(true); + + // This should let |grand_child| "escape" |child|'s clip. + grand_child->SetClipParent(root.get()); + + child->AddChild(grand_child.Pass()); + root->AddChild(child.Pass()); + } + + host_impl().SetViewportSize(root->bounds()); + host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->UpdateDrawProperties(); + + gfx::Point test_point = gfx::Point(12, 52); + LayerImpl* result_layer = + host_impl().active_tree()->FindLayerThatIsHitByPoint(test_point); + ASSERT_TRUE(result_layer); + EXPECT_EQ(4, result_layer->id()); +} + +TEST_F(LayerTreeImplTest, HitTestingRespectsScrollParents) { + scoped_ptr root = LayerImpl::Create(host_impl().active_tree(), 1); + gfx::Transform identity_matrix; + gfx::Point3F transform_origin; + gfx::PointF position; + gfx::Size bounds(100, 100); + SetLayerPropertiesForTesting(root.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + root->SetDrawsContent(true); + { + scoped_ptr child = + LayerImpl::Create(host_impl().active_tree(), 2); + scoped_ptr scroll_child = + LayerImpl::Create(host_impl().active_tree(), 3); + scoped_ptr grand_child = + LayerImpl::Create(host_impl().active_tree(), 4); + + position = gfx::PointF(10.f, 10.f); + bounds = gfx::Size(1, 1); + SetLayerPropertiesForTesting(child.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + child->SetDrawsContent(true); + child->SetMasksToBounds(true); + + position = gfx::PointF(); + bounds = gfx::Size(200, 200); + SetLayerPropertiesForTesting(scroll_child.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + scroll_child->SetDrawsContent(true); + + // This should cause scroll child and its descendants to be affected by + // |child|'s clip. + scroll_child->SetScrollParent(child.get()); + + SetLayerPropertiesForTesting(grand_child.get(), + identity_matrix, + transform_origin, + position, + bounds, + true, + false); + grand_child->SetDrawsContent(true); + grand_child->SetForceRenderSurface(true); + + scroll_child->AddChild(grand_child.Pass()); + root->AddChild(scroll_child.Pass()); + root->AddChild(child.Pass()); + } + + host_impl().SetViewportSize(root->bounds()); + host_impl().active_tree()->SetRootLayer(root.Pass()); + host_impl().active_tree()->UpdateDrawProperties(); + + gfx::Point test_point = gfx::Point(12, 52); + LayerImpl* result_layer = + host_impl().active_tree()->FindLayerThatIsHitByPoint(test_point); + // The |test_point| should have been clipped away by |child|, the scroll + // parent, so the only thing that should be hit is |root|. + ASSERT_TRUE(result_layer); + ASSERT_EQ(1, result_layer->id()); +} TEST_F(LayerTreeImplTest, HitTestingForMultipleLayerLists) { // // The geometry is set up similarly to the previous case, but -- cgit v1.1