| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 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 <stddef.h> | 5 #include <stddef.h> |
| 6 | 6 |
| 7 #include "cc/output/compositor_frame.h" | 7 #include "cc/output/compositor_frame.h" |
| 8 #include "cc/surfaces/surface.h" | 8 #include "cc/surfaces/surface.h" |
| 9 #include "cc/surfaces/surface_factory.h" | 9 #include "cc/surfaces/surface_factory.h" |
| 10 #include "cc/surfaces/surface_factory_client.h" | 10 #include "cc/surfaces/surface_factory_client.h" |
| 11 #include "cc/surfaces/surface_hittest.h" | 11 #include "cc/surfaces/surface_hittest.h" |
| 12 #include "cc/surfaces/surface_id_allocator.h" | 12 #include "cc/surfaces/surface_id_allocator.h" |
| 13 #include "cc/surfaces/surface_manager.h" | 13 #include "cc/surfaces/surface_manager.h" |
| 14 #include "cc/test/surface_hittest_test_helpers.h" | 14 #include "cc/test/surface_hittest_test_helpers.h" |
| 15 #include "testing/gtest/include/gtest/gtest.h" | 15 #include "testing/gtest/include/gtest/gtest.h" |
| 16 #include "third_party/skia/include/core/SkColor.h" | 16 #include "third_party/skia/include/core/SkColor.h" |
| 17 #include "ui/gfx/geometry/size.h" | 17 #include "ui/gfx/geometry/size.h" |
| 18 | 18 |
| 19 namespace cc { | 19 namespace cc { |
| 20 | 20 |
| 21 namespace { | 21 namespace { |
| 22 | 22 |
| 23 static constexpr FrameSinkId kArbitraryFrameSinkId(1, 1); |
| 24 |
| 23 struct TestCase { | 25 struct TestCase { |
| 24 SurfaceId input_surface_id; | 26 SurfaceId input_surface_id; |
| 25 gfx::Point input_point; | 27 gfx::Point input_point; |
| 26 SurfaceId expected_compositor_frame_sink_id; | 28 SurfaceId expected_compositor_frame_sink_id; |
| 27 gfx::Point expected_output_point; | 29 gfx::Point expected_output_point; |
| 28 }; | 30 }; |
| 29 | 31 |
| 30 void RunTests(SurfaceHittestDelegate* delegate, | 32 void RunTests(SurfaceHittestDelegate* delegate, |
| 31 SurfaceManager* manager, | 33 SurfaceManager* manager, |
| 32 TestCase* tests, | 34 TestCase* tests, |
| (...skipping 29 matching lines...) Expand all Loading... |
| 62 SurfaceManager manager; | 64 SurfaceManager manager; |
| 63 EmptySurfaceFactoryClient client; | 65 EmptySurfaceFactoryClient client; |
| 64 SurfaceFactory factory(&manager, &client); | 66 SurfaceFactory factory(&manager, &client); |
| 65 | 67 |
| 66 // Creates a root surface. | 68 // Creates a root surface. |
| 67 gfx::Rect root_rect(300, 300); | 69 gfx::Rect root_rect(300, 300); |
| 68 RenderPass* root_pass = nullptr; | 70 RenderPass* root_pass = nullptr; |
| 69 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); | 71 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); |
| 70 | 72 |
| 71 // Add a reference to a non-existant child surface on the root surface. | 73 // Add a reference to a non-existant child surface on the root surface. |
| 72 SurfaceId child_surface_id(3, 0xdeadbeef, 0); | 74 SurfaceId child_surface_id(kArbitraryFrameSinkId, 0xdeadbeef, 0); |
| 73 gfx::Rect child_rect(200, 200); | 75 gfx::Rect child_rect(200, 200); |
| 74 CreateSurfaceDrawQuad(root_pass, | 76 CreateSurfaceDrawQuad(root_pass, |
| 75 gfx::Transform(), | 77 gfx::Transform(), |
| 76 root_rect, | 78 root_rect, |
| 77 child_rect, | 79 child_rect, |
| 78 child_surface_id); | 80 child_surface_id); |
| 79 | 81 |
| 80 // Submit the root frame. | 82 // Submit the root frame. |
| 81 SurfaceIdAllocator root_allocator(2); | 83 SurfaceIdAllocator root_allocator(FrameSinkId(2, 2)); |
| 82 SurfaceId root_surface_id = root_allocator.GenerateId(); | 84 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 83 factory.Create(root_surface_id); | 85 factory.Create(root_surface_id); |
| 84 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 86 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 85 SurfaceFactory::DrawCallback()); | 87 SurfaceFactory::DrawCallback()); |
| 86 | 88 |
| 87 { | 89 { |
| 88 SurfaceHittest hittest(nullptr, &manager); | 90 SurfaceHittest hittest(nullptr, &manager); |
| 89 // It is expected this test will complete without crashes. | 91 // It is expected this test will complete without crashes. |
| 90 gfx::Transform transform; | 92 gfx::Transform transform; |
| 91 EXPECT_EQ(root_surface_id, | 93 EXPECT_EQ(root_surface_id, |
| 92 hittest.GetTargetSurfaceAtPoint( | 94 hittest.GetTargetSurfaceAtPoint( |
| 93 root_surface_id, gfx::Point(100, 100), &transform)); | 95 root_surface_id, gfx::Point(100, 100), &transform)); |
| 94 } | 96 } |
| 95 | 97 |
| 96 factory.Destroy(root_surface_id); | 98 factory.Destroy(root_surface_id); |
| 97 } | 99 } |
| 98 | 100 |
| 99 TEST(SurfaceHittestTest, Hittest_SingleSurface) { | 101 TEST(SurfaceHittestTest, Hittest_SingleSurface) { |
| 100 SurfaceManager manager; | 102 SurfaceManager manager; |
| 101 EmptySurfaceFactoryClient client; | 103 EmptySurfaceFactoryClient client; |
| 102 SurfaceFactory factory(&manager, &client); | 104 SurfaceFactory factory(&manager, &client); |
| 103 | 105 |
| 104 // Creates a root surface. | 106 // Creates a root surface. |
| 105 gfx::Rect root_rect(300, 300); | 107 gfx::Rect root_rect(300, 300); |
| 106 RenderPass* root_pass = nullptr; | 108 RenderPass* root_pass = nullptr; |
| 107 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); | 109 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); |
| 108 | 110 |
| 109 // Submit the root frame. | 111 // Submit the root frame. |
| 110 SurfaceIdAllocator root_allocator(2); | 112 SurfaceIdAllocator root_allocator(FrameSinkId(2, 2)); |
| 111 SurfaceId root_surface_id = root_allocator.GenerateId(); | 113 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 112 factory.Create(root_surface_id); | 114 factory.Create(root_surface_id); |
| 113 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 115 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 114 SurfaceFactory::DrawCallback()); | 116 SurfaceFactory::DrawCallback()); |
| 115 TestCase tests[] = { | 117 TestCase tests[] = { |
| 116 { | 118 { |
| 117 root_surface_id, | 119 root_surface_id, |
| 118 gfx::Point(100, 100), | 120 gfx::Point(100, 100), |
| 119 root_surface_id, | 121 root_surface_id, |
| 120 gfx::Point(100, 100) | 122 gfx::Point(100, 100) |
| 121 }, | 123 }, |
| 122 }; | 124 }; |
| 123 | 125 |
| 124 RunTests(nullptr, &manager, tests, arraysize(tests)); | 126 RunTests(nullptr, &manager, tests, arraysize(tests)); |
| 125 | 127 |
| 126 factory.Destroy(root_surface_id); | 128 factory.Destroy(root_surface_id); |
| 127 } | 129 } |
| 128 | 130 |
| 129 TEST(SurfaceHittestTest, Hittest_ChildSurface) { | 131 TEST(SurfaceHittestTest, Hittest_ChildSurface) { |
| 130 SurfaceManager manager; | 132 SurfaceManager manager; |
| 131 EmptySurfaceFactoryClient client; | 133 EmptySurfaceFactoryClient client; |
| 132 SurfaceFactory factory(&manager, &client); | 134 SurfaceFactory factory(&manager, &client); |
| 133 | 135 |
| 134 // Creates a root surface. | 136 // Creates a root surface. |
| 135 gfx::Rect root_rect(300, 300); | 137 gfx::Rect root_rect(300, 300); |
| 136 RenderPass* root_pass = nullptr; | 138 RenderPass* root_pass = nullptr; |
| 137 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); | 139 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); |
| 138 | 140 |
| 139 // Add a reference to the child surface on the root surface. | 141 // Add a reference to the child surface on the root surface. |
| 140 SurfaceIdAllocator child_allocator(3); | 142 SurfaceIdAllocator child_allocator(FrameSinkId(3, 3)); |
| 141 SurfaceId child_surface_id = child_allocator.GenerateId(); | 143 SurfaceId child_surface_id = child_allocator.GenerateId(); |
| 142 gfx::Rect child_rect(200, 200); | 144 gfx::Rect child_rect(200, 200); |
| 143 CreateSurfaceDrawQuad(root_pass, | 145 CreateSurfaceDrawQuad(root_pass, |
| 144 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, | 146 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, |
| 145 0.0f, 1.0f, 0.0f, 50.0f, | 147 0.0f, 1.0f, 0.0f, 50.0f, |
| 146 0.0f, 0.0f, 1.0f, 0.0f, | 148 0.0f, 0.0f, 1.0f, 0.0f, |
| 147 0.0f, 0.0f, 0.0f, 1.0f), | 149 0.0f, 0.0f, 0.0f, 1.0f), |
| 148 root_rect, | 150 root_rect, |
| 149 child_rect, | 151 child_rect, |
| 150 child_surface_id); | 152 child_surface_id); |
| 151 | 153 |
| 152 // Submit the root frame. | 154 // Submit the root frame. |
| 153 SurfaceIdAllocator root_allocator(2); | 155 SurfaceIdAllocator root_allocator(FrameSinkId(2, 2)); |
| 154 SurfaceId root_surface_id = root_allocator.GenerateId(); | 156 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 155 factory.Create(root_surface_id); | 157 factory.Create(root_surface_id); |
| 156 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 158 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 157 SurfaceFactory::DrawCallback()); | 159 SurfaceFactory::DrawCallback()); |
| 158 | 160 |
| 159 // Creates a child surface. | 161 // Creates a child surface. |
| 160 RenderPass* child_pass = nullptr; | 162 RenderPass* child_pass = nullptr; |
| 161 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); | 163 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); |
| 162 | 164 |
| 163 // Add a solid quad in the child surface. | 165 // Add a solid quad in the child surface. |
| (...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); | 270 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); |
| 269 | 271 |
| 270 // Create a RenderPassDrawQuad to a non-existant RenderPass. | 272 // Create a RenderPassDrawQuad to a non-existant RenderPass. |
| 271 CreateRenderPassDrawQuad(root_pass, | 273 CreateRenderPassDrawQuad(root_pass, |
| 272 gfx::Transform(), | 274 gfx::Transform(), |
| 273 root_rect, | 275 root_rect, |
| 274 root_rect, | 276 root_rect, |
| 275 RenderPassId(1337, 1337)); | 277 RenderPassId(1337, 1337)); |
| 276 | 278 |
| 277 // Add a reference to the child surface on the root surface. | 279 // Add a reference to the child surface on the root surface. |
| 278 SurfaceIdAllocator child_allocator(3); | 280 SurfaceIdAllocator child_allocator(FrameSinkId(3, 3)); |
| 279 SurfaceId child_surface_id = child_allocator.GenerateId(); | 281 SurfaceId child_surface_id = child_allocator.GenerateId(); |
| 280 gfx::Rect child_rect(200, 200); | 282 gfx::Rect child_rect(200, 200); |
| 281 CreateSurfaceDrawQuad(root_pass, | 283 CreateSurfaceDrawQuad(root_pass, |
| 282 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, | 284 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, |
| 283 0.0f, 1.0f, 0.0f, 50.0f, | 285 0.0f, 1.0f, 0.0f, 50.0f, |
| 284 0.0f, 0.0f, 1.0f, 0.0f, | 286 0.0f, 0.0f, 1.0f, 0.0f, |
| 285 0.0f, 0.0f, 0.0f, 1.0f), | 287 0.0f, 0.0f, 0.0f, 1.0f), |
| 286 root_rect, | 288 root_rect, |
| 287 child_rect, | 289 child_rect, |
| 288 child_surface_id); | 290 child_surface_id); |
| 289 | 291 |
| 290 // Submit the root frame. | 292 // Submit the root frame. |
| 291 SurfaceIdAllocator root_allocator(2); | 293 SurfaceIdAllocator root_allocator(FrameSinkId(2, 2)); |
| 292 SurfaceId root_surface_id = root_allocator.GenerateId(); | 294 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 293 factory.Create(root_surface_id); | 295 factory.Create(root_surface_id); |
| 294 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 296 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 295 SurfaceFactory::DrawCallback()); | 297 SurfaceFactory::DrawCallback()); |
| 296 | 298 |
| 297 // Creates a child surface. | 299 // Creates a child surface. |
| 298 RenderPass* child_pass = nullptr; | 300 RenderPass* child_pass = nullptr; |
| 299 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); | 301 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); |
| 300 | 302 |
| 301 // Add a solid quad in the child surface. | 303 // Add a solid quad in the child surface. |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 // Add a solid quad in the child render pass. | 401 // Add a solid quad in the child render pass. |
| 400 RenderPass* child_render_pass = | 402 RenderPass* child_render_pass = |
| 401 root_frame.delegated_frame_data->render_pass_list.front().get(); | 403 root_frame.delegated_frame_data->render_pass_list.front().get(); |
| 402 gfx::Rect child_solid_quad_rect(100, 100); | 404 gfx::Rect child_solid_quad_rect(100, 100); |
| 403 CreateSolidColorDrawQuad(child_render_pass, | 405 CreateSolidColorDrawQuad(child_render_pass, |
| 404 gfx::Transform(), | 406 gfx::Transform(), |
| 405 gfx::Rect(100, 100), | 407 gfx::Rect(100, 100), |
| 406 child_solid_quad_rect); | 408 child_solid_quad_rect); |
| 407 | 409 |
| 408 // Submit the root frame. | 410 // Submit the root frame. |
| 409 SurfaceIdAllocator root_allocator(1); | 411 SurfaceIdAllocator root_allocator(FrameSinkId(1, 1)); |
| 410 SurfaceId root_surface_id = root_allocator.GenerateId(); | 412 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 411 factory.Create(root_surface_id); | 413 factory.Create(root_surface_id); |
| 412 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 414 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 413 SurfaceFactory::DrawCallback()); | 415 SurfaceFactory::DrawCallback()); |
| 414 | 416 |
| 415 TestCase tests[] = { | 417 TestCase tests[] = { |
| 416 // These tests just miss the RenderPassDrawQuad. | 418 // These tests just miss the RenderPassDrawQuad. |
| 417 { | 419 { |
| 418 root_surface_id, | 420 root_surface_id, |
| 419 gfx::Point(49, 49), | 421 gfx::Point(49, 49), |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 465 SurfaceManager manager; | 467 SurfaceManager manager; |
| 466 EmptySurfaceFactoryClient client; | 468 EmptySurfaceFactoryClient client; |
| 467 SurfaceFactory factory(&manager, &client); | 469 SurfaceFactory factory(&manager, &client); |
| 468 | 470 |
| 469 // Creates a root surface. | 471 // Creates a root surface. |
| 470 gfx::Rect root_rect(300, 300); | 472 gfx::Rect root_rect(300, 300); |
| 471 RenderPass* root_pass = nullptr; | 473 RenderPass* root_pass = nullptr; |
| 472 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); | 474 CompositorFrame root_frame = CreateCompositorFrame(root_rect, &root_pass); |
| 473 | 475 |
| 474 // Add a reference to the child surface on the root surface. | 476 // Add a reference to the child surface on the root surface. |
| 475 SurfaceIdAllocator child_allocator(3); | 477 SurfaceIdAllocator child_allocator(FrameSinkId(3, 3)); |
| 476 SurfaceId child_surface_id = child_allocator.GenerateId(); | 478 SurfaceId child_surface_id = child_allocator.GenerateId(); |
| 477 gfx::Rect child_rect(200, 200); | 479 gfx::Rect child_rect(200, 200); |
| 478 CreateSurfaceDrawQuad( | 480 CreateSurfaceDrawQuad( |
| 479 root_pass, | 481 root_pass, |
| 480 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, | 482 gfx::Transform(1.0f, 0.0f, 0.0f, 50.0f, |
| 481 0.0f, 1.0f, 0.0f, 50.0f, | 483 0.0f, 1.0f, 0.0f, 50.0f, |
| 482 0.0f, 0.0f, 1.0f, 0.0f, | 484 0.0f, 0.0f, 1.0f, 0.0f, |
| 483 0.0f, 0.0f, 0.0f, 1.0f), | 485 0.0f, 0.0f, 0.0f, 1.0f), |
| 484 root_rect, child_rect, child_surface_id); | 486 root_rect, child_rect, child_surface_id); |
| 485 | 487 |
| 486 // Submit the root frame. | 488 // Submit the root frame. |
| 487 SurfaceIdAllocator root_allocator(2); | 489 SurfaceIdAllocator root_allocator(FrameSinkId(2, 2)); |
| 488 SurfaceId root_surface_id = root_allocator.GenerateId(); | 490 SurfaceId root_surface_id = root_allocator.GenerateId(); |
| 489 factory.Create(root_surface_id); | 491 factory.Create(root_surface_id); |
| 490 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), | 492 factory.SubmitCompositorFrame(root_surface_id, std::move(root_frame), |
| 491 SurfaceFactory::DrawCallback()); | 493 SurfaceFactory::DrawCallback()); |
| 492 | 494 |
| 493 // Creates a child surface. | 495 // Creates a child surface. |
| 494 RenderPass* child_pass = nullptr; | 496 RenderPass* child_pass = nullptr; |
| 495 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); | 497 CompositorFrame child_frame = CreateCompositorFrame(child_rect, &child_pass); |
| 496 | 498 |
| 497 // Add a solid quad in the child surface. | 499 // Add a solid quad in the child surface. |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 581 arraysize(test_expectations_with_accept_insets)); | 583 arraysize(test_expectations_with_accept_insets)); |
| 582 | 584 |
| 583 // Verify that insets have affected hit targeting. | 585 // Verify that insets have affected hit targeting. |
| 584 EXPECT_EQ(0, accept_delegate.reject_target_overrides()); | 586 EXPECT_EQ(0, accept_delegate.reject_target_overrides()); |
| 585 EXPECT_EQ(2, accept_delegate.accept_target_overrides()); | 587 EXPECT_EQ(2, accept_delegate.accept_target_overrides()); |
| 586 | 588 |
| 587 factory.Destroy(root_surface_id); | 589 factory.Destroy(root_surface_id); |
| 588 } | 590 } |
| 589 | 591 |
| 590 } // namespace cc | 592 } // namespace cc |
| OLD | NEW |