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

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

Issue 1977863004: scheduler: Add main thread gesture as a detected use case (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fix broken test 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 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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