Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "config.h" | 5 #include "config.h" |
| 6 | 6 |
| 7 #include "cc/layer_tree_host_common.h" | 7 #include "cc/layer_tree_host_common.h" |
| 8 | 8 |
| 9 #include "cc/content_layer.h" | 9 #include "cc/content_layer.h" |
| 10 #include "cc/content_layer_client.h" | 10 #include "cc/content_layer_client.h" |
| (...skipping 3091 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3102 | 3102 |
| 3103 { | 3103 { |
| 3104 scoped_ptr<LayerImpl> child = LayerImpl::create(456); | 3104 scoped_ptr<LayerImpl> child = LayerImpl::create(456); |
| 3105 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(789); | 3105 scoped_ptr<LayerImpl> grandChild = LayerImpl::create(789); |
| 3106 scoped_ptr<LayerImpl> rotatedLeaf = LayerImpl::create(2468); | 3106 scoped_ptr<LayerImpl> rotatedLeaf = LayerImpl::create(2468); |
| 3107 | 3107 |
| 3108 position = gfx::PointF(10, 10); | 3108 position = gfx::PointF(10, 10); |
| 3109 bounds = gfx::Size(80, 80); | 3109 bounds = gfx::Size(80, 80); |
| 3110 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix , anchor, position, bounds, false); | 3110 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix , anchor, position, bounds, false); |
| 3111 child->setMasksToBounds(true); | 3111 child->setMasksToBounds(true); |
| 3112 | 3112 |
| 3113 WebTransformationMatrix rotation45DegreesAboutCorner; | 3113 WebTransformationMatrix rotation45DegreesAboutCorner; |
| 3114 rotation45DegreesAboutCorner.rotate3d(0, 0, 45); | 3114 rotation45DegreesAboutCorner.rotate3d(0, 0, 45); |
| 3115 | 3115 |
| 3116 position = gfx::PointF(0, 0); // remember, positioned with respect to it s parent which is already at 10, 10 | 3116 position = gfx::PointF(0, 0); // remember, positioned with respect to it s parent which is already at 10, 10 |
| 3117 bounds = gfx::Size(200, 200); // to ensure it covers at least sqrt(2) * 100. | 3117 bounds = gfx::Size(200, 200); // to ensure it covers at least sqrt(2) * 100. |
| 3118 setLayerPropertiesForTesting(grandChild.get(), rotation45DegreesAboutCor ner, identityMatrix, anchor, position, bounds, false); | 3118 setLayerPropertiesForTesting(grandChild.get(), rotation45DegreesAboutCor ner, identityMatrix, anchor, position, bounds, false); |
| 3119 grandChild->setMasksToBounds(true); | 3119 grandChild->setMasksToBounds(true); |
| 3120 | 3120 |
| 3121 // Rotates about the center of the layer | 3121 // Rotates about the center of the layer |
| 3122 WebTransformationMatrix rotatedLeafTransform; | 3122 WebTransformationMatrix rotatedLeafTransform; |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3456 ASSERT_TRUE(resultLayer); | 3456 ASSERT_TRUE(resultLayer); |
| 3457 EXPECT_EQ(3, resultLayer->id()); | 3457 EXPECT_EQ(3, resultLayer->id()); |
| 3458 | 3458 |
| 3459 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b e on top. | 3459 // At (20, 51), child1 and grandChild1 overlap. grandChild1 is expected to b e on top. |
| 3460 testPoint = gfx::Point(20, 51); | 3460 testPoint = gfx::Point(20, 51); |
| 3461 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend erSurfaceLayerList); | 3461 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPoint(testPoint, rend erSurfaceLayerList); |
| 3462 ASSERT_TRUE(resultLayer); | 3462 ASSERT_TRUE(resultLayer); |
| 3463 EXPECT_EQ(4, resultLayer->id()); | 3463 EXPECT_EQ(4, resultLayer->id()); |
| 3464 } | 3464 } |
| 3465 | 3465 |
| 3466 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForEmptyLayerL ist) | |
| 3467 { | |
| 3468 // Hit checking on an empty renderSurfaceLayerList should return a null poin ter. | |
| 3469 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3470 | |
| 3471 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3472 | |
| 3473 gfx::Point testPoint(0, 0); | |
| 3474 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3475 EXPECT_FALSE(resultLayer); | |
| 3476 | |
| 3477 testPoint = gfx::Point(10, 20); | |
| 3478 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3479 EXPECT_FALSE(resultLayer); | |
| 3480 } | |
| 3481 | |
| 3482 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSingleLayer ) | |
| 3483 { | |
| 3484 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3485 | |
| 3486 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | |
| 3487 | |
| 3488 WebTransformationMatrix identityMatrix; | |
| 3489 Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); | |
| 3490 gfx::PointF anchor(0, 0); | |
| 3491 gfx::PointF position(0, 0); | |
| 3492 gfx::Size bounds(100, 100); | |
| 3493 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc hor, position, bounds, false); | |
| 3494 root->setDrawsContent(true); | |
| 3495 | |
| 3496 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3497 int dummyMaxTextureSize = 512; | |
| 3498 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | |
| 3499 | |
| 3500 // Sanity check the scenario we just created. | |
| 3501 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | |
| 3502 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | |
| 3503 | |
| 3504 // Hit checking for any point should return a null pointer for a layer witho ut any touch event handler regions. | |
| 3505 gfx::Point testPoint(11, 11); | |
| 3506 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3507 EXPECT_FALSE(resultLayer); | |
| 3508 | |
| 3509 root->setTouchEventHandlerRegion(touchHandlerRegion); | |
| 3510 // Hit checking for a point outside the layer should return a null pointer. | |
| 3511 testPoint = gfx::Point(101, 101); | |
| 3512 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3513 EXPECT_FALSE(resultLayer); | |
| 3514 | |
| 3515 testPoint = gfx::Point(-1, -1); | |
| 3516 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3517 EXPECT_FALSE(resultLayer); | |
| 3518 | |
| 3519 // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. | |
| 3520 testPoint = gfx::Point(1, 1); | |
| 3521 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3522 EXPECT_FALSE(resultLayer); | |
| 3523 | |
| 3524 testPoint = gfx::Point(99, 99); | |
| 3525 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3526 EXPECT_FALSE(resultLayer); | |
| 3527 | |
| 3528 // Hit checking for a point inside the touch event handler region should ret urn the root layer. | |
| 3529 testPoint = gfx::Point(11, 11); | |
| 3530 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3531 ASSERT_TRUE(resultLayer); | |
| 3532 EXPECT_EQ(12345, resultLayer->id()); | |
| 3533 | |
| 3534 testPoint = gfx::Point(59, 59); | |
| 3535 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3536 ASSERT_TRUE(resultLayer); | |
| 3537 EXPECT_EQ(12345, resultLayer->id()); | |
| 3538 } | |
| 3539 | |
| 3540 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForUninvertibl eTransform) | |
| 3541 { | |
| 3542 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3543 | |
| 3544 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | |
| 3545 | |
| 3546 WebTransformationMatrix uninvertibleTransform; | |
| 3547 uninvertibleTransform.setM11(0); | |
| 3548 uninvertibleTransform.setM22(0); | |
| 3549 uninvertibleTransform.setM33(0); | |
| 3550 uninvertibleTransform.setM44(0); | |
| 3551 ASSERT_FALSE(uninvertibleTransform.isInvertible()); | |
| 3552 | |
| 3553 WebTransformationMatrix identityMatrix; | |
| 3554 Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); | |
| 3555 gfx::PointF anchor(0, 0); | |
| 3556 gfx::PointF position(0, 0); | |
| 3557 gfx::Size bounds(100, 100); | |
| 3558 setLayerPropertiesForTesting(root.get(), uninvertibleTransform, identityMatr ix, anchor, position, bounds, false); | |
| 3559 root->setDrawsContent(true); | |
| 3560 root->setTouchEventHandlerRegion(touchHandlerRegion); | |
| 3561 | |
| 3562 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3563 int dummyMaxTextureSize = 512; | |
| 3564 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | |
| 3565 | |
| 3566 // Sanity check the scenario we just created. | |
| 3567 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | |
| 3568 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | |
| 3569 ASSERT_FALSE(root->screenSpaceTransform().isInvertible()); | |
| 3570 | |
| 3571 // Hit checking any point should not hit the touch handler region on the lay er. If the invertible matrix is | |
| 3572 // accidentally ignored and treated like an identity, then the hit testing w ill | |
| 3573 // incorrectly hit the layer when it shouldn't. | |
| 3574 gfx::Point testPoint(1, 1); | |
| 3575 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3576 EXPECT_FALSE(resultLayer); | |
| 3577 | |
| 3578 testPoint = gfx::Point(10, 10); | |
| 3579 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3580 EXPECT_FALSE(resultLayer); | |
| 3581 | |
| 3582 testPoint = gfx::Point(10, 30); | |
| 3583 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3584 EXPECT_FALSE(resultLayer); | |
| 3585 | |
| 3586 testPoint = gfx::Point(50, 50); | |
| 3587 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3588 EXPECT_FALSE(resultLayer); | |
| 3589 | |
| 3590 testPoint = gfx::Point(67, 48); | |
| 3591 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3592 EXPECT_FALSE(resultLayer); | |
| 3593 | |
| 3594 testPoint = gfx::Point(99, 99); | |
| 3595 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3596 EXPECT_FALSE(resultLayer); | |
| 3597 | |
| 3598 testPoint = gfx::Point(-1, -1); | |
| 3599 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3600 EXPECT_FALSE(resultLayer); | |
| 3601 } | |
| 3602 | |
| 3603 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSinglePosit ionedLayer) | |
| 3604 { | |
| 3605 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3606 | |
| 3607 scoped_ptr<LayerImpl> root = LayerImpl::create(12345); | |
| 3608 | |
| 3609 WebTransformationMatrix identityMatrix; | |
| 3610 Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); | |
| 3611 gfx::PointF anchor(0, 0); | |
| 3612 gfx::PointF position(50, 50); // this layer is positioned, and hit testing s hould correctly know where the layer is located. | |
| 3613 gfx::Size bounds(100, 100); | |
| 3614 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc hor, position, bounds, false); | |
| 3615 root->setDrawsContent(true); | |
| 3616 root->setTouchEventHandlerRegion(touchHandlerRegion); | |
| 3617 | |
| 3618 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3619 int dummyMaxTextureSize = 512; | |
| 3620 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | |
| 3621 | |
| 3622 // Sanity check the scenario we just created. | |
| 3623 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | |
| 3624 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | |
| 3625 | |
| 3626 // Hit checking for a point outside the layer should return a null pointer. | |
| 3627 gfx::Point testPoint(49, 49); | |
| 3628 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3629 EXPECT_FALSE(resultLayer); | |
| 3630 | |
| 3631 // Even though the layer has a touch handler region containing (101, 101), i t should not be visible there since the root renderSurface would clamp it. | |
| 3632 testPoint = gfx::Point(101, 101); | |
| 3633 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3634 EXPECT_FALSE(resultLayer); | |
| 3635 | |
| 3636 // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. | |
| 3637 testPoint = gfx::Point(51, 51); | |
| 3638 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3639 EXPECT_FALSE(resultLayer); | |
| 3640 | |
| 3641 // Hit checking for a point inside the touch event handler region should ret urn the root layer. | |
| 3642 testPoint = gfx::Point(61, 61); | |
| 3643 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3644 ASSERT_TRUE(resultLayer); | |
| 3645 EXPECT_EQ(12345, resultLayer->id()); | |
| 3646 | |
| 3647 testPoint = gfx::Point(99, 99); | |
| 3648 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3649 ASSERT_TRUE(resultLayer); | |
| 3650 EXPECT_EQ(12345, resultLayer->id()); | |
| 3651 } | |
| 3652 | |
| 3653 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSingleLayer WithScaledContents) | |
| 3654 { | |
| 3655 // A layer's visibleContentRect is actually in the layer's content space. Th e | |
| 3656 // screenSpaceTransform converts from the layer's origin space to screen spa ce. This | |
| 3657 // test makes sure that hit testing works correctly accounts for the content s scale. | |
| 3658 // A contentsScale that is not 1 effectively forces a non-identity transform between | |
| 3659 // layer's content space and layer's origin space. The hit testing code must take this into account. | |
| 3660 // | |
| 3661 // To test this, the layer is positioned at (25, 25), and is size (50, 50). If | |
| 3662 // contentsScale is ignored, then hit checking will mis-interpret the visibl eContentRect | |
| 3663 // as being larger than the actual bounds of the layer. | |
| 3664 // | |
| 3665 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3666 | |
| 3667 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | |
| 3668 | |
| 3669 WebTransformationMatrix identityMatrix; | |
| 3670 gfx::PointF anchor(0, 0); | |
| 3671 | |
| 3672 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc hor, gfx::PointF(0, 0), gfx::Size(100, 100), false); | |
| 3673 | |
| 3674 { | |
| 3675 Region touchHandlerRegion(gfx::Rect(10, 10, 30, 30)); | |
| 3676 gfx::PointF position(25, 25); | |
| 3677 gfx::Size bounds(50, 50); | |
| 3678 scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345); | |
| 3679 setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMa trix, anchor, position, bounds, false); | |
| 3680 | |
| 3681 // override contentBounds and contentsScale | |
| 3682 testLayer->setContentBounds(gfx::Size(100, 100)); | |
| 3683 testLayer->setContentsScale(2, 2); | |
| 3684 | |
| 3685 testLayer->setDrawsContent(true); | |
| 3686 testLayer->setTouchEventHandlerRegion(touchHandlerRegion); | |
| 3687 root->addChild(testLayer.Pass()); | |
| 3688 } | |
| 3689 | |
| 3690 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3691 int dummyMaxTextureSize = 512; | |
| 3692 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | |
|
danakj
2012/11/09 17:02:58
Can you repeat this test but pass something non-1,
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3693 | |
| 3694 // Sanity check the scenario we just created. | |
| 3695 // The visibleContentRect for testLayer is actually 100x100, even though its layout size is 50x50, positioned at 25x25. | |
| 3696 LayerImpl* testLayer = root->children()[0]; | |
| 3697 EXPECT_RECT_EQ(gfx::Rect(gfx::Point(), gfx::Size(100, 100)), testLayer->visi bleContentRect()); | |
| 3698 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | |
| 3699 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | |
| 3700 | |
| 3701 // Hit checking for a point outside the layer should return a null pointer ( the root layer does not draw content, so it will not be tested either). | |
| 3702 gfx::Point testPoint(76, 76); | |
| 3703 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3704 EXPECT_FALSE(resultLayer); | |
| 3705 | |
| 3706 // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. | |
| 3707 testPoint = gfx::Point(26, 26); | |
|
danakj
2012/11/09 17:02:58
does this also work at 34,34?
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3708 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3709 EXPECT_FALSE(resultLayer); | |
| 3710 | |
| 3711 testPoint = gfx::Point(74, 74); | |
|
danakj
2012/11/09 17:02:58
does this also work at 65,65?
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3712 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3713 EXPECT_FALSE(resultLayer); | |
| 3714 | |
| 3715 // Hit checking for a point inside the touch event handler region should ret urn the root layer. | |
| 3716 testPoint = gfx::Point(36, 36); | |
|
danakj
2012/11/09 17:02:58
does this also work at 35,35?
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3717 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3718 ASSERT_TRUE(resultLayer); | |
| 3719 EXPECT_EQ(12345, resultLayer->id()); | |
| 3720 | |
| 3721 testPoint = gfx::Point(64, 64); | |
| 3722 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3723 ASSERT_TRUE(resultLayer); | |
| 3724 EXPECT_EQ(12345, resultLayer->id()); | |
| 3725 } | |
| 3726 | |
| 3727 TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSimpleClipp edLayer) | |
| 3728 { | |
| 3729 // Test that hit-checking will only work for the visible portion of a layer, and not | |
| 3730 // the entire layer bounds. Here we just test the simple axis-aligned case. | |
| 3731 DebugScopedSetImplThread thisScopeIsOnImplThread; | |
| 3732 | |
| 3733 WebTransformationMatrix identityMatrix; | |
| 3734 gfx::PointF anchor(0, 0); | |
| 3735 | |
| 3736 scoped_ptr<LayerImpl> root = LayerImpl::create(1); | |
| 3737 setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anc hor, gfx::PointF(0, 0), gfx::Size(100, 100), false); | |
| 3738 | |
| 3739 { | |
| 3740 scoped_ptr<LayerImpl> clippingLayer = LayerImpl::create(123); | |
| 3741 gfx::PointF position(25, 25); // this layer is positioned, and hit testi ng should correctly know where the layer is located. | |
| 3742 gfx::Size bounds(50, 50); | |
| 3743 setLayerPropertiesForTesting(clippingLayer.get(), identityMatrix, identi tyMatrix, anchor, position, bounds, false); | |
| 3744 clippingLayer->setMasksToBounds(true); | |
| 3745 | |
| 3746 scoped_ptr<LayerImpl> child = LayerImpl::create(456); | |
| 3747 Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); | |
| 3748 position = gfx::PointF(-50, -50); | |
| 3749 bounds = gfx::Size(300, 300); | |
| 3750 setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix , anchor, position, bounds, false); | |
| 3751 child->setDrawsContent(true); | |
| 3752 child->setTouchEventHandlerRegion(touchHandlerRegion); | |
| 3753 clippingLayer->addChild(child.Pass()); | |
| 3754 root->addChild(clippingLayer.Pass()); | |
| 3755 } | |
| 3756 | |
| 3757 std::vector<LayerImpl*> renderSurfaceLayerList; | |
| 3758 int dummyMaxTextureSize = 512; | |
| 3759 LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); | |
| 3760 | |
| 3761 // Sanity check the scenario we just created. | |
| 3762 ASSERT_EQ(1u, renderSurfaceLayerList.size()); | |
| 3763 ASSERT_EQ(1u, root->renderSurface()->layerList().size()); | |
| 3764 ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); | |
| 3765 | |
| 3766 // Hit checking for a point outside the layer should return a null pointer. | |
| 3767 // Despite the child layer being very large, it should be clipped to the roo t layer's bounds. | |
| 3768 gfx::Point testPoint(24, 24); | |
| 3769 LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTou chHandlerRegion(testPoint, renderSurfaceLayerList); | |
| 3770 EXPECT_FALSE(resultLayer); | |
| 3771 | |
| 3772 // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. | |
| 3773 testPoint = gfx::Point(36, 36); | |
|
danakj
2012/11/09 17:02:58
how about 35,35?
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3774 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3775 EXPECT_FALSE(resultLayer); | |
| 3776 | |
| 3777 testPoint = gfx::Point(74, 74); | |
| 3778 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3779 EXPECT_FALSE(resultLayer); | |
| 3780 | |
| 3781 // Hit checking for a point inside the touch event handler region should ret urn the root layer. | |
| 3782 testPoint = gfx::Point(26, 26); | |
|
danakj
2012/11/09 17:02:58
how about 25,25?
Yusuf
2012/11/12 23:57:33
Done.
| |
| 3783 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3784 ASSERT_TRUE(resultLayer); | |
| 3785 EXPECT_EQ(456, resultLayer->id()); | |
| 3786 | |
| 3787 testPoint = gfx::Point(34, 34); | |
| 3788 resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRe gion(testPoint, renderSurfaceLayerList); | |
| 3789 ASSERT_TRUE(resultLayer); | |
| 3790 EXPECT_EQ(456, resultLayer->id()); | |
| 3791 } | |
| 3792 | |
| 3466 class NoScaleContentLayer : public ContentLayer | 3793 class NoScaleContentLayer : public ContentLayer |
| 3467 { | 3794 { |
| 3468 public: | 3795 public: |
| 3469 static scoped_refptr<NoScaleContentLayer> create(ContentLayerClient* client) { return make_scoped_refptr(new NoScaleContentLayer(client)); } | 3796 static scoped_refptr<NoScaleContentLayer> create(ContentLayerClient* client) { return make_scoped_refptr(new NoScaleContentLayer(client)); } |
| 3470 | 3797 |
| 3471 virtual gfx::Size contentBounds() const OVERRIDE { return bounds(); } | 3798 virtual gfx::Size contentBounds() const OVERRIDE { return bounds(); } |
| 3472 virtual float contentsScaleX() const OVERRIDE { return 1.0; } | 3799 virtual float contentsScaleX() const OVERRIDE { return 1.0; } |
| 3473 virtual float contentsScaleY() const OVERRIDE { return 1.0; } | 3800 virtual float contentsScaleY() const OVERRIDE { return 1.0; } |
| 3474 | 3801 |
| 3475 protected: | 3802 protected: |
| (...skipping 563 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4039 int nonexistentId = -1; | 4366 int nonexistentId = -1; |
| 4040 EXPECT_EQ(root, LayerTreeHostCommon::findLayerInSubtree(root.get(), root->id ())); | 4367 EXPECT_EQ(root, LayerTreeHostCommon::findLayerInSubtree(root.get(), root->id ())); |
| 4041 EXPECT_EQ(child, LayerTreeHostCommon::findLayerInSubtree(root.get(), child-> id())); | 4368 EXPECT_EQ(child, LayerTreeHostCommon::findLayerInSubtree(root.get(), child-> id())); |
| 4042 EXPECT_EQ(grandChild, LayerTreeHostCommon::findLayerInSubtree(root.get(), gr andChild->id())); | 4369 EXPECT_EQ(grandChild, LayerTreeHostCommon::findLayerInSubtree(root.get(), gr andChild->id())); |
| 4043 EXPECT_EQ(maskLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), mas kLayer->id())); | 4370 EXPECT_EQ(maskLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), mas kLayer->id())); |
| 4044 EXPECT_EQ(replicaLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), replicaLayer->id())); | 4371 EXPECT_EQ(replicaLayer, LayerTreeHostCommon::findLayerInSubtree(root.get(), replicaLayer->id())); |
| 4045 EXPECT_EQ(0, LayerTreeHostCommon::findLayerInSubtree(root.get(), nonexistent Id)); | 4372 EXPECT_EQ(0, LayerTreeHostCommon::findLayerInSubtree(root.get(), nonexistent Id)); |
| 4046 } | 4373 } |
| 4047 | 4374 |
| 4048 } // namespace | 4375 } // namespace |
| OLD | NEW |