| Index: components/viz/service/hit_test/hit_test_aggregator_unittest.cc
|
| diff --git a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
|
| index 4a23b4dca4ad5388f42296f800fcc673d67754b9..8d1cc5e20e808424e9fdb01f2353884150bc73ef 100644
|
| --- a/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
|
| +++ b/components/viz/service/hit_test/hit_test_aggregator_unittest.cc
|
| @@ -7,6 +7,7 @@
|
| #include "components/viz/common/surfaces/frame_sink_id.h"
|
| #include "components/viz/common/surfaces/local_surface_id.h"
|
| #include "components/viz/common/surfaces/surface_id.h"
|
| +#include "components/viz/host/hit_test/hit_test_query.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| namespace viz {
|
| @@ -75,8 +76,6 @@ class HitTestAggregatorTest : public testing::Test {
|
| void SetUp() override {}
|
| void TearDown() override { aggregator_.Reset(); }
|
|
|
| - TestHitTestAggregator aggregator_;
|
| -
|
| // Creates a hit test data element with 8 children recursively to
|
| // the specified depth. SurfaceIds are generated in sequential order and
|
| // the method returns the next unused id.
|
| @@ -106,6 +105,9 @@ class HitTestAggregatorTest : public testing::Test {
|
| aggregator_.SubmitHitTestRegionList(std::move(hit_test_region_list));
|
| return id;
|
| }
|
| +
|
| + TestHitTestAggregator aggregator_;
|
| + HitTestQuery hit_test_query_;
|
| };
|
|
|
| // TODO(gklassen): Add tests for 3D use cases as suggested by and with
|
| @@ -155,6 +157,30 @@ TEST_F(HitTestAggregatorTest, OneSurface) {
|
| EXPECT_EQ(display_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(0, 0, 1024, 768), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 1);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(1, 1);
|
| + gfx::Point point2(1024, 768);
|
| + gfx::Point point3(0, 0);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(display_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + // point2 is on the bounds of e so no target found.
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(FrameSinkId(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(), target2.location_in_target);
|
| + EXPECT_FALSE(target2.flags);
|
| +
|
| + // There's a valid Target for point3, see Rect::Contains.
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(display_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(point3, target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target3.flags);
|
| }
|
|
|
| // One opaque embedder with two regions.
|
| @@ -177,10 +203,12 @@ TEST_F(HitTestAggregatorTest, OneEmbedderTwoRegions) {
|
| e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
|
|
|
| auto e_hit_test_region_r1 = mojom::HitTestRegion::New();
|
| + e_hit_test_region_r1->surface_id = e_surface_id;
|
| e_hit_test_region_r1->flags = mojom::kHitTestMine;
|
| e_hit_test_region_r1->rect.SetRect(100, 100, 200, 400);
|
|
|
| auto e_hit_test_region_r2 = mojom::HitTestRegion::New();
|
| + e_hit_test_region_r2->surface_id = e_surface_id;
|
| e_hit_test_region_r2->flags = mojom::kHitTestMine;
|
| e_hit_test_region_r2->rect.SetRect(400, 100, 300, 400);
|
|
|
| @@ -229,6 +257,34 @@ TEST_F(HitTestAggregatorTest, OneEmbedderTwoRegions) {
|
| EXPECT_EQ(mojom::kHitTestMine, region->flags);
|
| EXPECT_EQ(gfx::Rect(400, 100, 300, 400), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 3);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(99, 200);
|
| + gfx::Point point2(150, 150);
|
| + gfx::Point point3(400, 400);
|
| + gfx::Point point4(1200, 350);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(50, 50), target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(0, 300), target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target3.flags);
|
| +
|
| + Target target4 = hit_test_query_.FindTargetForLocation(point4);
|
| + EXPECT_EQ(FrameSinkId(), target4.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(), target4.location_in_target);
|
| + EXPECT_FALSE(target4.flags);
|
| }
|
|
|
| // One embedder with two children.
|
| @@ -330,6 +386,35 @@ TEST_F(HitTestAggregatorTest, OneEmbedderTwoChildren) {
|
| EXPECT_EQ(c2_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(400, 100, 400, 300), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 3);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + // They all go to e since c1 and c2 cannot receive events.
|
| + gfx::Point point1(99, 200);
|
| + gfx::Point point2(150, 150);
|
| + gfx::Point point3(400, 400);
|
| + gfx::Point point4(1200, 350);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(point2, target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(point3, target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target3.flags);
|
| +
|
| + Target target4 = hit_test_query_.FindTargetForLocation(point4);
|
| + EXPECT_EQ(FrameSinkId(), target4.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(), target4.location_in_target);
|
| + EXPECT_FALSE(target4.flags);
|
| }
|
|
|
| // Occluded child frame (OOPIF).
|
| @@ -424,6 +509,28 @@ TEST_F(HitTestAggregatorTest, OccludedChildFrame) {
|
| EXPECT_EQ(c_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(100, 100, 200, 500), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 3);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(99, 200);
|
| + gfx::Point point2(150, 150);
|
| + gfx::Point point3(250, 250);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(c_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(50, 50), target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(50, 50), target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target3.flags);
|
| }
|
|
|
| // Foreground child frame (OOPIF).
|
| @@ -519,6 +626,34 @@ TEST_F(HitTestAggregatorTest, ForegroundChildFrame) {
|
| EXPECT_EQ(e_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(200, 200, 300, 200), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 3);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(99, 200);
|
| + gfx::Point point2(150, 150);
|
| + gfx::Point point3(250, 250);
|
| + gfx::Point point4(350, 300);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(c_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(50, 50), target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(c_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(150, 150), target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target3.flags);
|
| +
|
| + Target target4 = hit_test_query_.FindTargetForLocation(point4);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target4.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(150, 100), target4.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target4.flags);
|
| }
|
|
|
| // One embedder with a clipped child with a tab and transparent background.
|
| @@ -549,7 +684,7 @@ TEST_F(HitTestAggregatorTest, ClippedChildWithTabAndTransparentBackground) {
|
| auto e_hit_test_region_c = mojom::HitTestRegion::New();
|
| e_hit_test_region_c->flags = mojom::kHitTestChildSurface;
|
| e_hit_test_region_c->surface_id = c_surface_id;
|
| - e_hit_test_region_c->rect.SetRect(200, 100, 1600, 800);
|
| + e_hit_test_region_c->rect.SetRect(300, 100, 1600, 800);
|
| e_hit_test_region_c->transform.Translate(200, 100);
|
|
|
| e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
|
| @@ -638,7 +773,7 @@ TEST_F(HitTestAggregatorTest, ClippedChildWithTabAndTransparentBackground) {
|
| region = ®ions[1];
|
| EXPECT_EQ(region->flags, mojom::kHitTestChildSurface | mojom::kHitTestIgnore);
|
| EXPECT_EQ(c_surface_id.frame_sink_id(), region->frame_sink_id);
|
| - EXPECT_EQ(gfx::Rect(200, 100, 1600, 800), region->rect);
|
| + EXPECT_EQ(gfx::Rect(300, 100, 1600, 800), region->rect);
|
| EXPECT_EQ(2, region->child_count);
|
|
|
| gfx::Point point(300, 300);
|
| @@ -656,6 +791,34 @@ TEST_F(HitTestAggregatorTest, ClippedChildWithTabAndTransparentBackground) {
|
| EXPECT_EQ(b_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(0, 100, 800, 600), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 4);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(1, 1);
|
| + gfx::Point point2(100, 50);
|
| + gfx::Point point3(400, 70);
|
| + gfx::Point point4(200, 200);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(a_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(0, 50), target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(point3, target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target3.flags);
|
| +
|
| + Target target4 = hit_test_query_.FindTargetForLocation(point4);
|
| + EXPECT_EQ(b_surface_id.frame_sink_id(), target4.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(100, 100), target4.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target4.flags);
|
| }
|
|
|
| // Three children deep.
|
| @@ -790,6 +953,34 @@ TEST_F(HitTestAggregatorTest, ThreeChildrenDeep) {
|
| EXPECT_EQ(c3_surface_id.frame_sink_id(), region->frame_sink_id);
|
| EXPECT_EQ(gfx::Rect(100, 100, 300, 300), region->rect);
|
| EXPECT_EQ(0, region->child_count);
|
| +
|
| + hit_test_query_.set_aggregated_hit_test_region_list(regions, 4);
|
| +
|
| + // All points are in e's coordinate system when we reach this case.
|
| + gfx::Point point1(1, 1);
|
| + gfx::Point point2(100, 150);
|
| + gfx::Point point3(250, 450);
|
| + gfx::Point point4(450, 550);
|
| +
|
| + Target target1 = hit_test_query_.FindTargetForLocation(point1);
|
| + EXPECT_EQ(e_surface_id.frame_sink_id(), target1.frame_sink_id);
|
| + EXPECT_EQ(point1, target1.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestMine, target1.flags);
|
| +
|
| + Target target2 = hit_test_query_.FindTargetForLocation(point2);
|
| + EXPECT_EQ(c3_surface_id.frame_sink_id(), target2.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(0, 50), target2.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target2.flags);
|
| +
|
| + Target target3 = hit_test_query_.FindTargetForLocation(point3);
|
| + EXPECT_EQ(c2_surface_id.frame_sink_id(), target3.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(50, 250), target3.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target3.flags);
|
| +
|
| + Target target4 = hit_test_query_.FindTargetForLocation(point4);
|
| + EXPECT_EQ(c1_surface_id.frame_sink_id(), target4.frame_sink_id);
|
| + EXPECT_EQ(gfx::Point(150, 250), target4.location_in_target);
|
| + EXPECT_EQ(mojom::kHitTestChildSurface | mojom::kHitTestMine, target4.flags);
|
| }
|
|
|
| // Missing / late child.
|
|
|