| 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 7b6d24cab5870fd9405f44d5acd277868cf618e5..db17ea5323f30f487f45d325eb9ebe3854ede3b6 100644
|
| --- a/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
|
| +++ b/components/scheduler/renderer/renderer_scheduler_impl_unittest.cc
|
| @@ -2988,6 +2988,67 @@ TEST_F(RendererSchedulerImplTest,
|
| }
|
|
|
| TEST_F(RendererSchedulerImplTest,
|
| + SYNCHRONIZED_GESTURE_TimerTaskThrottling_TimersSuspended) {
|
| + SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
|
| +
|
| + base::TimeTicks first_throttled_run_time =
|
| + ThrottlingHelper::ThrottledRunTime(clock_->NowTicks());
|
| +
|
| + size_t count = 0;
|
| + // With the compositor task taking 10ms, there is not enough time to run this
|
| + // 7ms timer task in the 16ms frame.
|
| + scheduler_->TimerTaskRunner()->PostTask(
|
| + FROM_HERE, base::Bind(SlowCountingTask, &count, clock_.get(), 7,
|
| + scheduler_->TimerTaskRunner()));
|
| +
|
| + bool suspended = false;
|
| + for (int i = 0; i < 1000; i++) {
|
| + cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create(
|
| + BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(),
|
| + base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL);
|
| + begin_frame_args.on_critical_path = true;
|
| + scheduler_->WillBeginFrame(begin_frame_args);
|
| + scheduler_->DidHandleInputEventOnCompositorThread(
|
| + FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
|
| + RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
|
| +
|
| + simulate_compositor_task_ran_ = false;
|
| + compositor_task_runner_->PostTask(
|
| + FROM_HERE,
|
| + base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask,
|
| + base::Unretained(this),
|
| + base::TimeDelta::FromMilliseconds(10)));
|
| +
|
| + mock_task_runner_->RunTasksWhile(
|
| + base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending,
|
| + base::Unretained(this)));
|
| + EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i;
|
| +
|
| + // Before the policy is updated the queue will be enabled. Subsequently it
|
| + // will be disabled until the throttled queue is pumped.
|
| + bool expect_queue_enabled =
|
| + (i == 0) || (clock_->NowTicks() > first_throttled_run_time);
|
| + if (suspended)
|
| + expect_queue_enabled = false;
|
| + EXPECT_EQ(expect_queue_enabled,
|
| + scheduler_->TimerTaskRunner()->IsQueueEnabled())
|
| + << "i = " << i;
|
| +
|
| + // After we've run any expensive tasks suspend the queue. The throttling
|
| + // helper should /not/ re-enable this queue under any circumstances while
|
| + // timers are suspended.
|
| + if (count > 0 && !suspended) {
|
| + EXPECT_EQ(2u, count);
|
| + scheduler_->SuspendTimerQueue();
|
| + suspended = true;
|
| + }
|
| + }
|
| +
|
| + // Make sure the timer queue stayed suspended!
|
| + EXPECT_EQ(2u, count);
|
| +}
|
| +
|
| +TEST_F(RendererSchedulerImplTest,
|
| SYNCHRONIZED_GESTURE_TimerTaskThrottling_task_not_expensive) {
|
| SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
|
|
|
|
|