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

Side by Side Diff: components/viz/service/hit_test/hit_test_aggregator_unittest.cc

Issue 2938953002: Implement HitTestAggregator (Closed)
Patch Set: improvents based on reviewer comments ( partial ) Created 3 years, 6 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2017 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "hit_test_aggregator.h"
6 #include "cc/surfaces/frame_sink_id.h"
7 #include "cc/surfaces/local_surface_id.h"
8 #include "cc/surfaces/surface_id.h"
9 #include "display_hit_test_data_factory_local.h"
10 #include "testing/gtest/include/gtest/gtest.h"
11
12 namespace viz {
13 namespace hit_test {
14 namespace test {
15
16 namespace {
17
18 constexpr cc::FrameSinkId kDisplayFrameSink(2, 0);
19
20 cc::SurfaceId MakeSurfaceId(const cc::FrameSinkId& frame_sink_id,
21 uint32_t local_id) {
22 return cc::SurfaceId(
23 frame_sink_id,
24 cc::LocalSurfaceId(local_id, base::UnguessableToken::Deserialize(0, 1u)));
25 }
26
27 } // namespace
28
29 using namespace hit_test::mojom;
30
31 class HitTestAggregatorTest : public testing::Test {
32 public:
33 HitTestAggregatorTest()
34 : aggregator_(
35 base::MakeUnique<hit_test::DisplayHitTestDataFactoryLocal>()) {}
36 ~HitTestAggregatorTest() override {}
37
38 void SetUp() override {}
39
40 void TearDown() override {}
41
42 HitTestAggregator aggregator_;
43
44 int count() {
45 DisplayHitTestRegion* start = aggregator_.GetCurrentRegions();
46 DisplayHitTestRegion* end = start;
47 while (end->child_count != kEndOfList) {
48 end++;
49 }
50 int count = end - start;
51 return count;
52 }
53
54 DisplayHitTestRegion* RegionAtIndex(int i) {
55 return aggregator_.GetCurrentRegions() + i;
56 }
57
58 int GetPendingCount() { return aggregator_.pending_.size(); }
59 int GetActiveCount() { return aggregator_.active_.size(); }
60
61 int GetPendingRegionCount() { return RegionCount(aggregator_.pending_); }
62 int GetActiveRegionCount() { return RegionCount(aggregator_.active_); }
63
64 int RegionCount(const HitTestDataMap& map) {
65 int size = 0;
66 for (auto const& it : map) {
67 hit_test::mojom::HitTestData* hit_test_data = it.second.get();
68 size += hit_test_data->regions.size();
69 }
70 return size;
71 }
72
73 void Reset() {
74 int size = aggregator_.display_hit_test_data_->length;
75
76 aggregator_.display_hit_test_data_->regions[0].child_count = kEndOfList;
77 aggregator_.display_hit_test_data_->regions[size >> 1].child_count =
78 kEndOfList;
79
80 aggregator_.pending_.clear();
81 aggregator_.active_.clear();
82 }
83
84 int GetDisplayHitTestDataLength() {
85 return aggregator_.display_hit_test_data_->length;
86 }
87
88 // Creates a hit test data element with 8 children recursively to
89 // the specified depth. SurfaceIds are generated in sequential order and
90 // the method returns the next unused id ( also matches the count ).
91 int CreateAndSubmitHitTestDataWith8Children(int id, int depth) {
92 cc::SurfaceId surface_id = MakeSurfaceId(kDisplayFrameSink, id);
93 id++;
94
95 auto hit_test_data = HitTestData::New();
96 hit_test_data->surface_id = surface_id;
97
98 for (int i = 0; i < 8; i++) {
99 auto hit_test_region = HitTestRegion::New();
100 hit_test_region->rect.SetRect(100, 100, 100, 100);
101
102 if (depth > 0) {
103 hit_test_region->flags = kHitTestChildSurface;
104 hit_test_region->surface_id = MakeSurfaceId(kDisplayFrameSink, id);
105 id = CreateAndSubmitHitTestDataWith8Children(id, depth - 1);
106 } else {
107 hit_test_region->flags = kHitTestMine;
108 }
109 hit_test_data->regions.push_back(std::move(hit_test_region));
110 }
111
112 aggregator_.SubmitHitTestData(std::move(hit_test_data));
113 return id;
114 }
115 };
116
117 // TODO(gklassen): Add tests for 3D use cases as suggested by and with
118 // input from rjkroege.
119
120 // One surface.
121 //
122 // +----------+
123 // | |
124 // | |
125 // | |
126 // +----------+
127 //
128 TEST_F(HitTestAggregatorTest, OneSurface) {
129 EXPECT_EQ(count(), 0);
130
131 cc::SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
132
133 auto hit_test_data = HitTestData::New();
134 hit_test_data->surface_id = display_surface_id;
135
136 auto hit_test_region = HitTestRegion::New();
137 hit_test_region->flags = kHitTestMine;
138 hit_test_region->surface_id = display_surface_id;
139 hit_test_region->rect.SetRect(0, 0, 1024, 768);
140
141 hit_test_data->regions.push_back(std::move(hit_test_region));
142
143 aggregator_.SubmitHitTestData(std::move(hit_test_data));
144 EXPECT_EQ(count(), 0);
145
146 EXPECT_EQ(GetPendingCount(), 1);
147 EXPECT_EQ(GetActiveCount(), 0);
148
149 aggregator_.OnSurfaceWillDraw(display_surface_id);
150
151 EXPECT_EQ(GetPendingCount(), 0);
152 EXPECT_EQ(GetActiveCount(), 1);
153
154 aggregator_.Aggregate(display_surface_id);
155 aggregator_.Swap();
156
157 // Expect 1 entry routing all events to the one surface ( display root ).
158 EXPECT_EQ(count(), 1);
159
160 DisplayHitTestRegion* region;
161
162 region = RegionAtIndex(0);
163 EXPECT_EQ(region->flags, kHitTestMine);
164 EXPECT_EQ(region->frame_sink_id, display_surface_id.frame_sink_id());
165 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
166 EXPECT_EQ(region->child_count, 0);
167 }
168
169 // One opaque embedder with two regions.
170 //
171 // +e-------------+
172 // | +r1-+ +r2--+ |
173 // | | | | | |
174 // | | | | | |
175 // | +---+ +----+ |
176 // +--------------+
177 //
178 TEST_F(HitTestAggregatorTest, OneEmbedderTwoRegions) {
179 Reset();
180 EXPECT_EQ(count(), 0);
181
182 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
183
184 auto e_hit_test_data = HitTestData::New();
185 e_hit_test_data->surface_id = e_surface_id;
186
187 auto e_hit_test_region = HitTestRegion::New();
188 e_hit_test_region->flags = kHitTestMine;
189 e_hit_test_region->surface_id = e_surface_id;
190 e_hit_test_region->rect.SetRect(0, 0, 1024, 768);
191
192 auto e_hit_test_region_r1 = HitTestRegion::New();
193 e_hit_test_region_r1->flags = kHitTestMine;
194 e_hit_test_region_r1->rect.SetRect(0, 0, 200, 400);
195
196 auto e_hit_test_region_r2 = HitTestRegion::New();
197 e_hit_test_region_r2->flags = kHitTestMine;
198 e_hit_test_region_r2->rect.SetRect(300, 0, 300, 400);
199
200 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r1));
201 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r2));
202 e_hit_test_data->regions.push_back(std::move(e_hit_test_region));
203
204 // Submit HitTestData.
205
206 EXPECT_EQ(GetPendingCount(), 0);
207
208 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
209 EXPECT_EQ(GetPendingCount(), 1);
210
211 // Add Surfaces to DisplayFrame ( in unexpected order ).
212
213 EXPECT_EQ(count(), 0);
214 EXPECT_EQ(GetActiveCount(), 0);
215
216 aggregator_.OnSurfaceWillDraw(e_surface_id);
217 EXPECT_EQ(GetActiveCount(), 1);
218
219 // Aggregate and swap.
220
221 aggregator_.Aggregate(e_surface_id);
222 EXPECT_EQ(count(), 0);
223
224 aggregator_.Swap();
225 EXPECT_EQ(count(), 3);
226
227 DisplayHitTestRegion* region;
228
229 region = RegionAtIndex(0);
230 EXPECT_EQ(region->flags, kHitTestMine);
231 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 200, 400));
232 EXPECT_EQ(region->child_count, 0);
233
234 region = RegionAtIndex(1);
235 EXPECT_EQ(region->flags, kHitTestMine);
236 EXPECT_EQ(region->rect, gfx::Rect(300, 0, 300, 400));
237 EXPECT_EQ(region->child_count, 0);
238
239 region = RegionAtIndex(2);
240 EXPECT_EQ(region->flags, kHitTestMine);
241 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
242 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
243 EXPECT_EQ(region->child_count, 0);
244 }
245
246 // One embedder with two children.
247 //
248 // +e------------+
249 // | +c1-+ +c2-+ |
250 // | | | | | |
251 // | | | | | |
252 // | +---+ +---+ |
253 // +-------------+
254 //
255
256 TEST_F(HitTestAggregatorTest, OneEmbedderTwoChildren) {
257 Reset();
258 EXPECT_EQ(count(), 0);
259
260 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
261 cc::SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
262 cc::SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
263
264 auto e_hit_test_data = HitTestData::New();
265 e_hit_test_data->surface_id = e_surface_id;
266
267 auto e_hit_test_region = HitTestRegion::New();
268 e_hit_test_region->flags = kHitTestMine;
269 e_hit_test_region->surface_id = e_surface_id;
270 e_hit_test_region->rect.SetRect(0, 0, 900, 500);
271
272 auto e_hit_test_region_c1 = HitTestRegion::New();
273 e_hit_test_region_c1->flags = kHitTestChildSurface;
274 e_hit_test_region_c1->surface_id = c1_surface_id;
275 e_hit_test_region_c1->rect.SetRect(100, 100, 200, 200);
276
277 auto e_hit_test_region_c2 = HitTestRegion::New();
278 e_hit_test_region_c2->flags = kHitTestChildSurface;
279 e_hit_test_region_c2->surface_id = c2_surface_id;
280 e_hit_test_region_c2->rect.SetRect(300, 300, 400, 400);
281
282 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
283 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c2));
284 e_hit_test_data->regions.push_back(std::move(e_hit_test_region));
285
286 auto c1_hit_test_data = HitTestData::New();
287 c1_hit_test_data->surface_id = c1_surface_id;
288
289 auto c2_hit_test_data = HitTestData::New();
290 c2_hit_test_data->surface_id = c2_surface_id;
291
292 // Submit ( in unexpected order ).
293
294 EXPECT_EQ(GetPendingCount(), 0);
295
296 aggregator_.SubmitHitTestData(std::move(c1_hit_test_data));
297 EXPECT_EQ(GetPendingCount(), 1);
298
299 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
300 EXPECT_EQ(GetPendingCount(), 2);
301
302 aggregator_.SubmitHitTestData(std::move(c2_hit_test_data));
303 EXPECT_EQ(GetPendingCount(), 3);
304
305 // Surfaces added to DisplayFrame ( in unexpected order ).
306
307 EXPECT_EQ(count(), 0);
308
309 EXPECT_EQ(GetActiveCount(), 0);
310
311 aggregator_.OnSurfaceWillDraw(c2_surface_id);
312 EXPECT_EQ(GetActiveCount(), 1);
313
314 aggregator_.OnSurfaceWillDraw(c1_surface_id);
315 EXPECT_EQ(GetActiveCount(), 2);
316
317 aggregator_.OnSurfaceWillDraw(e_surface_id);
318 EXPECT_EQ(GetActiveCount(), 3);
319
320 // Aggregate and swap.
321
322 aggregator_.Aggregate(e_surface_id);
323 EXPECT_EQ(count(), 0);
324
325 aggregator_.Swap();
326
327 EXPECT_EQ(count(), 3);
328
329 DisplayHitTestRegion* region;
330
331 region = RegionAtIndex(0);
332 EXPECT_EQ(region->flags, kHitTestChildSurface);
333 EXPECT_EQ(region->frame_sink_id, c1_surface_id.frame_sink_id());
334 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 200, 200));
335 EXPECT_EQ(region->child_count, 0);
336
337 region = RegionAtIndex(1);
338 EXPECT_EQ(region->flags, kHitTestChildSurface);
339 EXPECT_EQ(region->frame_sink_id, c2_surface_id.frame_sink_id());
340 EXPECT_EQ(region->rect, gfx::Rect(300, 300, 400, 400));
341 EXPECT_EQ(region->child_count, 0);
342
343 region = RegionAtIndex(2);
344 EXPECT_EQ(region->flags, kHitTestMine);
345 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
346 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 500, 500));
347 EXPECT_EQ(region->child_count, 0);
348 }
349
350 // Occluded child frame ( OOPIF ).
351 //
352 // +e-----------+
353 // | +c--+ |
354 // | | +div-+ |
355 // | | | | |
356 // | | +----+ |
357 // | +---+ |
358 // +------------+
359 //
360
361 TEST_F(HitTestAggregatorTest, OccludedChildFrame) {
362 Reset();
363 EXPECT_EQ(count(), 0);
364
365 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
366 cc::SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
367
368 auto e_hit_test_data = HitTestData::New();
369 e_hit_test_data->surface_id = e_surface_id;
370
371 auto e_hit_test_region = HitTestRegion::New();
372 e_hit_test_region->flags = kHitTestMine;
373 e_hit_test_region->surface_id = e_surface_id;
374 e_hit_test_region->rect.SetRect(0, 0, 500, 500);
375
376 auto e_hit_test_region_div = HitTestRegion::New();
377 e_hit_test_region_div->flags = kHitTestMine;
378 e_hit_test_region_div->rect.SetRect(100, 100, 400, 400);
379
380 auto e_hit_test_region_c = HitTestRegion::New();
381 e_hit_test_region_c->flags = kHitTestChildSurface;
382 e_hit_test_region_c->surface_id = c_surface_id;
383 e_hit_test_region_c->rect.SetRect(200, 200, 500, 200);
384
385 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
386 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
387 e_hit_test_data->regions.push_back(std::move(e_hit_test_region));
388
389 auto c_hit_test_data = HitTestData::New();
390 c_hit_test_data->surface_id = c_surface_id;
391
392 auto c_hit_test_region = HitTestRegion::New();
393 c_hit_test_region->flags = kHitTestMine;
394 c_hit_test_region->surface_id = c_surface_id;
395 c_hit_test_region->rect.SetRect(0, 0, 300, 300);
396
397 c_hit_test_data->regions.push_back(std::move(c_hit_test_region));
398
399 // Submit ( in unexpected order ).
400
401 EXPECT_EQ(GetPendingCount(), 0);
402
403 aggregator_.SubmitHitTestData(std::move(c_hit_test_data));
404 EXPECT_EQ(GetPendingCount(), 1);
405
406 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
407 EXPECT_EQ(GetPendingCount(), 2);
408
409 // Surfaces added to DisplayFrame ( in unexpected order ).
410
411 EXPECT_EQ(count(), 0);
412
413 EXPECT_EQ(GetActiveCount(), 0);
414
415 aggregator_.OnSurfaceWillDraw(e_surface_id);
416 EXPECT_EQ(GetActiveCount(), 1);
417
418 aggregator_.OnSurfaceWillDraw(c_surface_id);
419 EXPECT_EQ(GetActiveCount(), 2);
420
421 // Aggregate and swap.
422
423 aggregator_.Aggregate(e_surface_id);
424 EXPECT_EQ(count(), 0);
425
426 aggregator_.Swap();
427
428 EXPECT_EQ(count(), 4);
429
430 DisplayHitTestRegion* region;
431
432 region = RegionAtIndex(0);
433 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 400, 400));
434 EXPECT_EQ(region->flags, kHitTestMine);
435 EXPECT_EQ(region->child_count, 0);
436
437 region = RegionAtIndex(1);
438 EXPECT_EQ(region->rect, gfx::Rect(200, 200, 500, 200));
439 EXPECT_EQ(region->frame_sink_id, c_surface_id.frame_sink_id());
440 EXPECT_EQ(region->flags, kHitTestChildSurface);
441 EXPECT_EQ(region->child_count, 1);
442
443 region = RegionAtIndex(2);
444 EXPECT_EQ(region->flags, kHitTestMine);
445 EXPECT_EQ(region->frame_sink_id, c_surface_id.frame_sink_id());
446 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 300, 300));
447 EXPECT_EQ(region->child_count, 0);
448
449 region = RegionAtIndex(3);
450 EXPECT_EQ(region->flags, kHitTestMine);
451 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
452 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 500, 500));
453 EXPECT_EQ(region->child_count, 0);
454 }
455
456 // One embedder with a clipped child with a tab and transparent background.
457 //
458 // +e-------------+
459 // | +c---------| Point maps to
460 // | 1 |+a--+ | ----- -------
461 // | || 2 | 3 | 1 e
462 // | |+b--------| 2 a
463 // | || | 3 e ( transparent area in c )
464 // | || 4 | 4 b
465 // +--------------+
466 //
467
468 TEST_F(HitTestAggregatorTest, ClippedChildWithTabAndTransparentBackground) {
469 Reset();
470 EXPECT_EQ(count(), 0);
471
472 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
473 cc::SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
474 cc::SurfaceId a_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
475 cc::SurfaceId b_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
476
477 auto e_hit_test_data = HitTestData::New();
478 e_hit_test_data->surface_id = e_surface_id;
479
480 auto e_hit_test_region_c = HitTestRegion::New();
481 e_hit_test_region_c->flags = kHitTestChildSurface;
482 e_hit_test_region_c->surface_id = c_surface_id;
483 e_hit_test_region_c->rect.SetRect(200, 100, 800, 800);
484 e_hit_test_region_c->transform.Translate(200, 100);
485
486 auto e_hit_test_region = HitTestRegion::New();
487 e_hit_test_region->flags = kHitTestMine;
488 e_hit_test_region->surface_id = e_surface_id;
489 e_hit_test_region->rect.SetRect(0, 0, 600, 600);
490
491 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
492 e_hit_test_data->regions.push_back(std::move(e_hit_test_region));
493
494 auto c_hit_test_data = HitTestData::New();
495 c_hit_test_data->surface_id = c_surface_id;
496
497 auto c_hit_test_region_a = HitTestRegion::New();
498 c_hit_test_region_a->flags = kHitTestChildSurface;
499 c_hit_test_region_a->surface_id = a_surface_id;
500 c_hit_test_region_a->rect.SetRect(0, 0, 200, 100);
501
502 auto c_hit_test_region_b = HitTestRegion::New();
503 c_hit_test_region_b->flags = kHitTestChildSurface;
504 c_hit_test_region_b->surface_id = b_surface_id;
505 c_hit_test_region_b->rect.SetRect(0, 100, 800, 600);
506
507 c_hit_test_data->regions.push_back(std::move(c_hit_test_region_a));
508 c_hit_test_data->regions.push_back(std::move(c_hit_test_region_b));
509
510 auto a_hit_test_data = HitTestData::New();
511 a_hit_test_data->surface_id = a_surface_id;
512
513 auto a_hit_test_region = HitTestRegion::New();
514 a_hit_test_region->flags = kHitTestMine;
515 a_hit_test_region->surface_id = a_surface_id;
516 a_hit_test_region->rect.SetRect(0, 0, 200, 100);
517
518 a_hit_test_data->regions.push_back(std::move(a_hit_test_region));
519
520 auto b_hit_test_data = HitTestData::New();
521 b_hit_test_data->surface_id = b_surface_id;
522
523 auto b_hit_test_region = HitTestRegion::New();
524 b_hit_test_region->flags = kHitTestMine;
525 b_hit_test_region->surface_id = b_surface_id;
526 b_hit_test_region->rect.SetRect(0, 0, 800, 600);
527
528 b_hit_test_data->regions.push_back(std::move(b_hit_test_region));
529
530 // Submit ( in unexpected order ).
531
532 EXPECT_EQ(GetPendingCount(), 0);
533
534 aggregator_.SubmitHitTestData(std::move(c_hit_test_data));
535 EXPECT_EQ(GetPendingCount(), 1);
536
537 aggregator_.SubmitHitTestData(std::move(a_hit_test_data));
538 EXPECT_EQ(GetPendingCount(), 2);
539
540 aggregator_.SubmitHitTestData(std::move(b_hit_test_data));
541 EXPECT_EQ(GetPendingCount(), 3);
542
543 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
544 EXPECT_EQ(GetPendingCount(), 4);
545
546 // Surfaces added to DisplayFrame ( in unexpected order ).
547
548 EXPECT_EQ(count(), 0);
549
550 EXPECT_EQ(GetActiveCount(), 0);
551
552 aggregator_.OnSurfaceWillDraw(c_surface_id);
553 EXPECT_EQ(GetActiveCount(), 1);
554
555 aggregator_.OnSurfaceWillDraw(e_surface_id);
556 EXPECT_EQ(GetActiveCount(), 2);
557
558 aggregator_.OnSurfaceWillDraw(b_surface_id);
559 EXPECT_EQ(GetActiveCount(), 3);
560
561 aggregator_.OnSurfaceWillDraw(a_surface_id);
562 EXPECT_EQ(GetActiveCount(), 4);
563
564 // Aggregate and swap.
565
566 aggregator_.Aggregate(e_surface_id);
567 EXPECT_EQ(count(), 0);
568
569 aggregator_.Swap();
570
571 EXPECT_EQ(count(), 6);
572
573 DisplayHitTestRegion* region;
574
575 region = RegionAtIndex(0);
576 EXPECT_EQ(region->flags, kHitTestChildSurface);
577 EXPECT_EQ(region->frame_sink_id, c_surface_id.frame_sink_id());
578 EXPECT_EQ(region->rect, gfx::Rect(200, 100, 800, 800));
579 EXPECT_EQ(region->child_count, 4);
580
581 gfx::Point point(300, 300);
582 region->transform.TransformPointReverse(&point);
583 EXPECT_TRUE(point == gfx::Point(100, 200));
584
585 region = RegionAtIndex(1);
586 EXPECT_EQ(region->flags, kHitTestChildSurface);
587 EXPECT_EQ(region->frame_sink_id, a_surface_id.frame_sink_id());
588 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 200, 100));
589 EXPECT_EQ(region->child_count, 1);
590
591 region = RegionAtIndex(2);
592 EXPECT_EQ(region->flags, kHitTestMine);
593 EXPECT_EQ(region->frame_sink_id, a_surface_id.frame_sink_id());
594 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 200, 100));
595 EXPECT_EQ(region->child_count, 0);
596
597 region = RegionAtIndex(3);
598 EXPECT_EQ(region->flags, kHitTestChildSurface);
599 EXPECT_EQ(region->frame_sink_id, b_surface_id.frame_sink_id());
600 EXPECT_EQ(region->rect, gfx::Rect(0, 100, 800, 600));
601 EXPECT_EQ(region->child_count, 1);
602
603 region = RegionAtIndex(4);
604 EXPECT_EQ(region->flags, kHitTestMine);
605 EXPECT_EQ(region->frame_sink_id, b_surface_id.frame_sink_id());
606 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 800, 600));
607 EXPECT_EQ(region->child_count, 0);
608
609 region = RegionAtIndex(5);
610 EXPECT_EQ(region->flags, kHitTestMine);
611 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
612 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 600, 600));
613 EXPECT_EQ(region->child_count, 0);
614 }
615
616 // Three children deep.
617 //
618 // +e------------+
619 // | +c1-------+ |
620 // | | +c2---+ | |
621 // | | | +c3-| | |
622 // | | | | | | |
623 // | | | +---| | |
624 // | | +-----+ | |
625 // | +---------+ |
626 // +-------------+
627 //
628
629 TEST_F(HitTestAggregatorTest, ThreeChildrenDeep) {
630 Reset();
631 EXPECT_EQ(count(), 0);
632
633 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
634 cc::SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
635 cc::SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
636 cc::SurfaceId c3_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
637
638 auto e_hit_test_data = HitTestData::New();
639 e_hit_test_data->surface_id = e_surface_id;
640
641 auto e_hit_test_region_c1 = HitTestRegion::New();
642 e_hit_test_region_c1->flags = kHitTestChildSurface;
643 e_hit_test_region_c1->surface_id = c1_surface_id;
644 e_hit_test_region_c1->rect.SetRect(100, 100, 700, 700);
645
646 auto e_hit_test_region = HitTestRegion::New();
647 e_hit_test_region->flags = kHitTestMine;
648 e_hit_test_region->surface_id = e_surface_id;
649 e_hit_test_region->rect.SetRect(0, 0, 800, 800);
650
651 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
652 e_hit_test_data->regions.push_back(std::move(e_hit_test_region));
653
654 auto c1_hit_test_data = HitTestData::New();
655 c1_hit_test_data->surface_id = c1_surface_id;
656
657 auto c1_hit_test_region_c2 = HitTestRegion::New();
658 c1_hit_test_region_c2->flags = kHitTestChildSurface;
659 c1_hit_test_region_c2->surface_id = c2_surface_id;
660 c1_hit_test_region_c2->rect.SetRect(100, 100, 500, 500);
661
662 auto c1_hit_test_region = HitTestRegion::New();
663 c1_hit_test_region->flags = kHitTestMine;
664 c1_hit_test_region->surface_id = c1_surface_id;
665 c1_hit_test_region->rect.SetRect(0, 0, 600, 600);
666
667 c1_hit_test_data->regions.push_back(std::move(c1_hit_test_region_c2));
668 c1_hit_test_data->regions.push_back(std::move(c1_hit_test_region));
669
670 auto c2_hit_test_data = HitTestData::New();
671 c2_hit_test_data->surface_id = c2_surface_id;
672
673 auto c2_hit_test_region_c3 = HitTestRegion::New();
674 c2_hit_test_region_c3->flags = kHitTestChildSurface;
675 c2_hit_test_region_c3->surface_id = c3_surface_id;
676 c2_hit_test_region_c3->rect.SetRect(100, 100, 300, 300);
677
678 auto c2_hit_test_region = HitTestRegion::New();
679 c2_hit_test_region->flags = kHitTestMine;
680 c2_hit_test_region->surface_id = c2_surface_id;
681 c2_hit_test_region->rect.SetRect(0, 0, 400, 400);
682
683 c2_hit_test_data->regions.push_back(std::move(c2_hit_test_region_c3));
684 c2_hit_test_data->regions.push_back(std::move(c2_hit_test_region));
685
686 auto c3_hit_test_data = HitTestData::New();
687 c3_hit_test_data->surface_id = c3_surface_id;
688
689 auto c3_hit_test_region = HitTestRegion::New();
690 c3_hit_test_region->flags = kHitTestMine;
691 c3_hit_test_region->surface_id = c3_surface_id;
692 c3_hit_test_region->rect.SetRect(0, 0, 200, 200);
693
694 c3_hit_test_data->regions.push_back(std::move(c3_hit_test_region));
695
696 // Submit ( in unexpected order ).
697
698 EXPECT_EQ(GetPendingCount(), 0);
699
700 aggregator_.SubmitHitTestData(std::move(c1_hit_test_data));
701 EXPECT_EQ(GetPendingCount(), 1);
702
703 aggregator_.SubmitHitTestData(std::move(c3_hit_test_data));
704 EXPECT_EQ(GetPendingCount(), 2);
705
706 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
707 EXPECT_EQ(GetPendingCount(), 3);
708
709 aggregator_.SubmitHitTestData(std::move(c2_hit_test_data));
710 EXPECT_EQ(GetPendingCount(), 4);
711
712 // Surfaces added to DisplayFrame ( in unexpected order ).
713
714 EXPECT_EQ(count(), 0);
715
716 EXPECT_EQ(GetActiveCount(), 0);
717
718 aggregator_.OnSurfaceWillDraw(c2_surface_id);
719 EXPECT_EQ(GetActiveCount(), 1);
720
721 aggregator_.OnSurfaceWillDraw(c1_surface_id);
722 EXPECT_EQ(GetActiveCount(), 2);
723
724 aggregator_.OnSurfaceWillDraw(e_surface_id);
725 EXPECT_EQ(GetActiveCount(), 3);
726
727 aggregator_.OnSurfaceWillDraw(c3_surface_id);
728 EXPECT_EQ(GetActiveCount(), 4);
729
730 // Aggregate and swap.
731
732 aggregator_.Aggregate(e_surface_id);
733 EXPECT_EQ(count(), 0);
734
735 aggregator_.Swap();
736
737 EXPECT_EQ(count(), 7);
738
739 DisplayHitTestRegion* region;
740
741 region = RegionAtIndex(0);
742 EXPECT_EQ(region->flags, kHitTestChildSurface);
743 EXPECT_EQ(region->frame_sink_id, c1_surface_id.frame_sink_id());
744 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 700, 700));
745 EXPECT_EQ(region->child_count, 5);
746
747 region = RegionAtIndex(1);
748 EXPECT_EQ(region->flags, kHitTestChildSurface);
749 EXPECT_EQ(region->frame_sink_id, c2_surface_id.frame_sink_id());
750 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 500, 500));
751 EXPECT_EQ(region->child_count, 3);
752
753 region = RegionAtIndex(2);
754 EXPECT_EQ(region->flags, kHitTestChildSurface);
755 EXPECT_EQ(region->frame_sink_id, c3_surface_id.frame_sink_id());
756 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 300, 300));
757 EXPECT_EQ(region->child_count, 1);
758
759 region = RegionAtIndex(3);
760 EXPECT_EQ(region->flags, kHitTestMine);
761 EXPECT_EQ(region->frame_sink_id, c3_surface_id.frame_sink_id());
762 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 200, 200));
763 EXPECT_EQ(region->child_count, 0);
764
765 region = RegionAtIndex(4);
766 EXPECT_EQ(region->flags, kHitTestMine);
767 EXPECT_EQ(region->frame_sink_id, c2_surface_id.frame_sink_id());
768 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 400, 400));
769 EXPECT_EQ(region->child_count, 0);
770
771 region = RegionAtIndex(5);
772 EXPECT_EQ(region->flags, kHitTestMine);
773 EXPECT_EQ(region->frame_sink_id, c1_surface_id.frame_sink_id());
774 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 600, 600));
775 EXPECT_EQ(region->child_count, 0);
776
777 region = RegionAtIndex(6);
778 EXPECT_EQ(region->flags, kHitTestMine);
779 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
780 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 800, 800));
781 EXPECT_EQ(region->child_count, 0);
782 }
783
784 // Exceed limits to ensure that bounds and resize work.
785 //
786 // A tree of embedders each with 8 children and 4 levels deep = 4096 regions.
787 // This will exceed initial allocation and force a resize.
788 //
789 // +e--------------------------------------------------------+
790 // | +c1----------++c2----------++c3----------++c4----------+|
791 // | | +c1--------|| +c1--------|| +c1--------|| +c1--------||
792 // | | | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-||
793 // | | | | || || | | || || | | || || | | || ||
794 // | | | +---++---|| | +---++---|| | +---++---|| | +---++---||
795 // | +------------++------------++------------++------------+|
796 // | +c5----------++c6----------++c7----------++c8----------+|
797 // | | +c1--------|| +c1--------|| +c1--------|| +c1--------||
798 // | | | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-||
799 // | | | | || || | | || || | | || || | | || ||
800 // | | | +---++---|| | +---++---|| | +---++---|| | +---++---||
801 // | +------------++------------++------------++------------+|
802 // +---------------------------------------------------------+
803 //
804
805 TEST_F(HitTestAggregatorTest, ExceedLimits) {
806 Reset();
807 EXPECT_EQ(count(), 0);
808
809 EXPECT_LT(GetDisplayHitTestDataLength(), 4096);
810
811 cc::SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
812
813 int next_surface_id = CreateAndSubmitHitTestDataWith8Children(1, 3);
814 int surface_count = next_surface_id - 1;
815
816 int region_count = GetPendingRegionCount();
817
818 // Expect 4680 regions:
819 // 8 children 4 levels deep 8*8*8*8 is 4096
820 // 1 region for each embedder/surface + 584
821 // -----
822 // 4680.
823 EXPECT_EQ(region_count, 4680);
824
825 EXPECT_EQ(GetPendingCount(), surface_count);
826
827 // Mark Surfaces as added to DisplayFrame ( in unexpected order ).
828
829 EXPECT_EQ(count(), 0);
830 EXPECT_EQ(GetActiveCount(), 0);
831
832 for (int i = 1; i <= surface_count; i++) {
833 cc::SurfaceId surface_id = MakeSurfaceId(kDisplayFrameSink, i);
834 aggregator_.OnSurfaceWillDraw(surface_id);
835 }
836
837 EXPECT_EQ(GetActiveCount(), surface_count);
838
839 // Aggregate and swap.
840
841 aggregator_.Aggregate(display_surface_id);
842 EXPECT_EQ(count(), 0);
843
844 aggregator_.Swap();
845
846 EXPECT_EQ(count(), region_count);
847
848 EXPECT_GE(GetDisplayHitTestDataLength(), region_count);
849 }
850
851 } // namespace test
852 } // namespace hit_test
853 } // namespace viz
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698