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 "cc/trees/layer_tree_host_common.h" | 5 #include "cc/trees/layer_tree_host_common.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 | 8 |
| 9 #include "cc/animation/layer_animation_controller.h" | 9 #include "cc/animation/layer_animation_controller.h" |
| 10 #include "cc/base/math_util.h" | 10 #include "cc/base/math_util.h" |
| (...skipping 5398 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5409 EXPECT_EQ(3, result_layer->id()); | 5409 EXPECT_EQ(3, result_layer->id()); |
| 5410 | 5410 |
| 5411 // Hit testing for a point inside the mousewheel layer should return it. | 5411 // Hit testing for a point inside the mousewheel layer should return it. |
| 5412 test_point = gfx::Point(75, 75); | 5412 test_point = gfx::Point(75, 75); |
| 5413 result_layer = LayerTreeHostCommon::FindLayerThatIsHitByPoint( | 5413 result_layer = LayerTreeHostCommon::FindLayerThatIsHitByPoint( |
| 5414 test_point, render_surface_layer_list); | 5414 test_point, render_surface_layer_list); |
| 5415 ASSERT_TRUE(result_layer); | 5415 ASSERT_TRUE(result_layer); |
| 5416 EXPECT_EQ(4, result_layer->id()); | 5416 EXPECT_EQ(4, result_layer->id()); |
| 5417 } | 5417 } |
| 5418 | 5418 |
| 5419 TEST_F(LayerTreeHostCommonTest, ZeroOpacityLayersWithEventHandlerChild) { | |
| 5420 FakeImplProxy proxy; | |
| 5421 FakeLayerTreeHostImpl host_impl(&proxy); | |
| 5422 const int kRootId = 1; | |
| 5423 const int kNoHandlerChildId = 4; | |
| 5424 const int kGrandChildWithEventId = 5; | |
| 5425 const int kGrandChildWithoutEventId = 6; | |
| 5426 | |
| 5427 scoped_ptr<LayerImpl> root = | |
| 5428 LayerImpl::Create(host_impl.active_tree(), 1); | |
| 5429 gfx::Transform identity_matrix; | |
| 5430 gfx::PointF anchor; | |
| 5431 gfx::PointF position; | |
| 5432 gfx::Size bounds(100, 100); | |
| 5433 SetLayerPropertiesForTesting(root.get(), | |
| 5434 identity_matrix, | |
| 5435 identity_matrix, | |
| 5436 anchor, | |
| 5437 position, | |
| 5438 bounds, | |
| 5439 false); | |
| 5440 root->SetDrawsContent(true); | |
| 5441 | |
| 5442 // Child - Zero opacity, without any event handler. | |
| 5443 scoped_ptr<LayerImpl> child = | |
| 5444 LayerImpl::Create(host_impl.active_tree(), kNoHandlerChildId); | |
| 5445 SetLayerPropertiesForTesting(child.get(), | |
| 5446 identity_matrix, | |
| 5447 identity_matrix, | |
| 5448 anchor, | |
| 5449 gfx::PointF(10.f, 10.f), | |
| 5450 gfx::Size(30, 30), | |
| 5451 false); | |
| 5452 child->SetOpacity(0.f); | |
| 5453 child->SetDrawsContent(true); | |
| 5454 | |
| 5455 // Grandchild - with a wheel handler. | |
| 5456 { | |
| 5457 scoped_ptr<LayerImpl> grand_child = | |
| 5458 LayerImpl::Create(host_impl.active_tree(), kGrandChildWithEventId); | |
| 5459 SetLayerPropertiesForTesting(grand_child.get(), | |
| 5460 identity_matrix, | |
| 5461 identity_matrix, | |
| 5462 gfx::PointF(), | |
| 5463 gfx::PointF(10, 10), | |
| 5464 gfx::Size(10, 10), | |
| 5465 false); | |
| 5466 grand_child->SetHaveWheelEventHandlers(true); | |
| 5467 grand_child->SetDrawsContent(true); | |
| 5468 child->AddChild(grand_child.Pass()); | |
| 5469 } | |
| 5470 | |
| 5471 // Grandchild - without any event handlers. | |
| 5472 { | |
| 5473 scoped_ptr<LayerImpl> grand_child = | |
| 5474 LayerImpl::Create(host_impl.active_tree(), kGrandChildWithoutEventId); | |
| 5475 SetLayerPropertiesForTesting(grand_child.get(), | |
| 5476 identity_matrix, | |
| 5477 identity_matrix, | |
| 5478 gfx::PointF(), | |
| 5479 gfx::PointF(20, 10), | |
| 5480 gfx::Size(10, 10), | |
| 5481 false); | |
| 5482 grand_child->SetDrawsContent(true); | |
| 5483 child->AddChild(grand_child.Pass()); | |
| 5484 } | |
| 5485 | |
| 5486 root->AddChild(child.Pass()); | |
| 5487 | |
| 5488 LayerImplList render_surface_layer_list; | |
| 5489 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( | |
| 5490 root.get(), root->bounds(), &render_surface_layer_list); | |
| 5491 inputs.can_adjust_raster_scales = true; | |
| 5492 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | |
| 5493 | |
| 5494 // Verify that both the root layer and zero-opacity child layer are in the | |
| 5495 // RSLL (since the child layer has multiple drawing children). | |
| 5496 ASSERT_EQ(2u, render_surface_layer_list.size()); | |
| 5497 EXPECT_EQ(kRootId, render_surface_layer_list[0]->id()); | |
| 5498 EXPECT_EQ(kNoHandlerChildId, render_surface_layer_list[1]->id()); | |
| 5499 | |
| 5500 // The zero-opacity child layer should not be in the layer-list of the root's | |
| 5501 // surface. | |
| 5502 ASSERT_EQ(1u, root->render_surface()->layer_list().size()); | |
| 5503 EXPECT_EQ(kRootId, root->render_surface()->layer_list().at(0)->id()); | |
| 5504 | |
| 5505 ASSERT_EQ(2u, root->children()[0]->render_surface()->layer_list().size()); | |
| 5506 EXPECT_EQ(kNoHandlerChildId, | |
|
danakj
2013/10/09 19:14:59
This shouldn't be present, it doesn't have a handl
| |
| 5507 root->children()[0]->render_surface()->layer_list().at(0)->id()); | |
| 5508 EXPECT_EQ(kGrandChildWithEventId, | |
| 5509 root->children()[0]->render_surface()->layer_list().at(1)->id()); | |
| 5510 } | |
| 5511 | |
| 5512 TEST_F(LayerTreeHostCommonTest, | |
| 5513 ZeroOpacityLayerRenderSurfaceChildEventHandlerGrandChild) { | |
| 5514 FakeImplProxy proxy; | |
| 5515 FakeLayerTreeHostImpl host_impl(&proxy); | |
| 5516 const int kRootId = 1; | |
| 5517 const int kForceSurfaceLayer = 4; | |
| 5518 const int kZeroOpacityLayer = 5; | |
| 5519 const int kTouchHandlerLayer = 6; | |
| 5520 | |
| 5521 scoped_ptr<LayerImpl> root = | |
| 5522 LayerImpl::Create(host_impl.active_tree(), 1); | |
| 5523 gfx::Transform identity_matrix; | |
| 5524 gfx::PointF anchor; | |
| 5525 gfx::PointF position; | |
| 5526 gfx::Size bounds(100, 100); | |
| 5527 SetLayerPropertiesForTesting(root.get(), | |
| 5528 identity_matrix, | |
| 5529 identity_matrix, | |
| 5530 anchor, | |
| 5531 position, | |
| 5532 bounds, | |
| 5533 false); | |
| 5534 root->SetDrawsContent(true); | |
| 5535 | |
| 5536 // Layer with zero opacity. | |
| 5537 scoped_ptr<LayerImpl> zero_opacity_layer = | |
| 5538 LayerImpl::Create(host_impl.active_tree(), kZeroOpacityLayer); | |
| 5539 SetLayerPropertiesForTesting(zero_opacity_layer.get(), | |
| 5540 identity_matrix, | |
| 5541 identity_matrix, | |
| 5542 anchor, | |
| 5543 gfx::PointF(10.f, 10.f), | |
| 5544 gfx::Size(50, 50), | |
| 5545 false); | |
| 5546 zero_opacity_layer->SetOpacity(0.f); | |
| 5547 | |
| 5548 // Child with a render surface. | |
| 5549 scoped_ptr<LayerImpl> render_surface_layer = | |
| 5550 LayerImpl::Create(host_impl.active_tree(), kForceSurfaceLayer); | |
| 5551 SetLayerPropertiesForTesting(render_surface_layer.get(), | |
| 5552 identity_matrix, | |
| 5553 identity_matrix, | |
| 5554 gfx::PointF(), | |
| 5555 gfx::PointF(10, 10), | |
| 5556 gfx::Size(40, 40), | |
| 5557 false); | |
| 5558 render_surface_layer->SetForceRenderSurface(true); | |
| 5559 render_surface_layer->SetDrawsContent(true); | |
| 5560 | |
| 5561 // Grandchild with a touch handler. | |
| 5562 scoped_ptr<LayerImpl> touch_handler_layer = | |
| 5563 LayerImpl::Create(host_impl.active_tree(), kTouchHandlerLayer); | |
| 5564 SetLayerPropertiesForTesting(touch_handler_layer.get(), | |
| 5565 identity_matrix, | |
| 5566 identity_matrix, | |
| 5567 gfx::PointF(), | |
| 5568 gfx::PointF(10, 10), | |
| 5569 gfx::Size(10, 10), | |
| 5570 false); | |
| 5571 touch_handler_layer->SetTouchEventHandlerRegion(gfx::Rect(0, 0, 10, 10)); | |
| 5572 touch_handler_layer->SetDrawsContent(true); | |
| 5573 | |
| 5574 render_surface_layer->AddChild(touch_handler_layer.Pass()); | |
| 5575 zero_opacity_layer->AddChild(render_surface_layer.Pass()); | |
| 5576 root->AddChild(zero_opacity_layer.Pass()); | |
| 5577 | |
| 5578 LayerImplList render_surface_layer_list; | |
| 5579 LayerTreeHostCommon::CalcDrawPropsImplInputsForTesting inputs( | |
| 5580 root.get(), root->bounds(), &render_surface_layer_list); | |
| 5581 inputs.can_adjust_raster_scales = true; | |
| 5582 LayerTreeHostCommon::CalculateDrawProperties(&inputs); | |
| 5583 | |
| 5584 // Verify that both the root layer and child layer are in the RSLL (since both | |
| 5585 // own surfaces). | |
| 5586 ASSERT_EQ(3u, render_surface_layer_list.size()); | |
| 5587 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
| |
| 5588 EXPECT_EQ(kZeroOpacityLayer, render_surface_layer_list[1]->id()); | |
| 5589 EXPECT_EQ(kForceSurfaceLayer, render_surface_layer_list[2]->id()); | |
| 5590 | |
| 5591 ASSERT_EQ(1u, root->render_surface()->layer_list().size()); | |
| 5592 EXPECT_EQ(kRootId, root->render_surface()->layer_list().at(0)->id()); | |
| 5593 | |
| 5594 LayerImpl* zero_opacity_raw = root->children()[0]; | |
| 5595 ASSERT_EQ(0u, | |
| 5596 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
| |
| 5597 | |
| 5598 LayerImpl* render_surface_raw = zero_opacity_raw->children()[0]; | |
| 5599 ASSERT_EQ(1u, | |
| 5600 render_surface_raw->render_surface()->layer_list().size()); | |
| 5601 EXPECT_EQ(kTouchHandlerLayer, | |
| 5602 render_surface_raw->render_surface()->layer_list().at(0)->id()); | |
| 5603 } | |
| 5604 | |
| 5419 TEST_F(LayerTreeHostCommonTest, | 5605 TEST_F(LayerTreeHostCommonTest, |
| 5420 HitCheckingTouchHandlerRegionsForEmptyLayerList) { | 5606 HitCheckingTouchHandlerRegionsForEmptyLayerList) { |
| 5421 // Hit checking on an empty render_surface_layer_list should return a null | 5607 // Hit checking on an empty render_surface_layer_list should return a null |
| 5422 // pointer. | 5608 // pointer. |
| 5423 LayerImplList render_surface_layer_list; | 5609 LayerImplList render_surface_layer_list; |
| 5424 | 5610 |
| 5425 gfx::Point test_point(0, 0); | 5611 gfx::Point test_point(0, 0); |
| 5426 LayerImpl* result_layer = | 5612 LayerImpl* result_layer = |
| 5427 LayerTreeHostCommon::FindLayerThatIsHitByPointInTouchHandlerRegion( | 5613 LayerTreeHostCommon::FindLayerThatIsHitByPointInTouchHandlerRegion( |
| 5428 test_point, render_surface_layer_list); | 5614 test_point, render_surface_layer_list); |
| (...skipping 4110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9539 // due to layer sorting). | 9725 // due to layer sorting). |
| 9540 EXPECT_EQ(4u, root->render_surface()->layer_list().size()); | 9726 EXPECT_EQ(4u, root->render_surface()->layer_list().size()); |
| 9541 EXPECT_EQ(5, root->render_surface()->layer_list().at(0)->id()); | 9727 EXPECT_EQ(5, root->render_surface()->layer_list().at(0)->id()); |
| 9542 EXPECT_EQ(6, root->render_surface()->layer_list().at(1)->id()); | 9728 EXPECT_EQ(6, root->render_surface()->layer_list().at(1)->id()); |
| 9543 EXPECT_EQ(7, root->render_surface()->layer_list().at(2)->id()); | 9729 EXPECT_EQ(7, root->render_surface()->layer_list().at(2)->id()); |
| 9544 EXPECT_EQ(4, root->render_surface()->layer_list().at(3)->id()); | 9730 EXPECT_EQ(4, root->render_surface()->layer_list().at(3)->id()); |
| 9545 } | 9731 } |
| 9546 | 9732 |
| 9547 } // namespace | 9733 } // namespace |
| 9548 } // namespace cc | 9734 } // namespace cc |
| OLD | NEW |