| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index 2992dbc11c7f8da2cf3a485a5bcaa85b52c61b9b..0997049a974c2fc26548a80c2a1d395ee8311756 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -1319,6 +1319,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) {
|
| scheduler->SetCanStart();
|
| scheduler->SetVisible(true);
|
| scheduler->SetCanDraw(true);
|
| + scheduler->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1));
|
| InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
|
|
|
| // To test swap ack throttling, this test disables automatic swap acks.
|
| @@ -1331,12 +1332,7 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) {
|
| EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
|
| client.Reset();
|
|
|
| - // Create a BeginFrame with a long deadline to avoid race conditions.
|
| - // This is the first BeginFrame, which will be handled immediately.
|
| - BeginFrameArgs args =
|
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, client.now_src());
|
| - args.deadline += base::TimeDelta::FromHours(1);
|
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
|
| + client.AdvanceFrame();
|
| EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -1344,11 +1340,10 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) {
|
| client.Reset();
|
|
|
| // Queue BeginFrame while we are still handling the previous BeginFrame.
|
| - EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| - args.frame_time += base::TimeDelta::FromSeconds(1);
|
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
|
| + client.SendNextBeginFrame();
|
| EXPECT_NO_ACTION(client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + EXPECT_TRUE(client.needs_begin_frames());
|
| client.Reset();
|
|
|
| // NotifyReadyToCommit should trigger the pending commit and draw.
|
| @@ -1359,7 +1354,8 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) {
|
| client.Reset();
|
|
|
| // Swapping will put us into a swap throttled state.
|
| - client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + // Run posted deadline.
|
| + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
|
| EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
|
| EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -1369,35 +1365,32 @@ TEST(SchedulerTest, BeginRetroFrame_SwapThrottled) {
|
| // While swap throttled, BeginRetroFrames should trigger BeginImplFrames
|
| // but not a BeginMainFrame or draw.
|
| scheduler->SetNeedsCommit();
|
| - client.task_runner().RunPendingTasks(); // Run posted BeginRetroFrame.
|
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 1);
|
| + scheduler->SetNeedsRedraw();
|
| + // Run posted BeginRetroFrame.
|
| + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(false));
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_frames());
|
| client.Reset();
|
|
|
| - // Queue BeginFrame while we are still handling the previous BeginFrame.
|
| - args.frame_time += base::TimeDelta::FromSeconds(1);
|
| - client.fake_external_begin_frame_source()->TestOnBeginFrame(args);
|
| - EXPECT_NO_ACTION(client);
|
| + // Let time pass sufficiently beyond the regular deadline but not beyond the
|
| + // late deadline.
|
| + client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() -
|
| + base::TimeDelta::FromMicroseconds(1));
|
| + client.task_runner().RunUntilTime(client.now_src()->Now());
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| - EXPECT_TRUE(client.needs_begin_frames());
|
| - client.Reset();
|
|
|
| // Take us out of a swap throttled state.
|
| scheduler->DidSwapBuffersComplete();
|
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1);
|
| + EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_frames());
|
| client.Reset();
|
|
|
| - // BeginImplFrame deadline should draw.
|
| - scheduler->SetNeedsRedraw();
|
| -
|
| - EXPECT_TRUE(client.task_runner().RunTasksWhile(
|
| - client.ImplFrameDeadlinePending(true)));
|
| -
|
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
|
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
|
| + // Verify that the deadline was rescheduled.
|
| + client.task_runner().RunUntilTime(client.now_src()->Now());
|
| + EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| EXPECT_TRUE(client.needs_begin_frames());
|
| client.Reset();
|
| @@ -1630,6 +1623,7 @@ void BeginFramesNotFromClient_SwapThrottled(
|
| scheduler->SetCanStart();
|
| scheduler->SetVisible(true);
|
| scheduler->SetCanDraw(true);
|
| + scheduler->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1));
|
| InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
|
|
|
| DCHECK(!client.fake_external_begin_frame_source());
|
| @@ -1645,7 +1639,7 @@ void BeginFramesNotFromClient_SwapThrottled(
|
| client.Reset();
|
|
|
| // Trigger the first BeginImplFrame and BeginMainFrame
|
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame.
|
| + client.AdvanceFrame();
|
| EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -1658,7 +1652,8 @@ void BeginFramesNotFromClient_SwapThrottled(
|
| client.Reset();
|
|
|
| // Swapping will put us into a swap throttled state.
|
| - client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| + // Run posted deadline.
|
| + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
|
| EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
|
| EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| @@ -1667,22 +1662,33 @@ void BeginFramesNotFromClient_SwapThrottled(
|
| // While swap throttled, BeginFrames should trigger BeginImplFrames,
|
| // but not a BeginMainFrame or draw.
|
| scheduler->SetNeedsCommit();
|
| - client.task_runner().RunPendingTasks(); // Run posted BeginFrame.
|
| - EXPECT_ACTION("WillBeginImplFrame", client, 0, 1);
|
| + scheduler->SetNeedsRedraw();
|
| + client.AdvanceFrame(); // Run posted BeginFrame.
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
|
|
| + // Let time pass sufficiently beyond the regular deadline but not beyond the
|
| + // late deadline.
|
| + client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() -
|
| + base::TimeDelta::FromMicroseconds(1));
|
| + client.task_runner().RunUntilTime(client.now_src()->Now());
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| +
|
| // Take us out of a swap throttled state.
|
| scheduler->DidSwapBuffersComplete();
|
| - EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 0, 1);
|
| + EXPECT_SINGLE_ACTION("ScheduledActionSendBeginMainFrame", client);
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
|
|
| - // BeginImplFrame deadline should draw.
|
| - scheduler->SetNeedsRedraw();
|
| - client.task_runner().RunPendingTasks(); // Run posted deadline.
|
| - EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2);
|
| - EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2);
|
| + // Verify that the deadline was rescheduled.
|
| + // We can't use RunUntilTime(now) here because the next frame is also
|
| + // scheduled if throttle_frame_production = false.
|
| + base::TimeTicks before_deadline = client.now_src()->Now();
|
| + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
|
| + base::TimeTicks after_deadline = client.now_src()->Now();
|
| + EXPECT_EQ(after_deadline, before_deadline);
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| client.Reset();
|
| }
|
|
|