Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(676)

Unified Diff: cc/trees/layer_tree_host_common_unittest.cc

Issue 26112002: cc: Fix hit-testing in zero-opacity layers. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: test Created 7 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « cc/trees/layer_tree_host_common.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/trees/layer_tree_host_common_unittest.cc
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc
index e9182e845a2fad6065b0ed3f6844ebb2f3f587fd..baf32bd028a836c589d636cb41bf06bb11279e69 100644
--- a/cc/trees/layer_tree_host_common_unittest.cc
+++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -5416,6 +5416,192 @@ TEST_F(LayerTreeHostCommonTest, HitTestingForEmptyLayers) {
EXPECT_EQ(4, result_layer->id());
}
+TEST_F(LayerTreeHostCommonTest, ZeroOpacityLayersWithEventHandlerChild) {
+ FakeImplProxy proxy;
+ FakeLayerTreeHostImpl host_impl(&proxy);
+ const int kRootId = 1;
+ const int kNoHandlerChildId = 4;
+ const int kGrandChildWithEventId = 5;
+ const int kGrandChildWithoutEventId = 6;
+
+ scoped_ptr<LayerImpl> root =
+ LayerImpl::Create(host_impl.active_tree(), 1);
+ gfx::Transform identity_matrix;
+ gfx::PointF anchor;
+ gfx::PointF position;
+ gfx::Size bounds(100, 100);
+ SetLayerPropertiesForTesting(root.get(),
+ identity_matrix,
+ identity_matrix,
+ anchor,
+ position,
+ bounds,
+ false);
+ root->SetDrawsContent(true);
+
+ // Child - Zero opacity, without any event handler.
+ scoped_ptr<LayerImpl> child =
+ LayerImpl::Create(host_impl.active_tree(), kNoHandlerChildId);
+ SetLayerPropertiesForTesting(child.get(),
+ identity_matrix,
+ identity_matrix,
+ anchor,
+ gfx::PointF(10.f, 10.f),
+ gfx::Size(30, 30),
+ false);
+ child->SetOpacity(0.f);
+ child->SetDrawsContent(true);
+
+ // Grandchild - with a wheel handler.
+ {
+ scoped_ptr<LayerImpl> grand_child =
+ LayerImpl::Create(host_impl.active_tree(), kGrandChildWithEventId);
+ SetLayerPropertiesForTesting(grand_child.get(),
+ identity_matrix,
+ identity_matrix,
+ gfx::PointF(),
+ gfx::PointF(10, 10),
+ gfx::Size(10, 10),
+ false);
+ grand_child->SetHaveWheelEventHandlers(true);
+ grand_child->SetDrawsContent(true);
+ child->AddChild(grand_child.Pass());
+ }
+
+ // Grandchild - without any event handlers.
+ {
+ scoped_ptr<LayerImpl> grand_child =
+ LayerImpl::Create(host_impl.active_tree(), kGrandChildWithoutEventId);
+ SetLayerPropertiesForTesting(grand_child.get(),
+ identity_matrix,
+ identity_matrix,
+ gfx::PointF(),
+ gfx::PointF(20, 10),
+ gfx::Size(10, 10),
+ false);
+ grand_child->SetDrawsContent(true);
+ child->AddChild(grand_child.Pass());
+ }
+
+ root->AddChild(child.Pass());
+
+ LayerImplList render_surface_layer_list;
+ LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
+ root.get(), root->bounds(), &render_surface_layer_list);
+ inputs.can_adjust_raster_scales = true;
+ LayerTreeHostCommon::CalculateDrawProperties(&inputs);
+
+ // Verify that both the root layer and zero-opacity child layer are in the
+ // RSLL (since the child layer has multiple drawing children).
+ ASSERT_EQ(2u, render_surface_layer_list.size());
+ EXPECT_EQ(kRootId, render_surface_layer_list[0]->id());
+ EXPECT_EQ(kNoHandlerChildId, render_surface_layer_list[1]->id());
+
+ // The zero-opacity child layer should not be in the layer-list of the root's
+ // surface.
+ ASSERT_EQ(1u, root->render_surface()->layer_list().size());
+ EXPECT_EQ(kRootId, root->render_surface()->layer_list().at(0)->id());
+
+ ASSERT_EQ(2u, root->children()[0]->render_surface()->layer_list().size());
+ EXPECT_EQ(kNoHandlerChildId,
danakj 2013/10/09 19:14:59 This shouldn't be present, it doesn't have a handl
+ root->children()[0]->render_surface()->layer_list().at(0)->id());
+ EXPECT_EQ(kGrandChildWithEventId,
+ root->children()[0]->render_surface()->layer_list().at(1)->id());
+}
+
+TEST_F(LayerTreeHostCommonTest,
+ ZeroOpacityLayerRenderSurfaceChildEventHandlerGrandChild) {
+ FakeImplProxy proxy;
+ FakeLayerTreeHostImpl host_impl(&proxy);
+ const int kRootId = 1;
+ const int kForceSurfaceLayer = 4;
+ const int kZeroOpacityLayer = 5;
+ const int kTouchHandlerLayer = 6;
+
+ scoped_ptr<LayerImpl> root =
+ LayerImpl::Create(host_impl.active_tree(), 1);
+ gfx::Transform identity_matrix;
+ gfx::PointF anchor;
+ gfx::PointF position;
+ gfx::Size bounds(100, 100);
+ SetLayerPropertiesForTesting(root.get(),
+ identity_matrix,
+ identity_matrix,
+ anchor,
+ position,
+ bounds,
+ false);
+ root->SetDrawsContent(true);
+
+ // Layer with zero opacity.
+ scoped_ptr<LayerImpl> zero_opacity_layer =
+ LayerImpl::Create(host_impl.active_tree(), kZeroOpacityLayer);
+ SetLayerPropertiesForTesting(zero_opacity_layer.get(),
+ identity_matrix,
+ identity_matrix,
+ anchor,
+ gfx::PointF(10.f, 10.f),
+ gfx::Size(50, 50),
+ false);
+ zero_opacity_layer->SetOpacity(0.f);
+
+ // Child with a render surface.
+ scoped_ptr<LayerImpl> render_surface_layer =
+ LayerImpl::Create(host_impl.active_tree(), kForceSurfaceLayer);
+ SetLayerPropertiesForTesting(render_surface_layer.get(),
+ identity_matrix,
+ identity_matrix,
+ gfx::PointF(),
+ gfx::PointF(10, 10),
+ gfx::Size(40, 40),
+ false);
+ render_surface_layer->SetForceRenderSurface(true);
+ render_surface_layer->SetDrawsContent(true);
+
+ // Grandchild with a touch handler.
+ scoped_ptr<LayerImpl> touch_handler_layer =
+ LayerImpl::Create(host_impl.active_tree(), kTouchHandlerLayer);
+ SetLayerPropertiesForTesting(touch_handler_layer.get(),
+ identity_matrix,
+ identity_matrix,
+ gfx::PointF(),
+ gfx::PointF(10, 10),
+ gfx::Size(10, 10),
+ false);
+ touch_handler_layer->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 10, 10));
+ touch_handler_layer->SetDrawsContent(true);
+
+ render_surface_layer->AddChild(touch_handler_layer.Pass());
+ zero_opacity_layer->AddChild(render_surface_layer.Pass());
+ root->AddChild(zero_opacity_layer.Pass());
+
+ LayerImplList render_surface_layer_list;
+ LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs(
+ root.get(), root->bounds(), &render_surface_layer_list);
+ inputs.can_adjust_raster_scales = true;
+ LayerTreeHostCommon::CalculateDrawProperties(&inputs);
+
+ // Verify that both the root layer and child layer are in the RSLL (since both
+ // own surfaces).
+ ASSERT_EQ(3u, render_surface_layer_list.size());
+ EXPECT_EQ(kRootId, render_surface_layer_list[0]->id());
sadrul 2013/10/10 18:01:31 The other issue I am hitting is, when we get kRoot
enne (OOO) 2013/10/15 17:56:49 Yes. The front-to-back iterator that the LayerTre
+ EXPECT_EQ(kZeroOpacityLayer, render_surface_layer_list[1]->id());
+ EXPECT_EQ(kForceSurfaceLayer, render_surface_layer_list[2]->id());
+
+ ASSERT_EQ(1u, root->render_surface()->layer_list().size());
+ EXPECT_EQ(kRootId, root->render_surface()->layer_list().at(0)->id());
+
+ LayerImpl* zero_opacity_raw = root->children()[0];
+ ASSERT_EQ(0u,
+ zero_opacity_raw->render_surface()->layer_list().size());
sadrul 2013/10/10 17:08:46 One of the issues I ran into is that RemoveSurface
danakj 2013/10/10 17:16:38 Hm... Maybe it's okay and better to not have thos
sadrul 2013/10/10 17:41:39 |RemoveSurfaceForEarlyExit()| also removes all sur
enne (OOO) 2013/10/15 17:56:49 Ack. That's really unfortunate. As the comment s
+
+ LayerImpl* render_surface_raw = zero_opacity_raw->children()[0];
+ ASSERT_EQ(1u,
+ render_surface_raw->render_surface()->layer_list().size());
+ EXPECT_EQ(kTouchHandlerLayer,
+ render_surface_raw->render_surface()->layer_list().at(0)->id());
+}
+
TEST_F(LayerTreeHostCommonTest,
HitCheckingTouchHandlerRegionsForEmptyLayerList) {
// Hit checking on an empty render_surface_layer_list should return a null
« no previous file with comments | « cc/trees/layer_tree_host_common.cc ('k') | cc/trees/layer_tree_host_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698