Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2657)

Unified Diff: cc/scheduler/scheduler_state_machine_unittest.cc

Issue 2632563003: [cc] Calculate the correct latest_confirmed_sequence_number in cc::Scheduler. (Closed)
Patch Set: Fix handling of source_id changes and add some Scheduler tests. Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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 93e2cc26faa84e547c97b8c21202b6d947a22f42..790a1de1b19ed48d379fbea508ef4f8712ada589 100644
--- a/cc/scheduler/scheduler_state_machine_unittest.cc
+++ b/cc/scheduler/scheduler_state_machine_unittest.cc
@@ -7,6 +7,7 @@
#include <stddef.h>
#include "base/trace_event/trace_event.h"
+#include "cc/output/begin_frame_args.h"
#include "cc/scheduler/scheduler.h"
#include "cc/test/begin_frame_args_test.h"
#include "testing/gtest/include/gtest/gtest.h"
@@ -22,6 +23,19 @@
EXPECT_STREQ(SchedulerStateMachine::enum_tostring(expected), \
SchedulerStateMachine::enum_tostring(actual))
+#define EXPECT_SEQUENCE_NUMBERS(current, main_frame, pending_tree, \
+ active_tree, compositor_frame) \
+ EXPECT_EQ(current, state.begin_frame_sequence_number()); \
+ EXPECT_EQ(main_frame, \
+ state.last_begin_frame_sequence_number_begin_main_frame_sent()); \
+ EXPECT_EQ(pending_tree, \
+ state.last_begin_frame_sequence_number_pending_tree_was_fresh()); \
+ EXPECT_EQ(active_tree, \
+ state.last_begin_frame_sequence_number_active_tree_was_fresh()); \
+ EXPECT_EQ( \
+ compositor_frame, \
+ state.last_begin_frame_sequence_number_compositor_frame_was_fresh())
+
#define EXPECT_IMPL_FRAME_STATE(expected) \
EXPECT_ENUM_EQ(BeginImplFrameStateToString, expected, \
state.begin_impl_frame_state()) \
@@ -86,6 +100,10 @@ class StateMachine : public SchedulerStateMachine {
compositor_frame_sink_state_ = COMPOSITOR_FRAME_SINK_ACTIVE;
}
+ void IssueNextBeginImplFrame() {
+ OnBeginImplFrame(0, next_begin_frame_number_++);
+ }
+
void SetBeginMainFrameState(BeginMainFrameState cs) {
begin_main_frame_state_ = cs;
}
@@ -150,12 +168,26 @@ class StateMachine : public SchedulerStateMachine {
has_pending_tree_ = has_pending_tree;
}
+ uint64_t begin_frame_sequence_number() const {
+ return begin_frame_sequence_number_;
+ }
+ uint64_t last_begin_frame_sequence_number_begin_main_frame_sent() const {
+ return last_begin_frame_sequence_number_begin_main_frame_sent_;
+ }
+ uint64_t last_begin_frame_sequence_number_pending_tree_was_fresh() const {
+ return last_begin_frame_sequence_number_pending_tree_was_fresh_;
+ }
+ uint64_t last_begin_frame_sequence_number_active_tree_was_fresh() const {
+ return last_begin_frame_sequence_number_active_tree_was_fresh_;
+ }
+
using SchedulerStateMachine::ShouldTriggerBeginImplFrameDeadlineImmediately;
using SchedulerStateMachine::ProactiveBeginFrameWanted;
using SchedulerStateMachine::WillCommit;
protected:
DrawResult draw_result_for_test_;
+ uint64_t next_begin_frame_number_ = BeginFrameArgs::kStartingFrameNumber;
};
void PerformAction(StateMachine* sm, SchedulerStateMachine::Action action) {
@@ -271,7 +303,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.NeedsCommit());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -290,7 +322,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_TRUE(state.NeedsCommit());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -318,7 +350,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
EXPECT_TRUE(state.NeedsCommit());
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -345,7 +377,7 @@ TEST(SchedulerStateMachineTest, TestNextActionBeginsMainFrameIfNeeded) {
EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -367,7 +399,7 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
EXPECT_TRUE(state.BeginFrameNeeded());
// Commit to the pending tree.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -383,7 +415,7 @@ TEST(SchedulerStateMachineTest, MainFrameBeforeActivationEnabled) {
// Verify that the next commit starts while there is still a pending tree.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -420,7 +452,7 @@ TEST(SchedulerStateMachineTest,
EXPECT_TRUE(state.BeginFrameNeeded());
// Start a frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.CommitPending());
@@ -438,7 +470,7 @@ TEST(SchedulerStateMachineTest,
// finishes and the requested commit wasn't actually necessary.
EXPECT_TRUE(state.CommitPending());
EXPECT_TRUE(state.RedrawPending());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
@@ -457,7 +489,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
EXPECT_TRUE(state.BeginFrameNeeded());
// Start a frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.CommitPending());
@@ -475,7 +507,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
// It doesn't request a draw until we get a new commit though.
EXPECT_TRUE(state.CommitPending());
EXPECT_FALSE(state.RedrawPending());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -493,7 +525,7 @@ TEST(SchedulerStateMachineTest, FailedDrawForMissingHighResNeedsCommit) {
EXPECT_TRUE(state.RedrawPending());
// Verify we draw with the new frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
state.SetDrawResultForTest(DRAW_SUCCESS);
@@ -514,7 +546,7 @@ TEST(SchedulerStateMachineTest,
// Start a commit.
state.SetNeedsBeginMainFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -545,7 +577,7 @@ TEST(SchedulerStateMachineTest,
EXPECT_TRUE(state.RedrawPending());
// The redraw should be forced at the end of the next BeginImplFrame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -569,7 +601,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
// Start a commit.
state.SetNeedsBeginMainFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -583,7 +615,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
// Fail the draw enough times to force a redraw.
for (int i = 0; i < draw_limit; ++i) {
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
@@ -604,7 +636,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawsDoNotRestartForcedDraw) {
// redraw, but not back in IDLE.
for (int i = 0; i < draw_limit; ++i) {
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
state.SetDrawResultForTest(DRAW_ABORTED_CHECKERBOARD_ANIMATIONS);
@@ -626,7 +658,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
// Start a draw.
state.SetNeedsRedraw(true);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_TRUE(state.RedrawPending());
@@ -641,7 +673,7 @@ TEST(SchedulerStateMachineTest, TestFailedDrawIsRetriedInNextBeginImplFrame) {
// We should not be trying to draw again now, but we have a commit pending.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// We should try to draw again at the end of the next BeginImplFrame on
@@ -662,7 +694,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
// Draw the first frame.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
@@ -678,7 +710,7 @@ TEST(SchedulerStateMachineTest, TestDoestDrawTwiceInSameFrame) {
// Move to another frame. This should now draw.
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
@@ -816,7 +848,7 @@ TEST(SchedulerStateMachineTest, TestCanRedraw_StopsDraw) {
state.SetVisible(false);
state.SetNeedsRedraw(true);
if (j == 1)
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
state.SetCanDraw(false);
EXPECT_NE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE,
@@ -839,7 +871,7 @@ TEST(SchedulerStateMachineTest,
state.SetNeedsBeginMainFrame();
state.SetNeedsRedraw(true);
state.SetCanDraw(false);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_ABORT);
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -863,7 +895,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) {
EXPECT_TRUE(state.BeginFrameNeeded());
// Begin the frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -892,7 +924,7 @@ TEST(SchedulerStateMachineTest, TestSetNeedsBeginMainFrameIsNotLost) {
EXPECT_IMPL_FRAME_STATE(SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_IDLE);
EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_IMPL_FRAME_STATE(
SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
EXPECT_ACTION(SchedulerStateMachine::ACTION_COMMIT);
@@ -924,7 +956,7 @@ TEST(SchedulerStateMachineTest, TestFullCycle) {
state.SetNeedsBeginMainFrame();
// Begin the frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -970,7 +1002,7 @@ TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) {
state.SetNeedsBeginMainFrame();
// Make a main frame, commit and activate it. But don't draw it.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
state.NotifyBeginMainFrameStarted();
@@ -983,7 +1015,7 @@ TEST(SchedulerStateMachineTest, CommitWithoutDrawWithPendingTree) {
// pending tree and not clobber the active tree, we're able to start a new
// begin frame and commit it.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
state.NotifyBeginMainFrameStarted();
@@ -1002,7 +1034,7 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) {
state.SetNeedsBeginMainFrame();
// Make a main frame, commit and activate it. But don't draw it.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
state.NotifyBeginMainFrameStarted();
@@ -1014,7 +1046,7 @@ TEST(SchedulerStateMachineTest, DontCommitWithoutDrawWithoutPendingTree) {
// Try to make a new main frame before drawing, but since we would clobber the
// active tree, we will not do so.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
}
@@ -1026,7 +1058,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) {
// Perform a commit so that we have an active tree.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1041,7 +1073,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) {
// Ask for another commit but abort it. Verify that we didn't reset pending
// tree state.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1055,7 +1087,7 @@ TEST(SchedulerStateMachineTest, AbortedMainFrameDoesNotResetPendingTree) {
// Ask for another commit that doesn't abort.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1084,7 +1116,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
state.SetNeedsBeginMainFrame();
// Begin the frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -1111,7 +1143,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
// Can't BeginMainFrame yet since last commit hasn't been drawn yet.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Now call ready to draw which will allow the draw to happen and
@@ -1124,7 +1156,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitToActive) {
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Can't BeginMainFrame yet since we're submit-frame throttled.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// CompositorFrameAck unblocks BeginMainFrame.
@@ -1154,7 +1186,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
state.SetNeedsBeginMainFrame();
// Begin the frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -1193,7 +1225,7 @@ TEST(SchedulerStateMachineTest, TestFullCycleWithCommitRequestInbetween) {
EXPECT_FALSE(state.needs_redraw());
// Next BeginImplFrame should initiate second commit.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1256,7 +1288,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) {
state.SetNeedsBeginMainFrame();
// Begin the frame while visible.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -1290,7 +1322,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseInvisible) {
EXPECT_TRUE(state.NeedsCommit());
// Start a new frame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
@@ -1312,7 +1344,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
// Get into a begin frame / commit state.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_SENT);
@@ -1336,7 +1368,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
EXPECT_FALSE(state.NeedsCommit());
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1344,7 +1376,7 @@ TEST(SchedulerStateMachineTest, TestAbortBeginMainFrameBecauseCommitNotNeeded) {
// Verify another commit can start if requested, though.
state.SetNeedsBeginMainFrame();
EXPECT_MAIN_FRAME_STATE(SchedulerStateMachine::BEGIN_MAIN_FRAME_STATE_IDLE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1360,14 +1392,14 @@ TEST(SchedulerStateMachineTest, TestFirstContextCreation) {
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Check that the first init does not SetNeedsBeginMainFrame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Check that a needs commit initiates a BeginMainFrame.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1392,7 +1424,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhenCompletelyIdle) {
state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
// When the context is recreated, we should begin a commit.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1414,14 +1446,14 @@ TEST(SchedulerStateMachineTest,
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// Once context recreation begins, nothing should happen.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// While context is recreating, commits shouldn't begin.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1438,7 +1470,7 @@ TEST(SchedulerStateMachineTest,
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
// When the BeginFrame comes in we should begin a commit
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1464,7 +1496,7 @@ TEST(SchedulerStateMachineTest,
// Finishing the first commit after initializing an CompositorFrameSink should
// automatically cause a redraw.
EXPECT_TRUE(state.RedrawPending());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
@@ -1472,7 +1504,7 @@ TEST(SchedulerStateMachineTest,
EXPECT_FALSE(state.RedrawPending());
// Next frame as no work to do.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1480,7 +1512,7 @@ TEST(SchedulerStateMachineTest,
// Once the context is recreated, whether we draw should be based on
// SetCanDraw if waiting on first draw after activate.
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
@@ -1494,7 +1526,7 @@ TEST(SchedulerStateMachineTest,
// SetCanDraw if waiting on first draw after activate.
state.SetNeedsRedraw(true);
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1526,7 +1558,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
// Set damage and expect a draw.
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1560,7 +1592,7 @@ TEST(SchedulerStateMachineTest, TestContextLostWhileCommitInProgress) {
EXPECT_ACTION(
SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_IMPL_FRAME_STATE(
SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
@@ -1583,7 +1615,7 @@ TEST(SchedulerStateMachineTest,
// Set damage and expect a draw.
state.SetNeedsRedraw(true);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1617,7 +1649,7 @@ TEST(SchedulerStateMachineTest,
EXPECT_ACTION(
SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_IMPL_FRAME_STATE(
SchedulerStateMachine::BEGIN_IMPL_FRAME_STATE_INSIDE_BEGIN_FRAME);
EXPECT_ACTION(SchedulerStateMachine::ACTION_NONE);
@@ -1633,7 +1665,7 @@ TEST(SchedulerStateMachineTest,
// After we get a new CompositorFrameSink, the commit flow should start.
state.CreateAndInitializeCompositorFrameSinkWithActivatedCommit();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1667,7 +1699,7 @@ TEST(SchedulerStateMachineTest,
state.DidCreateAndInitializeCompositorFrameSink();
EXPECT_FALSE(state.RedrawPending());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION(SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1730,7 +1762,7 @@ TEST(SchedulerStateMachineTest, TestNoBeginMainFrameWhenInvisible) {
// When become visible again, the needs commit should still be pending.
state.SetVisible(true);
EXPECT_TRUE(state.BeginFrameNeeded());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -1894,7 +1926,7 @@ TEST(SchedulerStateMachineTest,
// This test mirrors what happens during the first frame of a scroll gesture.
// First we get the input event and a BeginFrame.
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
// As a response the compositor requests a redraw and a commit to tell the
// main thread about the new scroll offset.
@@ -1929,7 +1961,7 @@ void FinishPreviousCommitAndDrawWithoutExitingDeadline(
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_TRUE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
@@ -1947,7 +1979,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
// in prefer impl latency mode.
state.SetNeedsRedraw(true);
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -1984,7 +2016,7 @@ TEST(SchedulerStateMachineTest, TestImplLatencyTakesPriority) {
// throttled and did not just submit one.
state.SetNeedsBeginMainFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
EXPECT_FALSE(state.ShouldTriggerBeginImplFrameDeadlineImmediately());
state.OnBeginImplFrameDeadline();
@@ -1999,7 +2031,7 @@ TEST(SchedulerStateMachineTest,
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -2019,7 +2051,7 @@ TEST(SchedulerStateMachineTest, TestTriggerDeadlineImmediatelyWhenInvisible) {
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -2039,7 +2071,7 @@ TEST(SchedulerStateMachineTest,
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
@@ -2062,14 +2094,14 @@ TEST(SchedulerStateMachineTest, TestDeferCommit) {
EXPECT_FALSE(state.BeginFrameNeeded());
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.OnBeginImplFrameDeadline();
EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
state.SetDeferCommits(false);
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_ACTION_UPDATE_STATE(
SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
}
@@ -2083,7 +2115,7 @@ TEST(SchedulerStateMachineTest, EarlyOutCommitWantsProactiveBeginFrame) {
bool commit_has_no_updates = true;
state.WillCommit(commit_has_no_updates);
EXPECT_TRUE(state.ProactiveBeginFrameWanted());
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
EXPECT_FALSE(state.ProactiveBeginFrameWanted());
}
@@ -2095,7 +2127,7 @@ TEST(SchedulerStateMachineTest,
// Set up the request for a commit and start a frame.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
// Lose the CompositorFrameSink.
@@ -2131,7 +2163,7 @@ TEST(SchedulerStateMachineTest, CompositorFrameSinkCreationWhileCommitPending) {
// Set up the request for a commit and start a frame.
state.SetNeedsBeginMainFrame();
- state.OnBeginImplFrame();
+ state.IssueNextBeginImplFrame();
PerformAction(&state, SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
// Lose the CompositorFrameSink.
@@ -2150,5 +2182,266 @@ TEST(SchedulerStateMachineTest, CompositorFrameSinkCreationWhileCommitPending) {
SchedulerStateMachine::ACTION_BEGIN_COMPOSITOR_FRAME_SINK_CREATION);
}
+TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessInitialState) {
+ SchedulerSettings default_scheduler_settings;
+ StateMachine state(default_scheduler_settings);
+ SET_UP_STATE(state)
+
+ // Initially, we report a valid current frame number, but invalid frame
+ // numbers for freshness.
+ EXPECT_SEQUENCE_NUMBERS(
+ BeginFrameArgs::kStartingFrameNumber, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+}
+
+TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithoutUpdates) {
+ // Setup without any requested updates.
+ SchedulerSettings default_scheduler_settings;
+ StateMachine state(default_scheduler_settings);
+ SET_UP_STATE(state)
+ state.SetNeedsRedraw(false);
+ EXPECT_FALSE(state.RedrawPending());
+ EXPECT_FALSE(state.NeedsCommit());
+
+ // OnBeginImplFrame() updates the sequence number.
+ state.OnBeginImplFrame(0, 10);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // When no updates are required, OnBeginImplFrameDeadline() updates active
+ // tree and compositor frame freshness.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber, 10u, 10u);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+}
+
+TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithImplFrameUpdates) {
+ // Setup with an impl-thread draw requested.
+ SchedulerSettings default_scheduler_settings;
+ StateMachine state(default_scheduler_settings);
+ SET_UP_STATE(state)
+ state.SetNeedsRedraw(true);
+ EXPECT_TRUE(state.RedrawPending());
+ EXPECT_FALSE(state.NeedsCommit());
+
+ // OnBeginImplFrame() updates the sequence number.
+ state.OnBeginImplFrame(0, 10);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // With only an impl-thread draw requested, OnBeginImplFrameDeadline()
+ // updates the active tree freshness.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber, 10u,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // Compositor frame freshness is updated when active tree is drawn.
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.RedrawPending());
+ state.DidSubmitCompositorFrame();
+ state.DidReceiveCompositorFrameAck();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber, 10u, 10u);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+}
+
+TEST(SchedulerStateMachineTest, TestBeginFrameFreshnessWithMainFrameUpdates) {
+ // Setup with a BeginMainFrame requested.
+ SchedulerSettings default_scheduler_settings;
+ StateMachine state(default_scheduler_settings);
+ SET_UP_STATE(state)
+ state.SetNeedsRedraw(false);
+ state.SetNeedsBeginMainFrameForTest(true);
+ EXPECT_FALSE(state.RedrawPending());
+ EXPECT_TRUE(state.NeedsCommit());
+
+ // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame()
+ // updates begin_main_frame_sent sequence number.
+ state.OnBeginImplFrame(0, 10);
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.NeedsCommit());
+ EXPECT_TRUE(state.CommitPending());
+ EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // When a BeginMainFrame is needed, OnBeginImplFrameDeadline() updates no
+ // freshness numbers.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // When a main frame is in progress, OnBeginImplFrameDeadline() updates no
+ // freshness numbers.
+ state.NotifyBeginMainFrameStarted();
+ state.OnBeginImplFrame(0, 11);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(11u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Pending tree freshness is updated when the new pending tree is committed.
+ state.NotifyReadyToCommit();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_COMMIT);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.CommitPending());
+ EXPECT_TRUE(state.has_pending_tree());
+ EXPECT_SEQUENCE_NUMBERS(11u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // If no further BeginMainFrame is needed, OnBeginFrameImplDeadline()
+ // updates the pending tree's frame number.
+ state.OnBeginImplFrame(0, 12);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(12u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // If a further BeginMainFrame is needed, OnBeginFrameImplDeadline()
+ // updates no freshness numbers.
+ state.SetNeedsBeginMainFrameForTest(true);
+ EXPECT_TRUE(state.NeedsCommit());
+ state.OnBeginImplFrame(0, 13);
+ // BMF will be sent only after pending_tree activation.
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Active tree freshness is updated when pending frame is activated.
+ state.NotifyReadyToActivate();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_ACTIVATE_SYNC_TREE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.has_pending_tree());
+ EXPECT_SEQUENCE_NUMBERS(13u, 10u, 12u, 12u,
+ BeginFrameArgs::kInvalidFrameNumber);
+ EXPECT_TRUE(state.RedrawPending());
+
+ // BMF requested above will be sent after activation.
+ state.OnBeginImplFrame(0, 14);
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // Active tree freshness is updated when commit didn't have updates.
+ state.NotifyBeginMainFrameStarted();
+ state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
+ EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // Compositor frame freshness is updated when active tree is drawn.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_DRAW_IF_POSSIBLE);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.RedrawPending());
+ state.DidSubmitCompositorFrame();
+ state.DidReceiveCompositorFrameAck();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(14u, 14u, 12u, 14u, 14u);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // When no updates are required, OnBeginImplFrameDeadline() updates active
+ // tree and compositor frame freshness.
+ state.OnBeginImplFrame(0, 15);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(15u, 14u, 12u, 15u, 15u);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+
+ // 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_NONE);
+ EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // When no updates are required, OnBeginImplFrameDeadline() updates active
+ // tree and compositor frame freshness.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(5u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber, 5u, 5u);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+}
+
+TEST(SchedulerStateMachineTest,
+ TestBeginFrameFreshnessWithNoUpdatesCommitAndPendingTree) {
+ // Setup with main_frame_before_activation_enabled, a pending tree, and a
+ // new BeginMainFrame requested.
+ SchedulerSettings settings;
+ settings.main_frame_before_activation_enabled = true;
+ StateMachine state(settings);
+ SET_UP_STATE(state)
+ state.SetHasPendingTree(true);
+ state.SetNeedsRedraw(false);
+ state.SetNeedsBeginMainFrameForTest(true);
+ EXPECT_FALSE(state.RedrawPending());
+ EXPECT_TRUE(state.NeedsCommit());
+
+ // OnBeginImplFrame() updates the sequence number, WillSendBeginMainFrame()
+ // updates begin_main_frame_sent sequence number.
+ state.OnBeginImplFrame(0, 10);
+ EXPECT_ACTION_UPDATE_STATE(
+ SchedulerStateMachine::ACTION_SEND_BEGIN_MAIN_FRAME);
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_FALSE(state.NeedsCommit());
+ EXPECT_TRUE(state.CommitPending());
+ EXPECT_SEQUENCE_NUMBERS(10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // Pending tree freshness is updated when commit didn't have updates, but an
+ // older pending tree is still pending.
+ state.NotifyBeginMainFrameStarted();
+ state.BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES);
+ EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+
+ // As no further BeginMainFrame is needed, OnBeginFrameImplDeadline()
+ // updates the pending tree's frame number, but without any visible change.
+ state.OnBeginImplFrameDeadline();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+ EXPECT_SEQUENCE_NUMBERS(10u, 10u, 10u, BeginFrameArgs::kInvalidFrameNumber,
+ BeginFrameArgs::kInvalidFrameNumber);
+ state.OnBeginImplFrameIdle();
+ EXPECT_ACTION_UPDATE_STATE(SchedulerStateMachine::ACTION_NONE);
+}
+
} // namespace
} // namespace cc

Powered by Google App Engine
This is Rietveld 408576698