Index: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
diff --git a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
index c651486d18c9315d3783c1992daac11d200eeaa6..f34f2f01fb524c18ca836e10c31361a7b985785f 100644 |
--- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
+++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc |
@@ -324,6 +324,11 @@ class RendererSchedulerImplTest : public testing::Test { |
RendererSchedulerImpl::kIdlePeriodStarvationThresholdMillis); |
} |
+ static base::TimeDelta suspend_timers_when_backgrounded_delay() { |
+ return base::TimeDelta::FromMilliseconds( |
+ RendererSchedulerImpl::kSuspendTimersWhenBackgroundedDelayMillis); |
+ } |
+ |
template <typename E> |
static void CallForEachEnumValue(E first, |
E last, |
@@ -1789,4 +1794,44 @@ TEST_F(RendererSchedulerImplTest, ShutdownPreventsPostingOfNewTasks) { |
EXPECT_TRUE(run_order.empty()); |
} |
+TEST_F(RendererSchedulerImplTest, TestRendererBackgroundedTimerSuspension) { |
+ scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled(true); |
+ |
+ std::vector<std::string> run_order; |
+ PostTestTasks(&run_order, "T1 T2"); |
+ |
+ // The background signal will not immediately suspend the timer queue. |
+ scheduler_->OnRendererBackgrounded(); |
+ RunUntilIdle(); |
+ EXPECT_THAT(run_order, |
+ testing::ElementsAre(std::string("T1"), std::string("T2"))); |
+ |
+ run_order.clear(); |
+ PostTestTasks(&run_order, "T3"); |
+ RunUntilIdle(); |
+ EXPECT_THAT(run_order, testing::ElementsAre(std::string("T3"))); |
+ |
+ // Advance the time until after the scheduled timer queue suspension. |
+ run_order.clear(); |
+ clock_->Advance(suspend_timers_when_backgrounded_delay() + |
+ base::TimeDelta::FromMilliseconds(10)); |
+ RunUntilIdle(); |
+ ASSERT_TRUE(run_order.empty()); |
+ |
+ // Timer tasks should be suspended until the foregrounded signal. |
+ PostTestTasks(&run_order, "T4 T5"); |
+ RunUntilIdle(); |
+ EXPECT_TRUE(run_order.empty()); |
+ |
+ scheduler_->OnRendererForegrounded(); |
+ RunUntilIdle(); |
+ EXPECT_THAT(run_order, |
+ testing::ElementsAre(std::string("T4"), std::string("T5"))); |
+ |
+ // Subsequent timer tasks should fire as usual. |
+ run_order.clear(); |
+ PostTestTasks(&run_order, "T6"); |
+ RunUntilIdle(); |
+ EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6"))); |
+} |
} // namespace scheduler |