| 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
 | 
| 
 |