| Index: cc/scheduler/scheduler_state_machine_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_state_machine_unittest.cc b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| index 0a99a0969a0b4ab28055457e3102bed1093e44a5..adac80971e9c31916b1f27a0f61ad248f7fdf498 100644
|
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
|
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
|
| @@ -204,6 +204,10 @@ void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
|
| sm->WillSendBeginMainFrame();
|
| return;
|
|
|
| + case SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK:
|
| + sm->WillDoShortIdleWork();
|
| + return;
|
| +
|
| case SchedulerStateMachine::ACTION_COMMIT: {
|
| bool commit_has_no_updates = false;
|
| sm->WillCommit(commit_has_no_updates);
|
| @@ -290,6 +294,26 @@ TEST(SchedulerStateMachineTest, BeginFrameNeeded) {
|
| EXPECT_FALSE(state.BeginFrameNeeded());
|
| }
|
|
|
| +TEST(SchedulerStateMachineTest, TestNextActionDoShortIdleWork) {
|
| + SchedulerSettings default_scheduler_settings;
|
| + StateMachine state(default_scheduler_settings);
|
| + state.SetVisible(true);
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
|
| + state.IssueNextBeginImplFrame();
|
| + state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
|
| + // A main frame was not requested so short idle work is scheduled instead.
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +
|
| + state.SetNeedsRedraw(true);
|
| + state.SetNeedsBeginMainFrame();
|
| + // Now a main frame is requested no short idle work is scheduled.
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| +}
|
| +
|
| TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| SchedulerSettings default_scheduler_settings;
|
|
|
| @@ -309,6 +333,8 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
|
| EXPECT_FALSE(state.NeedsCommit());
|
|
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| state.OnBeginImplFrameDeadline();
|
| @@ -458,6 +484,7 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Start a frame.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_FALSE(state.CommitPending());
|
|
|
| @@ -495,6 +522,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
|
|
|
| // Start a frame.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_FALSE(state.CommitPending());
|
|
|
| @@ -523,6 +551,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
|
| state.NotifyBeginMainFrameStarted();
|
| state.NotifyReadyToCommit();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.NotifyReadyToActivate();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
|
| @@ -531,6 +560,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
|
|
|
| // Verify we draw with the new frame.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| state.SetDrawResultForTest(DRAW_SUCCESS);
|
| @@ -664,6 +694,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
|
| state.SetNeedsRedraw(true);
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_TRUE(state.RedrawPending());
|
| @@ -700,6 +731,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| // Draw the first frame.
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| state.OnBeginImplFrameDeadline();
|
| @@ -716,6 +748,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
|
| // Move to another frame. This should now draw.
|
| EXPECT_TRUE(state.BeginFrameNeeded());
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| @@ -1400,6 +1433,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
|
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
|
|
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -1424,6 +1458,7 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
|
|
|
| // Check that the first init does not SetNeedsBeginMainFrame.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -1478,6 +1513,7 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Once context recreation begins, nothing should happen.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -1528,6 +1564,7 @@ TEST(SchedulerStateMachineTest,
|
| // automatically cause a redraw.
|
| EXPECT_TRUE(state.RedrawPending());
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| @@ -1536,6 +1573,7 @@ TEST(SchedulerStateMachineTest,
|
|
|
| // Next frame as no work to do.
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -1544,6 +1582,7 @@ TEST(SchedulerStateMachineTest,
|
| // SetCanDraw if waiting on first draw after activate.
|
| state.SetNeedsRedraw(true);
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
|
| @@ -1636,6 +1675,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
|
| state.OnBeginImplFrame(0, 11);
|
| EXPECT_IMPL_FRAME_STATE(
|
| SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u,
|
| BeginFrameArgs::kInvalidFrameNumber);
|
| @@ -1993,7 +2033,8 @@ TEST(SchedulerStateMachineTest,
|
| }
|
|
|
| void FinishPreviousCommitAndDrawWithoutExitingDeadline(
|
| - StateMachine* state_ptr) {
|
| + StateMachine* state_ptr,
|
| + bool expect_idle_work_before_impl_frame_deadline) {
|
| // Gross, but allows us to use macros below.
|
| StateMachine& state = *state_ptr;
|
|
|
| @@ -2006,6 +2047,10 @@ void FinishPreviousCommitAndDrawWithoutExitingDeadline(
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| state.IssueNextBeginImplFrame();
|
| + if (expect_idle_work_before_impl_frame_deadline) {
|
| + EXPECT_ACTION_UPDATE_STATE(
|
| + SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| + }
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
|
| @@ -2045,7 +2090,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
|
|
|
| // Request a new commit and finish the previous one.
|
| state.SetNeedsBeginMainFrame();
|
| - FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
|
| + FinishPreviousCommitAndDrawWithoutExitingDeadline(&state, false);
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -2053,7 +2098,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Finish the previous commit and draw it.
|
| - FinishPreviousCommitAndDrawWithoutExitingDeadline(&state);
|
| + FinishPreviousCommitAndDrawWithoutExitingDeadline(&state, true);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Verify we do not send another BeginMainFrame if was are submit-frame
|
| @@ -2234,6 +2279,7 @@ TEST(SchedulerStateMachineTest, ImplSideInvalidationOnlyInsideDeadline) {
|
|
|
| state.SetNeedsImplSideInvalidation();
|
| state.IssueNextBeginImplFrame();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(
|
| @@ -2257,6 +2303,7 @@ TEST(SchedulerStateMachineTest,
|
| state.SetNeedsImplSideInvalidation();
|
| state.IssueNextBeginImplFrame();
|
| state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Initializing the CompositorFrameSink puts us in a state waiting for the
|
| @@ -2351,6 +2398,7 @@ TEST(SchedulerStateMachineTest,
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Request another invalidation, which should wait until the pending tree is
|
| @@ -2399,6 +2447,7 @@ TEST(SchedulerStateMachineTest, ImplSideInvalidationsThrottledOnDraw) {
|
| state.SetNeedsImplSideInvalidation();
|
| state.IssueNextBeginImplFrame();
|
| state.OnBeginImplFrameDeadline();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
|
|
| // Ack the previous frame and begin impl frame, which should perform the
|
| @@ -2447,6 +2496,7 @@ TEST(SchedulerStateMachineTest, PrepareTilesWaitForImplSideInvalidation) {
|
| EXPECT_ACTION_UPDATE_STATE(
|
| SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION);
|
| state.DidPrepareTiles();
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| }
|
|
|
| @@ -2473,6 +2523,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) {
|
|
|
| // OnBeginImplFrame() updates the sequence number.
|
| state.OnBeginImplFrame(0, 10);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
|
| BeginFrameArgs::kInvalidFrameNumber,
|
| @@ -2500,6 +2551,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) {
|
|
|
| // OnBeginImplFrame() updates the sequence number.
|
| state.OnBeginImplFrame(0, 10);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
|
| BeginFrameArgs::kInvalidFrameNumber,
|
| @@ -2574,6 +2626,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
|
| // Pending tree freshness is updated when the new pending tree is committed.
|
| state.NotifyReadyToCommit();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_FALSE(state.CommitPending());
|
| EXPECT_TRUE(state.has_pending_tree());
|
| @@ -2583,6 +2636,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
|
| // If no further BeginMainFrame is needed, OnBeginFrameImplDeadline()
|
| // updates the pending tree's frame number.
|
| state.OnBeginImplFrame(0, 12);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
|
| BeginFrameArgs::kInvalidFrameNumber);
|
| @@ -2644,6 +2698,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
|
| // When no updates are required, OnBeginImplFrameDeadline() updates active
|
| // tree and compositor frame freshness.
|
| state.OnBeginImplFrame(0, 15);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| state.OnBeginImplFrameDeadline();
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| @@ -2673,6 +2728,7 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
|
| // When the source changes, the current frame number is updated and frame
|
| // numbers for freshness are reset to invalid numbers.
|
| state.OnBeginImplFrame(1, 5);
|
| + EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DO_SHORT_IDLE_WORK);
|
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
|
| EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber,
|
| BeginFrameArgs::kInvalidFrameNumber,
|
|
|