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

Unified Diff: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc

Issue 2555623004: [scheduler] Throttle default timer queue when renderer is backgrounded. (Closed)
Patch Set: Ooops Created 4 years 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
Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
index 9fd59734250fe178ee82fe3a7310573805246941..2e1985656a9f7e5f53c739783a75faede3cdb58b 100644
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl_unittest.cc
@@ -176,6 +176,25 @@ void AnticipationTestTask(RendererSchedulerImpl* scheduler,
*is_anticipated_after = scheduler->IsHighPriorityWorkAnticipated();
}
+// RAII helper class to enable auto advancing of time inside mock task runner.
+// Automatically disables auto-advancement when destroyed.
+class AutoAdvanceNowEnabler {
+ public:
+ AutoAdvanceNowEnabler(scoped_refptr<cc::OrderedSimpleTaskRunner> task_runner)
+ : task_runner_(task_runner) {
+ task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ }
+
+ ~AutoAdvanceNowEnabler() {
+ task_runner_->SetAutoAdvanceNowToPendingTasks(false);
+ }
+
+ private:
+ scoped_refptr<cc::OrderedSimpleTaskRunner> task_runner_;
+
+ DISALLOW_COPY_AND_ASSIGN(AutoAdvanceNowEnabler);
+};
+
}; // namespace
class RendererSchedulerImplForTest : public RendererSchedulerImpl {
@@ -319,7 +338,7 @@ class RendererSchedulerImplTest : public testing::Test {
const scoped_refptr<base::SingleThreadTaskRunner>& task_runner) {
// RunUntilIdle won't actually run all of the SimpleTestTickClock::Advance
// tasks unless we set AutoAdvanceNow to true :/
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
// Simulate a bunch of expensive tasks
for (int i = 0; i < 10; i++) {
@@ -330,10 +349,6 @@ class RendererSchedulerImplTest : public testing::Test {
}
RunUntilIdle();
-
- // Switch back to not auto-advancing because we want to be in control of
- // when time advances.
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(false);
}
enum class TouchEventPolicy {
@@ -719,7 +734,7 @@ TEST_F(RendererSchedulerImplTest, TestRepostingIdleTask) {
}
TEST_F(RendererSchedulerImplTest, TestIdleTaskExceedsDeadline) {
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
int run_count = 0;
// Post two UpdateClockToDeadlineIdleTestTask tasks.
@@ -1694,7 +1709,7 @@ TEST_F(RendererSchedulerImplWithMockSchedulerTest,
TEST_F(RendererSchedulerImplWithMockSchedulerTest,
OnePendingDelayedAndOneUrgentUpdatePolicy) {
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
mock_scheduler_->ScheduleDelayedPolicyUpdate(
clock_->NowTicks(), base::TimeDelta::FromMilliseconds(1));
@@ -1708,7 +1723,7 @@ TEST_F(RendererSchedulerImplWithMockSchedulerTest,
TEST_F(RendererSchedulerImplWithMockSchedulerTest,
OneUrgentAndOnePendingDelayedUpdatePolicy) {
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
mock_scheduler_->EnsureUrgentPolicyUpdatePostedOnMainThread();
mock_scheduler_->ScheduleDelayedPolicyUpdate(
@@ -1833,7 +1848,7 @@ TEST_F(RendererSchedulerImplWithMockSchedulerTest,
TEST_F(RendererSchedulerImplWithMockSchedulerTest,
EnsureUpdatePolicyNotTriggeredTooOften) {
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
EXPECT_EQ(0, mock_scheduler_->update_policy_count_);
scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
@@ -2010,7 +2025,7 @@ TEST_F(RendererSchedulerImplTest,
}
TEST_F(RendererSchedulerImplTest, TestLongIdlePeriodRepeating) {
- mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true);
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
std::vector<base::TimeTicks> actual_deadlines;
int run_count = 0;
@@ -2251,6 +2266,8 @@ TEST_F(RendererSchedulerImplTest, SuspendRenderer) {
}
TEST_F(RendererSchedulerImplTest, ResumeRenderer) {
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
+
// Assume that the renderer is backgrounded.
scheduler_->OnRendererBackgrounded();
@@ -2340,26 +2357,35 @@ TEST_F(RendererSchedulerImplTest, TestRendererBackgroundedTimerSuspension) {
std::vector<std::string> run_order;
PostTestTasks(&run_order, "T1 T2");
+ base::TimeTicks now;
+
// The background signal will not immediately suspend the timer queue.
scheduler_->OnRendererBackgrounded();
+ now += base::TimeDelta::FromMilliseconds(1100);
+ clock_->SetNowTicks(now);
RunUntilIdle();
EXPECT_THAT(run_order,
testing::ElementsAre(std::string("T1"), std::string("T2")));
run_order.clear();
PostTestTasks(&run_order, "T3");
+
+ now += base::TimeDelta::FromSeconds(1);
+ clock_->SetNowTicks(now);
RunUntilIdle();
EXPECT_THAT(run_order, testing::ElementsAre(std::string("T3")));
// Advance the time until after the scheduled timer queue suspension.
+ now = base::TimeTicks() + suspend_timers_when_backgrounded_delay() +
+ base::TimeDelta::FromMilliseconds(10);
run_order.clear();
- clock_->Advance(suspend_timers_when_backgrounded_delay() +
- base::TimeDelta::FromMilliseconds(10));
+ clock_->SetNowTicks(now);
RunUntilIdle();
ASSERT_TRUE(run_order.empty());
// Timer tasks should be suspended until the foregrounded signal.
PostTestTasks(&run_order, "T4 T5");
+ now += base::TimeDelta::FromSeconds(10);
RunUntilIdle();
EXPECT_TRUE(run_order.empty());
@@ -3518,5 +3544,46 @@ TEST_F(RendererSchedulerImplTest, EnableVirtualTime) {
scheduler_->GetVirtualTimeDomain());
}
+namespace {
+
+void RecordingTimeTestTask(std::vector<base::TimeTicks>* run_times,
+ base::SimpleTestTickClock* clock) {
+ run_times->push_back(clock->NowTicks());
+}
+
+} // namespace
+
+TEST_F(RendererSchedulerImplTest,
+ DefaultTimerTasksAreThrottledWhenBackgrounded) {
+ AutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_);
+
+ scheduler_->OnRendererBackgrounded();
+
+ std::vector<base::TimeTicks> run_times;
+
+ timer_task_runner_->PostTask(
+ FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get()));
+
+ mock_task_runner_->RunUntilTime(base::TimeTicks() +
+ base::TimeDelta::FromMilliseconds(1100));
+
+ EXPECT_THAT(run_times, testing::ElementsAre(base::TimeTicks() +
+ base::TimeDelta::FromSeconds(1)));
+ run_times.clear();
+
+ timer_task_runner_->PostDelayedTask(
+ FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get()),
+ base::TimeDelta::FromMilliseconds(200));
+
+ scheduler_->OnRendererForegrounded();
+
+ mock_task_runner_->RunUntilTime(base::TimeTicks() +
+ base::TimeDelta::FromMilliseconds(1500));
+
+ EXPECT_THAT(run_times,
+ testing::ElementsAre(base::TimeTicks() +
+ base::TimeDelta::FromMilliseconds(1300)));
+}
+
} // namespace scheduler
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698