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

Side by Side Diff: components/scheduler/renderer/renderer_scheduler_impl_unittest.cc

Issue 1971763003: scheduler: Detect when a main thread touch stream turns into a compositor gesture (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Review comments Created 4 years, 7 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 unified diff | Download patch
« no previous file with comments | « components/scheduler/renderer/renderer_scheduler_impl.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "base/callback.h" 9 #include "base/callback.h"
10 #include "base/macros.h" 10 #include "base/macros.h"
(...skipping 343 matching lines...) Expand 10 before | Expand all | Expand 10 after
354 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); 354 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
355 } 355 }
356 scheduler_->DidHandleInputEventOnCompositorThread( 356 scheduler_->DidHandleInputEventOnCompositorThread(
357 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin), 357 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
358 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); 358 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
359 scheduler_->DidHandleInputEventOnCompositorThread( 359 scheduler_->DidHandleInputEventOnCompositorThread(
360 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), 360 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
361 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); 361 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
362 } 362 }
363 363
364 void SimulateMainThreadGestureWithCancelledScroll() { 364 // Simulate a gesture where there is an active compositor scroll, but no
365 // scroll updates are generated. Instead, the main thread handles
366 // non-canceleable touch events, making this an effectively main thread
367 // driven gesture.
368 void SimulateMainThreadGestureWithoutScrollUpdates() {
365 scheduler_->DidHandleInputEventOnCompositorThread( 369 scheduler_->DidHandleInputEventOnCompositorThread(
366 FakeInputEvent(blink::WebInputEvent::TouchStart), 370 FakeInputEvent(blink::WebInputEvent::TouchStart),
367 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); 371 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
368 scheduler_->DidHandleInputEventOnCompositorThread( 372 scheduler_->DidHandleInputEventOnCompositorThread(
369 FakeInputEvent(blink::WebInputEvent::TouchMove), 373 FakeInputEvent(blink::WebInputEvent::TouchMove),
370 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); 374 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
371 scheduler_->DidHandleInputEventOnCompositorThread( 375 scheduler_->DidHandleInputEventOnCompositorThread(
372 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin), 376 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
373 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); 377 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
374 scheduler_->DidHandleInputEventOnCompositorThread( 378 scheduler_->DidHandleInputEventOnCompositorThread(
375 FakeInputEvent(blink::WebInputEvent::TouchMove), 379 FakeInputEvent(blink::WebInputEvent::TouchMove),
376 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); 380 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
377 } 381 }
378 382
383 // Simulate a gesture where the main thread handles touch events but does not
384 // preventDefault(), allowing the gesture to turn into a compositor driven
385 // gesture. This function also verifies the necessary policy updates are
386 // scheduled.
387 void SimulateMainThreadGestureWithoutPreventDefault() {
388 scheduler_->DidHandleInputEventOnCompositorThread(
389 FakeInputEvent(blink::WebInputEvent::TouchStart),
390 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
391
392 // Touchstart policy update.
393 EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting());
394 EXPECT_EQ(UseCase::TOUCHSTART, ForceUpdatePolicyAndGetCurrentUseCase());
395 EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting());
396
397 scheduler_->DidHandleInputEventOnCompositorThread(
398 FakeInputEvent(blink::WebInputEvent::TouchMove),
399 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
400 scheduler_->DidHandleInputEventOnCompositorThread(
401 FakeInputEvent(blink::WebInputEvent::GestureTapCancel),
402 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
403 scheduler_->DidHandleInputEventOnCompositorThread(
404 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin),
405 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
406
407 // Main thread gesture policy update.
408 EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting());
409 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE,
410 ForceUpdatePolicyAndGetCurrentUseCase());
411 EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting());
412
413 scheduler_->DidHandleInputEventOnCompositorThread(
414 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate),
415 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR);
416 scheduler_->DidHandleInputEventOnCompositorThread(
417 FakeInputEvent(blink::WebInputEvent::TouchScrollStarted),
418 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
419 scheduler_->DidHandleInputEventOnCompositorThread(
420 FakeInputEvent(blink::WebInputEvent::TouchMove),
421 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
422
423 // Compositor thread gesture policy update.
424 EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting());
425 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE,
426 ForceUpdatePolicyAndGetCurrentUseCase());
427 EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting());
428 }
429
379 void SimulateMainThreadGestureStart(TouchEventPolicy touch_event_policy, 430 void SimulateMainThreadGestureStart(TouchEventPolicy touch_event_policy,
380 blink::WebInputEvent::Type gesture_type) { 431 blink::WebInputEvent::Type gesture_type) {
381 if (touch_event_policy == TouchEventPolicy::SEND_TOUCH_START) { 432 if (touch_event_policy == TouchEventPolicy::SEND_TOUCH_START) {
382 scheduler_->DidHandleInputEventOnCompositorThread( 433 scheduler_->DidHandleInputEventOnCompositorThread(
383 FakeInputEvent(blink::WebInputEvent::TouchStart), 434 FakeInputEvent(blink::WebInputEvent::TouchStart),
384 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); 435 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD);
385 scheduler_->DidHandleInputEventOnMainThread( 436 scheduler_->DidHandleInputEventOnMainThread(
386 FakeInputEvent(blink::WebInputEvent::TouchStart)); 437 FakeInputEvent(blink::WebInputEvent::TouchStart));
387 438
388 scheduler_->DidHandleInputEventOnCompositorThread( 439 scheduler_->DidHandleInputEventOnCompositorThread(
(...skipping 418 matching lines...) Expand 10 before | Expand all | Expand 10 after
807 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); 858 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
808 RunUntilIdle(); 859 RunUntilIdle();
809 EXPECT_THAT(run_order, 860 EXPECT_THAT(run_order,
810 testing::ElementsAre(std::string("L1"), std::string("D1"), 861 testing::ElementsAre(std::string("L1"), std::string("D1"),
811 std::string("D2"), std::string("I1"), 862 std::string("D2"), std::string("I1"),
812 std::string("C1"), std::string("C2"))); 863 std::string("C1"), std::string("C2")));
813 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); 864 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
814 } 865 }
815 866
816 TEST_F(RendererSchedulerImplTest, 867 TEST_F(RendererSchedulerImplTest,
817 TestCompositorPolicy_MainThreadHandlesInput_WithCancelledScroll) { 868 TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) {
818 std::vector<std::string> run_order; 869 std::vector<std::string> run_order;
819 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); 870 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2");
820 871
821 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); 872 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
822 EnableIdleTasks(); 873 EnableIdleTasks();
823 SimulateMainThreadGestureWithCancelledScroll(); 874 SimulateMainThreadGestureWithoutScrollUpdates();
824 RunUntilIdle(); 875 RunUntilIdle();
825 EXPECT_THAT(run_order, 876 EXPECT_THAT(run_order,
826 testing::ElementsAre(std::string("C1"), std::string("C2"), 877 testing::ElementsAre(std::string("C1"), std::string("C2"),
827 std::string("L1"), std::string("D1"), 878 std::string("L1"), std::string("D1"),
828 std::string("D2"), std::string("I1"))); 879 std::string("D2"), std::string("I1")));
829 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); 880 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase());
830 } 881 }
831 882
832 TEST_F(RendererSchedulerImplTest, 883 TEST_F(RendererSchedulerImplTest,
884 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) {
885 std::vector<std::string> run_order;
886 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2");
887
888 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
889 EnableIdleTasks();
890 SimulateMainThreadGestureWithoutPreventDefault();
891 RunUntilIdle();
892 EXPECT_THAT(run_order,
893 testing::ElementsAre(std::string("L1"), std::string("D1"),
894 std::string("D2"), std::string("I1"),
895 std::string("C1"), std::string("C2")));
896 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase());
897 }
898
899 TEST_F(RendererSchedulerImplTest,
833 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { 900 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) {
834 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); 901 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true);
835 EnableIdleTasks(); 902 EnableIdleTasks();
836 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); 903 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START);
837 904
838 base::TimeTicks loop_end_time = 905 base::TimeTicks loop_end_time =
839 clock_->NowTicks() + base::TimeDelta::FromMilliseconds( 906 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(
840 UserModel::kMedianGestureDurationMillis * 2); 907 UserModel::kMedianGestureDurationMillis * 2);
841 908
842 // The UseCase::COMPOSITOR_GESTURE usecase initially deprioritizes compositor 909 // The UseCase::COMPOSITOR_GESTURE usecase initially deprioritizes compositor
(...skipping 2074 matching lines...) Expand 10 before | Expand all | Expand 10 after
2917 } 2984 }
2918 2985
2919 // Timer tasks should not have been starved by the expensive compositor 2986 // Timer tasks should not have been starved by the expensive compositor
2920 // tasks. 2987 // tasks.
2921 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, 2988 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY,
2922 scheduler_->CompositorTaskRunner()->GetQueuePriority()); 2989 scheduler_->CompositorTaskRunner()->GetQueuePriority());
2923 EXPECT_EQ(1000u, run_order.size()); 2990 EXPECT_EQ(1000u, run_order.size());
2924 } 2991 }
2925 2992
2926 } // namespace scheduler 2993 } // namespace scheduler
OLDNEW
« no previous file with comments | « components/scheduler/renderer/renderer_scheduler_impl.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698