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 |