OLD | NEW |
---|---|
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "cc/output/begin_frame_args.h" | 8 #include "cc/output/begin_frame_args.h" |
9 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 10 #include "testing/gmock/include/gmock/gmock.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 11 #include "testing/gtest/include/gtest/gtest.h" |
12 | 12 |
13 namespace content { | 13 namespace content { |
14 | 14 |
15 namespace { | |
16 class FakeInputEvent : public blink::WebInputEvent { | |
17 public: | |
18 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) | |
19 : WebInputEvent(sizeof(FakeInputEvent)) { | |
20 type = event_type; | |
21 } | |
22 | |
23 FakeInputEvent(blink::WebInputEvent::Type event_type, int event_modifiers) | |
24 : WebInputEvent(sizeof(FakeInputEvent)) { | |
25 type = event_type; | |
26 modifiers = event_modifiers; | |
27 } | |
28 }; | |
29 }; // namespace | |
30 | |
15 class RendererSchedulerImplTest : public testing::Test { | 31 class RendererSchedulerImplTest : public testing::Test { |
16 public: | 32 public: |
17 RendererSchedulerImplTest() | 33 RendererSchedulerImplTest() |
18 : clock_(cc::TestNowSource::Create(5000)), | 34 : clock_(cc::TestNowSource::Create(5000)), |
19 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), | 35 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), |
20 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), | 36 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), |
21 default_task_runner_(scheduler_->DefaultTaskRunner()), | 37 default_task_runner_(scheduler_->DefaultTaskRunner()), |
22 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 38 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
23 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 39 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
24 idle_task_runner_(scheduler_->IdleTaskRunner()) { | 40 idle_task_runner_(scheduler_->IdleTaskRunner()) { |
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
125 void PostingYieldingTestTask( | 141 void PostingYieldingTestTask( |
126 RendererSchedulerImpl* scheduler, | 142 RendererSchedulerImpl* scheduler, |
127 scoped_refptr<base::SingleThreadTaskRunner> task_runner, | 143 scoped_refptr<base::SingleThreadTaskRunner> task_runner, |
128 bool simulate_input, | 144 bool simulate_input, |
129 bool* should_yield_before, | 145 bool* should_yield_before, |
130 bool* should_yield_after) { | 146 bool* should_yield_after) { |
131 *should_yield_before = scheduler->ShouldYieldForHighPriorityWork(); | 147 *should_yield_before = scheduler->ShouldYieldForHighPriorityWork(); |
132 task_runner->PostTask(FROM_HERE, base::Bind(NullTask)); | 148 task_runner->PostTask(FROM_HERE, base::Bind(NullTask)); |
133 if (simulate_input) { | 149 if (simulate_input) { |
134 scheduler->DidReceiveInputEventOnCompositorThread( | 150 scheduler->DidReceiveInputEventOnCompositorThread( |
135 blink::WebInputEvent::GestureFlingStart); | 151 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
136 } | 152 } |
137 *should_yield_after = scheduler->ShouldYieldForHighPriorityWork(); | 153 *should_yield_after = scheduler->ShouldYieldForHighPriorityWork(); |
138 } | 154 } |
139 | 155 |
140 void AnticipationTestTask(RendererSchedulerImpl* scheduler, | 156 void AnticipationTestTask(RendererSchedulerImpl* scheduler, |
141 bool simulate_input, | 157 bool simulate_input, |
142 bool* is_anticipated_before, | 158 bool* is_anticipated_before, |
143 bool* is_anticipated_after) { | 159 bool* is_anticipated_after) { |
144 *is_anticipated_before = scheduler->IsHighPriorityWorkAnticipated(); | 160 *is_anticipated_before = scheduler->IsHighPriorityWorkAnticipated(); |
145 if (simulate_input) { | 161 if (simulate_input) { |
146 scheduler->DidReceiveInputEventOnCompositorThread( | 162 scheduler->DidReceiveInputEventOnCompositorThread( |
147 blink::WebInputEvent::GestureFlingStart); | 163 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
148 } | 164 } |
149 *is_anticipated_after = scheduler->IsHighPriorityWorkAnticipated(); | 165 *is_anticipated_after = scheduler->IsHighPriorityWorkAnticipated(); |
150 } | 166 } |
151 | 167 |
152 TEST_F(RendererSchedulerImplTest, TestPostDefaultTask) { | 168 TEST_F(RendererSchedulerImplTest, TestPostDefaultTask) { |
153 int result = 0; | 169 int result = 0; |
154 default_task_runner_->PostTask(FROM_HERE, | 170 default_task_runner_->PostTask(FROM_HERE, |
155 base::Bind(OrderedTestTask, 1, &result)); | 171 base::Bind(OrderedTestTask, 1, &result)); |
156 default_task_runner_->PostTask(FROM_HERE, | 172 default_task_runner_->PostTask(FROM_HERE, |
157 base::Bind(OrderedTestTask, 2, &result)); | 173 base::Bind(OrderedTestTask, 2, &result)); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
342 FROM_HERE, | 358 FROM_HERE, |
343 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | 359 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); |
344 default_task_runner_->PostTask( | 360 default_task_runner_->PostTask( |
345 FROM_HERE, | 361 FROM_HERE, |
346 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); | 362 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); |
347 compositor_task_runner_->PostTask( | 363 compositor_task_runner_->PostTask( |
348 FROM_HERE, | 364 FROM_HERE, |
349 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | 365 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); |
350 | 366 |
351 scheduler_->DidReceiveInputEventOnCompositorThread( | 367 scheduler_->DidReceiveInputEventOnCompositorThread( |
352 blink::WebInputEvent::GestureFlingStart); | 368 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
353 EnableIdleTasks(); | 369 EnableIdleTasks(); |
354 RunUntilIdle(); | 370 RunUntilIdle(); |
355 EXPECT_THAT(order, testing::ElementsAre( | 371 EXPECT_THAT(order, testing::ElementsAre( |
356 std::string("C1"), std::string("C2"), std::string("D1"), | 372 std::string("C1"), std::string("C2"), std::string("D1"), |
357 std::string("D2"), std::string("L1"), std::string("I1"))); | 373 std::string("D2"), std::string("L1"), std::string("I1"))); |
358 } | 374 } |
359 | 375 |
360 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { | 376 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { |
361 std::vector<std::string> order; | 377 std::vector<std::string> order; |
362 | 378 |
(...skipping 15 matching lines...) Expand all Loading... | |
378 | 394 |
379 scheduler_->DidAnimateForInputOnCompositorThread(); | 395 scheduler_->DidAnimateForInputOnCompositorThread(); |
380 EnableIdleTasks(); | 396 EnableIdleTasks(); |
381 RunUntilIdle(); | 397 RunUntilIdle(); |
382 EXPECT_THAT(order, testing::ElementsAre(std::string("C1"), std::string("C2"), | 398 EXPECT_THAT(order, testing::ElementsAre(std::string("C1"), std::string("C2"), |
383 std::string("D1"), std::string("D2"), | 399 std::string("D1"), std::string("D2"), |
384 std::string("I1"))); | 400 std::string("I1"))); |
385 } | 401 } |
386 | 402 |
387 TEST_F(RendererSchedulerImplTest, | 403 TEST_F(RendererSchedulerImplTest, |
388 DidReceiveInputEventOnCompositorThread_IgnoresMouseEvents) { | 404 DidReceiveInputEventOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { |
389 std::vector<std::string> order; | 405 std::vector<std::string> order; |
390 | 406 |
391 idle_task_runner_->PostIdleTask( | 407 idle_task_runner_->PostIdleTask( |
392 FROM_HERE, | 408 FROM_HERE, |
393 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("I1"))); | 409 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("I1"))); |
394 default_task_runner_->PostTask( | 410 default_task_runner_->PostTask( |
395 FROM_HERE, | 411 FROM_HERE, |
396 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); | 412 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); |
397 compositor_task_runner_->PostTask( | 413 compositor_task_runner_->PostTask( |
398 FROM_HERE, | 414 FROM_HERE, |
399 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | 415 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); |
400 default_task_runner_->PostTask( | 416 default_task_runner_->PostTask( |
401 FROM_HERE, | 417 FROM_HERE, |
402 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); | 418 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); |
403 compositor_task_runner_->PostTask( | 419 compositor_task_runner_->PostTask( |
404 FROM_HERE, | 420 FROM_HERE, |
405 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | 421 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); |
406 | 422 |
407 scheduler_->DidReceiveInputEventOnCompositorThread( | 423 scheduler_->DidReceiveInputEventOnCompositorThread( |
408 blink::WebInputEvent::MouseMove); | 424 FakeInputEvent(blink::WebInputEvent::MouseMove)); |
409 EnableIdleTasks(); | 425 EnableIdleTasks(); |
410 RunUntilIdle(); | 426 RunUntilIdle(); |
411 // Note compositor tasks are not prioritized. | 427 // Note compositor tasks are not prioritized. |
412 EXPECT_THAT(order, testing::ElementsAre(std::string("D1"), std::string("C1"), | 428 EXPECT_THAT(order, testing::ElementsAre(std::string("D1"), std::string("C1"), |
413 std::string("D2"), std::string("C2"), | 429 std::string("D2"), std::string("C2"), |
414 std::string("I1"))); | 430 std::string("I1"))); |
415 } | 431 } |
416 | 432 |
417 TEST_F(RendererSchedulerImplTest, | 433 TEST_F(RendererSchedulerImplTest, |
434 DidReceiveInputEventOnCompositorThread_MouseMove_WhenMouseDown) { | |
435 std::vector<std::string> order; | |
436 | |
437 idle_task_runner_->PostIdleTask( | |
438 FROM_HERE, | |
439 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("I1"))); | |
440 default_task_runner_->PostTask( | |
441 FROM_HERE, | |
442 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); | |
443 compositor_task_runner_->PostTask( | |
444 FROM_HERE, | |
445 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | |
446 default_task_runner_->PostTask( | |
447 FROM_HERE, | |
448 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); | |
449 compositor_task_runner_->PostTask( | |
450 FROM_HERE, | |
451 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | |
452 | |
453 scheduler_->DidReceiveInputEventOnCompositorThread(FakeInputEvent( | |
454 blink::WebInputEvent::MouseMove, blink::WebInputEvent::LeftButtonDown)); | |
455 EnableIdleTasks(); | |
456 RunUntilIdle(); | |
457 // Note compositor tasks are not prioritized. | |
Sami
2015/02/10 14:02:45
s/are not/are/
| |
458 EXPECT_THAT(order, testing::ElementsAre(std::string("C1"), std::string("C2"), | |
459 std::string("D1"), std::string("D2"), | |
460 std::string("I1"))); | |
461 } | |
462 | |
463 TEST_F(RendererSchedulerImplTest, | |
418 DidReceiveInputEventOnCompositorThread_IgnoresKeyboardEvents) { | 464 DidReceiveInputEventOnCompositorThread_IgnoresKeyboardEvents) { |
419 std::vector<std::string> order; | 465 std::vector<std::string> order; |
420 | 466 |
421 idle_task_runner_->PostIdleTask( | 467 idle_task_runner_->PostIdleTask( |
422 FROM_HERE, | 468 FROM_HERE, |
423 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("I1"))); | 469 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("I1"))); |
424 default_task_runner_->PostTask( | 470 default_task_runner_->PostTask( |
425 FROM_HERE, | 471 FROM_HERE, |
426 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); | 472 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); |
427 compositor_task_runner_->PostTask( | 473 compositor_task_runner_->PostTask( |
428 FROM_HERE, | 474 FROM_HERE, |
429 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | 475 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); |
430 default_task_runner_->PostTask( | 476 default_task_runner_->PostTask( |
431 FROM_HERE, | 477 FROM_HERE, |
432 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); | 478 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); |
433 compositor_task_runner_->PostTask( | 479 compositor_task_runner_->PostTask( |
434 FROM_HERE, | 480 FROM_HERE, |
435 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | 481 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); |
436 | 482 |
437 scheduler_->DidReceiveInputEventOnCompositorThread( | 483 scheduler_->DidReceiveInputEventOnCompositorThread( |
438 blink::WebInputEvent::KeyDown); | 484 FakeInputEvent(blink::WebInputEvent::KeyDown)); |
439 EnableIdleTasks(); | 485 EnableIdleTasks(); |
440 RunUntilIdle(); | 486 RunUntilIdle(); |
441 // Note compositor tasks are not prioritized. | 487 // Note compositor tasks are not prioritized. |
442 EXPECT_THAT(order, testing::ElementsAre(std::string("D1"), std::string("C1"), | 488 EXPECT_THAT(order, testing::ElementsAre(std::string("D1"), std::string("C1"), |
443 std::string("D2"), std::string("C2"), | 489 std::string("D2"), std::string("C2"), |
444 std::string("I1"))); | 490 std::string("I1"))); |
445 } | 491 } |
446 | 492 |
447 TEST_F(RendererSchedulerImplTest, | 493 TEST_F(RendererSchedulerImplTest, |
448 TestCompositorPolicyDoesNotStarveDefaultTasks) { | 494 TestCompositorPolicyDoesNotStarveDefaultTasks) { |
449 std::vector<std::string> order; | 495 std::vector<std::string> order; |
450 | 496 |
451 default_task_runner_->PostTask( | 497 default_task_runner_->PostTask( |
452 FROM_HERE, | 498 FROM_HERE, |
453 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); | 499 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); |
454 compositor_task_runner_->PostTask( | 500 compositor_task_runner_->PostTask( |
455 FROM_HERE, | 501 FROM_HERE, |
456 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | 502 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); |
457 for (int i = 0; i < 20; i++) { | 503 for (int i = 0; i < 20; i++) { |
458 compositor_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 504 compositor_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
459 } | 505 } |
460 compositor_task_runner_->PostTask( | 506 compositor_task_runner_->PostTask( |
461 FROM_HERE, | 507 FROM_HERE, |
462 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | 508 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); |
463 | 509 |
464 scheduler_->DidReceiveInputEventOnCompositorThread( | 510 scheduler_->DidReceiveInputEventOnCompositorThread( |
465 blink::WebInputEvent::GestureFlingStart); | 511 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
466 RunUntilIdle(); | 512 RunUntilIdle(); |
467 // Ensure that the default D1 task gets to run at some point before the final | 513 // Ensure that the default D1 task gets to run at some point before the final |
468 // C2 compositor task. | 514 // C2 compositor task. |
469 EXPECT_THAT(order, testing::ElementsAre(std::string("C1"), std::string("D1"), | 515 EXPECT_THAT(order, testing::ElementsAre(std::string("C1"), std::string("D1"), |
470 std::string("C2"))); | 516 std::string("C2"))); |
471 } | 517 } |
472 | 518 |
473 TEST_F(RendererSchedulerImplTest, TestCompositorPolicyEnds) { | 519 TEST_F(RendererSchedulerImplTest, TestCompositorPolicyEnds) { |
474 std::vector<std::string> order; | 520 std::vector<std::string> order; |
475 | 521 |
476 default_task_runner_->PostTask( | 522 default_task_runner_->PostTask( |
477 FROM_HERE, | 523 FROM_HERE, |
478 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); | 524 base::Bind(&AppendToVectorTestTask, &order, std::string("D1"))); |
479 compositor_task_runner_->PostTask( | 525 compositor_task_runner_->PostTask( |
480 FROM_HERE, | 526 FROM_HERE, |
481 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); | 527 base::Bind(&AppendToVectorTestTask, &order, std::string("C1"))); |
482 default_task_runner_->PostTask( | 528 default_task_runner_->PostTask( |
483 FROM_HERE, | 529 FROM_HERE, |
484 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); | 530 base::Bind(&AppendToVectorTestTask, &order, std::string("D2"))); |
485 compositor_task_runner_->PostTask( | 531 compositor_task_runner_->PostTask( |
486 FROM_HERE, | 532 FROM_HERE, |
487 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); | 533 base::Bind(&AppendToVectorTestTask, &order, std::string("C2"))); |
488 | 534 |
489 scheduler_->DidReceiveInputEventOnCompositorThread( | 535 scheduler_->DidReceiveInputEventOnCompositorThread( |
490 blink::WebInputEvent::GestureFlingStart); | 536 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
491 RunUntilIdle(); | 537 RunUntilIdle(); |
492 EXPECT_THAT(order, | 538 EXPECT_THAT(order, |
493 testing::ElementsAre(std::string("C1"), std::string("C2"), | 539 testing::ElementsAre(std::string("C1"), std::string("C2"), |
494 std::string("D1"), std::string("D2"))); | 540 std::string("D1"), std::string("D2"))); |
495 | 541 |
496 order.clear(); | 542 order.clear(); |
497 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(1000)); | 543 clock_->AdvanceNow(base::TimeDelta::FromMilliseconds(1000)); |
498 | 544 |
499 default_task_runner_->PostTask( | 545 default_task_runner_->PostTask( |
500 FROM_HERE, | 546 FROM_HERE, |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
581 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), | 627 FROM_HERE, base::Bind(&PostingYieldingTestTask, scheduler_.get(), |
582 compositor_task_runner_, true, &should_yield_before, | 628 compositor_task_runner_, true, &should_yield_before, |
583 &should_yield_after)); | 629 &should_yield_after)); |
584 RunUntilIdle(); | 630 RunUntilIdle(); |
585 // We should be able to switch to compositor priority mid-task. | 631 // We should be able to switch to compositor priority mid-task. |
586 EXPECT_FALSE(should_yield_before); | 632 EXPECT_FALSE(should_yield_before); |
587 EXPECT_TRUE(should_yield_after); | 633 EXPECT_TRUE(should_yield_after); |
588 } | 634 } |
589 | 635 |
590 } // namespace content | 636 } // namespace content |
OLD | NEW |