Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(662)

Unified Diff: cc/scheduler/scheduler_unittest.cc

Issue 2418593002: Fix scheduler bug in skipping main frames (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« cc/scheduler/scheduler.cc ('K') | « cc/scheduler/scheduler.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: cc/scheduler/scheduler_unittest.cc
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc
index 24b7173248ee70d8ffe51bede6f112246389f3ab..2dfc4032d14df20744e8819adcbf5d1f8563614c 100644
--- a/cc/scheduler/scheduler_unittest.cc
+++ b/cc/scheduler/scheduler_unittest.cc
@@ -415,6 +415,7 @@ class SchedulerTest : public testing::Test {
return fake_external_begin_frame_source_.get();
}
+ void AdvanceAndMissOneFrame();
void CheckMainFrameSkippedAfterLateCommit(bool expect_send_begin_main_frame);
void ImplFrameSkippedAfterLateSwapAck(bool swap_ack_before_deadline);
void ImplFrameNotSkippedAfterLateSwapAck();
@@ -1282,8 +1283,7 @@ TEST_F(SchedulerTest, WaitForReadyToDrawCancelledWhenLostCompositorFrameSink) {
EXPECT_ACTION("SendBeginMainFrameNotExpectedSoon", client_, 2, 3);
}
-void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
- bool expect_send_begin_main_frame) {
+void SchedulerTest::AdvanceAndMissOneFrame() {
// Impl thread hits deadline before commit finishes.
scheduler_->SetNeedsBeginMainFrame();
EXPECT_FALSE(scheduler_->MainThreadMissedLastDeadline());
@@ -1300,8 +1300,13 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
EXPECT_ACTION("ScheduledActionCommit", client_, 3, 5);
EXPECT_ACTION("ScheduledActionActivateSyncTree", client_, 4, 5);
EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
-
client_->Reset();
+}
+
+void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
+ bool expect_send_begin_main_frame) {
+ AdvanceAndMissOneFrame();
+
scheduler_->SetNeedsBeginMainFrame();
EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
EXPECT_SCOPED(AdvanceFrame());
@@ -1314,6 +1319,32 @@ void SchedulerTest::CheckMainFrameSkippedAfterLateCommit(
client_->HasAction("ScheduledActionSendBeginMainFrame"));
}
+TEST_F(SchedulerTest, MainFrameNotSkippedAfterLateBeginFrame) {
+ // If a begin frame is delivered extremely late (because the browser has
+ // some contention), make sure that the main frame is not skipped even
+ // if it can activate before the deadline.
+ SetUpScheduler(EXTERNAL_BFS);
+ fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
+
+ AdvanceAndMissOneFrame();
+
+ // Advance frame and create a begin frame.
sunnyps 2016/10/12 20:51:46 Why do we need this extra frame in between?
enne (OOO) 2016/10/13 17:09:44 Which extra frame? There's one frame where the mai
sunnyps 2016/10/13 20:25:57 Ooh, sorry. Misread that.
+ now_src_->Advance(BeginFrameArgs::DefaultInterval());
+ BeginFrameArgs args =
+ CreateBeginFrameArgsForTesting(BEGINFRAME_FROM_HERE, now_src());
+
+ // Deliver this begin frame super late.
+ now_src_->Advance(BeginFrameArgs::DefaultInterval() * 100);
+ fake_external_begin_frame_source_->TestOnBeginFrame(args);
+
+ scheduler_->SetNeedsBeginMainFrame();
sunnyps 2016/10/12 20:51:46 nit: Can you call SetNeedsBeginMainFrame before se
enne (OOO) 2016/10/13 17:09:44 Done.
+ EXPECT_TRUE(scheduler_->MainThreadMissedLastDeadline());
+ task_runner().RunTasksWhile(client_->InsideBeginImplFrame(true));
+ EXPECT_EQ(true, scheduler_->MainThreadMissedLastDeadline());
+ EXPECT_TRUE(client_->HasAction("WillBeginImplFrame"));
sunnyps 2016/10/12 20:51:46 nit: Can you use EXPECT_ACTION here?
enne (OOO) 2016/10/13 17:09:44 Done.
+ EXPECT_EQ(true, client_->HasAction("ScheduledActionSendBeginMainFrame"));
+}
+
TEST_F(SchedulerTest, MainFrameSkippedAfterLateCommit) {
SetUpScheduler(EXTERNAL_BFS);
fake_compositor_timing_history_->SetAllEstimatesTo(kFastDuration);
« cc/scheduler/scheduler.cc ('K') | « cc/scheduler/scheduler.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698