diff options
Diffstat (limited to 'cc/trees/layer_tree_impl_unittest.cc')
-rw-r--r-- | cc/trees/layer_tree_impl_unittest.cc | 138 |
1 files changed, 138 insertions, 0 deletions
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<LayerImpl> 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<LayerImpl> child = + LayerImpl::Create(host_impl().active_tree(), 2); + scoped_ptr<LayerImpl> 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<LayerImpl> 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<LayerImpl> child = + LayerImpl::Create(host_impl().active_tree(), 2); + scoped_ptr<LayerImpl> scroll_child = + LayerImpl::Create(host_impl().active_tree(), 3); + scoped_ptr<LayerImpl> 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 |