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

Unified Diff: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc

Issue 2080563003: (Merge m52) Fix a bug with throttling and timer queue suspension (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@2743
Patch Set: Created 4 years, 6 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
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);
« no previous file with comments | « components/scheduler/renderer/renderer_scheduler_impl.cc ('k') | components/scheduler/renderer/throttling_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698