Index: cc/scheduler/scheduler_unittest.cc |
diff --git a/cc/scheduler/scheduler_unittest.cc b/cc/scheduler/scheduler_unittest.cc |
index 071fa58a066aea14ff4c3158d3ab47dac747b187..1af601de05fefd5bb940902d6dadef07f298f246 100644 |
--- a/cc/scheduler/scheduler_unittest.cc |
+++ b/cc/scheduler/scheduler_unittest.cc |
@@ -40,7 +40,11 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
class FakeSchedulerClient : public SchedulerClient { |
public: |
- FakeSchedulerClient() : needs_begin_frame_(false), automatic_swap_ack_(true) { |
+ FakeSchedulerClient() |
+ : needs_begin_frame_(false), |
+ automatic_swap_ack_(true), |
+ swap_contains_incomplete_tile_(false), |
+ redraw_will_happen_if_update_visible_tiles_happens_(false) { |
Reset(); |
} |
@@ -82,6 +86,10 @@ class FakeSchedulerClient : public SchedulerClient { |
return -1; |
} |
+ void SetSwapContainsIncompleteTile(bool contain) { |
+ swap_contains_incomplete_tile_ = contain; |
+ } |
+ |
bool HasAction(const char* action) const { |
return ActionIndex(action) >= 0; |
} |
@@ -95,7 +103,9 @@ class FakeSchedulerClient : public SchedulerClient { |
void SetAutomaticSwapAck(bool automatic_swap_ack) { |
automatic_swap_ack_ = automatic_swap_ack; |
} |
- |
+ void SetRedrawWillHappenIfUpdateVisibleTilesHappens(bool redraw) { |
+ redraw_will_happen_if_update_visible_tiles_happens_ = redraw; |
+ } |
// SchedulerClient implementation. |
virtual void SetNeedsBeginFrame(bool enable) OVERRIDE { |
actions_.push_back("SetNeedsBeginFrame"); |
@@ -124,6 +134,13 @@ class FakeSchedulerClient : public SchedulerClient { |
draw_will_happen_ && swap_will_happen_if_draw_happens_; |
if (swap_will_happen) { |
scheduler_->DidSwapBuffers(); |
+ if (swap_contains_incomplete_tile_) { |
+ scheduler_->SetSwapUsedIncompleteTile(true); |
+ swap_contains_incomplete_tile_ = false; |
+ } else { |
+ scheduler_->SetSwapUsedIncompleteTile(false); |
+ } |
+ |
if (automatic_swap_ack_) |
scheduler_->DidSwapBuffersComplete(); |
} |
@@ -141,6 +158,8 @@ class FakeSchedulerClient : public SchedulerClient { |
virtual void ScheduledActionUpdateVisibleTiles() OVERRIDE { |
actions_.push_back("ScheduledActionUpdateVisibleTiles"); |
states_.push_back(scheduler_->AsValue().release()); |
+ if (redraw_will_happen_if_update_visible_tiles_happens_) |
+ scheduler_->SetNeedsRedraw(); |
} |
virtual void ScheduledActionActivatePendingTree() OVERRIDE { |
actions_.push_back("ScheduledActionActivatePendingTree"); |
@@ -177,6 +196,8 @@ class FakeSchedulerClient : public SchedulerClient { |
bool automatic_swap_ack_; |
int num_draws_; |
bool log_anticipated_draw_time_change_; |
+ bool swap_contains_incomplete_tile_; |
+ bool redraw_will_happen_if_update_visible_tiles_happens_; |
base::TimeTicks posted_begin_impl_frame_deadline_; |
std::vector<const char*> actions_; |
ScopedVector<base::Value> states_; |
@@ -194,6 +215,8 @@ void InitializeOutputSurfaceAndFirstCommit(Scheduler* scheduler, |
scheduler->SetNeedsCommit(); |
scheduler->NotifyBeginMainFrameStarted(); |
scheduler->NotifyReadyToCommit(); |
+ if (scheduler->settings().impl_side_painting) |
+ scheduler->NotifyReadyToActivate(); |
// Go through the motions to draw the commit. |
if (client_initiates_begin_frame) |
scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); |
@@ -875,6 +898,58 @@ TEST(SchedulerTest, ManageTilesOncePerFrame) { |
scheduler->DidManageTiles(); // Corresponds to ScheduledActionManageTiles |
} |
+TEST(SchedulerTest, ShouldUpdateVisibleTiles) { |
+ FakeSchedulerClient client; |
+ SchedulerSettings scheduler_settings; |
+ scheduler_settings.impl_side_painting = true; |
+ Scheduler* scheduler = client.CreateScheduler(scheduler_settings); |
+ scheduler->SetCanStart(); |
+ scheduler->SetVisible(true); |
+ scheduler->SetCanDraw(true); |
+ InitializeOutputSurfaceAndFirstCommit(scheduler, &client); |
+ |
+ client.SetRedrawWillHappenIfUpdateVisibleTilesHappens(true); |
+ |
+ // SetNeedsCommit should begin the frame. |
+ client.Reset(); |
+ scheduler->SetNeedsCommit(); |
+ EXPECT_SINGLE_ACTION("SetNeedsBeginFrame", client); |
+ |
+ client.Reset(); |
+ scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); |
+ EXPECT_ACTION("WillBeginImplFrame", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionSendBeginMainFrame", client, 1, 2); |
+ EXPECT_TRUE(scheduler->BeginImplFrameDeadlinePending()); |
+ |
+ client.Reset(); |
+ scheduler->NotifyBeginMainFrameStarted(); |
+ scheduler->NotifyReadyToCommit(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionCommit", client); |
+ |
+ client.Reset(); |
+ scheduler->NotifyReadyToActivate(); |
+ EXPECT_SINGLE_ACTION("ScheduledActionActivatePendingTree", client); |
+ |
+ client.Reset(); |
+ client.SetSwapContainsIncompleteTile(true); |
+ client.task_runner().RunPendingTasks(); // Run posted deadline. |
+ EXPECT_ACTION("ScheduledActionAnimate", client, 0, 3); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 3); |
+ EXPECT_ACTION("ScheduledActionUpdateVisibleTiles", client, 2, 3); |
+ EXPECT_TRUE(scheduler->RedrawPending()); |
+ |
+ client.Reset(); |
+ scheduler->BeginFrame(CreateBeginFrameArgsForTesting()); |
+ 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("ScheduledActionUpdateVisibleTiles", client, 0, 2); |
+ EXPECT_ACTION("ScheduledActionDrawAndSwapIfPossible", client, 1, 2); |
+} |
+ |
TEST(SchedulerTest, TriggerBeginFrameDeadlineEarly) { |
SchedulerClientNeedsManageTilesInDraw client; |
SchedulerSettings default_scheduler_settings; |