| 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 |