| 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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 scoped_refptr<SchedulerTqmDelegate> main_task_runner) | 186 scoped_refptr<SchedulerTqmDelegate> main_task_runner) |
| 187 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} | 187 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} |
| 188 | 188 |
| 189 void UpdatePolicyLocked(UpdateType update_type) override { | 189 void UpdatePolicyLocked(UpdateType update_type) override { |
| 190 update_policy_count_++; | 190 update_policy_count_++; |
| 191 RendererSchedulerImpl::UpdatePolicyLocked(update_type); | 191 RendererSchedulerImpl::UpdatePolicyLocked(update_type); |
| 192 | 192 |
| 193 std::string use_case = | 193 std::string use_case = |
| 194 RendererScheduler::UseCaseToString(MainThreadOnly().current_use_case); | 194 RendererScheduler::UseCaseToString(MainThreadOnly().current_use_case); |
| 195 if (MainThreadOnly().touchstart_expected_soon) { | 195 if (MainThreadOnly().touchstart_expected_soon) { |
| 196 use_cases_.push_back(use_case + " scroll expected"); | 196 use_cases_.push_back(use_case + " touchstart expected"); |
| 197 } else { | 197 } else { |
| 198 use_cases_.push_back(use_case); | 198 use_cases_.push_back(use_case); |
| 199 } | 199 } |
| 200 } | 200 } |
| 201 | 201 |
| 202 void EnsureUrgentPolicyUpdatePostedOnMainThread() { | 202 void EnsureUrgentPolicyUpdatePostedOnMainThread() { |
| 203 base::AutoLock lock(any_thread_lock_); | 203 base::AutoLock lock(any_thread_lock_); |
| 204 RendererSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( | 204 RendererSchedulerImpl::EnsureUrgentPolicyUpdatePostedOnMainThread( |
| 205 FROM_HERE); | 205 FROM_HERE); |
| 206 } | 206 } |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 | 338 |
| 339 enum class TouchEventPolicy { | 339 enum class TouchEventPolicy { |
| 340 SEND_TOUCH_START, | 340 SEND_TOUCH_START, |
| 341 DONT_SEND_TOUCH_START, | 341 DONT_SEND_TOUCH_START, |
| 342 }; | 342 }; |
| 343 | 343 |
| 344 void SimulateCompositorGestureStart(TouchEventPolicy touch_event_policy) { | 344 void SimulateCompositorGestureStart(TouchEventPolicy touch_event_policy) { |
| 345 if (touch_event_policy == TouchEventPolicy::SEND_TOUCH_START) { | 345 if (touch_event_policy == TouchEventPolicy::SEND_TOUCH_START) { |
| 346 scheduler_->DidHandleInputEventOnCompositorThread( | 346 scheduler_->DidHandleInputEventOnCompositorThread( |
| 347 FakeInputEvent(blink::WebInputEvent::TouchStart), | 347 FakeInputEvent(blink::WebInputEvent::TouchStart), |
| 348 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 348 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 349 scheduler_->DidHandleInputEventOnCompositorThread( | 349 scheduler_->DidHandleInputEventOnCompositorThread( |
| 350 FakeInputEvent(blink::WebInputEvent::TouchMove), | 350 FakeInputEvent(blink::WebInputEvent::TouchMove), |
| 351 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 351 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 352 scheduler_->DidHandleInputEventOnCompositorThread( | 352 scheduler_->DidHandleInputEventOnCompositorThread( |
| 353 FakeInputEvent(blink::WebInputEvent::TouchMove), | 353 FakeInputEvent(blink::WebInputEvent::TouchMove), |
| 354 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 354 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 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 // Simulate a gesture where there is an active compositor scroll, but no | 364 // Simulate a gesture where there is an active compositor scroll, but no |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 399 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 399 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 400 scheduler_->DidHandleInputEventOnCompositorThread( | 400 scheduler_->DidHandleInputEventOnCompositorThread( |
| 401 FakeInputEvent(blink::WebInputEvent::GestureTapCancel), | 401 FakeInputEvent(blink::WebInputEvent::GestureTapCancel), |
| 402 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 402 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 403 scheduler_->DidHandleInputEventOnCompositorThread( | 403 scheduler_->DidHandleInputEventOnCompositorThread( |
| 404 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin), | 404 FakeInputEvent(blink::WebInputEvent::GestureScrollBegin), |
| 405 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 405 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 406 | 406 |
| 407 // Main thread gesture policy update. | 407 // Main thread gesture policy update. |
| 408 EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting()); | 408 EXPECT_TRUE(scheduler_->PolicyNeedsUpdateForTesting()); |
| 409 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, | 409 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 410 ForceUpdatePolicyAndGetCurrentUseCase()); | 410 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 411 EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting()); | 411 EXPECT_FALSE(scheduler_->PolicyNeedsUpdateForTesting()); |
| 412 | 412 |
| 413 scheduler_->DidHandleInputEventOnCompositorThread( | 413 scheduler_->DidHandleInputEventOnCompositorThread( |
| 414 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), | 414 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), |
| 415 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 415 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 416 scheduler_->DidHandleInputEventOnCompositorThread( | 416 scheduler_->DidHandleInputEventOnCompositorThread( |
| 417 FakeInputEvent(blink::WebInputEvent::TouchScrollStarted), | 417 FakeInputEvent(blink::WebInputEvent::TouchScrollStarted), |
| 418 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 418 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 419 scheduler_->DidHandleInputEventOnCompositorThread( | 419 scheduler_->DidHandleInputEventOnCompositorThread( |
| (...skipping 21 matching lines...) Expand all Loading... |
| 441 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 441 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 442 scheduler_->DidHandleInputEventOnMainThread( | 442 scheduler_->DidHandleInputEventOnMainThread( |
| 443 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 443 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 444 | 444 |
| 445 scheduler_->DidHandleInputEventOnCompositorThread( | 445 scheduler_->DidHandleInputEventOnCompositorThread( |
| 446 FakeInputEvent(blink::WebInputEvent::TouchMove), | 446 FakeInputEvent(blink::WebInputEvent::TouchMove), |
| 447 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 447 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 448 scheduler_->DidHandleInputEventOnMainThread( | 448 scheduler_->DidHandleInputEventOnMainThread( |
| 449 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 449 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 450 } | 450 } |
| 451 scheduler_->DidHandleInputEventOnCompositorThread( | 451 if (gesture_type != blink::WebInputEvent::Undefined) { |
| 452 FakeInputEvent(gesture_type), | 452 scheduler_->DidHandleInputEventOnCompositorThread( |
| 453 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 453 FakeInputEvent(gesture_type), |
| 454 scheduler_->DidHandleInputEventOnMainThread(FakeInputEvent(gesture_type)); | 454 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 455 scheduler_->DidHandleInputEventOnMainThread(FakeInputEvent(gesture_type)); |
| 456 } |
| 455 } | 457 } |
| 456 | 458 |
| 457 void SimulateMainThreadGestureCompositorTask( | 459 void SimulateMainThreadInputHandlingCompositorTask( |
| 458 base::TimeDelta begin_main_frame_duration) { | 460 base::TimeDelta begin_main_frame_duration) { |
| 459 scheduler_->DidHandleInputEventOnCompositorThread( | 461 scheduler_->DidHandleInputEventOnCompositorThread( |
| 460 FakeInputEvent(blink::WebInputEvent::TouchMove), | 462 FakeInputEvent(blink::WebInputEvent::TouchMove), |
| 461 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 463 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 462 clock_->Advance(begin_main_frame_duration); | 464 clock_->Advance(begin_main_frame_duration); |
| 463 scheduler_->DidHandleInputEventOnMainThread( | 465 scheduler_->DidHandleInputEventOnMainThread( |
| 464 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 466 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 465 scheduler_->DidCommitFrameToCompositor(); | 467 scheduler_->DidCommitFrameToCompositor(); |
| 466 } | 468 } |
| 467 | 469 |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 870 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 872 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 871 | 873 |
| 872 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 874 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 873 EnableIdleTasks(); | 875 EnableIdleTasks(); |
| 874 SimulateMainThreadGestureWithoutScrollUpdates(); | 876 SimulateMainThreadGestureWithoutScrollUpdates(); |
| 875 RunUntilIdle(); | 877 RunUntilIdle(); |
| 876 EXPECT_THAT(run_order, | 878 EXPECT_THAT(run_order, |
| 877 testing::ElementsAre(std::string("C1"), std::string("C2"), | 879 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 878 std::string("L1"), std::string("D1"), | 880 std::string("L1"), std::string("D1"), |
| 879 std::string("D2"), std::string("I1"))); | 881 std::string("D2"), std::string("I1"))); |
| 880 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 882 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 883 CurrentUseCase()); |
| 881 } | 884 } |
| 882 | 885 |
| 883 TEST_F(RendererSchedulerImplTest, | 886 TEST_F(RendererSchedulerImplTest, |
| 884 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { | 887 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { |
| 885 std::vector<std::string> run_order; | 888 std::vector<std::string> run_order; |
| 886 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 889 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 887 | 890 |
| 888 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 891 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 889 EnableIdleTasks(); | 892 EnableIdleTasks(); |
| 890 SimulateMainThreadGestureWithoutPreventDefault(); | 893 SimulateMainThreadGestureWithoutPreventDefault(); |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 950 | 953 |
| 951 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 954 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 952 EnableIdleTasks(); | 955 EnableIdleTasks(); |
| 953 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 956 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 954 blink::WebInputEvent::GestureScrollBegin); | 957 blink::WebInputEvent::GestureScrollBegin); |
| 955 RunUntilIdle(); | 958 RunUntilIdle(); |
| 956 EXPECT_THAT(run_order, | 959 EXPECT_THAT(run_order, |
| 957 testing::ElementsAre(std::string("C1"), std::string("C2"), | 960 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 958 std::string("L1"), std::string("D1"), | 961 std::string("L1"), std::string("D1"), |
| 959 std::string("D2"), std::string("I1"))); | 962 std::string("D2"), std::string("I1"))); |
| 960 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 963 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 964 CurrentUseCase()); |
| 961 scheduler_->DidHandleInputEventOnMainThread( | 965 scheduler_->DidHandleInputEventOnMainThread( |
| 962 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 966 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| 963 } | 967 } |
| 964 | 968 |
| 965 TEST_F(RendererSchedulerImplTest, | 969 TEST_F(RendererSchedulerImplTest, |
| 966 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { | 970 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { |
| 967 std::vector<std::string> run_order; | 971 std::vector<std::string> run_order; |
| 968 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 972 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 969 | 973 |
| 970 EnableIdleTasks(); | 974 EnableIdleTasks(); |
| 971 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 975 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 972 blink::WebInputEvent::GestureScrollBegin); | 976 blink::WebInputEvent::GestureScrollBegin); |
| 973 RunUntilIdle(); | 977 RunUntilIdle(); |
| 974 EXPECT_THAT(run_order, | 978 EXPECT_THAT(run_order, |
| 975 testing::ElementsAre(std::string("C1"), std::string("C2"), | 979 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 976 std::string("L1"), std::string("D1"), | 980 std::string("L1"), std::string("D1"), |
| 977 std::string("D2"), std::string("I1"))); | 981 std::string("D2"), std::string("I1"))); |
| 978 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 982 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 983 CurrentUseCase()); |
| 979 scheduler_->DidHandleInputEventOnMainThread( | 984 scheduler_->DidHandleInputEventOnMainThread( |
| 980 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 985 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| 981 } | 986 } |
| 982 | 987 |
| 983 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { | 988 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { |
| 984 std::vector<std::string> run_order; | 989 std::vector<std::string> run_order; |
| 985 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 990 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 986 | 991 |
| 987 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 992 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 988 scheduler_->DidAnimateForInputOnCompositorThread(); | 993 scheduler_->DidAnimateForInputOnCompositorThread(); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1008 | 1013 |
| 1009 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1014 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 1010 blink::WebInputEvent::GestureScrollBegin); | 1015 blink::WebInputEvent::GestureScrollBegin); |
| 1011 scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period | 1016 scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period |
| 1012 RunUntilIdle(); | 1017 RunUntilIdle(); |
| 1013 | 1018 |
| 1014 EXPECT_THAT(run_order, | 1019 EXPECT_THAT(run_order, |
| 1015 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1020 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 1016 } | 1021 } |
| 1017 | 1022 |
| 1018 TEST_F(RendererSchedulerImplTest, ExpensiveTimersDoRunWhenMainThreadScrolling) { | 1023 TEST_F(RendererSchedulerImplTest, |
| 1024 ExpensiveTimersDontRunWhenMainThreadScrolling) { |
| 1019 std::vector<std::string> run_order; | 1025 std::vector<std::string> run_order; |
| 1020 | 1026 |
| 1021 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1027 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1022 SimulateExpensiveTasks(timer_task_runner_); | 1028 SimulateExpensiveTasks(timer_task_runner_); |
| 1023 DoMainFrame(); | 1029 DoMainFrame(); |
| 1024 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1030 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1025 blink::WebInputEvent::GestureScrollBegin); | 1031 blink::WebInputEvent::GestureScrollUpdate); |
| 1026 | 1032 |
| 1027 PostTestTasks(&run_order, "C1 T1"); | 1033 PostTestTasks(&run_order, "C1 T1"); |
| 1028 | 1034 |
| 1029 RunUntilIdle(); | 1035 RunUntilIdle(); |
| 1030 EXPECT_FALSE(TouchStartExpectedSoon()); | 1036 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1031 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1037 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); |
| 1032 | 1038 |
| 1039 EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); |
| 1040 } |
| 1041 |
| 1042 TEST_F(RendererSchedulerImplTest, |
| 1043 ExpensiveTimersDoRunWhenMainThreadInputHandling) { |
| 1044 std::vector<std::string> run_order; |
| 1045 |
| 1046 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1047 SimulateExpensiveTasks(timer_task_runner_); |
| 1048 DoMainFrame(); |
| 1049 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1050 blink::WebInputEvent::Undefined); |
| 1051 |
| 1052 PostTestTasks(&run_order, "C1 T1"); |
| 1053 |
| 1054 RunUntilIdle(); |
| 1055 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1056 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1057 CurrentUseCase()); |
| 1058 |
| 1033 EXPECT_THAT(run_order, | 1059 EXPECT_THAT(run_order, |
| 1034 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1060 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 1035 } | 1061 } |
| 1036 | 1062 |
| 1037 TEST_F(RendererSchedulerImplTest, | 1063 TEST_F(RendererSchedulerImplTest, |
| 1038 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { | 1064 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { |
| 1039 std::vector<std::string> run_order; | 1065 std::vector<std::string> run_order; |
| 1040 | 1066 |
| 1041 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1067 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1042 SimulateExpensiveTasks(timer_task_runner_); | 1068 SimulateExpensiveTasks(timer_task_runner_); |
| 1043 DoMainFrameOnCriticalPath(); | 1069 DoMainFrameOnCriticalPath(); |
| 1044 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1070 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1045 blink::WebInputEvent::GestureScrollBegin); | 1071 blink::WebInputEvent::GestureScrollBegin); |
| 1046 | 1072 |
| 1047 PostTestTasks(&run_order, "C1 T1"); | 1073 PostTestTasks(&run_order, "C1 T1"); |
| 1048 | 1074 |
| 1049 RunUntilIdle(); | 1075 RunUntilIdle(); |
| 1050 EXPECT_FALSE(TouchStartExpectedSoon()); | 1076 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1051 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1077 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1078 CurrentUseCase()); |
| 1052 | 1079 |
| 1053 EXPECT_THAT(run_order, | 1080 EXPECT_THAT(run_order, |
| 1054 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1081 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 1055 } | 1082 } |
| 1056 | 1083 |
| 1057 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { | 1084 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { |
| 1058 std::vector<std::string> run_order; | 1085 std::vector<std::string> run_order; |
| 1059 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); | 1086 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); |
| 1060 | 1087 |
| 1061 // Observation of touchstart should defer execution of timer, idle and loading | 1088 // Observation of touchstart should defer execution of timer, idle and loading |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 EnableIdleTasks(); | 1300 EnableIdleTasks(); |
| 1274 scheduler_->DidHandleInputEventOnCompositorThread( | 1301 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1275 FakeInputEvent(blink::WebInputEvent::MouseWheel), | 1302 FakeInputEvent(blink::WebInputEvent::MouseWheel), |
| 1276 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1303 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1277 RunUntilIdle(); | 1304 RunUntilIdle(); |
| 1278 // Note compositor tasks are prioritized. | 1305 // Note compositor tasks are prioritized. |
| 1279 EXPECT_THAT(run_order, | 1306 EXPECT_THAT(run_order, |
| 1280 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1307 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 1281 std::string("D1"), std::string("D2"), | 1308 std::string("D1"), std::string("D2"), |
| 1282 std::string("I1"))); | 1309 std::string("I1"))); |
| 1283 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1310 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1311 CurrentUseCase()); |
| 1284 } | 1312 } |
| 1285 | 1313 |
| 1286 TEST_F(RendererSchedulerImplTest, | 1314 TEST_F(RendererSchedulerImplTest, |
| 1287 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { | 1315 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { |
| 1288 std::vector<std::string> run_order; | 1316 std::vector<std::string> run_order; |
| 1289 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1317 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 1290 | 1318 |
| 1291 EnableIdleTasks(); | 1319 EnableIdleTasks(); |
| 1292 scheduler_->DidHandleInputEventOnCompositorThread( | 1320 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1293 FakeInputEvent(blink::WebInputEvent::KeyDown), | 1321 FakeInputEvent(blink::WebInputEvent::KeyDown), |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1354 ForceUpdatePolicyAndGetCurrentUseCase()); | 1382 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 1355 | 1383 |
| 1356 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); | 1384 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| 1357 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 1385 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 1358 } | 1386 } |
| 1359 | 1387 |
| 1360 TEST_F(RendererSchedulerImplTest, | 1388 TEST_F(RendererSchedulerImplTest, |
| 1361 TestCompositorPolicyEnds_MainThreadHandlesInput) { | 1389 TestCompositorPolicyEnds_MainThreadHandlesInput) { |
| 1362 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1390 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 1363 blink::WebInputEvent::GestureScrollBegin); | 1391 blink::WebInputEvent::GestureScrollBegin); |
| 1364 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, | 1392 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1365 ForceUpdatePolicyAndGetCurrentUseCase()); | 1393 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 1366 | 1394 |
| 1367 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); | 1395 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
| 1368 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 1396 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 1369 } | 1397 } |
| 1370 | 1398 |
| 1371 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { | 1399 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { |
| 1372 std::vector<std::string> run_order; | 1400 std::vector<std::string> run_order; |
| 1373 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); | 1401 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); |
| 1374 | 1402 |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1535 } | 1563 } |
| 1536 | 1564 |
| 1537 TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) { | 1565 TEST_F(RendererSchedulerImplTest, SlowMainThreadInputEvent) { |
| 1538 EXPECT_EQ(UseCase::NONE, CurrentUseCase()); | 1566 EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| 1539 | 1567 |
| 1540 // An input event should bump us into input priority. | 1568 // An input event should bump us into input priority. |
| 1541 scheduler_->DidHandleInputEventOnCompositorThread( | 1569 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1542 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), | 1570 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| 1543 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1571 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1544 RunUntilIdle(); | 1572 RunUntilIdle(); |
| 1545 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1573 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase()); |
| 1546 | 1574 |
| 1547 // Simulate the input event being queued for a very long time. The compositor | 1575 // Simulate the input event being queued for a very long time. The compositor |
| 1548 // task we post here represents the enqueued input task. | 1576 // task we post here represents the enqueued input task. |
| 1549 clock_->Advance(priority_escalation_after_input_duration() * 2); | 1577 clock_->Advance(priority_escalation_after_input_duration() * 2); |
| 1550 scheduler_->DidHandleInputEventOnMainThread( | 1578 scheduler_->DidHandleInputEventOnMainThread( |
| 1551 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 1579 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| 1552 RunUntilIdle(); | 1580 RunUntilIdle(); |
| 1553 | 1581 |
| 1554 // Even though we exceeded the input priority escalation period, we should | 1582 // Even though we exceeded the input priority escalation period, we should |
| 1555 // still be in main thread gesture since the input remains queued. | 1583 // still be in main thread gesture since the input remains queued. |
| 1556 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1584 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase()); |
| 1557 | 1585 |
| 1558 // After the escalation period ends we should go back into normal mode. | 1586 // After the escalation period ends we should go back into normal mode. |
| 1559 clock_->Advance(priority_escalation_after_input_duration() * 2); | 1587 clock_->Advance(priority_escalation_after_input_duration() * 2); |
| 1560 RunUntilIdle(); | 1588 RunUntilIdle(); |
| 1561 EXPECT_EQ(UseCase::NONE, CurrentUseCase()); | 1589 EXPECT_EQ(UseCase::NONE, CurrentUseCase()); |
| 1562 } | 1590 } |
| 1563 | 1591 |
| 1564 class RendererSchedulerImplWithMockSchedulerTest | 1592 class RendererSchedulerImplWithMockSchedulerTest |
| 1565 : public RendererSchedulerImplTest { | 1593 : public RendererSchedulerImplTest { |
| 1566 public: | 1594 public: |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1732 EnsureUpdatePolicyNotTriggeredTooOften) { | 1760 EnsureUpdatePolicyNotTriggeredTooOften) { |
| 1733 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 1761 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 1734 | 1762 |
| 1735 EXPECT_EQ(0, mock_scheduler_->update_policy_count_); | 1763 EXPECT_EQ(0, mock_scheduler_->update_policy_count_); |
| 1736 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1764 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1737 EXPECT_EQ(1, mock_scheduler_->update_policy_count_); | 1765 EXPECT_EQ(1, mock_scheduler_->update_policy_count_); |
| 1738 | 1766 |
| 1739 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 1767 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 1740 | 1768 |
| 1741 // We expect the first call to IsHighPriorityWorkAnticipated to be called | 1769 // We expect the first call to IsHighPriorityWorkAnticipated to be called |
| 1742 // after recieving an input event (but before the UpdateTask was processed) to | 1770 // after receiving an input event (but before the UpdateTask was processed) to |
| 1743 // call UpdatePolicy. | 1771 // call UpdatePolicy. |
| 1744 EXPECT_EQ(1, mock_scheduler_->update_policy_count_); | 1772 EXPECT_EQ(1, mock_scheduler_->update_policy_count_); |
| 1745 scheduler_->IsHighPriorityWorkAnticipated(); | 1773 scheduler_->IsHighPriorityWorkAnticipated(); |
| 1746 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); | 1774 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); |
| 1747 // Subsequent calls should not call UpdatePolicy. | 1775 // Subsequent calls should not call UpdatePolicy. |
| 1748 scheduler_->IsHighPriorityWorkAnticipated(); | 1776 scheduler_->IsHighPriorityWorkAnticipated(); |
| 1749 scheduler_->IsHighPriorityWorkAnticipated(); | 1777 scheduler_->IsHighPriorityWorkAnticipated(); |
| 1750 scheduler_->IsHighPriorityWorkAnticipated(); | 1778 scheduler_->IsHighPriorityWorkAnticipated(); |
| 1751 scheduler_->ShouldYieldForHighPriorityWork(); | 1779 scheduler_->ShouldYieldForHighPriorityWork(); |
| 1752 scheduler_->ShouldYieldForHighPriorityWork(); | 1780 scheduler_->ShouldYieldForHighPriorityWork(); |
| 1753 scheduler_->ShouldYieldForHighPriorityWork(); | 1781 scheduler_->ShouldYieldForHighPriorityWork(); |
| 1754 scheduler_->ShouldYieldForHighPriorityWork(); | 1782 scheduler_->ShouldYieldForHighPriorityWork(); |
| 1755 | 1783 |
| 1756 scheduler_->DidHandleInputEventOnCompositorThread( | 1784 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1757 FakeInputEvent(blink::WebInputEvent::GestureScrollEnd), | 1785 FakeInputEvent(blink::WebInputEvent::GestureScrollEnd), |
| 1758 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1786 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 1787 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1788 FakeInputEvent(blink::WebInputEvent::TouchEnd), |
| 1789 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1790 |
| 1791 scheduler_->DidHandleInputEventOnMainThread( |
| 1792 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
| 1793 scheduler_->DidHandleInputEventOnMainThread( |
| 1794 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1795 scheduler_->DidHandleInputEventOnMainThread( |
| 1796 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
| 1797 scheduler_->DidHandleInputEventOnMainThread( |
| 1798 FakeInputEvent(blink::WebInputEvent::TouchEnd)); |
| 1759 | 1799 |
| 1760 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); | 1800 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); |
| 1761 | 1801 |
| 1762 // We expect both the urgent and the delayed updates to run in addition to the | 1802 // We expect both the urgent and the delayed updates to run in addition to the |
| 1763 // earlier updated cause by IsHighPriorityWorkAnticipated, a final update | 1803 // earlier updated cause by IsHighPriorityWorkAnticipated, a final update |
| 1764 // transitions from 'not_scrolling scroll expected' to 'not_scrolling'. | 1804 // transitions from 'not_scrolling touchstart expected' to 'not_scrolling'. |
| 1765 RunUntilIdle(); | 1805 RunUntilIdle(); |
| 1766 EXPECT_THAT(mock_scheduler_->use_cases_, | 1806 EXPECT_THAT( |
| 1767 testing::ElementsAre( | 1807 mock_scheduler_->use_cases_, |
| 1768 std::string("none"), std::string("compositor_gesture"), | 1808 testing::ElementsAre( |
| 1769 std::string("compositor_gesture scroll expected"), | 1809 std::string("none"), std::string("compositor_gesture"), |
| 1770 std::string("none scroll expected"), std::string("none"))); | 1810 std::string("compositor_gesture touchstart expected"), |
| 1811 std::string("none touchstart expected"), std::string("none"))); |
| 1771 } | 1812 } |
| 1772 | 1813 |
| 1773 class RendererSchedulerImplWithMessageLoopTest | 1814 class RendererSchedulerImplWithMessageLoopTest |
| 1774 : public RendererSchedulerImplTest { | 1815 : public RendererSchedulerImplTest { |
| 1775 public: | 1816 public: |
| 1776 RendererSchedulerImplWithMessageLoopTest() | 1817 RendererSchedulerImplWithMessageLoopTest() |
| 1777 : RendererSchedulerImplTest(new base::MessageLoop()) {} | 1818 : RendererSchedulerImplTest(new base::MessageLoop()) {} |
| 1778 ~RendererSchedulerImplWithMessageLoopTest() override {} | 1819 ~RendererSchedulerImplWithMessageLoopTest() override {} |
| 1779 | 1820 |
| 1780 void PostFromNestedRunloop(std::vector< | 1821 void PostFromNestedRunloop(std::vector< |
| (...skipping 513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2294 TEST_F(RendererSchedulerImplTest, | 2335 TEST_F(RendererSchedulerImplTest, |
| 2295 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { | 2336 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { |
| 2296 std::vector<std::string> run_order; | 2337 std::vector<std::string> run_order; |
| 2297 | 2338 |
| 2298 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2339 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2299 DoMainFrame(); | 2340 DoMainFrame(); |
| 2300 SimulateExpensiveTasks(timer_task_runner_); | 2341 SimulateExpensiveTasks(timer_task_runner_); |
| 2301 | 2342 |
| 2302 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2343 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2303 blink::WebInputEvent::GestureScrollBegin); | 2344 blink::WebInputEvent::GestureScrollBegin); |
| 2304 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, | 2345 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2305 ForceUpdatePolicyAndGetCurrentUseCase()); | 2346 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2306 | 2347 |
| 2307 scheduler_->DidHandleInputEventOnCompositorThread( | 2348 scheduler_->DidHandleInputEventOnCompositorThread( |
| 2308 FakeInputEvent(blink::WebInputEvent::TouchEnd), | 2349 FakeInputEvent(blink::WebInputEvent::TouchEnd), |
| 2309 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 2350 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 2310 scheduler_->DidHandleInputEventOnMainThread( | 2351 scheduler_->DidHandleInputEventOnMainThread( |
| 2311 FakeInputEvent(blink::WebInputEvent::TouchEnd)); | 2352 FakeInputEvent(blink::WebInputEvent::TouchEnd)); |
| 2312 | 2353 |
| 2313 clock_->Advance(priority_escalation_after_input_duration() * 2); | 2354 clock_->Advance(priority_escalation_after_input_duration() * 2); |
| 2314 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2355 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| (...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 | 2560 |
| 2520 SimulateExpensiveTasks(loading_task_runner_); | 2561 SimulateExpensiveTasks(loading_task_runner_); |
| 2521 | 2562 |
| 2522 // Loading tasks should not be disabled during main thread user interactions. | 2563 // Loading tasks should not be disabled during main thread user interactions. |
| 2523 PostTestTasks(&run_order, "C1 L1"); | 2564 PostTestTasks(&run_order, "C1 L1"); |
| 2524 | 2565 |
| 2525 // Trigger main_thread_gesture UseCase | 2566 // Trigger main_thread_gesture UseCase |
| 2526 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2567 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2527 blink::WebInputEvent::GestureScrollBegin); | 2568 blink::WebInputEvent::GestureScrollBegin); |
| 2528 RunUntilIdle(); | 2569 RunUntilIdle(); |
| 2529 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 2570 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2571 CurrentUseCase()); |
| 2530 | 2572 |
| 2531 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2573 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2532 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2574 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2533 EXPECT_THAT(run_order, | 2575 EXPECT_THAT(run_order, |
| 2534 testing::ElementsAre(std::string("C1"), std::string("L1"))); | 2576 testing::ElementsAre(std::string("C1"), std::string("L1"))); |
| 2535 } | 2577 } |
| 2536 | 2578 |
| 2537 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { | 2579 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { |
| 2538 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2580 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2539 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2581 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2540 blink::WebInputEvent::TouchMove); | 2582 blink::WebInputEvent::TouchMove); |
| 2541 RunUntilIdle(); | 2583 RunUntilIdle(); |
| 2542 for (int i = 0; i < 20; i++) { | 2584 for (int i = 0; i < 20; i++) { |
| 2543 simulate_timer_task_ran_ = false; | 2585 simulate_timer_task_ran_ = false; |
| 2544 | 2586 |
| 2545 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2587 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2546 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2588 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2547 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2589 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2548 begin_frame_args.on_critical_path = false; | 2590 begin_frame_args.on_critical_path = false; |
| 2549 scheduler_->WillBeginFrame(begin_frame_args); | 2591 scheduler_->WillBeginFrame(begin_frame_args); |
| 2550 | 2592 |
| 2551 compositor_task_runner_->PostTask( | 2593 compositor_task_runner_->PostTask( |
| 2552 FROM_HERE, | 2594 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2553 base::Bind( | 2595 SimulateMainThreadInputHandlingCompositorTask, |
| 2554 &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask, | 2596 base::Unretained(this), |
| 2555 base::Unretained(this), base::TimeDelta::FromMilliseconds(8))); | 2597 base::TimeDelta::FromMilliseconds(8))); |
| 2556 timer_task_runner_->PostTask( | 2598 timer_task_runner_->PostTask( |
| 2557 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2599 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2558 base::Unretained(this), | 2600 base::Unretained(this), |
| 2559 base::TimeDelta::FromMilliseconds(4))); | 2601 base::TimeDelta::FromMilliseconds(4))); |
| 2560 | 2602 |
| 2561 RunUntilIdle(); | 2603 RunUntilIdle(); |
| 2562 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2604 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2563 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) | 2605 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2606 CurrentUseCase()) |
| 2564 << " i = " << i; | 2607 << " i = " << i; |
| 2565 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2608 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2566 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2609 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2567 | 2610 |
| 2568 base::TimeDelta time_till_next_frame = | 2611 base::TimeDelta time_till_next_frame = |
| 2569 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2612 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2570 if (time_till_next_frame > base::TimeDelta()) | 2613 if (time_till_next_frame > base::TimeDelta()) |
| 2571 clock_->Advance(time_till_next_frame); | 2614 clock_->Advance(time_till_next_frame); |
| 2572 } | 2615 } |
| 2573 } | 2616 } |
| (...skipping 30 matching lines...) Expand all Loading... |
| 2604 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2647 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2605 | 2648 |
| 2606 base::TimeDelta time_till_next_frame = | 2649 base::TimeDelta time_till_next_frame = |
| 2607 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2650 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2608 if (time_till_next_frame > base::TimeDelta()) | 2651 if (time_till_next_frame > base::TimeDelta()) |
| 2609 clock_->Advance(time_till_next_frame); | 2652 clock_->Advance(time_till_next_frame); |
| 2610 } | 2653 } |
| 2611 } | 2654 } |
| 2612 | 2655 |
| 2613 TEST_F(RendererSchedulerImplTest, | 2656 TEST_F(RendererSchedulerImplTest, |
| 2614 ExpensiveTimer_NotBlocked_UseCase_MAIN_THREAD_GESTURE) { | 2657 ExpensiveTimer_NotBlocked_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLING) { |
| 2615 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2658 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2616 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2659 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2617 blink::WebInputEvent::TouchMove); | 2660 blink::WebInputEvent::TouchMove); |
| 2618 RunUntilIdle(); | 2661 RunUntilIdle(); |
| 2619 for (int i = 0; i < 20; i++) { | 2662 for (int i = 0; i < 20; i++) { |
| 2620 simulate_timer_task_ran_ = false; | 2663 simulate_timer_task_ran_ = false; |
| 2621 | 2664 |
| 2622 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2665 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2623 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2666 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2624 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2667 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2625 begin_frame_args.on_critical_path = false; | 2668 begin_frame_args.on_critical_path = false; |
| 2626 scheduler_->WillBeginFrame(begin_frame_args); | 2669 scheduler_->WillBeginFrame(begin_frame_args); |
| 2627 | 2670 |
| 2628 compositor_task_runner_->PostTask( | 2671 compositor_task_runner_->PostTask( |
| 2629 FROM_HERE, | 2672 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2630 base::Bind( | 2673 SimulateMainThreadInputHandlingCompositorTask, |
| 2631 &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask, | 2674 base::Unretained(this), |
| 2632 base::Unretained(this), base::TimeDelta::FromMilliseconds(8))); | 2675 base::TimeDelta::FromMilliseconds(8))); |
| 2633 timer_task_runner_->PostTask( | 2676 timer_task_runner_->PostTask( |
| 2634 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2677 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2635 base::Unretained(this), | 2678 base::Unretained(this), |
| 2636 base::TimeDelta::FromMilliseconds(10))); | 2679 base::TimeDelta::FromMilliseconds(10))); |
| 2637 | 2680 |
| 2638 RunUntilIdle(); | 2681 RunUntilIdle(); |
| 2639 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) | 2682 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2683 CurrentUseCase()) |
| 2640 << " i = " << i; | 2684 << " i = " << i; |
| 2641 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2685 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2642 if (i == 0) { | 2686 if (i == 0) { |
| 2643 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2687 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2644 } else { | 2688 } else { |
| 2645 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; | 2689 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2646 } | 2690 } |
| 2647 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2691 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2648 | 2692 |
| 2649 base::TimeDelta time_till_next_frame = | 2693 base::TimeDelta time_till_next_frame = |
| (...skipping 23 matching lines...) Expand all Loading... |
| 2673 TEST_F(RendererSchedulerImplTest, | 2717 TEST_F(RendererSchedulerImplTest, |
| 2674 DISABLED_EstimateLongestJankFreeTaskDuration_UseCase_) { | 2718 DISABLED_EstimateLongestJankFreeTaskDuration_UseCase_) { |
| 2675 scheduler_->OnNavigationStarted(); | 2719 scheduler_->OnNavigationStarted(); |
| 2676 EXPECT_EQ(UseCase::LOADING, ForceUpdatePolicyAndGetCurrentUseCase()); | 2720 EXPECT_EQ(UseCase::LOADING, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2677 EXPECT_EQ(rails_response_time(), | 2721 EXPECT_EQ(rails_response_time(), |
| 2678 scheduler_->EstimateLongestJankFreeTaskDuration()); | 2722 scheduler_->EstimateLongestJankFreeTaskDuration()); |
| 2679 } | 2723 } |
| 2680 | 2724 |
| 2681 TEST_F(RendererSchedulerImplTest, | 2725 TEST_F(RendererSchedulerImplTest, |
| 2682 EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_GESTURE) { | 2726 EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_GESTURE) { |
| 2727 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2728 blink::WebInputEvent::GestureScrollUpdate); |
| 2683 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2729 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2684 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2730 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2685 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2731 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2686 begin_frame_args.on_critical_path = false; | 2732 begin_frame_args.on_critical_path = false; |
| 2687 scheduler_->WillBeginFrame(begin_frame_args); | 2733 scheduler_->WillBeginFrame(begin_frame_args); |
| 2688 | 2734 |
| 2689 compositor_task_runner_->PostTask( | 2735 compositor_task_runner_->PostTask( |
| 2690 FROM_HERE, | 2736 FROM_HERE, |
| 2691 base::Bind( | 2737 base::Bind(&RendererSchedulerImplTest:: |
| 2692 &RendererSchedulerImplTest::SimulateMainThreadGestureCompositorTask, | 2738 SimulateMainThreadInputHandlingCompositorTask, |
| 2693 base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); | 2739 base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); |
| 2694 | 2740 |
| 2695 RunUntilIdle(); | 2741 RunUntilIdle(); |
| 2696 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 2742 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); |
| 2697 | 2743 |
| 2698 // 16ms frame - 5ms compositor work = 11ms for other stuff. | 2744 // 16ms frame - 5ms compositor work = 11ms for other stuff. |
| 2699 EXPECT_EQ(base::TimeDelta::FromMilliseconds(11), | 2745 EXPECT_EQ(base::TimeDelta::FromMilliseconds(11), |
| 2700 scheduler_->EstimateLongestJankFreeTaskDuration()); | 2746 scheduler_->EstimateLongestJankFreeTaskDuration()); |
| 2701 } | 2747 } |
| 2702 | 2748 |
| 2749 TEST_F( |
| 2750 RendererSchedulerImplTest, |
| 2751 EstimateLongestJankFreeTaskDuration_UseCase_MAIN_THREAD_CUSTOM_INPUT_HANDLIN
G) { |
| 2752 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2753 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2754 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2755 begin_frame_args.on_critical_path = false; |
| 2756 scheduler_->WillBeginFrame(begin_frame_args); |
| 2757 |
| 2758 compositor_task_runner_->PostTask( |
| 2759 FROM_HERE, |
| 2760 base::Bind(&RendererSchedulerImplTest:: |
| 2761 SimulateMainThreadInputHandlingCompositorTask, |
| 2762 base::Unretained(this), base::TimeDelta::FromMilliseconds(5))); |
| 2763 |
| 2764 RunUntilIdle(); |
| 2765 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase()); |
| 2766 |
| 2767 // 16ms frame - 5ms compositor work = 11ms for other stuff. |
| 2768 EXPECT_EQ(base::TimeDelta::FromMilliseconds(11), |
| 2769 scheduler_->EstimateLongestJankFreeTaskDuration()); |
| 2770 } |
| 2771 |
| 2703 TEST_F(RendererSchedulerImplTest, | 2772 TEST_F(RendererSchedulerImplTest, |
| 2704 EstimateLongestJankFreeTaskDuration_UseCase_SYNCHRONIZED_GESTURE) { | 2773 EstimateLongestJankFreeTaskDuration_UseCase_SYNCHRONIZED_GESTURE) { |
| 2705 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); | 2774 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); |
| 2706 | 2775 |
| 2707 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2776 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2708 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2777 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2709 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2778 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2710 begin_frame_args.on_critical_path = true; | 2779 begin_frame_args.on_critical_path = true; |
| 2711 scheduler_->WillBeginFrame(begin_frame_args); | 2780 scheduler_->WillBeginFrame(begin_frame_args); |
| 2712 | 2781 |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2904 EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i; | 2973 EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i; |
| 2905 EXPECT_TRUE(scheduler_->TimerTaskRunner()->IsQueueEnabled()) << "i = " << i; | 2974 EXPECT_TRUE(scheduler_->TimerTaskRunner()->IsQueueEnabled()) << "i = " << i; |
| 2906 } | 2975 } |
| 2907 | 2976 |
| 2908 // Task is not throttled. | 2977 // Task is not throttled. |
| 2909 EXPECT_EQ(500u, count); | 2978 EXPECT_EQ(500u, count); |
| 2910 } | 2979 } |
| 2911 | 2980 |
| 2912 TEST_F(RendererSchedulerImplTest, | 2981 TEST_F(RendererSchedulerImplTest, |
| 2913 ExpensiveTimerTaskBlocked_SYNCHRONIZED_GESTURE_TouchStartExpected) { | 2982 ExpensiveTimerTaskBlocked_SYNCHRONIZED_GESTURE_TouchStartExpected) { |
| 2983 SimulateExpensiveTasks(timer_task_runner_); |
| 2914 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 2984 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 2915 SimulateExpensiveTasks(timer_task_runner_); | |
| 2916 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2985 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2917 ForceTouchStartToBeExpectedSoon(); | 2986 ForceTouchStartToBeExpectedSoon(); |
| 2918 | 2987 |
| 2919 // Bump us into SYNCHRONIZED_GESTURE. | 2988 // Bump us into SYNCHRONIZED_GESTURE. |
| 2920 scheduler_->DidHandleInputEventOnCompositorThread( | 2989 scheduler_->DidHandleInputEventOnCompositorThread( |
| 2921 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), | 2990 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), |
| 2922 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 2991 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 2923 | 2992 |
| 2924 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2993 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2925 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2994 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3004 EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i; | 3073 EXPECT_EQ(UseCase::SYNCHRONIZED_GESTURE, CurrentUseCase()) << "i = " << i; |
| 3005 } | 3074 } |
| 3006 | 3075 |
| 3007 // Timer tasks should not have been starved by the expensive compositor | 3076 // Timer tasks should not have been starved by the expensive compositor |
| 3008 // tasks. | 3077 // tasks. |
| 3009 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, | 3078 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, |
| 3010 scheduler_->CompositorTaskRunner()->GetQueuePriority()); | 3079 scheduler_->CompositorTaskRunner()->GetQueuePriority()); |
| 3011 EXPECT_EQ(1000u, run_order.size()); | 3080 EXPECT_EQ(1000u, run_order.size()); |
| 3012 } | 3081 } |
| 3013 | 3082 |
| 3014 TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE_CompositingExpensive) { | 3083 TEST_F(RendererSchedulerImplTest, MAIN_THREAD_CUSTOM_INPUT_HANDLING) { |
| 3015 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 3084 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 3016 blink::WebInputEvent::GestureScrollBegin); | 3085 blink::WebInputEvent::GestureScrollBegin); |
| 3017 | 3086 |
| 3018 // With the compositor task taking 20ms, there is not enough time to run | 3087 // With the compositor task taking 20ms, there is not enough time to run |
| 3019 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks | 3088 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks |
| 3020 // should therefore not get prioritized. | 3089 // should therefore not get prioritized. |
| 3021 std::vector<std::string> run_order; | 3090 std::vector<std::string> run_order; |
| 3022 for (int i = 0; i < 1000; i++) | 3091 for (int i = 0; i < 1000; i++) |
| 3023 PostTestTasks(&run_order, "T1"); | 3092 PostTestTasks(&run_order, "T1"); |
| 3024 | 3093 |
| 3025 for (int i = 0; i < 100; i++) { | 3094 for (int i = 0; i < 100; i++) { |
| 3026 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 3095 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 3027 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 3096 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 3028 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 3097 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 3029 begin_frame_args.on_critical_path = true; | 3098 begin_frame_args.on_critical_path = true; |
| 3030 scheduler_->WillBeginFrame(begin_frame_args); | 3099 scheduler_->WillBeginFrame(begin_frame_args); |
| 3031 scheduler_->DidHandleInputEventOnCompositorThread( | 3100 scheduler_->DidHandleInputEventOnCompositorThread( |
| 3032 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), | 3101 FakeInputEvent(blink::WebInputEvent::TouchMove), |
| 3033 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 3102 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 3034 | 3103 |
| 3035 simulate_compositor_task_ran_ = false; | 3104 simulate_compositor_task_ran_ = false; |
| 3036 compositor_task_runner_->PostTask( | 3105 compositor_task_runner_->PostTask( |
| 3037 FROM_HERE, | 3106 FROM_HERE, |
| 3038 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, | 3107 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, |
| 3039 base::Unretained(this), | 3108 base::Unretained(this), |
| 3040 base::TimeDelta::FromMilliseconds(20))); | 3109 base::TimeDelta::FromMilliseconds(20))); |
| 3041 | 3110 |
| 3042 mock_task_runner_->RunTasksWhile( | 3111 mock_task_runner_->RunTasksWhile( |
| 3043 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, | 3112 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, |
| 3044 base::Unretained(this))); | 3113 base::Unretained(this))); |
| 3045 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; | 3114 EXPECT_EQ(UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, CurrentUseCase()) |
| 3115 << "i = " << i; |
| 3046 } | 3116 } |
| 3047 | 3117 |
| 3048 // Timer tasks should not have been starved by the expensive compositor | 3118 // Timer tasks should not have been starved by the expensive compositor |
| 3049 // tasks. | 3119 // tasks. |
| 3050 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, | 3120 EXPECT_EQ(TaskQueue::NORMAL_PRIORITY, |
| 3051 scheduler_->CompositorTaskRunner()->GetQueuePriority()); | 3121 scheduler_->CompositorTaskRunner()->GetQueuePriority()); |
| 3052 EXPECT_EQ(1000u, run_order.size()); | 3122 EXPECT_EQ(1000u, run_order.size()); |
| 3053 } | 3123 } |
| 3054 | 3124 |
| 3125 TEST_F(RendererSchedulerImplTest, MAIN_THREAD_GESTURE) { |
| 3126 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 3127 blink::WebInputEvent::GestureScrollBegin); |
| 3128 |
| 3129 // With the compositor task taking 20ms, there is not enough time to run |
| 3130 // other tasks in the same 16ms frame. However because this is a main thread |
| 3131 // gesture instead of custom main thread input handling, we allow the timer |
| 3132 // tasks to be starved. |
| 3133 std::vector<std::string> run_order; |
| 3134 for (int i = 0; i < 1000; i++) |
| 3135 PostTestTasks(&run_order, "T1"); |
| 3136 |
| 3137 for (int i = 0; i < 100; i++) { |
| 3138 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 3139 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 3140 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 3141 begin_frame_args.on_critical_path = true; |
| 3142 scheduler_->WillBeginFrame(begin_frame_args); |
| 3143 scheduler_->DidHandleInputEventOnCompositorThread( |
| 3144 FakeInputEvent(blink::WebInputEvent::GestureScrollUpdate), |
| 3145 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 3146 |
| 3147 simulate_compositor_task_ran_ = false; |
| 3148 compositor_task_runner_->PostTask( |
| 3149 FROM_HERE, |
| 3150 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, |
| 3151 base::Unretained(this), |
| 3152 base::TimeDelta::FromMilliseconds(20))); |
| 3153 |
| 3154 mock_task_runner_->RunTasksWhile( |
| 3155 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, |
| 3156 base::Unretained(this))); |
| 3157 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; |
| 3158 } |
| 3159 |
| 3160 EXPECT_EQ(TaskQueue::HIGH_PRIORITY, |
| 3161 scheduler_->CompositorTaskRunner()->GetQueuePriority()); |
| 3162 EXPECT_EQ(279u, run_order.size()); |
| 3163 } |
| 3164 |
| 3055 } // namespace scheduler | 3165 } // namespace scheduler |
| OLD | NEW |