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

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

Issue 2938953002: Implement HitTestAggregator (Closed)
Patch Set: Use two distinct buffers instead of one and remove in-place synchronization. Created 3 years, 5 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 { Reset(); }
39
40 void TearDown() override { Reset(); }
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 void CallOnSurfaceWillDraw(cc::SurfaceId surface_id) {
65 aggregator_.OnSurfaceWillDraw(surface_id);
66 }
67
68 int RegionCount(const HitTestDataMap& map) {
69 int size = 0;
70 for (auto const& it : map) {
71 hit_test::mojom::HitTestData* hit_test_data = it.second.get();
72 size += hit_test_data->regions.size();
73 }
74 return size;
75 }
76
77 void Reset() {
78 aggregator_.read_display_hit_test_data_->regions[0].child_count =
79 kEndOfList;
80 aggregator_.write_display_hit_test_data_->regions[0].child_count =
81 kEndOfList;
82
83 aggregator_.pending_.clear();
84 aggregator_.active_.clear();
85 }
86
87 int GetDisplayHitTestDataSize() {
88 return aggregator_.read_display_hit_test_data_->size;
89 }
90
91 // Creates a hit test data element with 8 children recursively to
92 // the specified depth. SurfaceIds are generated in sequential order and
93 // the method returns the next unused id ( also matches the count ).
94 int CreateAndSubmitHitTestDataWith8Children(int id, int depth) {
95 cc::SurfaceId surface_id = MakeSurfaceId(kDisplayFrameSink, id);
96 id++;
97
98 auto hit_test_data = HitTestData::New();
99 hit_test_data->surface_id = surface_id;
100 hit_test_data->flags = kHitTestMine;
101 hit_test_data->bounds.SetRect(0, 0, 1024, 768);
102
103 for (int i = 0; i < 8; i++) {
104 auto hit_test_region = HitTestRegion::New();
105 hit_test_region->rect.SetRect(100, 100, 100, 100);
106
107 if (depth > 0) {
108 hit_test_region->flags = kHitTestChildSurface;
109 hit_test_region->surface_id = MakeSurfaceId(kDisplayFrameSink, id);
110 id = CreateAndSubmitHitTestDataWith8Children(id, depth - 1);
111 } else {
112 hit_test_region->flags = kHitTestMine;
113 }
114 hit_test_data->regions.push_back(std::move(hit_test_region));
115 }
116
117 aggregator_.SubmitHitTestData(std::move(hit_test_data));
118 return id;
119 }
120 };
121
122 // TODO(gklassen): Add tests for 3D use cases as suggested by and with
123 // input from rjkroege.
124
125 // One surface.
126 //
127 // +----------+
128 // | |
129 // | |
130 // | |
131 // +----------+
132 //
133 TEST_F(HitTestAggregatorTest, OneSurface) {
134 EXPECT_EQ(count(), 0);
135
136 cc::SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
137
138 auto hit_test_data = HitTestData::New();
139 hit_test_data->surface_id = display_surface_id;
140 hit_test_data->flags = kHitTestMine;
141 hit_test_data->bounds.SetRect(0, 0, 1024, 768);
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 CallOnSurfaceWillDraw(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 EXPECT_EQ(count(), 0);
180
181 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
182
183 auto e_hit_test_data = HitTestData::New();
184 e_hit_test_data->surface_id = e_surface_id;
185 e_hit_test_data->flags = kHitTestMine;
186 e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
187
188 auto e_hit_test_region_r1 = HitTestRegion::New();
189 e_hit_test_region_r1->flags = kHitTestMine;
190 e_hit_test_region_r1->rect.SetRect(100, 100, 200, 400);
191
192 auto e_hit_test_region_r2 = HitTestRegion::New();
193 e_hit_test_region_r2->flags = kHitTestMine;
194 e_hit_test_region_r2->rect.SetRect(400, 100, 300, 400);
195
196 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r1));
197 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_r2));
198
199 // Submit HitTestData.
200
201 EXPECT_EQ(GetPendingCount(), 0);
202
203 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
204 EXPECT_EQ(GetPendingCount(), 1);
205
206 // Add Surfaces to DisplayFrame ( in unexpected order ).
207
208 EXPECT_EQ(count(), 0);
209 EXPECT_EQ(GetActiveCount(), 0);
210
211 CallOnSurfaceWillDraw(e_surface_id);
212 EXPECT_EQ(GetActiveCount(), 1);
213
214 // Aggregate and swap.
215
216 aggregator_.Aggregate(e_surface_id);
217 EXPECT_EQ(count(), 0);
218
219 aggregator_.Swap();
220 EXPECT_EQ(count(), 3);
221
222 DisplayHitTestRegion* region;
223
224 region = RegionAtIndex(0);
225 EXPECT_EQ(region->flags, kHitTestMine);
226 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
227 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
228 EXPECT_EQ(region->child_count, 2);
229
230 region = RegionAtIndex(1);
231 EXPECT_EQ(region->flags, kHitTestMine);
232 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 200, 400));
233 EXPECT_EQ(region->child_count, 0);
234
235 region = RegionAtIndex(2);
236 EXPECT_EQ(region->flags, kHitTestMine);
237 EXPECT_EQ(region->rect, gfx::Rect(400, 100, 300, 400));
238 EXPECT_EQ(region->child_count, 0);
239 }
240
241 // One embedder with two children.
242 //
243 // +e-------------+
244 // | +c1-+ +c2--+ |
245 // | | | | | |
246 // | | | | | |
247 // | +---+ +----+ |
248 // +--------------+
249 //
250
251 TEST_F(HitTestAggregatorTest, OneEmbedderTwoChildren) {
252 EXPECT_EQ(count(), 0);
253
254 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
255 cc::SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
256 cc::SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
257
258 auto e_hit_test_data = HitTestData::New();
259 e_hit_test_data->surface_id = e_surface_id;
260 e_hit_test_data->flags = kHitTestMine;
261 e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
262
263 auto e_hit_test_region_c1 = HitTestRegion::New();
264 e_hit_test_region_c1->flags = kHitTestChildSurface;
265 e_hit_test_region_c1->surface_id = c1_surface_id;
266 e_hit_test_region_c1->rect.SetRect(100, 100, 200, 300);
267
268 auto e_hit_test_region_c2 = HitTestRegion::New();
269 e_hit_test_region_c2->flags = kHitTestChildSurface;
270 e_hit_test_region_c2->surface_id = c2_surface_id;
271 e_hit_test_region_c2->rect.SetRect(400, 100, 400, 300);
272
273 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
274 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c2));
275
276 auto c1_hit_test_data = HitTestData::New();
277 c1_hit_test_data->surface_id = c1_surface_id;
278
279 auto c2_hit_test_data = HitTestData::New();
280 c2_hit_test_data->surface_id = c2_surface_id;
281
282 // Submit ( in unexpected order ).
283
284 EXPECT_EQ(GetPendingCount(), 0);
285
286 aggregator_.SubmitHitTestData(std::move(c1_hit_test_data));
287 EXPECT_EQ(GetPendingCount(), 1);
288
289 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
290 EXPECT_EQ(GetPendingCount(), 2);
291
292 aggregator_.SubmitHitTestData(std::move(c2_hit_test_data));
293 EXPECT_EQ(GetPendingCount(), 3);
294
295 // Surfaces added to DisplayFrame ( in unexpected order ).
296
297 EXPECT_EQ(count(), 0);
298
299 EXPECT_EQ(GetActiveCount(), 0);
300
301 CallOnSurfaceWillDraw(c2_surface_id);
302 EXPECT_EQ(GetActiveCount(), 1);
303
304 CallOnSurfaceWillDraw(c1_surface_id);
305 EXPECT_EQ(GetActiveCount(), 2);
306
307 CallOnSurfaceWillDraw(e_surface_id);
308 EXPECT_EQ(GetActiveCount(), 3);
309
310 // Aggregate and swap.
311
312 aggregator_.Aggregate(e_surface_id);
313 EXPECT_EQ(count(), 0);
314
315 aggregator_.Swap();
316
317 EXPECT_EQ(count(), 3);
318
319 DisplayHitTestRegion* region;
320
321 region = RegionAtIndex(0);
322 EXPECT_EQ(region->flags, kHitTestMine);
323 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
324 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
325 EXPECT_EQ(region->child_count, 2);
326
327 region = RegionAtIndex(1);
328 EXPECT_EQ(region->flags, kHitTestChildSurface);
329 EXPECT_EQ(region->frame_sink_id, c1_surface_id.frame_sink_id());
330 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 200, 300));
331 EXPECT_EQ(region->child_count, 0);
332
333 region = RegionAtIndex(2);
334 EXPECT_EQ(region->flags, kHitTestChildSurface);
335 EXPECT_EQ(region->frame_sink_id, c2_surface_id.frame_sink_id());
336 EXPECT_EQ(region->rect, gfx::Rect(400, 100, 400, 300));
337 EXPECT_EQ(region->child_count, 0);
338 }
339
340 // Occluded child frame ( OOPIF ).
341 //
342 // +e-----------+
343 // | +c--+ |
344 // | | +div-+ |
345 // | | | | |
346 // | | +----+ |
347 // | +---+ |
348 // +------------+
349 //
350
351 TEST_F(HitTestAggregatorTest, OccludedChildFrame) {
352 EXPECT_EQ(count(), 0);
353
354 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
355 cc::SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
356
357 auto e_hit_test_data = HitTestData::New();
358 e_hit_test_data->surface_id = e_surface_id;
359 e_hit_test_data->flags = kHitTestMine;
360 e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
361
362 auto e_hit_test_region_div = HitTestRegion::New();
363 e_hit_test_region_div->flags = kHitTestMine;
364 e_hit_test_region_div->surface_id = e_surface_id;
365 e_hit_test_region_div->rect.SetRect(200, 200, 300, 200);
366
367 auto e_hit_test_region_c = HitTestRegion::New();
368 e_hit_test_region_c->flags = kHitTestChildSurface;
369 e_hit_test_region_c->surface_id = c_surface_id;
370 e_hit_test_region_c->rect.SetRect(100, 100, 200, 500);
371
372 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_div));
373 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
374
375 auto c_hit_test_data = HitTestData::New();
376 c_hit_test_data->surface_id = c_surface_id;
377 c_hit_test_data->flags = kHitTestMine;
378 c_hit_test_data->bounds.SetRect(0, 0, 200, 500);
379
380 // Submit ( in unexpected order ).
381
382 EXPECT_EQ(GetPendingCount(), 0);
383
384 aggregator_.SubmitHitTestData(std::move(c_hit_test_data));
385 EXPECT_EQ(GetPendingCount(), 1);
386
387 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
388 EXPECT_EQ(GetPendingCount(), 2);
389
390 // Surfaces added to DisplayFrame ( in unexpected order ).
391
392 EXPECT_EQ(count(), 0);
393
394 EXPECT_EQ(GetActiveCount(), 0);
395
396 CallOnSurfaceWillDraw(e_surface_id);
397 EXPECT_EQ(GetActiveCount(), 1);
398
399 CallOnSurfaceWillDraw(c_surface_id);
400 EXPECT_EQ(GetActiveCount(), 2);
401
402 // Aggregate and swap.
403
404 aggregator_.Aggregate(e_surface_id);
405 EXPECT_EQ(count(), 0);
406
407 aggregator_.Swap();
408
409 EXPECT_EQ(count(), 3);
410
411 DisplayHitTestRegion* region;
412
413 region = RegionAtIndex(0);
414 EXPECT_EQ(region->flags, kHitTestMine);
415 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
416 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
417 EXPECT_EQ(region->child_count, 2);
418
419 region = RegionAtIndex(1);
420 EXPECT_EQ(region->flags, kHitTestMine);
421 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
422 EXPECT_EQ(region->rect, gfx::Rect(200, 200, 300, 200));
423 EXPECT_EQ(region->child_count, 0);
424
425 region = RegionAtIndex(2);
426 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
427 EXPECT_EQ(region->frame_sink_id, c_surface_id.frame_sink_id());
428 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 200, 500));
429 EXPECT_EQ(region->child_count, 0);
430 }
431
432 // One embedder with a clipped child with a tab and transparent background.
433 //
434 // +e-------------+
435 // | +c---------| Point maps to
436 // | 1 |+a--+ | ----- -------
437 // | || 2 | 3 | 1 e
438 // | |+b--------| 2 a
439 // | || | 3 e ( transparent area in c )
440 // | || 4 | 4 b
441 // +--------------+
442 //
443
444 TEST_F(HitTestAggregatorTest, ClippedChildWithTabAndTransparentBackground) {
445 EXPECT_EQ(count(), 0);
446
447 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
448 cc::SurfaceId c_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
449 cc::SurfaceId a_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
450 cc::SurfaceId b_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
451
452 auto e_hit_test_data = HitTestData::New();
453 e_hit_test_data->surface_id = e_surface_id;
454 e_hit_test_data->flags = kHitTestMine;
455 e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
456
457 auto e_hit_test_region_c = HitTestRegion::New();
458 e_hit_test_region_c->flags = kHitTestChildSurface;
459 e_hit_test_region_c->surface_id = c_surface_id;
460 e_hit_test_region_c->rect.SetRect(200, 100, 1600, 800);
461 e_hit_test_region_c->transform.Translate(200, 100);
462
463 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c));
464
465 auto c_hit_test_data = HitTestData::New();
466 c_hit_test_data->surface_id = c_surface_id;
467 c_hit_test_data->flags = kHitTestIgnore;
468 c_hit_test_data->bounds.SetRect(0, 0, 1600, 800);
469
470 auto c_hit_test_region_a = HitTestRegion::New();
471 c_hit_test_region_a->flags = kHitTestChildSurface;
472 c_hit_test_region_a->surface_id = a_surface_id;
473 c_hit_test_region_a->rect.SetRect(0, 0, 200, 100);
474
475 auto c_hit_test_region_b = HitTestRegion::New();
476 c_hit_test_region_b->flags = kHitTestChildSurface;
477 c_hit_test_region_b->surface_id = b_surface_id;
478 c_hit_test_region_b->rect.SetRect(0, 100, 800, 600);
479
480 c_hit_test_data->regions.push_back(std::move(c_hit_test_region_a));
481 c_hit_test_data->regions.push_back(std::move(c_hit_test_region_b));
482
483 auto a_hit_test_data = HitTestData::New();
484 a_hit_test_data->surface_id = a_surface_id;
485 a_hit_test_data->flags = kHitTestMine;
486 a_hit_test_data->bounds.SetRect(0, 0, 200, 100);
487
488 auto b_hit_test_data = HitTestData::New();
489 b_hit_test_data->surface_id = b_surface_id;
490 b_hit_test_data->flags = kHitTestMine;
491 b_hit_test_data->bounds.SetRect(0, 100, 800, 600);
492
493 // Submit ( in unexpected order ).
494
495 EXPECT_EQ(GetPendingCount(), 0);
496
497 aggregator_.SubmitHitTestData(std::move(c_hit_test_data));
498 EXPECT_EQ(GetPendingCount(), 1);
499
500 aggregator_.SubmitHitTestData(std::move(a_hit_test_data));
501 EXPECT_EQ(GetPendingCount(), 2);
502
503 aggregator_.SubmitHitTestData(std::move(b_hit_test_data));
504 EXPECT_EQ(GetPendingCount(), 3);
505
506 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
507 EXPECT_EQ(GetPendingCount(), 4);
508
509 // Surfaces added to DisplayFrame ( in unexpected order ).
510
511 EXPECT_EQ(count(), 0);
512
513 EXPECT_EQ(GetActiveCount(), 0);
514
515 CallOnSurfaceWillDraw(c_surface_id);
516 EXPECT_EQ(GetActiveCount(), 1);
517
518 CallOnSurfaceWillDraw(e_surface_id);
519 EXPECT_EQ(GetActiveCount(), 2);
520
521 CallOnSurfaceWillDraw(b_surface_id);
522 EXPECT_EQ(GetActiveCount(), 3);
523
524 CallOnSurfaceWillDraw(a_surface_id);
525 EXPECT_EQ(GetActiveCount(), 4);
526
527 // Aggregate and swap.
528
529 aggregator_.Aggregate(e_surface_id);
530 EXPECT_EQ(count(), 0);
531
532 aggregator_.Swap();
533
534 EXPECT_EQ(count(), 4);
535
536 DisplayHitTestRegion* region;
537
538 region = RegionAtIndex(0);
539 EXPECT_EQ(region->flags, kHitTestMine);
540 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
541 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
542 EXPECT_EQ(region->child_count, 3);
543
544 region = RegionAtIndex(1);
545 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestIgnore);
546 EXPECT_EQ(region->frame_sink_id, c_surface_id.frame_sink_id());
547 EXPECT_EQ(region->rect, gfx::Rect(200, 100, 1600, 800));
548 EXPECT_EQ(region->child_count, 2);
549
550 gfx::Point point(300, 300);
551 region->transform.TransformPointReverse(&point);
552 EXPECT_TRUE(point == gfx::Point(100, 200));
553
554 region = RegionAtIndex(2);
555 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
556 EXPECT_EQ(region->frame_sink_id, a_surface_id.frame_sink_id());
557 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 200, 100));
558 EXPECT_EQ(region->child_count, 0);
559
560 region = RegionAtIndex(3);
561 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
562 EXPECT_EQ(region->frame_sink_id, b_surface_id.frame_sink_id());
563 EXPECT_EQ(region->rect, gfx::Rect(0, 100, 800, 600));
564 EXPECT_EQ(region->child_count, 0);
565 }
566
567 // Three children deep.
568 //
569 // +e------------+
570 // | +c1-------+ |
571 // | | +c2---+ | |
572 // | | | +c3-| | |
573 // | | | | | | |
574 // | | | +---| | |
575 // | | +-----+ | |
576 // | +---------+ |
577 // +-------------+
578 //
579
580 TEST_F(HitTestAggregatorTest, ThreeChildrenDeep) {
581 EXPECT_EQ(count(), 0);
582
583 cc::SurfaceId e_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
584 cc::SurfaceId c1_surface_id = MakeSurfaceId(kDisplayFrameSink, 2);
585 cc::SurfaceId c2_surface_id = MakeSurfaceId(kDisplayFrameSink, 3);
586 cc::SurfaceId c3_surface_id = MakeSurfaceId(kDisplayFrameSink, 4);
587
588 auto e_hit_test_data = HitTestData::New();
589 e_hit_test_data->surface_id = e_surface_id;
590 e_hit_test_data->flags = kHitTestMine;
591 e_hit_test_data->bounds.SetRect(0, 0, 1024, 768);
592
593 auto e_hit_test_region_c1 = HitTestRegion::New();
594 e_hit_test_region_c1->flags = kHitTestChildSurface;
595 e_hit_test_region_c1->surface_id = c1_surface_id;
596 e_hit_test_region_c1->rect.SetRect(100, 100, 700, 700);
597
598 e_hit_test_data->regions.push_back(std::move(e_hit_test_region_c1));
599
600 auto c1_hit_test_data = HitTestData::New();
601 c1_hit_test_data->surface_id = c1_surface_id;
602 c1_hit_test_data->flags = kHitTestMine;
603 c1_hit_test_data->bounds.SetRect(0, 0, 600, 600);
604
605 auto c1_hit_test_region_c2 = HitTestRegion::New();
606 c1_hit_test_region_c2->flags = kHitTestChildSurface;
607 c1_hit_test_region_c2->surface_id = c2_surface_id;
608 c1_hit_test_region_c2->rect.SetRect(100, 100, 500, 500);
609
610 c1_hit_test_data->regions.push_back(std::move(c1_hit_test_region_c2));
611
612 auto c2_hit_test_data = HitTestData::New();
613 c2_hit_test_data->surface_id = c2_surface_id;
614 c2_hit_test_data->flags = kHitTestMine;
615 c2_hit_test_data->bounds.SetRect(0, 0, 400, 400);
616
617 auto c2_hit_test_region_c3 = HitTestRegion::New();
618 c2_hit_test_region_c3->flags = kHitTestChildSurface;
619 c2_hit_test_region_c3->surface_id = c3_surface_id;
620 c2_hit_test_region_c3->rect.SetRect(100, 100, 300, 300);
621
622 c2_hit_test_data->regions.push_back(std::move(c2_hit_test_region_c3));
623
624 auto c3_hit_test_data = HitTestData::New();
625 c3_hit_test_data->surface_id = c3_surface_id;
626 c3_hit_test_data->flags = kHitTestMine;
627 c3_hit_test_data->bounds.SetRect(0, 0, 200, 200);
628
629 // Submit ( in unexpected order ).
630
631 EXPECT_EQ(GetPendingCount(), 0);
632
633 aggregator_.SubmitHitTestData(std::move(c1_hit_test_data));
634 EXPECT_EQ(GetPendingCount(), 1);
635
636 aggregator_.SubmitHitTestData(std::move(c3_hit_test_data));
637 EXPECT_EQ(GetPendingCount(), 2);
638
639 aggregator_.SubmitHitTestData(std::move(e_hit_test_data));
640 EXPECT_EQ(GetPendingCount(), 3);
641
642 aggregator_.SubmitHitTestData(std::move(c2_hit_test_data));
643 EXPECT_EQ(GetPendingCount(), 4);
644
645 // Surfaces added to DisplayFrame ( in unexpected order ).
646
647 EXPECT_EQ(count(), 0);
648
649 EXPECT_EQ(GetActiveCount(), 0);
650
651 CallOnSurfaceWillDraw(c2_surface_id);
652 EXPECT_EQ(GetActiveCount(), 1);
653
654 CallOnSurfaceWillDraw(c1_surface_id);
655 EXPECT_EQ(GetActiveCount(), 2);
656
657 CallOnSurfaceWillDraw(e_surface_id);
658 EXPECT_EQ(GetActiveCount(), 3);
659
660 CallOnSurfaceWillDraw(c3_surface_id);
661 EXPECT_EQ(GetActiveCount(), 4);
662
663 // Aggregate and swap.
664
665 aggregator_.Aggregate(e_surface_id);
666 EXPECT_EQ(count(), 0);
667
668 aggregator_.Swap();
669
670 EXPECT_EQ(count(), 4);
671
672 DisplayHitTestRegion* region;
673
674 region = RegionAtIndex(0);
675 EXPECT_EQ(region->flags, kHitTestMine);
676 EXPECT_EQ(region->frame_sink_id, e_surface_id.frame_sink_id());
677 EXPECT_EQ(region->rect, gfx::Rect(0, 0, 1024, 768));
678 EXPECT_EQ(region->child_count, 3);
679
680 region = RegionAtIndex(1);
681 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
682 EXPECT_EQ(region->frame_sink_id, c1_surface_id.frame_sink_id());
683 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 700, 700));
684 EXPECT_EQ(region->child_count, 2);
685
686 region = RegionAtIndex(2);
687 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
688 EXPECT_EQ(region->frame_sink_id, c2_surface_id.frame_sink_id());
689 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 500, 500));
690 EXPECT_EQ(region->child_count, 1);
691
692 region = RegionAtIndex(3);
693 EXPECT_EQ(region->flags, kHitTestChildSurface | kHitTestMine);
694 EXPECT_EQ(region->frame_sink_id, c3_surface_id.frame_sink_id());
695 EXPECT_EQ(region->rect, gfx::Rect(100, 100, 300, 300));
696 EXPECT_EQ(region->child_count, 0);
697 }
698
699 // Exceed limits to ensure that bounds and resize work.
700 //
701 // A tree of embedders each with 8 children and 4 levels deep = 4096 regions.
702 // This will exceed initial allocation and force a resize.
703 //
704 // +e--------------------------------------------------------+
705 // | +c1----------++c2----------++c3----------++c4----------+|
706 // | | +c1--------|| +c1--------|| +c1--------|| +c1--------||
707 // | | | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-||
708 // | | | | || || | | || || | | || || | | || ||
709 // | | | +---++---|| | +---++---|| | +---++---|| | +---++---||
710 // | +------------++------------++------------++------------+|
711 // | +c5----------++c6----------++c7----------++c8----------+|
712 // | | +c1--------|| +c1--------|| +c1--------|| +c1--------||
713 // | | | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-|| | +c1-++c2-||
714 // | | | | || || | | || || | | || || | | || ||
715 // | | | +---++---|| | +---++---|| | +---++---|| | +---++---||
716 // | +------------++------------++------------++------------+|
717 // +---------------------------------------------------------+
718 //
719
720 TEST_F(HitTestAggregatorTest, ExceedLimits) {
721 EXPECT_EQ(count(), 0);
722
723 EXPECT_LT(GetDisplayHitTestDataSize(), 4096);
724
725 cc::SurfaceId display_surface_id = MakeSurfaceId(kDisplayFrameSink, 1);
726
727 int next_surface_id = CreateAndSubmitHitTestDataWith8Children(1, 3);
728 int surface_count = next_surface_id - 1;
729
730 int region_count = GetPendingRegionCount();
731
732 // Expect 4680 regions:
733 // 8 children 4 levels deep 8*8*8*8 is 4096
734 // 1 region for each embedder/surface + 584
735 // -----
736 // 4680.
737 EXPECT_EQ(region_count, 4680);
738
739 EXPECT_EQ(GetPendingCount(), surface_count);
740
741 // Mark Surfaces as added to DisplayFrame ( in unexpected order ).
742
743 EXPECT_EQ(count(), 0);
744 EXPECT_EQ(GetActiveCount(), 0);
745
746 for (int i = 1; i <= surface_count; i++) {
747 cc::SurfaceId surface_id = MakeSurfaceId(kDisplayFrameSink, i);
748 CallOnSurfaceWillDraw(surface_id);
749 }
750
751 EXPECT_EQ(GetActiveCount(), surface_count);
752
753 // Aggregate and swap.
754
755 aggregator_.Aggregate(display_surface_id);
756 EXPECT_EQ(count(), 0);
757
758 aggregator_.Swap();
759
760 EXPECT_EQ(count(), region_count + 1);
761
762 EXPECT_GE(GetDisplayHitTestDataSize(), region_count);
763 }
764
765 } // namespace test
766 } // namespace hit_test
767 } // namespace viz
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698