| 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 90c126a42becf09797517414f12ef1ba504c218e..e6adbc6e8c97cb7a63fc38038724eee82919a890 100644
 | 
| --- a/cc/scheduler/scheduler_state_machine_unittest.cc
 | 
| +++ b/cc/scheduler/scheduler_state_machine_unittest.cc
 | 
| @@ -40,7 +40,7 @@
 | 
|      EXPECT_IMPL_FRAME_STATE(                                                \
 | 
|          SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_DEADLINE);     \
 | 
|    }                                                                         \
 | 
| -  WillPerformAction(&state, action);                                        \
 | 
| +  PerformAction(&state, action);                                            \
 | 
|    if (action == SchedulerStateMachine::ACTION_NONE) {                       \
 | 
|      if (state.begin_impl_frame_state() ==                                   \
 | 
|          SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING) \
 | 
| @@ -62,57 +62,6 @@ namespace cc {
 | 
|  
 | 
|  namespace {
 | 
|  
 | 
| -void WillPerformAction(SchedulerStateMachine* sm,
 | 
| -                       SchedulerStateMachine::Action action) {
 | 
| -  switch (action) {
 | 
| -    case SchedulerStateMachine::ACTION_NONE:
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
 | 
| -      sm->WillActivate();
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_ANIMATE:
 | 
| -      sm->WillAnimate();
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
 | 
| -      sm->WillSendBeginMainFrame();
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_COMMIT: {
 | 
| -      bool commit_has_no_updates = false;
 | 
| -      sm->WillCommit(commit_has_no_updates);
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
 | 
| -    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
 | 
| -      bool did_request_swap = true;
 | 
| -      sm->WillDraw(did_request_swap);
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: {
 | 
| -      bool did_request_swap = false;
 | 
| -      sm->WillDraw(did_request_swap);
 | 
| -      return;
 | 
| -    }
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
 | 
| -      sm->WillBeginOutputSurfaceCreation();
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_PREPARE_TILES:
 | 
| -      sm->WillPrepareTiles();
 | 
| -      return;
 | 
| -
 | 
| -    case SchedulerStateMachine::ACTION_INVALIDATE_OUTPUT_SURFACE:
 | 
| -      sm->WillInvalidateOutputSurface();
 | 
| -      return;
 | 
| -  }
 | 
| -}
 | 
| -
 | 
|  const SchedulerStateMachine::BeginImplFrameState all_begin_impl_frame_states[] =
 | 
|      {SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE,
 | 
|       SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_BEGIN_FRAME_STARTING,
 | 
| @@ -131,7 +80,8 @@ const SchedulerStateMachine::BeginMainFrameState begin_main_frame_states[] = {
 | 
|  class StateMachine : public SchedulerStateMachine {
 | 
|   public:
 | 
|    explicit StateMachine(const SchedulerSettings& scheduler_settings)
 | 
| -      : SchedulerStateMachine(scheduler_settings) {}
 | 
| +      : SchedulerStateMachine(scheduler_settings),
 | 
| +        draw_result_for_test_(DRAW_SUCCESS) {}
 | 
|  
 | 
|    void CreateAndInitializeOutputSurfaceWithActivatedCommit() {
 | 
|      DidCreateAndInitializeOutputSurface();
 | 
| @@ -173,6 +123,11 @@ class StateMachine : public SchedulerStateMachine {
 | 
|  
 | 
|    void SetNeedsRedraw(bool needs_redraw) { needs_redraw_ = needs_redraw; }
 | 
|  
 | 
| +  void SetDrawResultForTest(DrawResult draw_result) {
 | 
| +    draw_result_for_test_ = draw_result;
 | 
| +  }
 | 
| +  DrawResult draw_result_for_test() { return draw_result_for_test_; }
 | 
| +
 | 
|    void SetNeedsForcedRedrawForTimeout(bool b) {
 | 
|      forced_redraw_state_ = FORCED_REDRAW_STATE_WAITING_FOR_COMMIT;
 | 
|      active_tree_needs_first_draw_ = true;
 | 
| @@ -199,8 +154,60 @@ class StateMachine : public SchedulerStateMachine {
 | 
|    using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
 | 
|    using SchedulerStateMachine::ProactiveBeginFrameWanted;
 | 
|    using SchedulerStateMachine::WillCommit;
 | 
| +
 | 
| + protected:
 | 
| +  DrawResult draw_result_for_test_;
 | 
|  };
 | 
|  
 | 
| +void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
 | 
| +  switch (action) {
 | 
| +    case SchedulerStateMachine::ACTION_NONE:
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE:
 | 
| +      sm->WillActivate();
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_ANIMATE:
 | 
| +      sm->WillAnimate();
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME:
 | 
| +      sm->WillSendBeginMainFrame();
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_COMMIT: {
 | 
| +      bool commit_has_no_updates = false;
 | 
| +      sm->WillCommit(commit_has_no_updates);
 | 
| +      return;
 | 
| +    }
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED:
 | 
| +    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE: {
 | 
| +      sm->WillDraw();
 | 
| +      sm->DidDraw(sm->draw_result_for_test());
 | 
| +      return;
 | 
| +    }
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_DRAW_AND_SWAP_ABORT: {
 | 
| +      sm->AbortDrawAndSwap();
 | 
| +      return;
 | 
| +    }
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_BEGIN_OUTPUT_SURFACE_CREATION:
 | 
| +      sm->WillBeginOutputSurfaceCreation();
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_PREPARE_TILES:
 | 
| +      sm->WillPrepareTiles();
 | 
| +      return;
 | 
| +
 | 
| +    case SchedulerStateMachine::ACTION_INVALIDATE_OUTPUT_SURFACE:
 | 
| +      sm->WillInvalidateOutputSurface();
 | 
| +      return;
 | 
| +  }
 | 
| +}
 | 
| +
 | 
|  TEST(SchedulerStateMachineTest, BeginFrameNeeded) {
 | 
|    SchedulerSettings default_scheduler_settings;
 | 
|    StateMachine state(default_scheduler_settings);
 | 
| @@ -406,39 +413,52 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
 | 
|  }
 | 
|  
 | 
|  TEST(SchedulerStateMachineTest,
 | 
| -     TestFailedDrawForAnimationCheckerboardSetsNeedsCommitAndDoesNotDrawAgain) {
 | 
| +     FailedDrawForAnimationCheckerboardSetsNeedsCommitAndRetriesDraw) {
 | 
|    SchedulerSettings default_scheduler_settings;
 | 
|    StateMachine state(default_scheduler_settings);
 | 
|    SET_UP_STATE(state)
 | 
|    state.SetNeedsRedraw(true);
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
|    EXPECT_TRUE(state.BeginFrameNeeded());
 | 
| +
 | 
| +  // Start a frame.
 | 
|    state.OnBeginImplFrame();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| -  state.OnBeginImplFrameDeadline();
 | 
| +  state.OnBeginImplFrameDeadlinePending();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  EXPECT_FALSE(state.CommitPending());
 | 
|  
 | 
| -  // We're drawing now.
 | 
| +  // Failing a draw triggers request for a new BeginMainFrame.
 | 
| +  state.OnBeginImplFrameDeadline();
 | 
| +  state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| -  state.DidSwapBuffers();
 | 
| -  state.DidSwapBuffersComplete();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(
 | 
| +      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameIdle();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  
 | 
| -  EXPECT_FALSE(state.RedrawPending());
 | 
| -  EXPECT_FALSE(state.CommitPending());
 | 
| -
 | 
| -  // Failing the draw makes us require a commit.
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| +  // It's okay to attempt more draws just in case additional raster
 | 
| +  // finishes and the requested commit wasn't actually necessary.
 | 
| +  EXPECT_TRUE(state.CommitPending());
 | 
| +  EXPECT_TRUE(state.RedrawPending());
 | 
|    state.OnBeginImplFrame();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameDeadlinePending();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameDeadline();
 | 
| +  state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
| -      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
| -  EXPECT_TRUE(state.RedrawPending());
 | 
| -  EXPECT_TRUE(state.CommitPending());
 | 
| +      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameIdle();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  }
 | 
|  
 | 
| -TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
 | 
| +TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
 | 
|    SchedulerSettings default_scheduler_settings;
 | 
|    StateMachine state(default_scheduler_settings);
 | 
|    SET_UP_STATE(state)
 | 
| @@ -446,61 +466,62 @@ TEST(SchedulerStateMachineTest, TestFailedDrawForMissingHighResNeedsCommit) {
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
|    EXPECT_TRUE(state.BeginFrameNeeded());
 | 
|  
 | 
| +  // Start a frame.
 | 
|    state.OnBeginImplFrame();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| -  state.OnBeginImplFrameDeadline();
 | 
| -  EXPECT_ACTION_UPDATE_STATE(
 | 
| -      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| -  state.DidSwapBuffers();
 | 
| -  state.DidSwapBuffersComplete();
 | 
| +  state.OnBeginImplFrameDeadlinePending();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| -  EXPECT_FALSE(state.RedrawPending());
 | 
|    EXPECT_FALSE(state.CommitPending());
 | 
|  
 | 
| -  // Missing high res content requires a commit (but not a redraw)
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
 | 
| -  state.OnBeginImplFrame();
 | 
| +  // Failing a draw triggers because of high res tiles missing
 | 
| +  // request for a new BeginMainFrame.
 | 
| +  state.OnBeginImplFrameDeadline();
 | 
| +  state.SetDrawResultForTest(DRAW_ABORTED_MISSING_HIGH_RES_CONTENT);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(
 | 
| +      SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
| -  EXPECT_FALSE(state.RedrawPending());
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameIdle();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +
 | 
| +  // It doesn't request a draw until we get a new commit though.
 | 
|    EXPECT_TRUE(state.CommitPending());
 | 
| -}
 | 
| +  EXPECT_FALSE(state.RedrawPending());
 | 
| +  state.OnBeginImplFrame();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameDeadlinePending();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameDeadline();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameIdle();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  
 | 
| -TEST(SchedulerStateMachineTest,
 | 
| -     TestsetNeedsRedrawDuringFailedDrawDoesNotRemoveNeedsRedraw) {
 | 
| -  SchedulerSettings default_scheduler_settings;
 | 
| -  StateMachine state(default_scheduler_settings);
 | 
| -  SET_UP_STATE(state)
 | 
| -  state.SetNeedsRedraw(true);
 | 
| +  // Finish the commit and activation.
 | 
| +  state.NotifyBeginMainFrameStarted();
 | 
| +  state.NotifyReadyToCommit();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.NotifyReadyToActivate();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
| -  EXPECT_TRUE(state.BeginFrameNeeded());
 | 
| +
 | 
| +  // Verify we draw with the new frame.
 | 
|    state.OnBeginImplFrame();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  state.OnBeginImplFrameDeadlinePending();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    state.OnBeginImplFrameDeadline();
 | 
| -
 | 
| -  // We're drawing now.
 | 
| +  state.SetDrawResultForTest(DRAW_SUCCESS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidSwapBuffersComplete();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| -  EXPECT_FALSE(state.RedrawPending());
 | 
| -  EXPECT_FALSE(state.CommitPending());
 | 
| -
 | 
| -  // While still in the same BeginMainFrame callback on the main thread,
 | 
| -  // set needs redraw again. This should not redraw.
 | 
| -  state.SetNeedsRedraw(true);
 | 
| +  state.OnBeginImplFrameIdle();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| -
 | 
| -  // Failing the draw for animation checkerboards makes us require a commit.
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| -  state.OnBeginImplFrame();
 | 
| -  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
| -  EXPECT_ACTION_UPDATE_STATE(
 | 
| -      SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
| -  EXPECT_TRUE(state.RedrawPending());
 | 
|  }
 | 
|  
 | 
|  TEST(SchedulerStateMachineTest,
 | 
| @@ -519,19 +540,16 @@ TEST(SchedulerStateMachineTest,
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    EXPECT_TRUE(state.CommitPending());
 | 
|  
 | 
| -  // Then initiate a draw.
 | 
| +  // Then initiate a draw that fails.
 | 
|    state.SetNeedsRedraw(true);
 | 
|    state.OnBeginImplFrameDeadline();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
| +  state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| -
 | 
| -  // Fail the draw.
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    EXPECT_TRUE(state.BeginFrameNeeded());
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
| -  // But the commit is ongoing.
 | 
|    EXPECT_TRUE(state.CommitPending());
 | 
|  
 | 
|    // Finish the commit. Note, we should not yet be forcing a draw, but should
 | 
| @@ -555,15 +573,18 @@ TEST(SchedulerStateMachineTest,
 | 
|        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    state.OnBeginImplFrameDeadline();
 | 
| +  state.SetDrawResultForTest(DRAW_SUCCESS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_FORCED);
 | 
|    state.DidSwapBuffers();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    state.DidSwapBuffersComplete();
 | 
| +  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  }
 | 
|  
 | 
|  TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
 | 
|    SchedulerSettings scheduler_settings;
 | 
| -  int draw_limit = 1;
 | 
| +  int draw_limit = 2;
 | 
|    scheduler_settings.maximum_number_of_failed_draws_before_draw_is_forced =
 | 
|        draw_limit;
 | 
|    StateMachine state(scheduler_settings);
 | 
| @@ -585,11 +606,23 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|  
 | 
| -  // Fail the draw enough times to force a redraw,
 | 
| -  // then once more for good measure.
 | 
| -  for (int i = 0; i < draw_limit + 1; ++i)
 | 
| -    state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| -  EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  // Fail the draw enough times to force a redraw.
 | 
| +  for (int i = 0; i < draw_limit; ++i) {
 | 
| +    state.SetNeedsRedraw(true);
 | 
| +    state.OnBeginImplFrame();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameDeadlinePending();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameDeadline();
 | 
| +    state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(
 | 
| +        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameIdle();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  }
 | 
| +
 | 
|    EXPECT_TRUE(state.BeginFrameNeeded());
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
|    // But the commit is ongoing.
 | 
| @@ -610,8 +643,21 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
 | 
|  
 | 
|    // After failing additional draws, we should still be in a forced
 | 
|    // redraw, but not back in WAITING_FOR_COMMIT.
 | 
| -  for (int i = 0; i < draw_limit + 1; ++i)
 | 
| -    state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| +  for (int i = 0; i < draw_limit; ++i) {
 | 
| +    state.SetNeedsRedraw(true);
 | 
| +    state.OnBeginImplFrame();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ANIMATE);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameDeadlinePending();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameDeadline();
 | 
| +    state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(
 | 
| +        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +    state.OnBeginImplFrameIdle();
 | 
| +    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| +  }
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
|    EXPECT_TRUE(state.ForcedRedrawState() ==
 | 
|      SchedulerStateMachine::FORCED_REDRAW_STATE_WAITING_FOR_ACTIVATION);
 | 
| @@ -630,11 +676,11 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|    state.OnBeginImplFrameDeadline();
 | 
|    EXPECT_TRUE(state.RedrawPending());
 | 
| +  state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|  
 | 
|    // Failing the draw for animation checkerboards makes us require a commit.
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
| @@ -649,6 +695,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
 | 
|    // We should try to draw again at the end of the next BeginImplFrame on
 | 
|    // the impl thread.
 | 
|    state.OnBeginImplFrameDeadline();
 | 
| +  state.SetDrawResultForTest(DRAW_SUCCESS);
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| @@ -672,7 +719,6 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  
 | 
| @@ -692,7 +738,6 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  
 | 
| @@ -931,7 +976,6 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|    EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
 | 
|  }
 | 
| @@ -976,7 +1020,6 @@ TEST(SchedulerStateMachineTest, TestFullCycle) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|  
 | 
|    // Should be synchronized, no draw needed, no action needed.
 | 
| @@ -1115,7 +1158,6 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|  
 | 
|    // Now will be able to start main frame.
 | 
| @@ -1167,7 +1209,6 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
 | 
|    EXPECT_ACTION_UPDATE_STATE(
 | 
|        SchedulerStateMachine::ACTION_DRAW_AND_SWAP_IF_POSSIBLE);
 | 
|    state.DidSwapBuffers();
 | 
| -  state.DidDrawIfPossibleCompleted(DRAW_SUCCESS);
 | 
|    state.DidSwapBuffersComplete();
 | 
|  
 | 
|    // Should be synchronized, no draw needed, no action needed.
 | 
| 
 |