Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index ac52271ec13c4a6b59582002fe110e45b6bb73ae..c51d12e7bee8e73634bcdb4f5e55565914576866 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -143,6 +143,10 @@ class FakeSchedulerClient : public SchedulerClient { |
void ScheduledActionPrepareTiles() override { |
PushAction("ScheduledActionPrepareTiles"); |
} |
+ void ScheduledActionInvalidateOutputSurface() override { |
+ actions_.push_back("ScheduledActionInvalidateOutputSurface"); |
+ states_.push_back(scheduler_->AsValue()); |
+ } |
void DidAnticipatedDrawTimeChange(base::TimeTicks) override { |
if (log_anticipated_draw_time_change_) |
PushAction("DidAnticipatedDrawTimeChange"); |
@@ -2347,5 +2351,116 @@ TEST_F(SchedulerTest, SwitchFrameSourceToThrottled) { |
EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client_, 0, 1); |
} |
+TEST(SchedulerTest, UsingSynchronousCompositor) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings settings; |
+ settings.using_synchronous_renderer_compositor = true; |
+ settings.use_external_begin_frame_source = true; |
+ settings.impl_side_painting = true; |
+ |
+ TestScheduler* scheduler = client.CreateScheduler(settings); |
+ |
+ scheduler->SetCanStart(); |
+ scheduler->SetVisible(true); |
+ scheduler->SetCanDraw(true); |
+ |
+ EXPECT_SINGLE_ACTION("ScheduledActionBeginOutputSurfaceCreation", client); |
+ client.Reset(); |
+ |
+ scheduler->DidCreateAndInitializeOutputSurface(); |
+ scheduler->SetNeedsCommit(); |
+ |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
+ client.Reset(); |
+ |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, client.now_src()->Now(), |
+ base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), |
+ BeginFrameArgs::SYNCHRONOUS_ANIMATE)); |
+ |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ scheduler->NotifyBeginMainFrameStarted(); |
+ EXPECT_NO_ACTION(client); |
+ |
+ scheduler->NotifyReadyToCommit(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
+ client.Reset(); |
+ |
+ scheduler->NotifyReadyToActivate(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client); |
+ client.Reset(); |
+ |
+ // Next VSync. |
+ client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, client.now_src()->Now(), |
+ base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), |
+ BeginFrameArgs::SYNCHRONOUS_ANIMATE)); |
+ |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 3); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3); |
+ EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client, 2, 3); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Android onDraw. |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, client.now_src()->Now(), base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::SYNCHRONOUS_DRAW)); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Next VSync. |
+ client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, client.now_src()->Now(), |
+ base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), |
+ BeginFrameArgs::SYNCHRONOUS_ANIMATE)); |
+ |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("SetNeedsBeginFrames(false)", client, 1, 2); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Steady-state. |
+ // Static page. Scrolling initiated by webview. |
+ scheduler->SetNeedsAnimate(); |
+ // Ask for BeginFrames. |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
+ client.Reset(); |
+ |
+ client.now_src()->AdvanceNow(BeginFrameArgs::DefaultInterval()); |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create(BEGINFRAME_FROM_HERE, client.now_src()->Now(), |
+ base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), |
+ BeginFrameArgs::SYNCHRONOUS_ANIMATE)); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 3); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 3); |
+ EXPECT_ACTION("ScheduledActionInvalidateOutputSurface", client, 2, 3); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Android onDraw. |
+ client.fake_external_begin_frame_source()->TestOnBeginFrame( |
+ BeginFrameArgs::Create( |
+ BEGINFRAME_FROM_HERE, client.now_src()->Now(), base::TimeTicks(), |
+ BeginFrameArgs::DefaultInterval(), BeginFrameArgs::SYNCHRONOUS_DRAW)); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+} |
+ |
} // namespace |
} // namespace cc |