| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index 2f878fdcdbfa9a22a3d101934c3200fb3c30b96d..8b2face59e5a382d3f31534307d53a5745694cb6 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -400,13 +400,15 @@ class SchedulerTest : public testing::Test {
|
| }
|
| }
|
|
|
| - void SendNextBeginFrame() {
|
| + BeginFrameArgs SendNextBeginFrame() {
|
| DCHECK(scheduler_->settings().use_external_begin_frame_source);
|
| // Creep the time forward so that any BeginFrameArgs is not equal to the
|
| // last one otherwise we violate the BeginFrameSource contract.
|
| now_src_->AdvanceNow(BeginFrameArgs::DefaultInterval());
|
| - fake_external_begin_frame_source_->TestOnBeginFrame(
|
| - CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src()));
|
| + BeginFrameArgs args =
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
|
| + fake_external_begin_frame_source_->TestOnBeginFrame(args);
|
| + return args;
|
| }
|
|
|
| FakeExternalBeginFrameSource* fake_external_begin_frame_source() const {
|
| @@ -1606,7 +1608,7 @@ TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) {
|
| scheduler_->NotifyBeginMainFrameStarted();
|
|
|
| client_->Reset();
|
| - SendNextBeginFrame();
|
| + BeginFrameArgs retro_frame_args = SendNextBeginFrame();
|
| // This BeginFrame is queued up as a retro frame.
|
| EXPECT_NO_ACTION(client_);
|
| // The previous deadline is still pending.
|
| @@ -1630,10 +1632,8 @@ TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) {
|
| scheduler_->SetNeedsRedraw();
|
| EXPECT_NO_ACTION(client_);
|
|
|
| - // Let's advance sufficiently past the next frame's deadline.
|
| - now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() -
|
| - BeginFrameArgs::DefaultEstimatedParentDrawTime() +
|
| - base::TimeDelta::FromMicroseconds(1));
|
| + // Let's advance to the retro frame's deadline.
|
| + now_src()->AdvanceNow(retro_frame_args.deadline - now_src()->Now());
|
|
|
| // The retro frame hasn't expired yet.
|
| task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(false));
|
| @@ -1648,7 +1648,7 @@ TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooEarly) {
|
| EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client_);
|
| }
|
|
|
| -TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooLate) {
|
| +TEST_F(SchedulerTest, RetroFrameExpiresOnTime) {
|
| scheduler_settings_.use_external_begin_frame_source = true;
|
| SetUpScheduler(true);
|
|
|
| @@ -1666,7 +1666,7 @@ TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooLate) {
|
| scheduler_->NotifyBeginMainFrameStarted();
|
|
|
| client_->Reset();
|
| - SendNextBeginFrame();
|
| + BeginFrameArgs retro_frame_args = SendNextBeginFrame();
|
| // This BeginFrame is queued up as a retro frame.
|
| EXPECT_NO_ACTION(client_);
|
| // The previous deadline is still pending.
|
| @@ -1690,14 +1690,64 @@ TEST_F(SchedulerTest, RetroFrameDoesNotExpireTooLate) {
|
| scheduler_->SetNeedsRedraw();
|
| EXPECT_NO_ACTION(client_);
|
|
|
| - // Let's advance sufficiently past the next frame's deadline.
|
| - now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval() +
|
| + // Let's advance sufficiently past the retro frame's deadline.
|
| + now_src()->AdvanceNow(retro_frame_args.deadline - now_src()->Now() +
|
| base::TimeDelta::FromMicroseconds(1));
|
|
|
| // The retro frame should've expired.
|
| EXPECT_NO_ACTION(client_);
|
| }
|
|
|
| +TEST_F(SchedulerTest, MissedFrameDoesNotExpireTooEarly) {
|
| + scheduler_settings_.use_external_begin_frame_source = true;
|
| + SetUpScheduler(true);
|
| +
|
| + scheduler_->SetNeedsCommit();
|
| + EXPECT_TRUE(client_->needs_begin_frames());
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
|
| +
|
| + BeginFrameArgs missed_frame_args =
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
|
| + missed_frame_args.type = BeginFrameArgs::MISSED;
|
| +
|
| + // Advance to the deadline.
|
| + now_src()->AdvanceNow(missed_frame_args.deadline - now_src()->Now());
|
| +
|
| + // Missed frame is handled because it's on time.
|
| + client_->Reset();
|
| + fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args);
|
| + EXPECT_TRUE(
|
| + task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(false)));
|
| + EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2);
|
| + EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2);
|
| + EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending());
|
| +}
|
| +
|
| +TEST_F(SchedulerTest, MissedFrameExpiresOnTime) {
|
| + scheduler_settings_.use_external_begin_frame_source = true;
|
| + SetUpScheduler(true);
|
| +
|
| + scheduler_->SetNeedsCommit();
|
| + EXPECT_TRUE(client_->needs_begin_frames());
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client_);
|
| +
|
| + BeginFrameArgs missed_frame_args =
|
| + CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
|
| + missed_frame_args.type = BeginFrameArgs::MISSED;
|
| +
|
| + // Advance sufficiently past the deadline.
|
| + now_src()->AdvanceNow(missed_frame_args.deadline - now_src()->Now() +
|
| + base::TimeDelta::FromMicroseconds(1));
|
| +
|
| + // Missed frame is dropped because it's too late.
|
| + client_->Reset();
|
| + fake_external_begin_frame_source_->TestOnBeginFrame(missed_frame_args);
|
| + EXPECT_FALSE(
|
| + task_runner().RunTasksWhile(client_->ImplFrameDeadlinePending(false)));
|
| + EXPECT_NO_ACTION(client_);
|
| + EXPECT_FALSE(scheduler_->BeginImplFrameDeadlinePending());
|
| +}
|
| +
|
| void SchedulerTest::BeginFramesNotFromClient(
|
| bool use_external_begin_frame_source,
|
| bool throttle_frame_production) {
|
|
|