Chromium Code Reviews| Index: cc/scheduler/scheduler_unittest.cc |
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
| index 24b7173248ee70d8ffe51bede6f112246389f3ab..2dfc4032d14df20744e8819adcbf5d1f8563614c 100644 |
| --- a/cc/scheduler/scheduler_unittest.cc |
| +++ b/cc/scheduler/scheduler_unittest.cc |
| @@ -415,6 +415,7 @@ class SchedulerTest : public testing::Test { |
| return fake_external_begin_frame_source_.get(); |
| } |
| + void AdvanceAndMissOneFrame(); |
| void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame); |
| void ImplFrameSkippedAfterLateSwapAck(bool swap_ack_before_deadline); |
| void ImplFrameNotSkippedAfterLateSwapAck(); |
| @@ -1282,8 +1283,7 @@ TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostCompositorFrameSink) { |
| EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); |
| } |
| -void SchedulerTest::CheckMainFrameSkippedAfterLateCommit( |
| - bool expect_send_begin_main_frame) { |
| +void SchedulerTest::AdvanceAndMissOneFrame() { |
| // Impl thread hits deadline before commit finishes. |
| scheduler_->SetNeedsBeginMainFrame(); |
| EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline()); |
| @@ -1300,8 +1300,13 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit( |
| EXPECT_ACTION("ScheduledActionCommit", client_, 3, 5); |
| EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 4, 5); |
| EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); |
| - |
| client_->Reset(); |
| +} |
| + |
| +void SchedulerTest::CheckMainFrameSkippedAfterLateCommit( |
| + bool expect_send_begin_main_frame) { |
| + AdvanceAndMissOneFrame(); |
| + |
| scheduler_->SetNeedsBeginMainFrame(); |
| EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); |
| EXPECT_SCOPED(AdvanceFrame()); |
| @@ -1314,6 +1319,32 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit( |
| client_->HasAction("ScheduledActionSendBeginMainFrame")); |
| } |
| +TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateBeginFrame) { |
| + // If a begin frame is delivered extremely late (because the browser has |
| + // some contention), make sure that the main frame is not skipped even |
| + // if it can activate before the deadline. |
| + SetUpScheduler(EXTERNAL_BFS); |
| + fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); |
| + |
| + AdvanceAndMissOneFrame(); |
| + |
| + // Advance frame and create a begin frame. |
|
sunnyps
2016/10/12 20:51:46
Why do we need this extra frame in between?
enne (OOO)
2016/10/13 17:09:44
Which extra frame? There's one frame where the mai
sunnyps
2016/10/13 20:25:57
Ooh, sorry. Misread that.
|
| + now_src_->Advance(BeginFrameArgs::DefaultInterval()); |
| + BeginFrameArgs args = |
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()); |
| + |
| + // Deliver this begin frame super late. |
| + now_src_->Advance(BeginFrameArgs::DefaultInterval() * 100); |
| + fake_external_begin_frame_source_->TestOnBeginFrame(args); |
| + |
| + scheduler_->SetNeedsBeginMainFrame(); |
|
sunnyps
2016/10/12 20:51:46
nit: Can you call SetNeedsBeginMainFrame before se
enne (OOO)
2016/10/13 17:09:44
Done.
|
| + EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline()); |
| + task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true)); |
| + EXPECT_EQ(true, scheduler_->MainThreadMissedLastDeadline()); |
| + EXPECT_TRUE(client_->HasAction("WillBeginImplFrame")); |
|
sunnyps
2016/10/12 20:51:46
nit: Can you use EXPECT_ACTION here?
enne (OOO)
2016/10/13 17:09:44
Done.
|
| + EXPECT_EQ(true, client_->HasAction("ScheduledActionSendBeginMainFrame")); |
| +} |
| + |
| TEST_F(SchedulerTest, MainFrameSkippedAfterLateCommit) { |
| SetUpScheduler(EXTERNAL_BFS); |
| fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration); |