| 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..da53e5dea99377c194767652cd56856fd712facf 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_begin_main_frame_not_sent_before_impl_frame_deadline) {
|
| // 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_begin_main_frame_not_sent_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,
|
|
|