Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 80d54d2306d093771f092d799be69feeb543c953..ec2c3e0eb6d583e84dbf148f499409c3be8a97f7 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -122,8 +122,7 @@ class FakeSchedulerClient : public SchedulerClient { |
TestScheduler* CreateScheduler(const SchedulerSettings& settings) { |
scoped_ptr<FakeExternalBeginFrameSource> fake_external_begin_frame_source; |
- if (settings.use_external_begin_frame_source && |
- settings.throttle_frame_production) { |
+ if (settings.use_external_begin_frame_source) { |
fake_external_begin_frame_source.reset( |
new FakeExternalBeginFrameSource(this)); |
fake_external_begin_frame_source_ = |
@@ -156,11 +155,6 @@ class FakeSchedulerClient : public SchedulerClient { |
return posted_begin_impl_frame_deadline_; |
} |
- bool ExternalBeginFrame() { |
- return scheduler_->settings().use_external_begin_frame_source && |
- scheduler_->settings().throttle_frame_production; |
- } |
- |
FakeExternalBeginFrameSource* fake_external_begin_frame_source() const { |
return fake_external_begin_frame_source_; |
} |
@@ -245,7 +239,8 @@ class FakeSchedulerClient : public SchedulerClient { |
// Send the next BeginFrame message if using an external source, otherwise |
// it will be already in the task queue. |
- if (ExternalBeginFrame()) { |
+ if (scheduler_->settings().use_external_begin_frame_source && |
+ scheduler_->FrameProductionThrottled()) { |
mithro-old
2014/12/19 04:11:19
I think we are actually better doing something lik
|
SendNextBeginFrame(); |
EXPECT_TRUE(scheduler_->BeginImplFrameDeadlinePending()); |
} |
@@ -256,7 +251,7 @@ class FakeSchedulerClient : public SchedulerClient { |
} |
void SendNextBeginFrame() { |
- DCHECK(ExternalBeginFrame()); |
+ 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()); |
@@ -1510,8 +1505,6 @@ void BeginFramesNotFromClient(bool use_external_begin_frame_source, |
CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
- DCHECK(!client.fake_external_begin_frame_source()); |
- |
// SetNeedsCommit should begin the frame on the next BeginImplFrame |
// without calling SetNeedsBeginFrame. |
scheduler->SetNeedsCommit(); |
@@ -1598,8 +1591,6 @@ void BeginFramesNotFromClient_SwapThrottled( |
CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
scheduler->SetEstimatedParentDrawTime(base::TimeDelta::FromMicroseconds(1)); |
- DCHECK(!client.fake_external_begin_frame_source()); |
- |
// To test swap ack throttling, this test disables automatic swap acks. |
scheduler->SetMaxSwapsPending(1); |
client.SetAutomaticSwapAck(false); |
@@ -2200,5 +2191,137 @@ TEST(SchedulerTest, |
EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
} |
+// Tests to ensure frame sources can be successfully changed while drawing. |
+TEST(SchedulerTest, SwitchFrameSourceToUnthrottled) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.use_external_begin_frame_source = true; |
mithro-old
2014/12/19 04:11:18
I think you want to actually check the BeginFrameA
|
+ |
+ CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ |
+ // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
+ scheduler->SetNeedsRedraw(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
+ client.Reset(); |
+ |
+ EXPECT_SCOPED(client.AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_TRUE(client.needs_begin_frames()); |
+ client.Reset(); |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ scheduler->SetNeedsRedraw(); |
+ |
+ // Switch to an unthrottled frame source. |
+ scheduler->SetThrottleFrameProduction(false); |
+ client.Reset(); |
+ |
+ // Unthrottled frame source will immediately begin a new frame. |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // If we don't swap on the deadline, we wait for the next BeginFrame. |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+} |
+ |
+// Tests to ensure frame sources can be successfully changed while a frame |
+// deadline is pending. |
+TEST(SchedulerTest, SwitchFrameSourceToUnthrottledBeforeDeadline) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.use_external_begin_frame_source = true; |
+ |
+ CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ |
+ // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
+ scheduler->SetNeedsRedraw(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrames(true)", client); |
+ client.Reset(); |
+ |
+ EXPECT_SCOPED(client.AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
+ |
+ // Switch to an unthrottled frame source before the frame deadline is hit. |
+ scheduler->SetThrottleFrameProduction(false); |
+ client.Reset(); |
+ |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_TRUE(client.needs_begin_frames()); |
+ client.Reset(); |
+ |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
brianderson
2014/12/19 23:04:59
Comment should read "Run posted deadline and Begin
|
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 2); |
+ // Unthrottled frame source will immediately begin a new frame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 1, 2); |
+ scheduler->SetNeedsRedraw(); |
+ client.Reset(); |
+ |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
brianderson
2014/12/19 23:04:59
Comment should read "Run posted deadline."
|
+ EXPECT_ACTION("ScheduledActionAnimate", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // If we don't swap on the deadline, we wait for the next BeginFrame. |
brianderson
2014/12/19 23:04:59
Probably just delete this block. We went through o
|
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 1); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+} |
+ |
+// Tests to ensure that the active frame source can successfully be changed from |
+// unthrottled to throttled. |
+TEST(SchedulerTest, SwitchFrameSourceToThrottled) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.throttle_frame_production = false; |
+ scheduler_settings.use_external_begin_frame_source = true; |
+ |
+ CREATE_SCHEDULER_AND_INIT_SURFACE(scheduler_settings); |
+ |
+ scheduler->SetNeedsRedraw(); |
+ EXPECT_NO_ACTION(client); |
+ client.Reset(); |
+ |
+ client.task_runner().RunPendingTasks(); // Run posted BeginFrame. |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ EXPECT_FALSE(scheduler->BeginImplFrameDeadlinePending()); |
+ client.Reset(); |
+ |
+ // Switch to a throttled frame source. |
+ scheduler->SetThrottleFrameProduction(true); |
+ client.Reset(); |
+ |
+ // SetNeedsRedraw should begin the frame on the next BeginImplFrame. |
+ scheduler->SetNeedsRedraw(); |
brianderson
2014/12/19 23:04:59
What happens if you RunPendingTasks after here?
|
+ EXPECT_NO_ACTION(client); |
+ client.Reset(); |
+ |
+ EXPECT_SCOPED(client.AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ EXPECT_TRUE(client.needs_begin_frames()); |
+ client.Reset(); |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 0, 1); |
+ scheduler->SetNeedsRedraw(); |
brianderson
2014/12/19 23:04:59
Don't need to SetNeedsRedraw here.
|
+} |
+ |
mithro-old
2014/12/19 04:11:19
You probably want a simple test for going to/from
|
} // namespace |
} // namespace cc |