| Index: cc/scheduler_state_machine_unittest.cc | 
| diff --git a/cc/scheduler_state_machine_unittest.cc b/cc/scheduler_state_machine_unittest.cc | 
| index c482bc7adb2703a2f028472811e5bbdbf09324cf..df6a3df4efff62f07bf8030b6ac7486559382369 100644 | 
| --- a/cc/scheduler_state_machine_unittest.cc | 
| +++ b/cc/scheduler_state_machine_unittest.cc | 
| @@ -22,12 +22,8 @@ public: | 
| void setCommitState(CommitState cs) { m_commitState = cs; } | 
| CommitState commitState() const { return  m_commitState; } | 
|  | 
| -    void setNeedsCommit(bool b) { m_needsCommit = b; } | 
| bool needsCommit() const { return m_needsCommit; } | 
|  | 
| -    void setNeedsForcedCommit(bool b) { m_needsForcedCommit = b; } | 
| -    bool needsForcedCommit() const { return m_needsForcedCommit; } | 
| - | 
| void setNeedsRedraw(bool b) { m_needsRedraw = b; } | 
| bool needsRedraw() const { return m_needsRedraw; } | 
|  | 
| @@ -47,7 +43,6 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsFrameIfNeeded) | 
| state.setCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| state.setCanBeginFrame(true); | 
| state.setNeedsRedraw(false); | 
| -        state.setNeedsCommit(false); | 
| state.setVisible(true); | 
|  | 
| EXPECT_FALSE(state.vsyncCallbackNeeded()); | 
| @@ -64,7 +59,6 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsFrameIfNeeded) | 
| StateMachine state; | 
| state.setCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| state.setNeedsRedraw(false); | 
| -        state.setNeedsCommit(false); | 
| state.setVisible(true); | 
|  | 
| EXPECT_FALSE(state.vsyncCallbackNeeded()); | 
| @@ -83,7 +77,6 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsFrameIfNeeded) | 
| state.setCommitState(SchedulerStateMachine::COMMIT_STATE_IDLE); | 
| state.setCanBeginFrame(true); | 
| state.setNeedsRedraw(false); | 
| -        state.setNeedsCommit(true); | 
| state.setVisible(true); | 
| EXPECT_FALSE(state.vsyncCallbackNeeded()); | 
| } | 
| @@ -366,11 +359,10 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnVSync) | 
| state.setVisible(true); | 
|  | 
| // Case 1: needsCommit=false | 
| -            state.setNeedsCommit(false); | 
| EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
|  | 
| // Case 2: needsCommit=true | 
| -            state.setNeedsCommit(true); | 
| +            state.setNeedsCommit(); | 
| EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
| } | 
| } | 
| @@ -396,12 +388,11 @@ TEST(SchedulerStateMachineTest, TestNextActionDrawsOnVSync) | 
| expectedAction = SchedulerStateMachine::ACTION_COMMIT; | 
|  | 
| // Case 1: needsCommit=false. | 
| -            state.setNeedsCommit(false); | 
| EXPECT_TRUE(state.vsyncCallbackNeeded()); | 
| EXPECT_EQ(expectedAction, state.nextAction()); | 
|  | 
| // Case 2: needsCommit=true. | 
| -            state.setNeedsCommit(true); | 
| +            state.setNeedsCommit(); | 
| EXPECT_TRUE(state.vsyncCallbackNeeded()); | 
| EXPECT_EQ(expectedAction, state.nextAction()); | 
| } | 
| @@ -423,11 +414,10 @@ TEST(SchedulerStateMachineTest, TestNoCommitStatesRedrawWhenInvisible) | 
| state.didEnterVSync(); | 
|  | 
| // Case 1: needsCommit=false. | 
| -            state.setNeedsCommit(false); | 
| EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
|  | 
| // Case 2: needsCommit=true. | 
| -            state.setNeedsCommit(true); | 
| +            state.setNeedsCommit(); | 
| EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
| } | 
| } | 
| @@ -458,7 +448,7 @@ TEST(SchedulerStateMachineTest, TestCanRedrawWithWaitingForFirstDrawMakesProgres | 
| StateMachine state; | 
| state.setCommitState(SchedulerStateMachine::COMMIT_STATE_WAITING_FOR_FIRST_DRAW); | 
| state.setCanBeginFrame(true); | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| state.setNeedsRedraw(true); | 
| state.setVisible(true); | 
| state.setCanDraw(false); | 
| @@ -469,7 +459,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) | 
| { | 
| StateMachine state; | 
| state.setCanBeginFrame(true); | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| state.setVisible(true); | 
| state.setCanDraw(true); | 
|  | 
| @@ -479,7 +469,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsCommitIsNotLost) | 
| EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, state.commitState()); | 
|  | 
| // Now, while the frame is in progress, set another commit. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_TRUE(state.needsCommit()); | 
|  | 
| // Let the frame finish. | 
| @@ -512,7 +502,7 @@ TEST(SchedulerStateMachineTest, TestFullCycle) | 
| state.setCanDraw(true); | 
|  | 
| // Start clean and set commit. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
|  | 
| // Begin the frame. | 
| @@ -555,7 +545,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) | 
| state.setCanDraw(true); | 
|  | 
| // Start clean and set commit. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
|  | 
| // Begin the frame. | 
| @@ -565,7 +555,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
|  | 
| // Request another commit while the commit is in flight. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
|  | 
| // Tell the scheduler the frame finished. | 
| @@ -597,7 +587,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) | 
| TEST(SchedulerStateMachineTest, TestRequestCommitInvisible) | 
| { | 
| StateMachine state; | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
| } | 
|  | 
| @@ -609,7 +599,7 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeBeginFrameCompletes) | 
| state.setCanDraw(true); | 
|  | 
| // Start clean and set commit. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
|  | 
| // Begin the frame while visible. | 
| @@ -679,7 +669,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenIdleAndCommitRequestedWhileRe | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
|  | 
| // While context is recreating, commits shouldn't begin. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
|  | 
| // Recreate the context | 
| @@ -708,7 +698,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) | 
| state.setCanDraw(true); | 
|  | 
| // Get a commit in flight. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
| state.updateState(state.nextAction()); | 
|  | 
| @@ -751,7 +741,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgressAndAnotherCo | 
| state.setCanDraw(true); | 
|  | 
| // Get a commit in flight. | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
| state.updateState(state.nextAction()); | 
|  | 
| @@ -767,7 +757,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgressAndAnotherCo | 
|  | 
| // Ask for another draw and also set needs commit. Expect nothing happens. | 
| state.setNeedsRedraw(true); | 
| -    state.setNeedsCommit(true); | 
| +    state.setNeedsCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.nextAction()); | 
|  | 
| // Finish the frame, and commit. | 
| @@ -822,8 +812,8 @@ TEST(SchedulerStateMachineTest, TestBeginFrameWhenInvisibleAndForceCommit) | 
| StateMachine state; | 
| state.setCanBeginFrame(true); | 
| state.setVisible(false); | 
| -    state.setNeedsCommit(true); | 
| -    state.setNeedsForcedCommit(true); | 
| +    state.setNeedsCommit(); | 
| +    state.setNeedsForcedCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
| } | 
|  | 
| @@ -832,8 +822,8 @@ TEST(SchedulerStateMachineTest, TestBeginFrameWhenCanBeginFrameFalseAndForceComm | 
| StateMachine state; | 
| state.setVisible(true); | 
| state.setCanDraw(true); | 
| -    state.setNeedsCommit(true); | 
| -    state.setNeedsForcedCommit(true); | 
| +    state.setNeedsCommit(); | 
| +    state.setNeedsForcedCommit(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
| } | 
|  | 
| @@ -843,8 +833,8 @@ TEST(SchedulerStateMachineTest, TestBeginFrameWhenCommitInProgress) | 
| state.setCanBeginFrame(true); | 
| state.setVisible(false); | 
| state.setCommitState(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS); | 
| -    state.setNeedsCommit(true); | 
| -    state.setNeedsForcedCommit(true); | 
| +    state.setNeedsCommit(); | 
| +    state.setNeedsForcedCommit(); | 
|  | 
| state.beginFrameComplete(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.nextAction()); | 
| @@ -861,11 +851,105 @@ TEST(SchedulerStateMachineTest, TestBeginFrameWhenContextLost) | 
| state.setCanBeginFrame(true); | 
| state.setVisible(true); | 
| state.setCanDraw(true); | 
| -    state.setNeedsCommit(true); | 
| -    state.setNeedsForcedCommit(true); | 
| +    state.setNeedsCommit(); | 
| +    state.setNeedsForcedCommit(); | 
| state.didLoseContext(); | 
| EXPECT_EQ(SchedulerStateMachine::ACTION_BEGIN_FRAME, state.nextAction()); | 
| } | 
|  | 
| +TEST(SchedulerStateMachineTest, TestImmediateBeginFrame) | 
| +{ | 
| +    StateMachine state; | 
| +    state.setCanBeginFrame(true); | 
| +    state.setVisible(true); | 
| +    state.setCanDraw(true); | 
| + | 
| +    // Schedule a forced frame, commit it, draw it. | 
| +    state.setNeedsCommit(); | 
| +    state.setNeedsForcedCommit(); | 
| +    state.updateState(state.nextAction()); | 
| +    state.beginFrameComplete(); | 
| +    EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.nextAction()); | 
| +    EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, state.commitState()); | 
| +    state.updateState(state.nextAction()); | 
| + | 
| +    state.didEnterVSync(); | 
| +    EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
| +    state.updateState(state.nextAction()); | 
| +    state.didDrawIfPossibleCompleted(true); | 
| +   state.didLeaveVSync(); | 
| + | 
| +   // Should be waiting for the normal begin frame | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, state.commitState()); | 
| +} | 
| + | 
| +TEST(SchedulerStateMachineTest, TestImmediateBeginFrameDuringCommit) | 
| +{ | 
| +   StateMachine state; | 
| +   state.setCanBeginFrame(true); | 
| +   state.setVisible(true); | 
| +   state.setCanDraw(true); | 
| + | 
| +   // Start a normal commit. | 
| +   state.setNeedsCommit(); | 
| +   state.updateState(state.nextAction()); | 
| + | 
| +   // Schedule a forced frame, commit it, draw it. | 
| +   state.setNeedsCommit(); | 
| +   state.setNeedsForcedCommit(); | 
| +   state.updateState(state.nextAction()); | 
| +   state.beginFrameComplete(); | 
| +   EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.nextAction()); | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, state.commitState()); | 
| +   state.updateState(state.nextAction()); | 
| + | 
| +   state.didEnterVSync(); | 
| +   EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
| +   state.updateState(state.nextAction()); | 
| +   state.didDrawIfPossibleCompleted(true); | 
| +   state.didLeaveVSync(); | 
| + | 
| +   // Should be waiting for the normal begin frame | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, state.commitState()) << state.toString(); | 
| +} | 
| + | 
| +TEST(SchedulerStateMachineTest, ImmediateBeginFrameWhileInvisible) | 
| +{ | 
| +   StateMachine state; | 
| +   state.setCanBeginFrame(true); | 
| +   state.setVisible(true); | 
| +   state.setCanDraw(true); | 
| + | 
| +   state.setNeedsCommit(); | 
| +   state.updateState(state.nextAction()); | 
| + | 
| +   state.setNeedsCommit(); | 
| +   state.setNeedsForcedCommit(); | 
| +   state.updateState(state.nextAction()); | 
| +   state.beginFrameComplete(); | 
| + | 
| +   EXPECT_EQ(SchedulerStateMachine::ACTION_COMMIT, state.nextAction()); | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_READY_TO_COMMIT, state.commitState()); | 
| +   state.updateState(state.nextAction()); | 
| + | 
| +   state.didEnterVSync(); | 
| +   EXPECT_EQ(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE, state.nextAction()); | 
| +   state.updateState(state.nextAction()); | 
| +   state.didDrawIfPossibleCompleted(true); | 
| +   state.didLeaveVSync(); | 
| + | 
| +   // Should be waiting for the normal begin frame | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, state.commitState()) << state.toString(); | 
| + | 
| + | 
| +   // Become invisible and abort the "normal" begin frame. | 
| +   state.setVisible(false); | 
| +   state.beginFrameAborted(); | 
| + | 
| +   // Should be back in the idle state, but needing a commit. | 
| +   EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.commitState()); | 
| +   EXPECT_TRUE(state.needsCommit()); | 
| +} | 
| + | 
| }  // namespace | 
| }  // namespace cc | 
|  |