| 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 2e4a7bbb688ffb2c32e8817ef9ccb408cdc1bc58..f31dabb85954a223c9e176ea00699f896626b140 100644 | 
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc | 
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc | 
| @@ -11,11 +11,6 @@ | 
| EXPECT_EQ(action, state.NextAction()) << *state.AsValue();                 \ | 
| if (action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE ||   \ | 
| action == SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED) {        \ | 
| -    if (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW ==        \ | 
| -            state.CommitState() &&                                           \ | 
| -        SchedulerStateMachine::OUTPUT_SURFACE_ACTIVE !=                      \ | 
| -            state.output_surface_state())                                    \ | 
| -      return;                                                                \ | 
| EXPECT_EQ(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE, \ | 
| state.begin_impl_frame_state())                                \ | 
| << *state.AsValue();                                                 \ | 
| @@ -45,7 +40,8 @@ const SchedulerStateMachine::CommitState all_commit_states[] = { | 
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT, | 
| SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_STARTED, | 
| SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, | 
| -    SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, }; | 
| +    SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_ACTIVATION, | 
| +    SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW}; | 
|  | 
| // Exposes the protected state fields of the SchedulerStateMachine for testing | 
| class StateMachine : public SchedulerStateMachine { | 
| @@ -85,7 +81,7 @@ class StateMachine : public SchedulerStateMachine { | 
|  | 
| void SetNeedsForcedRedrawForTimeout(bool b) { | 
| forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT; | 
| -    commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; | 
| +    active_tree_needs_first_draw_ = true; | 
| } | 
| bool NeedsForcedRedrawForTimeout() const { | 
| return forced_redraw_state_ != FORCED_REDRAW_STATE_IDLE; | 
| @@ -93,7 +89,7 @@ class StateMachine : public SchedulerStateMachine { | 
|  | 
| void SetNeedsForcedRedrawForReadback() { | 
| readback_state_ = READBACK_STATE_WAITING_FOR_DRAW_AND_READBACK; | 
| -    commit_state_ = COMMIT_STATE_WAITING_FOR_FIRST_DRAW; | 
| +    active_tree_needs_first_draw_ = true; | 
| } | 
|  | 
| bool NeedsForcedRedrawForReadback() const { | 
| @@ -185,6 +181,135 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { | 
| } | 
| } | 
|  | 
| +// Explicitly test main_frame_before_draw_enabled = false | 
| +TEST(SchedulerStateMachineTest, MainFrameBeforeDrawDisabled) { | 
| +  SchedulerSettings scheduler_settings; | 
| +  scheduler_settings.impl_side_painting = true; | 
| +  scheduler_settings.main_frame_before_draw_enabled = false; | 
| +  StateMachine state(scheduler_settings); | 
| +  state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| +  state.SetCanStart(); | 
| +  state.UpdateState(state.NextAction()); | 
| +  state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 
| +  state.SetNeedsRedraw(false); | 
| +  state.SetVisible(true); | 
| +  state.SetCanDraw(true); | 
| +  state.SetNeedsCommit(); | 
| + | 
| +  EXPECT_TRUE(state.BeginImplFrameNeeded()); | 
| + | 
| +  // Commit to the pending tree. | 
| +  state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  state.NotifyBeginMainFrameStarted(); | 
| +  state.NotifyReadyToCommit(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), | 
| +            SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| + | 
| +  state.OnBeginImplFrameDeadline(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), | 
| +            SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| + | 
| +  // Verify that the next commit doesn't start until the previous | 
| +  // commit has been drawn. | 
| +  state.SetNeedsCommit(); | 
| +  state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  // Verify NotifyReadyToActivate unblocks activation, draw, and | 
| +  // commit in that order. | 
| +  state.NotifyReadyToActivate(); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), | 
| +            SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| + | 
| +  EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 
| +  state.OnBeginImplFrameDeadline(); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 
| +  EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), | 
| +            SchedulerStateMachine::COMMIT_STATE_BEGIN_MAIN_FRAME_SENT); | 
| + | 
| +  state.NotifyBeginMainFrameStarted(); | 
| +  state.NotifyReadyToCommit(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), | 
| +            SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| +} | 
| + | 
| +// Explicitly test main_frame_before_activation_enabled = true | 
| +TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) { | 
| +  SchedulerSettings scheduler_settings; | 
| +  scheduler_settings.impl_side_painting = true; | 
| +  scheduler_settings.main_frame_before_activation_enabled = true; | 
| +  StateMachine state(scheduler_settings); | 
| +  state.SetCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| +  state.SetCanStart(); | 
| +  state.UpdateState(state.NextAction()); | 
| +  state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 
| +  state.SetNeedsRedraw(false); | 
| +  state.SetVisible(true); | 
| +  state.SetCanDraw(true); | 
| +  state.SetNeedsCommit(); | 
| + | 
| +  EXPECT_TRUE(state.BeginImplFrameNeeded()); | 
| + | 
| +  // Commit to the pending tree. | 
| +  state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  state.NotifyBeginMainFrameStarted(); | 
| +  state.NotifyReadyToCommit(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| + | 
| +  state.OnBeginImplFrameDeadline(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  // Verify that the next commit starts while there is still a pending tree. | 
| +  state.SetNeedsCommit(); | 
| +  state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  // Verify the pending commit doesn't overwrite the pending | 
| +  // tree until the pending tree has been activated. | 
| +  state.NotifyBeginMainFrameStarted(); | 
| +  state.NotifyReadyToCommit(); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  // Verify NotifyReadyToActivate unblocks activation, draw, and | 
| +  // commit in that order. | 
| +  state.NotifyReadyToActivate(); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_ACTIVATE_PENDING_TREE); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| +  EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineEarly()); | 
| +  state.OnBeginImplFrameDeadline(); | 
| +  EXPECT_ACTION_UPDATE_STATE( | 
| +      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| +  EXPECT_EQ(state.CommitState(), SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| +} | 
| + | 
| TEST(SchedulerStateMachineTest, | 
| TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) { | 
| SchedulerSettings default_scheduler_settings; | 
| @@ -288,9 +413,11 @@ TEST(SchedulerStateMachineTest, | 
| EXPECT_TRUE(state.RedrawPending()); | 
| } | 
|  | 
| -TEST(SchedulerStateMachineTest, | 
| -     TestFailedDrawsWillEventuallyForceADrawAfterTheNextCommit) { | 
| +void TestFailedDrawsEventuallyForceDrawAfterNextCommit( | 
| +    bool main_frame_before_draw_enabled) { | 
| SchedulerSettings scheduler_settings; | 
| +  scheduler_settings.main_frame_before_draw_enabled = | 
| +      main_frame_before_draw_enabled; | 
| scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced_ = 1; | 
| StateMachine state(scheduler_settings); | 
| state.SetCanStart(); | 
| @@ -333,12 +460,30 @@ TEST(SchedulerStateMachineTest, | 
|  | 
| // The redraw should be forced at the end of the next BeginImplFrame. | 
| state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| +  if (main_frame_before_draw_enabled) { | 
| +    EXPECT_ACTION_UPDATE_STATE( | 
| +        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  } | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| state.OnBeginImplFrameDeadline(); | 
| EXPECT_ACTION_UPDATE_STATE( | 
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED); | 
| } | 
|  | 
| +TEST(SchedulerStateMachineTest, | 
| +     TestFailedDrawsEventuallyForceDrawAfterNextCommit) { | 
| +  bool main_frame_before_draw_enabled = false; | 
| +  TestFailedDrawsEventuallyForceDrawAfterNextCommit( | 
| +      main_frame_before_draw_enabled); | 
| +} | 
| + | 
| +TEST(SchedulerStateMachineTest, | 
| +     TestFailedDrawsEventuallyForceDrawAfterNextCommit_CommitBeforeDraw) { | 
| +  bool main_frame_before_draw_enabled = true; | 
| +  TestFailedDrawsEventuallyForceDrawAfterNextCommit( | 
| +      main_frame_before_draw_enabled); | 
| +} | 
| + | 
| TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) { | 
| SchedulerSettings scheduler_settings; | 
| int draw_limit = 1; | 
| @@ -520,19 +665,14 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { | 
| } | 
| } | 
|  | 
| -  // When in BeginImplFrame deadline we should always draw for SetNeedsRedraw or | 
| -  // SetNeedsForcedRedrawForReadback have been called... except if we're | 
| -  // ready to commit, in which case we expect a commit first. | 
| +  // When in BeginImplFrame deadline we should always draw for SetNeedsRedraw | 
| +  // except if we're ready to commit, in which case we expect a commit first. | 
| +  // SetNeedsForcedRedrawForReadback should take precedence over all and | 
| +  // issue a readback. | 
| for (size_t i = 0; i < num_commit_states; ++i) { | 
| for (size_t j = 0; j < 2; ++j) { | 
| bool request_readback = j; | 
|  | 
| -      // Skip invalid states | 
| -      if (request_readback && | 
| -          (SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW != | 
| -           all_commit_states[i])) | 
| -        continue; | 
| - | 
| StateMachine state(default_scheduler_settings); | 
| state.SetCanStart(); | 
| state.UpdateState(state.NextAction()); | 
| @@ -549,15 +689,11 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { | 
| } | 
|  | 
| SchedulerStateMachine::Action expected_action; | 
| -      if (all_commit_states[i] == | 
| -          SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { | 
| +      if (request_readback) { | 
| +        expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK; | 
| +      } else if (all_commit_states[i] == | 
| +                 SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT) { | 
| expected_action = SchedulerStateMachine::ACTION_COMMIT; | 
| -      } else if (request_readback) { | 
| -        if (all_commit_states[i] == | 
| -            SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW) | 
| -          expected_action = SchedulerStateMachine::ACTION_DRAW_AND_READBACK; | 
| -        else | 
| -          expected_action = SchedulerStateMachine::ACTION_NONE; | 
| } else { | 
| expected_action = | 
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE; | 
| @@ -566,13 +702,13 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnBeginImplFrame) { | 
| // Case 1: needs_commit=false. | 
| EXPECT_NE(state.BeginImplFrameNeeded(), request_readback) | 
| << *state.AsValue(); | 
| -      EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); | 
| +      EXPECT_EQ(state.NextAction(), expected_action) << *state.AsValue(); | 
|  | 
| // Case 2: needs_commit=true. | 
| state.SetNeedsCommit(); | 
| EXPECT_NE(state.BeginImplFrameNeeded(), request_readback) | 
| << *state.AsValue(); | 
| -      EXPECT_EQ(expected_action, state.NextAction()) << *state.AsValue(); | 
| +      EXPECT_EQ(state.NextAction(), expected_action) << *state.AsValue(); | 
| } | 
| } | 
| } | 
| @@ -643,8 +779,6 @@ TEST(SchedulerStateMachineTest, | 
| state.UpdateState(state.NextAction()); | 
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 
|  | 
| -  state.SetCommitState( | 
| -      SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| state.SetActiveTreeNeedsFirstDraw(true); | 
| state.SetNeedsCommit(); | 
| state.SetNeedsRedraw(true); | 
| @@ -663,9 +797,11 @@ TEST(SchedulerStateMachineTest, | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| } | 
|  | 
| -TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { | 
| -  SchedulerSettings default_scheduler_settings; | 
| -  StateMachine state(default_scheduler_settings); | 
| +void TestSetNeedsCommitIsNotLost(bool main_frame_before_draw_enabled) { | 
| +  SchedulerSettings scheduler_settings; | 
| +  scheduler_settings.main_frame_before_draw_enabled = | 
| +      main_frame_before_draw_enabled; | 
| +  StateMachine state(scheduler_settings); | 
| state.SetCanStart(); | 
| state.UpdateState(state.NextAction()); | 
| state.CreateAndInitializeOutputSurfaceWithActivatedCommit(); | 
| @@ -717,22 +853,38 @@ TEST(SchedulerStateMachineTest, TestsetNeedsCommitIsNotLost) { | 
| state.begin_impl_frame_state()); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 
|  | 
| -  // Commit and make sure we draw on next BeginImplFrame | 
| +  // Finish the commit, then make sure we start the next commit immediately | 
| +  // and draw on the next BeginImplFrame. | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| +  if (main_frame_before_draw_enabled) { | 
| +    EXPECT_ACTION_UPDATE_STATE( | 
| +        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  } | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| + | 
| state.OnBeginImplFrameDeadline(); | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| + | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_ACTION_UPDATE_STATE( | 
| SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE); | 
| state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 
| - | 
| -  // Verify that another commit will start immediately after draw. | 
| -  EXPECT_ACTION_UPDATE_STATE( | 
| -      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  if (!main_frame_before_draw_enabled) { | 
| +    EXPECT_ACTION_UPDATE_STATE( | 
| +        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME); | 
| +  } | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| } | 
|  | 
| +TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) { | 
| +  bool main_frame_before_draw_enabled = false; | 
| +  TestSetNeedsCommitIsNotLost(main_frame_before_draw_enabled); | 
| +} | 
| + | 
| +TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost_CommitBeforeDraw) { | 
| +  bool main_frame_before_draw_enabled = true; | 
| +  TestSetNeedsCommitIsNotLost(main_frame_before_draw_enabled); | 
| +} | 
| + | 
| TEST(SchedulerStateMachineTest, TestFullCycle) { | 
| SchedulerSettings default_scheduler_settings; | 
| StateMachine state(default_scheduler_settings); | 
| @@ -762,8 +914,7 @@ TEST(SchedulerStateMachineTest, TestFullCycle) { | 
|  | 
| // Commit. | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_TRUE(state.needs_redraw()); | 
|  | 
| // Expect to do nothing until BeginImplFrame deadline | 
| @@ -814,8 +965,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) { | 
|  | 
| // First commit. | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_TRUE(state.needs_redraw()); | 
|  | 
| // Expect to do nothing until BeginImplFrame deadline. | 
| @@ -1105,8 +1255,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) { | 
|  | 
| // We will abort the draw when the output surface is lost if we are | 
| // waiting for the first draw to unblock the main thread. | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 
|  | 
| // Expect to begin context recreation only in BEGIN_IMPL_FRAME_STATE_IDLE | 
| @@ -1168,8 +1317,7 @@ TEST(SchedulerStateMachineTest, | 
| state.NotifyBeginMainFrameStarted(); | 
| state.NotifyReadyToCommit(); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
|  | 
| // Because the output surface is missing, we expect the draw to abort. | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 
| @@ -1228,8 +1376,6 @@ TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { | 
| state.DidLoseOutputSurface(); | 
|  | 
| // Ask a forced redraw for readback and verify it ocurrs. | 
| -  state.SetCommitState( | 
| -      SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| state.SetNeedsForcedRedrawForReadback(); | 
| state.OnBeginImplFrame(BeginFrameArgs::CreateForTesting()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| @@ -1257,8 +1403,6 @@ TEST(SchedulerStateMachineTest, TestFinishAllRenderingWhileContextLost) { | 
| SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION); | 
|  | 
| // Ask a readback and verify it occurs. | 
| -  state.SetCommitState( | 
| -      SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| state.SetNeedsForcedRedrawForReadback(); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); | 
| @@ -1401,8 +1545,7 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenCommitInProgress) { | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.NextAction()); | 
| state.UpdateState(state.NextAction()); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT); | 
| } | 
|  | 
| @@ -1422,8 +1565,7 @@ TEST(SchedulerStateMachineTest, TestFinishCommitWhenForcedCommitInProgress) { | 
| state.NotifyReadyToCommit(); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
|  | 
| // When the readback interrupts the normal commit, we should not get | 
| @@ -1494,8 +1636,7 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommit) { | 
| state.CommitState()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
|  | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 
| @@ -1531,8 +1672,7 @@ TEST(SchedulerStateMachineTest, TestImmediateFinishCommitDuringCommit) { | 
| state.CommitState()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
|  | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 
| @@ -1566,8 +1706,7 @@ TEST(SchedulerStateMachineTest, ImmediateBeginMainFrameAbortedWhileInvisible) { | 
| state.CommitState()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
|  | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 
| @@ -1608,8 +1747,7 @@ TEST(SchedulerStateMachineTest, ImmediateFinishCommitWhileCantDraw) { | 
| state.CommitState()); | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT); | 
|  | 
| -  EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW, | 
| -            state.CommitState()); | 
| +  EXPECT_TRUE(state.active_tree_needs_first_draw()); | 
|  | 
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_AND_READBACK); | 
| state.DidDrawIfPossibleCompleted(DrawSwapReadbackResult::DRAW_SUCCESS); | 
|  |