Index: cc/layer_tree_host_common_unittest.cc |
diff --git a/cc/layer_tree_host_common_unittest.cc b/cc/layer_tree_host_common_unittest.cc |
index 30aa9432c8c5c47657336e442c6492e8a751a7fa..0604654db4ff5c4ed4030be81ffeda60e3238aeb 100644 |
--- a/cc/layer_tree_host_common_unittest.cc |
+++ b/cc/layer_tree_host_common_unittest.cc |
@@ -16,6 +16,7 @@ |
#include "cc/test/animation_test_common.h" |
#include "cc/test/geometry_test_utils.h" |
#include "cc/thread.h" |
+#include "ui/gfx/size_conversions.h" |
#include "testing/gmock/include/gmock/gmock.h" |
#include "testing/gtest/include/gtest/gtest.h" |
#include <public/WebTransformationMatrix.h> |
@@ -3069,7 +3070,7 @@ TEST(LayerTreeHostCommonTest, verifyHitTestingForMultiClippedRotatedLayer) |
bounds = gfx::Size(80, 80); |
setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
child->setMasksToBounds(true); |
- |
+ |
WebTransformationMatrix rotation45DegreesAboutCorner; |
rotation45DegreesAboutCorner.rotate3d(0, 0, 45); |
@@ -3417,6 +3418,412 @@ TEST(LayerTreeHostCommonTest, verifyHitTestingForMultipleLayerLists) |
EXPECT_EQ(4, resultLayer->id()); |
} |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForEmptyLayerList) |
+{ |
+ // Hit checking on an empty renderSurfaceLayerList should return a null pointer. |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ |
+ gfx::Point testPoint(0, 0); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(10, 20); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSingleLayer) |
+{ |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
+ |
+ WebTransformationMatrix identityMatrix; |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); |
+ gfx::PointF anchor(0, 0); |
+ gfx::PointF position(0, 0); |
+ gfx::Size bounds(100, 100); |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ root->setDrawsContent(true); |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ |
+ // Hit checking for any point should return a null pointer for a layer without any touch event handler regions. |
+ gfx::Point testPoint(11, 11); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ root->setTouchEventHandlerRegion(touchHandlerRegion); |
+ // Hit checking for a point outside the layer should return a null pointer. |
+ testPoint = gfx::Point(101, 101); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(-1, -1); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. |
+ testPoint = gfx::Point(1, 1); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(99, 99); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the touch event handler region should return the root layer. |
+ testPoint = gfx::Point(11, 11); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+ |
+ testPoint = gfx::Point(59, 59); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForUninvertibleTransform) |
+{ |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
+ |
+ WebTransformationMatrix uninvertibleTransform; |
+ uninvertibleTransform.setM11(0); |
+ uninvertibleTransform.setM22(0); |
+ uninvertibleTransform.setM33(0); |
+ uninvertibleTransform.setM44(0); |
+ ASSERT_FALSE(uninvertibleTransform.isInvertible()); |
+ |
+ WebTransformationMatrix identityMatrix; |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); |
+ gfx::PointF anchor(0, 0); |
+ gfx::PointF position(0, 0); |
+ gfx::Size bounds(100, 100); |
+ setLayerPropertiesForTesting(root.get(), uninvertibleTransform, identityMatrix, anchor, position, bounds, false); |
+ root->setDrawsContent(true); |
+ root->setTouchEventHandlerRegion(touchHandlerRegion); |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ ASSERT_FALSE(root->screenSpaceTransform().isInvertible()); |
+ |
+ // Hit checking any point should not hit the touch handler region on the layer. If the invertible matrix is |
+ // accidentally ignored and treated like an identity, then the hit testing will |
+ // incorrectly hit the layer when it shouldn't. |
+ gfx::Point testPoint(1, 1); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(10, 10); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(10, 30); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(50, 50); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(67, 48); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(99, 99); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(-1, -1); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSinglePositionedLayer) |
+{ |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(12345); |
+ |
+ WebTransformationMatrix identityMatrix; |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); |
+ gfx::PointF anchor(0, 0); |
+ gfx::PointF position(50, 50); // this layer is positioned, and hit testing should correctly know where the layer is located. |
+ gfx::Size bounds(100, 100); |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ root->setDrawsContent(true); |
+ root->setTouchEventHandlerRegion(touchHandlerRegion); |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ |
+ // Hit checking for a point outside the layer should return a null pointer. |
+ gfx::Point testPoint(49, 49); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Even though the layer has a touch handler region containing (101, 101), it should not be visible there since the root renderSurface would clamp it. |
+ testPoint = gfx::Point(101, 101); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. |
+ testPoint = gfx::Point(51, 51); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the touch event handler region should return the root layer. |
+ testPoint = gfx::Point(61, 61); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+ |
+ testPoint = gfx::Point(99, 99); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSingleLayerWithScaledContents) |
+{ |
+ // A layer's visibleContentRect is actually in the layer's content space. The |
+ // screenSpaceTransform converts from the layer's origin space to screen space. This |
+ // test makes sure that hit testing works correctly accounts for the contents scale. |
+ // A contentsScale that is not 1 effectively forces a non-identity transform between |
+ // layer's content space and layer's origin space. The hit testing code must take this into account. |
+ // |
+ // To test this, the layer is positioned at (25, 25), and is size (50, 50). If |
+ // contentsScale is ignored, then hit checking will mis-interpret the visibleContentRect |
+ // as being larger than the actual bounds of the layer. |
+ // |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
+ |
+ WebTransformationMatrix identityMatrix; |
+ gfx::PointF anchor(0, 0); |
+ |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anchor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
+ |
+ { |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 30, 30)); |
+ gfx::PointF position(25, 25); |
+ gfx::Size bounds(50, 50); |
+ scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345); |
+ setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ |
+ // override contentBounds and contentsScale |
+ testLayer->setContentBounds(gfx::Size(100, 100)); |
+ testLayer->setContentsScale(2, 2); |
+ |
+ testLayer->setDrawsContent(true); |
+ testLayer->setTouchEventHandlerRegion(touchHandlerRegion); |
+ root->addChild(testLayer.Pass()); |
+ } |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ // The visibleContentRect for testLayer is actually 100x100, even though its layout size is 50x50, positioned at 25x25. |
+ LayerImpl* testLayer = root->children()[0]; |
+ EXPECT_RECT_EQ(gfx::Rect(gfx::Point(), gfx::Size(100, 100)), testLayer->visibleContentRect()); |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ |
+ // 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). |
+ gfx::Point testPoint(76, 76); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. |
+ testPoint = gfx::Point(26, 26); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(34, 34); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(65, 65); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(74, 74); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the touch event handler region should return the root layer. |
+ testPoint = gfx::Point(35, 35); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+ |
+ testPoint = gfx::Point(64, 64); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSingleLayerWithDeviceScale) |
+{ |
+ // The layer's deviceScalefactor and pageScaleFactor should scale the contentRect and we should |
+ // be able to hit the touch handler region by scaling the points accordingly. |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
+ |
+ WebTransformationMatrix identityMatrix; |
+ gfx::PointF anchor(0, 0); |
+ // Set the bounds of the root layer big enough to fit the child when scaled. |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anchor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
+ |
+ { |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 30, 30)); |
+ gfx::PointF position(25, 25); |
+ gfx::Size bounds(50, 50); |
+ scoped_ptr<LayerImpl> testLayer = LayerImpl::create(12345); |
+ setLayerPropertiesForTesting(testLayer.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ |
+ testLayer->setDrawsContent(true); |
+ testLayer->setTouchEventHandlerRegion(touchHandlerRegion); |
+ root->addChild(testLayer.Pass()); |
+ } |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ float deviceScaleFactor = 3.0f; |
+ float pageScaleFactor = 5.0f; |
+ WebTransformationMatrix pageScaleTransform; |
+ pageScaleTransform.scale(pageScaleFactor); |
+ root->setImplTransform(pageScaleTransform); // Applying the pageScaleFactor through implTransform. |
+ gfx::Size scaledBoundsForRoot = gfx::ToCeiledSize(gfx::ScaleSize(root->bounds(), deviceScaleFactor * pageScaleFactor)); |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), scaledBoundsForRoot, deviceScaleFactor, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ // The visibleContentRect for testLayer is actually 100x100, even though its layout size is 50x50, positioned at 25x25. |
+ LayerImpl* testLayer = root->children()[0]; |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ |
+ // Check whether the child layer fits into the root after scaled. |
+ EXPECT_RECT_EQ(gfx::Rect(testLayer->contentBounds()), testLayer->visibleContentRect());; |
+ |
+ // 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). |
+ gfx::PointF testPoint(76, 76); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. |
+ testPoint = gfx::Point(26, 26); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(34, 34); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(65, 65); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(74, 74); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the touch event handler region should return the root layer. |
+ testPoint = gfx::Point(35, 35); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+ |
+ testPoint = gfx::Point(64, 64); |
+ testPoint = gfx::ScalePoint(testPoint, deviceScaleFactor * pageScaleFactor); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(12345, resultLayer->id()); |
+} |
+ |
+TEST(LayerTreeHostCommonTest, verifyHitCheckingTouchHandlerRegionsForSimpleClippedLayer) |
+{ |
+ // Test that hit-checking will only work for the visible portion of a layer, and not |
+ // the entire layer bounds. Here we just test the simple axis-aligned case. |
+ WebTransformationMatrix identityMatrix; |
+ gfx::PointF anchor(0, 0); |
+ |
+ scoped_ptr<LayerImpl> root = LayerImpl::create(1); |
+ setLayerPropertiesForTesting(root.get(), identityMatrix, identityMatrix, anchor, gfx::PointF(0, 0), gfx::Size(100, 100), false); |
+ |
+ { |
+ scoped_ptr<LayerImpl> clippingLayer = LayerImpl::create(123); |
+ gfx::PointF position(25, 25); // this layer is positioned, and hit testing should correctly know where the layer is located. |
+ gfx::Size bounds(50, 50); |
+ setLayerPropertiesForTesting(clippingLayer.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ clippingLayer->setMasksToBounds(true); |
+ |
+ scoped_ptr<LayerImpl> child = LayerImpl::create(456); |
+ Region touchHandlerRegion(gfx::Rect(10, 10, 50, 50)); |
+ position = gfx::PointF(-50, -50); |
+ bounds = gfx::Size(300, 300); |
+ setLayerPropertiesForTesting(child.get(), identityMatrix, identityMatrix, anchor, position, bounds, false); |
+ child->setDrawsContent(true); |
+ child->setTouchEventHandlerRegion(touchHandlerRegion); |
+ clippingLayer->addChild(child.Pass()); |
+ root->addChild(clippingLayer.Pass()); |
+ } |
+ |
+ std::vector<LayerImpl*> renderSurfaceLayerList; |
+ int dummyMaxTextureSize = 512; |
+ LayerTreeHostCommon::calculateDrawTransforms(root.get(), root->bounds(), 1, 1, 0, dummyMaxTextureSize, renderSurfaceLayerList); |
+ |
+ // Sanity check the scenario we just created. |
+ ASSERT_EQ(1u, renderSurfaceLayerList.size()); |
+ ASSERT_EQ(1u, root->renderSurface()->layerList().size()); |
+ ASSERT_EQ(456, root->renderSurface()->layerList()[0]->id()); |
+ |
+ // Hit checking for a point outside the layer should return a null pointer. |
+ // Despite the child layer being very large, it should be clipped to the root layer's bounds. |
+ gfx::Point testPoint(24, 24); |
+ LayerImpl* resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the layer, but outside the touch handler region should return a null pointer. |
+ testPoint = gfx::Point(35, 35); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ testPoint = gfx::Point(74, 74); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ EXPECT_FALSE(resultLayer); |
+ |
+ // Hit checking for a point inside the touch event handler region should return the root layer. |
+ testPoint = gfx::Point(25, 25); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(456, resultLayer->id()); |
+ |
+ testPoint = gfx::Point(34, 34); |
+ resultLayer = LayerTreeHostCommon::findLayerThatIsHitByPointInTouchHandlerRegion(testPoint, renderSurfaceLayerList); |
+ ASSERT_TRUE(resultLayer); |
+ EXPECT_EQ(456, resultLayer->id()); |
+} |
+ |
class NoScaleContentLayer : public ContentLayer |
{ |
public: |