Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index ac52271ec13c4a6b59582002fe110e45b6bb73ae..50cc846c44114edffbc07dfdc6f0faf117b95299 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -161,6 +161,10 @@ class FakeSchedulerClient : public SchedulerClient { |
begin_frame_is_sent_to_children_ = true; |
} |
+ void SendBeginMainFrameNotExpectedSoon() override { |
+ PushAction("SendBeginMainFrameNotExpectedSoon"); |
+ } |
+ |
base::Callback<bool(void)> ImplFrameDeadlinePending(bool state) { |
return base::Bind(&FakeSchedulerClient::ImplFrameDeadlinePendingCallback, |
base::Unretained(this), |
@@ -517,7 +521,8 @@ TEST_F(SchedulerTest, RequestCommit) { |
client_->Reset(); |
task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
client_->Reset(); |
} |
@@ -1001,7 +1006,8 @@ TEST_F(SchedulerTest, PrepareTiles) { |
EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
client->Reset(); |
task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending()); |
EXPECT_EQ(0, client->num_draws()); |
@@ -1376,7 +1382,8 @@ TEST_F(SchedulerTest, BeginRetroFrame) { |
client_->Reset(); |
task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
client_->Reset(); |
} |
@@ -1627,7 +1634,7 @@ void SchedulerTest::BeginFramesNotFromClient( |
// Make sure SetNeedsBeginFrame isn't called on the client |
// when the BeginFrame is no longer needed. |
task_runner().RunPendingTasks(); // Run posted deadline. |
- EXPECT_NO_ACTION(client_); |
+ EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); |
client_->Reset(); |
} |
@@ -1783,7 +1790,8 @@ TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterBeginFrameStarted) { |
client_->Reset(); |
scheduler_->DidLoseOutputSurface(); |
// Do nothing when impl frame is in deadine pending state. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
client_->Reset(); |
scheduler_->NotifyBeginMainFrameStarted(); |
@@ -1814,7 +1822,8 @@ void SchedulerTest::DidLoseOutputSurfaceAfterBeginFrameStartedWithHighLatency( |
client_->Reset(); |
scheduler_->DidLoseOutputSurface(); |
// Do nothing when impl frame is in deadine pending state. |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
client_->Reset(); |
// Run posted deadline. |
@@ -1881,10 +1890,12 @@ void SchedulerTest::DidLoseOutputSurfaceAfterReadyToCommit( |
scheduler_->DidLoseOutputSurface(); |
if (impl_side_painting) { |
// Sync tree should be forced to activate. |
- EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 2); |
+ EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 0, 3); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); |
} else { |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
} |
client_->Reset(); |
@@ -1916,7 +1927,8 @@ TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterSetNeedsPrepareTiles) { |
client_->Reset(); |
scheduler_->DidLoseOutputSurface(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
client_->Reset(); |
task_runner().RunPendingTasks(); // Run posted deadline. |
@@ -1967,8 +1979,9 @@ TEST_F(SchedulerTest, DidLoseOutputSurfaceAfterBeginRetroFramePosted) { |
client_->Reset(); |
EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
scheduler_->DidLoseOutputSurface(); |
- EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 2); |
- EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 2); |
+ EXPECT_ACTION("ScheduledActionBeginOutputSurfaceCreation", client_, 0, 3); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 1, 3); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3); |
EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
// Posted BeginRetroFrame is aborted. |
@@ -2028,7 +2041,8 @@ TEST_F(SchedulerTest, DidLoseOutputSurfaceDuringBeginRetroFrameRunning) { |
client_->Reset(); |
EXPECT_FALSE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
scheduler_->DidLoseOutputSurface(); |
- EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client_); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
EXPECT_TRUE(scheduler_->IsBeginRetroFrameArgsEmpty()); |
// BeginImplFrame deadline should abort drawing. |
@@ -2069,7 +2083,7 @@ TEST_F(SchedulerTest, |
client_->Reset(); |
scheduler_->DidLoseOutputSurface(); |
- EXPECT_NO_ACTION(client_); |
+ EXPECT_SINGLE_ACTION("SendBeginMainFrameNotExpectedSoon", client_); |
EXPECT_FALSE(scheduler_->frame_source().NeedsBeginFrames()); |
client_->Reset(); |
@@ -2347,5 +2361,40 @@ TEST_F(SchedulerTest, SwitchFrameSourceToThrottled) { |
EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
} |
+// Tests to ensure that we send a BeginMainFrameNotExpectedSoon when expected. |
+TEST_F(SchedulerTest, SendBeginMainFrameNotExpectedSoon) { |
+ scheduler_settings_.use_external_begin_frame_source = true; |
+ SetUpScheduler(true); |
+ |
+ // SetNeedsCommit should begin the frame on the next BeginImplFrame. |
+ scheduler_->SetNeedsCommit(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_); |
+ client_->Reset(); |
+ |
+ // Trigger a frame draw. |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ scheduler_->NotifyBeginMainFrameStarted(); |
+ scheduler_->NotifyReadyToCommit(); |
+ task_runner().RunPendingTasks(); |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 5); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 5); |
+ EXPECT_ACTION("ScheduledActionCommit", client_, 2, 5); |
+ EXPECT_ACTION("ScheduledActionAnimate", client_, 3, 5); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 4, 5); |
+ client_->Reset(); |
+ |
+ // The following BeginImplFrame deadline should SetNeedsBeginFrame(false) |
+ // and send a SendBeginMainFrameNotExpectedSoon. |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+ EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
+ client_->Reset(); |
+ |
+ task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client_, 0, 2); |
+ EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 1, 2); |
+ client_->Reset(); |
+} |
+ |
} // namespace |
} // namespace cc |