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 7036459794ffd34cc16364b34fba0d55cd65b478..1bd92f36d1a0f25bed5640a05ce171c001b254f7 100644 |
--- a/cc/scheduler/scheduler_state_machine_unittest.cc |
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc |
@@ -718,7 +718,7 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
// Become invisible and abort the main thread's begin frame. |
state.SetVisible(false); |
- state.BeginFrameAbortedByMainThread(); |
+ state.BeginFrameAbortedByMainThread(false); |
// We should now be back in the idle state as if we didn't start a frame at |
// all. |
@@ -728,8 +728,14 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
// Become visible again. |
state.SetVisible(true); |
- // We should be beginning a frame now. |
+ // Although we have aborted on this frame and haven't cancelled the commit |
+ // (i.e. need another), don't send another begin frame yet. |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ EXPECT_TRUE(state.NeedsCommit()); |
+ |
+ // Start a new frame. |
+ state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
state.NextAction()); |
@@ -741,6 +747,51 @@ TEST(SchedulerStateMachineTest, TestGoesInvisibleBeforeFinishCommit) { |
state.CommitState()); |
} |
+TEST(SchedulerStateMachineTest, AbortBeginFrameAndCancelCommit) { |
+ SchedulerSettings default_scheduler_settings; |
+ StateMachine state(default_scheduler_settings); |
+ state.SetCanStart(); |
+ state.UpdateState(state.NextAction()); |
+ state.DidCreateAndInitializeOutputSurface(); |
+ state.SetVisible(true); |
+ state.SetCanDraw(true); |
+ |
+ // Get into a begin frame / commit state. |
+ state.SetNeedsCommit(); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
+ state.NextAction()); |
+ state.UpdateState( |
+ SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD); |
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_FRAME_IN_PROGRESS, |
+ state.CommitState()); |
+ EXPECT_FALSE(state.NeedsCommit()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ |
+ // Abort the commit, cancelling future commits. |
+ state.BeginFrameAbortedByMainThread(true); |
+ |
+ // Verify that another commit doesn't start on the same frame. |
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ EXPECT_FALSE(state.NeedsCommit()); |
+ |
+ // Start a new frame. |
+ state.DidEnterBeginFrame(BeginFrameArgs::CreateForTesting()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ state.DidLeaveBeginFrame(); |
+ |
+ // Verify another commit doesn't start on another frame either. |
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_NONE, state.NextAction()); |
+ EXPECT_FALSE(state.NeedsCommit()); |
+ |
+ // Verify another commit can start if requested, though. |
+ state.SetNeedsCommit(); |
+ EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |
+ EXPECT_EQ(SchedulerStateMachine::ACTION_SEND_BEGIN_FRAME_TO_MAIN_THREAD, |
+ state.NextAction()); |
+} |
+ |
TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
SchedulerSettings default_scheduler_settings; |
StateMachine state(default_scheduler_settings); |
@@ -1192,7 +1243,7 @@ TEST(SchedulerStateMachineTest, |
// Become invisible and abort the main thread's begin frame. |
state.SetVisible(false); |
- state.BeginFrameAbortedByMainThread(); |
+ state.BeginFrameAbortedByMainThread(false); |
// Should be back in the idle state, but needing a commit. |
EXPECT_EQ(SchedulerStateMachine::COMMIT_STATE_IDLE, state.CommitState()); |