Chromium Code Reviews| 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..6e386658d4b64d145bb6f2790f0bbcdfe8cde5a7 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT: |
| + sm->WillNotifyBeginMainFrameNotSent(); |
| + return; |
| + |
| case SchedulerStateMachine::ACTION_COMMIT: { |
| bool commit_has_no_updates = false; |
| sm->WillCommit(commit_has_no_updates); |
| @@ -290,6 +294,27 @@ TEST(SchedulerStateMachineTest, BeginFrameNeeded) { |
| EXPECT_FALSE(state.BeginFrameNeeded()); |
| } |
| +TEST(SchedulerStateMachineTest, TestNextActionNotifyBeginMainFrameNotSent) { |
| + 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| + 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 +334,8 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) { |
| EXPECT_FALSE(state.NeedsCommit()); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| @@ -458,6 +485,8 @@ TEST(SchedulerStateMachineTest, |
| // Start a frame. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.CommitPending()); |
| @@ -495,6 +524,8 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| // Start a frame. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_FALSE(state.CommitPending()); |
| @@ -531,6 +562,8 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) { |
| // Verify we draw with the new frame. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| state.SetDrawResultForTest(DRAW_SUCCESS); |
| @@ -664,6 +697,8 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) { |
| state.SetNeedsRedraw(true); |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_TRUE(state.RedrawPending()); |
| @@ -700,6 +735,8 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| // Draw the first frame. |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| @@ -716,6 +753,8 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) { |
| // Move to another frame. This should now draw. |
| EXPECT_TRUE(state.BeginFrameNeeded()); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -1400,6 +1439,8 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) { |
| EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1424,6 +1465,8 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) { |
| // Check that the first init does not SetNeedsBeginMainFrame. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1478,6 +1521,8 @@ TEST(SchedulerStateMachineTest, |
| // Once context recreation begins, nothing should happen. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1528,6 +1573,8 @@ TEST(SchedulerStateMachineTest, |
| // automatically cause a redraw. |
| EXPECT_TRUE(state.RedrawPending()); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -1536,6 +1583,8 @@ TEST(SchedulerStateMachineTest, |
| // Next frame as no work to do. |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -1544,6 +1593,8 @@ TEST(SchedulerStateMachineTest, |
| // SetCanDraw if waiting on first draw after activate. |
| state.SetNeedsRedraw(true); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE); |
| @@ -1636,6 +1687,8 @@ 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, 10u, |
| BeginFrameArgs::kInvalidFrameNumber); |
| @@ -1993,7 +2046,8 @@ TEST(SchedulerStateMachineTest, |
| } |
| void FinishPreviousCommitAndDrawWithoutExitingDeadline( |
| - StateMachine* state_ptr) { |
| + StateMachine* state_ptr, |
| + bool expect_idle_work_before_impl_frame_deadline) { |
|
Sami
2017/04/20 11:15:10
nit: expect_begin_main_frame_not_sent_before_impl_
Dan Elphick
2017/04/20 12:39:46
Done.
|
| // Gross, but allows us to use macros below. |
| StateMachine& state = *state_ptr; |
| @@ -2006,6 +2060,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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| + } |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately()); |
| @@ -2045,7 +2103,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 +2111,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 +2292,8 @@ TEST(SchedulerStateMachineTest, ImplSideInvalidationOnlyInsideDeadline) { |
| state.SetNeedsImplSideInvalidation(); |
| state.IssueNextBeginImplFrame(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE( |
| @@ -2257,6 +2317,8 @@ TEST(SchedulerStateMachineTest, |
| state.SetNeedsImplSideInvalidation(); |
| state.IssueNextBeginImplFrame(); |
| state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Initializing the CompositorFrameSink puts us in a state waiting for the |
| @@ -2351,6 +2413,8 @@ TEST(SchedulerStateMachineTest, |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Request another invalidation, which should wait until the pending tree is |
| @@ -2399,6 +2463,8 @@ TEST(SchedulerStateMachineTest, ImplSideInvalidationsThrottledOnDraw) { |
| state.SetNeedsImplSideInvalidation(); |
| state.IssueNextBeginImplFrame(); |
| state.OnBeginImplFrameDeadline(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| // Ack the previous frame and begin impl frame, which should perform the |
| @@ -2447,6 +2513,8 @@ TEST(SchedulerStateMachineTest, PrepareTilesWaitForImplSideInvalidation) { |
| EXPECT_ACTION_UPDATE_STATE( |
| SchedulerStateMachine::ACTION_PERFORM_IMPL_SIDE_INVALIDATION); |
| state.DidPrepareTiles(); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| } |
| @@ -2473,6 +2541,8 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) { |
| // OnBeginImplFrame() updates the sequence number. |
| state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| BeginFrameArgs::kInvalidFrameNumber, |
| @@ -2500,6 +2570,8 @@ TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) { |
| // OnBeginImplFrame() updates the sequence number. |
| state.OnBeginImplFrame(0, 10); |
| + EXPECT_ACTION_UPDATE_STATE( |
| + SchedulerStateMachine::ACTION_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber, |
| BeginFrameArgs::kInvalidFrameNumber, |
| @@ -2583,6 +2655,8 @@ 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_SEQUENCE_NUMBERS(12u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber, |
| BeginFrameArgs::kInvalidFrameNumber); |
| @@ -2644,6 +2718,8 @@ 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| state.OnBeginImplFrameDeadline(); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| @@ -2673,6 +2749,8 @@ 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_NOTIFY_BEGIN_MAIN_FRAME_NOT_SENT); |
| EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE); |
| EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber, |
| BeginFrameArgs::kInvalidFrameNumber, |