Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index f3bf54b89eb0b412472126725fd315fe5ac97e16..03afa472f5d1bc8c7edb5b8983653007bac786cd 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -171,6 +171,9 @@ class FakeSchedulerClient : public SchedulerClient, |
actions_.push_back("ScheduledActionInvalidateCompositorFrameSink"); |
states_.push_back(scheduler_->AsValue()); |
} |
+ void ScheduledActionPerformImplSideInvalidation() override { |
+ PushAction("ScheduledActionPerformImplSideInvalidation"); |
+ } |
void SendBeginMainFrameNotExpectedSoon() override { |
PushAction("SendBeginMainFrameNotExpectedSoon"); |
@@ -3183,6 +3186,86 @@ TEST_F(SchedulerTest, NoCompositorFrameSinkCreationWhileCommitPending) { |
client_); |
} |
+TEST_F(SchedulerTest, ImplSideInvalidationsInDeadline) { |
+ SetUpScheduler(EXTERNAL_BFS); |
+ |
+ // Request an impl-side invalidation and trigger the deadline. Ensure that the |
+ // invalidation runs inside the deadline. |
+ scheduler_->SetNeedsImplSideInvalidation(); |
+ client_->Reset(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_SINGLE_ACTION("WillBeginImplFrame", client_); |
+ |
+ // Deadline. |
+ client_->Reset(); |
+ task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(true)); |
+ EXPECT_SINGLE_ACTION("ScheduledActionPerformImplSideInvalidation", client_); |
+} |
+ |
+TEST_F(SchedulerTest, ImplSideInvalidationsMergedWithCommit) { |
+ SetUpScheduler(EXTERNAL_BFS); |
+ |
+ // Request a main frame and invalidation, the only action run should be |
+ // sending the main frame. |
+ scheduler_->SetNeedsBeginMainFrame(); |
+ scheduler_->SetNeedsImplSideInvalidation(); |
+ client_->Reset(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
+ |
+ // Respond with a commit. The scheduler should only perform the commit |
+ // actions since the impl-side invalidation request will be merged with the |
+ // commit. |
+ client_->Reset(); |
+ scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks::Now()); |
+ scheduler_->NotifyReadyToCommit(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client_); |
+ EXPECT_FALSE(scheduler_->needs_impl_side_invalidation()); |
+ |
+ // Deadline. |
+ client_->Reset(); |
+ task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(true)); |
+ EXPECT_NO_ACTION(client_); |
+} |
+ |
+TEST_F(SchedulerTest, AbortedCommitsTriggerImplSideInvalidations) { |
+ SetUpScheduler(EXTERNAL_BFS); |
+ |
+ // Request a main frame and invalidation. |
+ scheduler_->SetNeedsBeginMainFrame(); |
+ scheduler_->SetNeedsImplSideInvalidation(); |
+ client_->Reset(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
+ |
+ // Abort the main frame and request another one, the impl-side invalidations |
+ // should not be blocked on the main frame. |
+ client_->Reset(); |
+ scheduler_->SetNeedsBeginMainFrame(); |
+ scheduler_->NotifyBeginMainFrameStarted(base::TimeTicks::Now()); |
+ scheduler_->BeginMainFrameAborted(CommitEarlyOutReason::FINISHED_NO_UPDATES); |
+ task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(true)); |
+ EXPECT_SINGLE_ACTION("ScheduledActionPerformImplSideInvalidation", client_); |
+ |
+ // Activate the sync tree. |
+ client_->Reset(); |
+ scheduler_->NotifyReadyToActivate(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionActivateSyncTree", client_); |
+ |
+ // Second impl frame. |
+ client_->Reset(); |
+ EXPECT_SCOPED(AdvanceFrame()); |
+ EXPECT_ACTION("WillBeginImplFrame", client_, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client_, 1, 2); |
+ |
+ // Deadline. |
+ client_->Reset(); |
+ task_runner_->RunTasksWhile(client_->InsideBeginImplFrame(true)); |
+ EXPECT_SINGLE_ACTION("ScheduledActionDrawIfPossible", client_); |
+} |
+ |
// The three letters appeneded to each version of this test mean the following:s |
// tree_priority: B = both trees same priority; A = active tree priority; |
// scroll_handler_state: H = affects scroll handler; N = does not affect scroll |