| Index: cc/scheduler/scheduler_unittest.cc
|
| diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
|
| index 46242e3d6b97bec4b20f3e17a440f26715da0886..9e42d450b352d72d6924c6c2930c1a12804a1f8f 100644
|
| --- a/cc/scheduler/scheduler_unittest.cc
|
| +++ b/cc/scheduler/scheduler_unittest.cc
|
| @@ -267,6 +267,10 @@ class FakeSchedulerClient : public SchedulerClient {
|
| actions_.push_back("ScheduledActionPrepareTiles");
|
| states_.push_back(scheduler_->AsValue());
|
| }
|
| + void ScheduledActionInvalidateOutputSurface() override {
|
| + actions_.push_back("ScheduledActionInvalidateOutputSurface");
|
| + states_.push_back(scheduler_->AsValue());
|
| + }
|
| void DidAnticipatedDrawTimeChange(base::TimeTicks) override {
|
| if (log_anticipated_draw_time_change_)
|
| actions_.push_back("DidAnticipatedDrawTimeChange");
|
| @@ -334,9 +338,14 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler,
|
| client->AdvanceFrame();
|
| }
|
|
|
| - // Run the posted deadline task.
|
| EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| - client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true));
|
| + if (scheduler->settings().using_synchronous_renderer_compositor) {
|
| + // Trigger deadline synchronously.
|
| + scheduler->OutputSurfaceDidRequestDraw();
|
| + } else {
|
| + // Run the posted deadline task.
|
| + client->task_runner().RunTasksWhile(client->ImplFrameDeadlinePending(true));
|
| + }
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
|
|
| {
|
| @@ -2284,5 +2293,69 @@ TEST(SchedulerTest,
|
| EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| }
|
|
|
| +TEST(SchedulerTest, UsingSynchronousCompositor) {
|
| + FakeSchedulerClient client;
|
| + SchedulerSettings settings;
|
| + settings.using_synchronous_renderer_compositor = true;
|
| + settings.use_external_begin_frame_source = true;
|
| + TestScheduler* scheduler = client.CreateScheduler(settings);
|
| +
|
| + scheduler->SetCanStart();
|
| + scheduler->SetVisible(true);
|
| + scheduler->SetCanDraw(true);
|
| +
|
| + InitializeOutputSurfaceAndFirstCommit(scheduler, &client);
|
| + client.Reset();
|
| +
|
| + // Static page. Scrolling initiated by webview. OnDraw comes in time.
|
| + scheduler->SetNeedsRedraw();
|
| + // Ask for BeginFrames.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
|
| + client.Reset();
|
| +
|
| + client.SendNextBeginFrame();
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 3);
|
| + EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3);
|
| + EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client, 2, 3);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + // Android onDraw.
|
| + scheduler->SetNeedsRedraw();
|
| + scheduler->OutputSurfaceDidRequestDraw();
|
| + EXPECT_SINGLE_ACTION("ScheduledActionDrawAndSwapIfPossible", client);
|
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + // It takes one more frame to call SetNeedsBeginFrames(false).
|
| + client.AdvanceFrame();
|
| + EXPECT_SINGLE_ACTION("WillBeginImplFrame", client);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + client.task_runner().RunTasksWhile(client.ImplFrameDeadlinePending(true));
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(false)", client);
|
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + // Static page. Scrolling initiated by webview. OnDraw does not come in time.
|
| + scheduler->SetNeedsRedraw();
|
| + // Ask for BeginFrames.
|
| + EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client);
|
| + client.Reset();
|
| +
|
| + client.SendNextBeginFrame();
|
| + EXPECT_ACTION("WillBeginImplFrame", client, 0, 3);
|
| + EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3);
|
| + EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client, 2, 3);
|
| + EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending());
|
| + client.Reset();
|
| +
|
| + // No onDraw => no draw action by the scheduler.
|
| + client.task_runner().RunUntilTime(client.now_src()->Now());
|
| + EXPECT_NO_ACTION(client);
|
| + EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending());
|
| +}
|
| +
|
| } // namespace
|
| } // namespace cc
|
|
|