| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |