| 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 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 183 using RendererSchedulerImpl::EstimateLongestJankFreeTaskDuration; | 183 using RendererSchedulerImpl::EstimateLongestJankFreeTaskDuration; |
| 184 | 184 |
| 185 RendererSchedulerImplForTest( | 185 RendererSchedulerImplForTest( |
| 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 = RendererSchedulerImpl::UseCaseToString( |
| 194 RendererScheduler::UseCaseToString(MainThreadOnly().current_use_case); | 194 MainThreadOnly().current_use_case); |
| 195 if (MainThreadOnly().touchstart_expected_soon) { | 195 if (MainThreadOnly().touchstart_expected_soon) { |
| 196 use_cases_.push_back(use_case + " touchstart 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 } |
| 207 | 207 |
| 208 void ScheduleDelayedPolicyUpdate(base::TimeTicks now, base::TimeDelta delay) { | 208 void ScheduleDelayedPolicyUpdate(base::TimeTicks now, base::TimeDelta delay) { |
| 209 delayed_update_policy_runner_.SetDeadline(FROM_HERE, delay, now); | 209 delayed_update_policy_runner_.SetDeadline(FROM_HERE, delay, now); |
| 210 } | 210 } |
| 211 | 211 |
| 212 bool BeginMainFrameOnCriticalPath() { | 212 bool BeginMainFrameOnCriticalPath() { |
| 213 base::AutoLock lock(any_thread_lock_); | 213 base::AutoLock lock(any_thread_lock_); |
| 214 return AnyThread().begin_main_frame_on_critical_path; | 214 return AnyThread().begin_main_frame_on_critical_path; |
| 215 } | 215 } |
| 216 | 216 |
| 217 int update_policy_count_; | 217 int update_policy_count_; |
| 218 std::vector<std::string> use_cases_; | 218 std::vector<std::string> use_cases_; |
| 219 }; | 219 }; |
| 220 | 220 |
| 221 // Lets gtest print human readable Policy values. | 221 // Lets gtest print human readable Policy values. |
| 222 ::std::ostream& operator<<(::std::ostream& os, | 222 ::std::ostream& operator<<(::std::ostream& os, |
| 223 const RendererScheduler::UseCase& use_case) { | 223 const RendererSchedulerImpl::UseCase& use_case) { |
| 224 return os << RendererScheduler::UseCaseToString(use_case); | 224 return os << RendererSchedulerImpl::UseCaseToString(use_case); |
| 225 } | 225 } |
| 226 | 226 |
| 227 class RendererSchedulerImplTest : public testing::Test { | 227 class RendererSchedulerImplTest : public testing::Test { |
| 228 public: | 228 public: |
| 229 using UseCase = RendererSchedulerImpl::UseCase; | 229 using UseCase = RendererSchedulerImpl::UseCase; |
| 230 | 230 |
| 231 RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) { | 231 RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) { |
| 232 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 232 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
| 233 } | 233 } |
| 234 | 234 |
| (...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 487 | 487 |
| 488 UseCase CurrentUseCase() { | 488 UseCase CurrentUseCase() { |
| 489 return scheduler_->MainThreadOnly().current_use_case; | 489 return scheduler_->MainThreadOnly().current_use_case; |
| 490 } | 490 } |
| 491 | 491 |
| 492 UseCase ForceUpdatePolicyAndGetCurrentUseCase() { | 492 UseCase ForceUpdatePolicyAndGetCurrentUseCase() { |
| 493 scheduler_->ForceUpdatePolicy(); | 493 scheduler_->ForceUpdatePolicy(); |
| 494 return scheduler_->MainThreadOnly().current_use_case; | 494 return scheduler_->MainThreadOnly().current_use_case; |
| 495 } | 495 } |
| 496 | 496 |
| 497 v8::RAILMode RAILMode() { |
| 498 return scheduler_->MainThreadOnly().current_policy.rail_mode; |
| 499 } |
| 500 |
| 501 bool BeginFrameNotExpectedSoon() { |
| 502 return scheduler_->MainThreadOnly().begin_frame_not_expected_soon; |
| 503 } |
| 504 |
| 497 bool TouchStartExpectedSoon() { | 505 bool TouchStartExpectedSoon() { |
| 498 return scheduler_->MainThreadOnly().touchstart_expected_soon; | 506 return scheduler_->MainThreadOnly().touchstart_expected_soon; |
| 499 } | 507 } |
| 500 | 508 |
| 501 bool HaveSeenABeginMainframe() { | 509 bool HaveSeenABeginMainframe() { |
| 502 return scheduler_->MainThreadOnly().have_seen_a_begin_main_frame; | 510 return scheduler_->MainThreadOnly().have_seen_a_begin_main_frame; |
| 503 } | 511 } |
| 504 | 512 |
| 505 bool LoadingTasksSeemExpensive() { | 513 bool LoadingTasksSeemExpensive() { |
| 506 return scheduler_->MainThreadOnly().loading_tasks_seem_expensive; | 514 return scheduler_->MainThreadOnly().loading_tasks_seem_expensive; |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 840 TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { | 848 TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { |
| 841 std::vector<std::string> run_order; | 849 std::vector<std::string> run_order; |
| 842 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 850 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 843 | 851 |
| 844 EnableIdleTasks(); | 852 EnableIdleTasks(); |
| 845 RunUntilIdle(); | 853 RunUntilIdle(); |
| 846 EXPECT_THAT(run_order, | 854 EXPECT_THAT(run_order, |
| 847 testing::ElementsAre(std::string("L1"), std::string("D1"), | 855 testing::ElementsAre(std::string("L1"), std::string("D1"), |
| 848 std::string("C1"), std::string("D2"), | 856 std::string("C1"), std::string("D2"), |
| 849 std::string("C2"), std::string("I1"))); | 857 std::string("C2"), std::string("I1"))); |
| 850 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 858 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 851 } | 859 } |
| 852 | 860 |
| 853 TEST_F(RendererSchedulerImplTest, | 861 TEST_F(RendererSchedulerImplTest, |
| 854 TestCompositorPolicy_CompositorHandlesInput_WithTouchHandler) { | 862 TestCompositorPolicy_CompositorHandlesInput_WithTouchHandler) { |
| 855 std::vector<std::string> run_order; | 863 std::vector<std::string> run_order; |
| 856 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 864 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 857 | 865 |
| 858 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 866 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 859 EnableIdleTasks(); | 867 EnableIdleTasks(); |
| 860 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 868 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 861 RunUntilIdle(); | 869 RunUntilIdle(); |
| 862 EXPECT_THAT(run_order, | 870 EXPECT_THAT(run_order, |
| 863 testing::ElementsAre(std::string("L1"), std::string("D1"), | 871 testing::ElementsAre(std::string("L1"), std::string("D1"), |
| 864 std::string("D2"), std::string("I1"), | 872 std::string("D2"), std::string("I1"), |
| 865 std::string("C1"), std::string("C2"))); | 873 std::string("C1"), std::string("C2"))); |
| 866 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); | 874 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 875 CurrentUseCase()); |
| 867 } | 876 } |
| 868 | 877 |
| 869 TEST_F(RendererSchedulerImplTest, | 878 TEST_F(RendererSchedulerImplTest, |
| 870 TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) { | 879 TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) { |
| 871 std::vector<std::string> run_order; | 880 std::vector<std::string> run_order; |
| 872 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 881 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 873 | 882 |
| 874 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 883 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 875 EnableIdleTasks(); | 884 EnableIdleTasks(); |
| 876 SimulateMainThreadGestureWithoutScrollUpdates(); | 885 SimulateMainThreadGestureWithoutScrollUpdates(); |
| 877 RunUntilIdle(); | 886 RunUntilIdle(); |
| 878 EXPECT_THAT(run_order, | 887 EXPECT_THAT(run_order, |
| 879 testing::ElementsAre(std::string("C1"), std::string("C2"), | 888 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 880 std::string("L1"), std::string("D1"), | 889 std::string("L1"), std::string("D1"), |
| 881 std::string("D2"), std::string("I1"))); | 890 std::string("D2"), std::string("I1"))); |
| 882 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 891 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 883 CurrentUseCase()); | 892 CurrentUseCase()); |
| 884 } | 893 } |
| 885 | 894 |
| 886 TEST_F(RendererSchedulerImplTest, | 895 TEST_F(RendererSchedulerImplTest, |
| 887 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { | 896 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { |
| 888 std::vector<std::string> run_order; | 897 std::vector<std::string> run_order; |
| 889 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 898 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 890 | 899 |
| 891 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 900 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 892 EnableIdleTasks(); | 901 EnableIdleTasks(); |
| 893 SimulateMainThreadGestureWithoutPreventDefault(); | 902 SimulateMainThreadGestureWithoutPreventDefault(); |
| 894 RunUntilIdle(); | 903 RunUntilIdle(); |
| 895 EXPECT_THAT(run_order, | 904 EXPECT_THAT(run_order, |
| 896 testing::ElementsAre(std::string("L1"), std::string("D1"), | 905 testing::ElementsAre(std::string("L1"), std::string("D1"), |
| 897 std::string("D2"), std::string("I1"), | 906 std::string("D2"), std::string("I1"), |
| 898 std::string("C1"), std::string("C2"))); | 907 std::string("C1"), std::string("C2"))); |
| 899 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); | 908 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 909 CurrentUseCase()); |
| 900 } | 910 } |
| 901 | 911 |
| 902 TEST_F(RendererSchedulerImplTest, | 912 TEST_F(RendererSchedulerImplTest, |
| 903 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { | 913 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { |
| 904 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 914 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 905 EnableIdleTasks(); | 915 EnableIdleTasks(); |
| 906 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 916 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 907 | 917 |
| 908 base::TimeTicks loop_end_time = | 918 base::TimeTicks loop_end_time = |
| 909 clock_->NowTicks() + base::TimeDelta::FromMilliseconds( | 919 clock_->NowTicks() + base::TimeDelta::FromMilliseconds( |
| (...skipping 11 matching lines...) Expand all Loading... |
| 921 } | 931 } |
| 922 | 932 |
| 923 std::vector<std::string> run_order; | 933 std::vector<std::string> run_order; |
| 924 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 934 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 925 | 935 |
| 926 RunUntilIdle(); | 936 RunUntilIdle(); |
| 927 EXPECT_THAT(run_order, | 937 EXPECT_THAT(run_order, |
| 928 testing::ElementsAre(std::string("C1"), std::string("C2"), | 938 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 929 std::string("L1"), std::string("D1"), | 939 std::string("L1"), std::string("D1"), |
| 930 std::string("D2"))); | 940 std::string("D2"))); |
| 931 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); | 941 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 942 CurrentUseCase()); |
| 932 } | 943 } |
| 933 | 944 |
| 934 TEST_F(RendererSchedulerImplTest, | 945 TEST_F(RendererSchedulerImplTest, |
| 935 TestCompositorPolicy_CompositorHandlesInput_WithoutTouchHandler) { | 946 TestCompositorPolicy_CompositorHandlesInput_WithoutTouchHandler) { |
| 936 std::vector<std::string> run_order; | 947 std::vector<std::string> run_order; |
| 937 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 948 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 938 | 949 |
| 939 EnableIdleTasks(); | 950 EnableIdleTasks(); |
| 940 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); | 951 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); |
| 941 RunUntilIdle(); | 952 RunUntilIdle(); |
| 942 EXPECT_THAT(run_order, | 953 EXPECT_THAT(run_order, |
| 943 testing::ElementsAre(std::string("L1"), std::string("D1"), | 954 testing::ElementsAre(std::string("L1"), std::string("D1"), |
| 944 std::string("D2"), std::string("I1"), | 955 std::string("D2"), std::string("I1"), |
| 945 std::string("C1"), std::string("C2"))); | 956 std::string("C1"), std::string("C2"))); |
| 946 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); | 957 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 958 CurrentUseCase()); |
| 947 } | 959 } |
| 948 | 960 |
| 949 TEST_F(RendererSchedulerImplTest, | 961 TEST_F(RendererSchedulerImplTest, |
| 950 TestCompositorPolicy_MainThreadHandlesInput_WithTouchHandler) { | 962 TestCompositorPolicy_MainThreadHandlesInput_WithTouchHandler) { |
| 951 std::vector<std::string> run_order; | 963 std::vector<std::string> run_order; |
| 952 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 964 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 953 | 965 |
| 954 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 966 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 955 EnableIdleTasks(); | 967 EnableIdleTasks(); |
| 956 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 968 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 957 blink::WebInputEvent::GestureScrollBegin); | 969 blink::WebInputEvent::GestureScrollBegin); |
| 958 RunUntilIdle(); | 970 RunUntilIdle(); |
| 959 EXPECT_THAT(run_order, | 971 EXPECT_THAT(run_order, |
| 960 testing::ElementsAre(std::string("C1"), std::string("C2"), | 972 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 961 std::string("L1"), std::string("D1"), | 973 std::string("L1"), std::string("D1"), |
| 962 std::string("D2"), std::string("I1"))); | 974 std::string("D2"), std::string("I1"))); |
| 963 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 975 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 964 CurrentUseCase()); | 976 CurrentUseCase()); |
| 965 scheduler_->DidHandleInputEventOnMainThread( | 977 scheduler_->DidHandleInputEventOnMainThread( |
| 966 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 978 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| 967 } | 979 } |
| 968 | 980 |
| 969 TEST_F(RendererSchedulerImplTest, | 981 TEST_F(RendererSchedulerImplTest, |
| 970 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { | 982 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { |
| 971 std::vector<std::string> run_order; | 983 std::vector<std::string> run_order; |
| 972 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 984 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
| 973 | 985 |
| 974 EnableIdleTasks(); | 986 EnableIdleTasks(); |
| 975 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 987 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 976 blink::WebInputEvent::GestureScrollBegin); | 988 blink::WebInputEvent::GestureScrollBegin); |
| 977 RunUntilIdle(); | 989 RunUntilIdle(); |
| 978 EXPECT_THAT(run_order, | 990 EXPECT_THAT(run_order, |
| 979 testing::ElementsAre(std::string("C1"), std::string("C2"), | 991 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 980 std::string("L1"), std::string("D1"), | 992 std::string("L1"), std::string("D1"), |
| 981 std::string("D2"), std::string("I1"))); | 993 std::string("D2"), std::string("I1"))); |
| 982 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 994 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 983 CurrentUseCase()); | 995 CurrentUseCase()); |
| 984 scheduler_->DidHandleInputEventOnMainThread( | 996 scheduler_->DidHandleInputEventOnMainThread( |
| 985 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); | 997 FakeInputEvent(blink::WebInputEvent::GestureFlingStart)); |
| 986 } | 998 } |
| 987 | 999 |
| 988 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { | 1000 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { |
| 989 std::vector<std::string> run_order; | 1001 std::vector<std::string> run_order; |
| 990 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1002 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 991 | 1003 |
| 992 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1004 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 993 scheduler_->DidAnimateForInputOnCompositorThread(); | 1005 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 994 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a | 1006 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a |
| 995 // policy update. | 1007 // policy update. |
| 996 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, | 1008 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 997 ForceUpdatePolicyAndGetCurrentUseCase()); | 1009 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 998 EnableIdleTasks(); | 1010 EnableIdleTasks(); |
| 999 RunUntilIdle(); | 1011 RunUntilIdle(); |
| 1000 EXPECT_THAT(run_order, | 1012 EXPECT_THAT(run_order, |
| 1001 testing::ElementsAre(std::string("D1"), std::string("D2"), | 1013 testing::ElementsAre(std::string("D1"), std::string("D2"), |
| 1002 std::string("I1"), std::string("C1"), | 1014 std::string("I1"), std::string("C1"), |
| 1003 std::string("C2"))); | 1015 std::string("C2"))); |
| 1004 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()); | 1016 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 1017 CurrentUseCase()); |
| 1005 } | 1018 } |
| 1006 | 1019 |
| 1007 TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { | 1020 TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { |
| 1008 std::vector<std::string> run_order; | 1021 std::vector<std::string> run_order; |
| 1009 | 1022 |
| 1010 SimulateExpensiveTasks(timer_task_runner_); | 1023 SimulateExpensiveTasks(timer_task_runner_); |
| 1011 scheduler_->OnNavigationStarted(); | 1024 scheduler_->OnNavigationStarted(); |
| 1012 PostTestTasks(&run_order, "C1 T1"); | 1025 PostTestTasks(&run_order, "C1 T1"); |
| 1013 | 1026 |
| 1014 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1027 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| (...skipping 12 matching lines...) Expand all Loading... |
| 1027 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1040 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1028 SimulateExpensiveTasks(timer_task_runner_); | 1041 SimulateExpensiveTasks(timer_task_runner_); |
| 1029 DoMainFrame(); | 1042 DoMainFrame(); |
| 1030 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1043 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1031 blink::WebInputEvent::GestureScrollUpdate); | 1044 blink::WebInputEvent::GestureScrollUpdate); |
| 1032 | 1045 |
| 1033 PostTestTasks(&run_order, "C1 T1"); | 1046 PostTestTasks(&run_order, "C1 T1"); |
| 1034 | 1047 |
| 1035 RunUntilIdle(); | 1048 RunUntilIdle(); |
| 1036 EXPECT_FALSE(TouchStartExpectedSoon()); | 1049 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1037 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()); | 1050 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_GESTURE, |
| 1051 CurrentUseCase()); |
| 1038 | 1052 |
| 1039 EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); | 1053 EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); |
| 1040 } | 1054 } |
| 1041 | 1055 |
| 1042 TEST_F(RendererSchedulerImplTest, | 1056 TEST_F(RendererSchedulerImplTest, |
| 1043 ExpensiveTimersDoRunWhenMainThreadInputHandling) { | 1057 ExpensiveTimersDoRunWhenMainThreadInputHandling) { |
| 1044 std::vector<std::string> run_order; | 1058 std::vector<std::string> run_order; |
| 1045 | 1059 |
| 1046 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1060 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1047 SimulateExpensiveTasks(timer_task_runner_); | 1061 SimulateExpensiveTasks(timer_task_runner_); |
| 1048 DoMainFrame(); | 1062 DoMainFrame(); |
| 1049 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1063 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1050 blink::WebInputEvent::Undefined); | 1064 blink::WebInputEvent::Undefined); |
| 1051 | 1065 |
| 1052 PostTestTasks(&run_order, "C1 T1"); | 1066 PostTestTasks(&run_order, "C1 T1"); |
| 1053 | 1067 |
| 1054 RunUntilIdle(); | 1068 RunUntilIdle(); |
| 1055 EXPECT_FALSE(TouchStartExpectedSoon()); | 1069 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1056 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1070 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1057 CurrentUseCase()); | 1071 CurrentUseCase()); |
| 1058 | 1072 |
| 1059 EXPECT_THAT(run_order, | 1073 EXPECT_THAT(run_order, |
| 1060 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1074 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 1061 } | 1075 } |
| 1062 | 1076 |
| 1063 TEST_F(RendererSchedulerImplTest, | 1077 TEST_F(RendererSchedulerImplTest, |
| 1064 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { | 1078 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { |
| 1065 std::vector<std::string> run_order; | 1079 std::vector<std::string> run_order; |
| 1066 | 1080 |
| 1067 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1081 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 1068 SimulateExpensiveTasks(timer_task_runner_); | 1082 SimulateExpensiveTasks(timer_task_runner_); |
| 1069 DoMainFrameOnCriticalPath(); | 1083 DoMainFrameOnCriticalPath(); |
| 1070 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1084 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 1071 blink::WebInputEvent::GestureScrollBegin); | 1085 blink::WebInputEvent::GestureScrollBegin); |
| 1072 | 1086 |
| 1073 PostTestTasks(&run_order, "C1 T1"); | 1087 PostTestTasks(&run_order, "C1 T1"); |
| 1074 | 1088 |
| 1075 RunUntilIdle(); | 1089 RunUntilIdle(); |
| 1076 EXPECT_FALSE(TouchStartExpectedSoon()); | 1090 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 1077 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1091 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1078 CurrentUseCase()); | 1092 CurrentUseCase()); |
| 1079 | 1093 |
| 1080 EXPECT_THAT(run_order, | 1094 EXPECT_THAT(run_order, |
| 1081 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1095 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 1082 } | 1096 } |
| 1083 | 1097 |
| 1084 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { | 1098 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { |
| 1085 std::vector<std::string> run_order; | 1099 std::vector<std::string> run_order; |
| 1086 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); | 1100 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); |
| 1087 | 1101 |
| (...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1177 scheduler_->OnNavigationStarted(); | 1191 scheduler_->OnNavigationStarted(); |
| 1178 EnableIdleTasks(); | 1192 EnableIdleTasks(); |
| 1179 RunUntilIdle(); | 1193 RunUntilIdle(); |
| 1180 | 1194 |
| 1181 // In loading policy, loading tasks are prioritized other others. | 1195 // In loading policy, loading tasks are prioritized other others. |
| 1182 std::string loading_policy_expected[] = { | 1196 std::string loading_policy_expected[] = { |
| 1183 std::string("D1"), std::string("L1"), std::string("D2"), | 1197 std::string("D1"), std::string("L1"), std::string("D2"), |
| 1184 std::string("L2"), std::string("C1"), std::string("T1"), | 1198 std::string("L2"), std::string("C1"), std::string("T1"), |
| 1185 std::string("C2"), std::string("T2"), std::string("I1")}; | 1199 std::string("C2"), std::string("T2"), std::string("I1")}; |
| 1186 EXPECT_THAT(run_order, testing::ElementsAreArray(loading_policy_expected)); | 1200 EXPECT_THAT(run_order, testing::ElementsAreArray(loading_policy_expected)); |
| 1187 EXPECT_EQ(RendererScheduler::UseCase::LOADING, CurrentUseCase()); | 1201 EXPECT_EQ(RendererSchedulerImpl::UseCase::LOADING, CurrentUseCase()); |
| 1188 | 1202 |
| 1189 // Advance 15s and try again, the loading policy should have ended and the | 1203 // Advance 15s and try again, the loading policy should have ended and the |
| 1190 // task order should return to the NONE use case where loading tasks are no | 1204 // task order should return to the NONE use case where loading tasks are no |
| 1191 // longer prioritized. | 1205 // longer prioritized. |
| 1192 clock_->Advance(base::TimeDelta::FromMilliseconds(150000)); | 1206 clock_->Advance(base::TimeDelta::FromMilliseconds(150000)); |
| 1193 run_order.clear(); | 1207 run_order.clear(); |
| 1194 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); | 1208 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); |
| 1195 EnableIdleTasks(); | 1209 EnableIdleTasks(); |
| 1196 RunUntilIdle(); | 1210 RunUntilIdle(); |
| 1197 | 1211 |
| 1198 std::string default_order_expected[] = { | 1212 std::string default_order_expected[] = { |
| 1199 std::string("D1"), std::string("C1"), std::string("T1"), | 1213 std::string("D1"), std::string("C1"), std::string("T1"), |
| 1200 std::string("L1"), std::string("D2"), std::string("C2"), | 1214 std::string("L1"), std::string("D2"), std::string("C2"), |
| 1201 std::string("T2"), std::string("L2"), std::string("I1")}; | 1215 std::string("T2"), std::string("L2"), std::string("I1")}; |
| 1202 EXPECT_THAT(run_order, testing::ElementsAreArray(default_order_expected)); | 1216 EXPECT_THAT(run_order, testing::ElementsAreArray(default_order_expected)); |
| 1203 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 1217 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 1204 } | 1218 } |
| 1205 | 1219 |
| 1206 TEST_F(RendererSchedulerImplTest, | 1220 TEST_F(RendererSchedulerImplTest, |
| 1207 EventConsumedOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { | 1221 EventConsumedOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { |
| 1208 std::vector<std::string> run_order; | 1222 std::vector<std::string> run_order; |
| 1209 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1223 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 1210 | 1224 |
| 1211 EnableIdleTasks(); | 1225 EnableIdleTasks(); |
| 1212 scheduler_->DidHandleInputEventOnCompositorThread( | 1226 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1213 FakeInputEvent(blink::WebInputEvent::MouseMove), | 1227 FakeInputEvent(blink::WebInputEvent::MouseMove), |
| 1214 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1228 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 1215 RunUntilIdle(); | 1229 RunUntilIdle(); |
| 1216 // Note compositor tasks are not prioritized. | 1230 // Note compositor tasks are not prioritized. |
| 1217 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 1231 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 1218 EXPECT_THAT(run_order, | 1232 EXPECT_THAT(run_order, |
| 1219 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1233 testing::ElementsAre(std::string("D1"), std::string("C1"), |
| 1220 std::string("D2"), std::string("C2"), | 1234 std::string("D2"), std::string("C2"), |
| 1221 std::string("I1"))); | 1235 std::string("I1"))); |
| 1222 } | 1236 } |
| 1223 | 1237 |
| 1224 TEST_F(RendererSchedulerImplTest, | 1238 TEST_F(RendererSchedulerImplTest, |
| 1225 EventForwardedToMainThread_IgnoresMouseMove_WhenMouseUp) { | 1239 EventForwardedToMainThread_IgnoresMouseMove_WhenMouseUp) { |
| 1226 std::vector<std::string> run_order; | 1240 std::vector<std::string> run_order; |
| 1227 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1241 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 1228 | 1242 |
| 1229 EnableIdleTasks(); | 1243 EnableIdleTasks(); |
| 1230 scheduler_->DidHandleInputEventOnCompositorThread( | 1244 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1231 FakeInputEvent(blink::WebInputEvent::MouseMove), | 1245 FakeInputEvent(blink::WebInputEvent::MouseMove), |
| 1232 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1246 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1233 RunUntilIdle(); | 1247 RunUntilIdle(); |
| 1234 // Note compositor tasks are not prioritized. | 1248 // Note compositor tasks are not prioritized. |
| 1235 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 1249 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 1236 EXPECT_THAT(run_order, | 1250 EXPECT_THAT(run_order, |
| 1237 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1251 testing::ElementsAre(std::string("D1"), std::string("C1"), |
| 1238 std::string("D2"), std::string("C2"), | 1252 std::string("D2"), std::string("C2"), |
| 1239 std::string("I1"))); | 1253 std::string("I1"))); |
| 1240 } | 1254 } |
| 1241 | 1255 |
| 1242 TEST_F(RendererSchedulerImplTest, | 1256 TEST_F(RendererSchedulerImplTest, |
| 1243 EventConsumedOnCompositorThread_MouseMove_WhenMouseDown) { | 1257 EventConsumedOnCompositorThread_MouseMove_WhenMouseDown) { |
| 1244 std::vector<std::string> run_order; | 1258 std::vector<std::string> run_order; |
| 1245 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1259 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1300 EnableIdleTasks(); | 1314 EnableIdleTasks(); |
| 1301 scheduler_->DidHandleInputEventOnCompositorThread( | 1315 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1302 FakeInputEvent(blink::WebInputEvent::MouseWheel), | 1316 FakeInputEvent(blink::WebInputEvent::MouseWheel), |
| 1303 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1317 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1304 RunUntilIdle(); | 1318 RunUntilIdle(); |
| 1305 // Note compositor tasks are prioritized. | 1319 // Note compositor tasks are prioritized. |
| 1306 EXPECT_THAT(run_order, | 1320 EXPECT_THAT(run_order, |
| 1307 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1321 testing::ElementsAre(std::string("C1"), std::string("C2"), |
| 1308 std::string("D1"), std::string("D2"), | 1322 std::string("D1"), std::string("D2"), |
| 1309 std::string("I1"))); | 1323 std::string("I1"))); |
| 1310 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1324 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 1311 CurrentUseCase()); | 1325 CurrentUseCase()); |
| 1312 } | 1326 } |
| 1313 | 1327 |
| 1314 TEST_F(RendererSchedulerImplTest, | 1328 TEST_F(RendererSchedulerImplTest, |
| 1315 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { | 1329 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { |
| 1316 std::vector<std::string> run_order; | 1330 std::vector<std::string> run_order; |
| 1317 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1331 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 1318 | 1332 |
| 1319 EnableIdleTasks(); | 1333 EnableIdleTasks(); |
| 1320 scheduler_->DidHandleInputEventOnCompositorThread( | 1334 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1321 FakeInputEvent(blink::WebInputEvent::KeyDown), | 1335 FakeInputEvent(blink::WebInputEvent::KeyDown), |
| 1322 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1336 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
| 1323 RunUntilIdle(); | 1337 RunUntilIdle(); |
| 1324 // Note compositor tasks are not prioritized. | 1338 // Note compositor tasks are not prioritized. |
| 1325 EXPECT_THAT(run_order, | 1339 EXPECT_THAT(run_order, |
| 1326 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1340 testing::ElementsAre(std::string("D1"), std::string("C1"), |
| 1327 std::string("D2"), std::string("C2"), | 1341 std::string("D2"), std::string("C2"), |
| 1328 std::string("I1"))); | 1342 std::string("I1"))); |
| 1329 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 1343 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 1330 } | 1344 } |
| 1331 | 1345 |
| 1332 TEST_F(RendererSchedulerImplTest, | 1346 TEST_F(RendererSchedulerImplTest, |
| 1333 EventForwardedToMainThread_IgnoresKeyboardEvents) { | 1347 EventForwardedToMainThread_IgnoresKeyboardEvents) { |
| 1334 std::vector<std::string> run_order; | 1348 std::vector<std::string> run_order; |
| 1335 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1349 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
| 1336 | 1350 |
| 1337 EnableIdleTasks(); | 1351 EnableIdleTasks(); |
| 1338 scheduler_->DidHandleInputEventOnCompositorThread( | 1352 scheduler_->DidHandleInputEventOnCompositorThread( |
| 1339 FakeInputEvent(blink::WebInputEvent::KeyDown), | 1353 FakeInputEvent(blink::WebInputEvent::KeyDown), |
| 1340 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1354 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 1341 RunUntilIdle(); | 1355 RunUntilIdle(); |
| 1342 // Note compositor tasks are not prioritized. | 1356 // Note compositor tasks are not prioritized. |
| 1343 EXPECT_THAT(run_order, | 1357 EXPECT_THAT(run_order, |
| 1344 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1358 testing::ElementsAre(std::string("D1"), std::string("C1"), |
| 1345 std::string("D2"), std::string("C2"), | 1359 std::string("D2"), std::string("C2"), |
| 1346 std::string("I1"))); | 1360 std::string("I1"))); |
| 1347 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 1361 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 1348 // Note compositor tasks are not prioritized. | 1362 // Note compositor tasks are not prioritized. |
| 1349 scheduler_->DidHandleInputEventOnMainThread( | 1363 scheduler_->DidHandleInputEventOnMainThread( |
| 1350 FakeInputEvent(blink::WebInputEvent::KeyDown)); | 1364 FakeInputEvent(blink::WebInputEvent::KeyDown)); |
| 1351 } | 1365 } |
| 1352 | 1366 |
| 1353 TEST_F(RendererSchedulerImplTest, | 1367 TEST_F(RendererSchedulerImplTest, |
| 1354 TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { | 1368 TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { |
| 1355 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1369 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 1356 blink::WebInputEvent::GestureScrollBegin); | 1370 blink::WebInputEvent::GestureScrollBegin); |
| 1357 EnableIdleTasks(); | 1371 EnableIdleTasks(); |
| (...skipping 923 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2281 EXPECT_THAT(run_order, | 2295 EXPECT_THAT(run_order, |
| 2282 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2296 testing::ElementsAre(std::string("L1"), std::string("D1"))); |
| 2283 | 2297 |
| 2284 // Emit a BeginMainFrame, and the loading task should get blocked. | 2298 // Emit a BeginMainFrame, and the loading task should get blocked. |
| 2285 DoMainFrame(); | 2299 DoMainFrame(); |
| 2286 run_order.clear(); | 2300 run_order.clear(); |
| 2287 | 2301 |
| 2288 PostTestTasks(&run_order, "L1 D1"); | 2302 PostTestTasks(&run_order, "L1 D1"); |
| 2289 RunUntilIdle(); | 2303 RunUntilIdle(); |
| 2290 | 2304 |
| 2291 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2305 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2292 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2306 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2293 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2307 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2294 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2308 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2295 EXPECT_TRUE(TouchStartExpectedSoon()); | 2309 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2296 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2310 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2311 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2297 } | 2312 } |
| 2298 | 2313 |
| 2299 TEST_F(RendererSchedulerImplTest, | 2314 TEST_F(RendererSchedulerImplTest, |
| 2300 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { | 2315 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { |
| 2301 std::vector<std::string> run_order; | 2316 std::vector<std::string> run_order; |
| 2302 | 2317 |
| 2303 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); | 2318 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); |
| 2304 DoMainFrame(); | 2319 DoMainFrame(); |
| 2305 SimulateExpensiveTasks(loading_task_runner_); | 2320 SimulateExpensiveTasks(loading_task_runner_); |
| 2306 ForceTouchStartToBeExpectedSoon(); | 2321 ForceTouchStartToBeExpectedSoon(); |
| 2307 PostTestTasks(&run_order, "L1 D1"); | 2322 PostTestTasks(&run_order, "L1 D1"); |
| 2308 RunUntilIdle(); | 2323 RunUntilIdle(); |
| 2309 | 2324 |
| 2310 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2325 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2311 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2326 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2312 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2327 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2313 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2328 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2314 EXPECT_FALSE(TouchStartExpectedSoon()); | 2329 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 2315 EXPECT_THAT(run_order, | 2330 EXPECT_THAT(run_order, |
| 2316 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2331 testing::ElementsAre(std::string("L1"), std::string("D1"))); |
| 2332 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2317 } | 2333 } |
| 2318 | 2334 |
| 2319 TEST_F(RendererSchedulerImplTest, | 2335 TEST_F(RendererSchedulerImplTest, |
| 2320 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { | 2336 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { |
| 2321 std::vector<std::string> run_order; | 2337 std::vector<std::string> run_order; |
| 2322 | 2338 |
| 2323 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2339 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2324 DoMainFrame(); | 2340 DoMainFrame(); |
| 2325 SimulateExpensiveTasks(timer_task_runner_); | 2341 SimulateExpensiveTasks(timer_task_runner_); |
| 2326 ForceTouchStartToBeExpectedSoon(); | 2342 ForceTouchStartToBeExpectedSoon(); |
| 2327 | 2343 |
| 2328 PostTestTasks(&run_order, "T1 D1"); | 2344 PostTestTasks(&run_order, "T1 D1"); |
| 2329 RunUntilIdle(); | 2345 RunUntilIdle(); |
| 2330 | 2346 |
| 2331 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2347 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2332 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2348 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2333 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2349 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2334 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2350 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2335 EXPECT_TRUE(TouchStartExpectedSoon()); | 2351 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2336 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2352 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2353 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2337 } | 2354 } |
| 2338 | 2355 |
| 2339 TEST_F(RendererSchedulerImplTest, | 2356 TEST_F(RendererSchedulerImplTest, |
| 2340 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { | 2357 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { |
| 2341 std::vector<std::string> run_order; | 2358 std::vector<std::string> run_order; |
| 2342 | 2359 |
| 2343 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2360 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2344 DoMainFrame(); | 2361 DoMainFrame(); |
| 2345 SimulateExpensiveTasks(timer_task_runner_); | 2362 SimulateExpensiveTasks(timer_task_runner_); |
| 2346 | 2363 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2361 PostTestTasks(&run_order, "T1 D1"); | 2378 PostTestTasks(&run_order, "T1 D1"); |
| 2362 RunUntilIdle(); | 2379 RunUntilIdle(); |
| 2363 | 2380 |
| 2364 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2381 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2365 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2382 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2366 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2383 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2367 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2384 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2368 EXPECT_TRUE(TouchStartExpectedSoon()); | 2385 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2369 EXPECT_THAT(run_order, | 2386 EXPECT_THAT(run_order, |
| 2370 testing::ElementsAre(std::string("T1"), std::string("D1"))); | 2387 testing::ElementsAre(std::string("T1"), std::string("D1"))); |
| 2388 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2371 } | 2389 } |
| 2372 | 2390 |
| 2373 TEST_F(RendererSchedulerImplTest, | 2391 TEST_F(RendererSchedulerImplTest, |
| 2374 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { | 2392 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { |
| 2375 std::vector<std::string> run_order; | 2393 std::vector<std::string> run_order; |
| 2376 | 2394 |
| 2377 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2395 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2378 DoMainFrame(); | 2396 DoMainFrame(); |
| 2379 SimulateExpensiveTasks(timer_task_runner_); | 2397 SimulateExpensiveTasks(timer_task_runner_); |
| 2380 ForceTouchStartToBeExpectedSoon(); | 2398 ForceTouchStartToBeExpectedSoon(); |
| 2381 scheduler_->DidAnimateForInputOnCompositorThread(); | 2399 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 2382 | 2400 |
| 2383 PostTestTasks(&run_order, "T1 D1"); | 2401 PostTestTasks(&run_order, "T1 D1"); |
| 2384 RunUntilIdle(); | 2402 RunUntilIdle(); |
| 2385 | 2403 |
| 2386 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 2404 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| 2387 ForceUpdatePolicyAndGetCurrentUseCase()); | 2405 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2388 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2406 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2389 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2407 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2390 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2408 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2391 EXPECT_TRUE(TouchStartExpectedSoon()); | 2409 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2392 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2410 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2411 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2393 } | 2412 } |
| 2394 | 2413 |
| 2395 TEST_F(RendererSchedulerImplTest, | 2414 TEST_F(RendererSchedulerImplTest, |
| 2396 ExpensiveTimerTaskNotBlockedIfDissalowed_UseCase_COMPOSITOR_GESTURE) { | 2415 ExpensiveTimerTaskNotBlockedIfDisallowed_UseCase_COMPOSITOR_GESTURE) { |
| 2397 std::vector<std::string> run_order; | 2416 std::vector<std::string> run_order; |
| 2398 | 2417 |
| 2399 scheduler_->SetExpensiveTaskBlockingAllowed(false); | 2418 scheduler_->SetExpensiveTaskBlockingAllowed(false); |
| 2400 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2419 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2401 DoMainFrame(); | 2420 DoMainFrame(); |
| 2402 SimulateExpensiveTasks(timer_task_runner_); | 2421 SimulateExpensiveTasks(timer_task_runner_); |
| 2403 ForceTouchStartToBeExpectedSoon(); | 2422 ForceTouchStartToBeExpectedSoon(); |
| 2404 scheduler_->DidAnimateForInputOnCompositorThread(); | 2423 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 2405 | 2424 |
| 2406 PostTestTasks(&run_order, "T1 D1"); | 2425 PostTestTasks(&run_order, "T1 D1"); |
| 2407 RunUntilIdle(); | 2426 RunUntilIdle(); |
| 2408 | 2427 |
| 2409 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 2428 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| 2410 ForceUpdatePolicyAndGetCurrentUseCase()); | 2429 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2411 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2430 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2412 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2431 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2413 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2432 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2414 EXPECT_TRUE(TouchStartExpectedSoon()); | 2433 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2415 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), | 2434 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), |
| 2416 std::string("D1"))); | 2435 std::string("D1"))); |
| 2436 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2417 } | 2437 } |
| 2418 | 2438 |
| 2419 TEST_F(RendererSchedulerImplTest, | 2439 TEST_F(RendererSchedulerImplTest, |
| 2420 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { | 2440 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { |
| 2421 std::vector<std::string> run_order; | 2441 std::vector<std::string> run_order; |
| 2422 | 2442 |
| 2423 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2443 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2424 DoMainFrame(); | 2444 DoMainFrame(); |
| 2425 SimulateExpensiveTasks(timer_task_runner_); | 2445 SimulateExpensiveTasks(timer_task_runner_); |
| 2426 ForceTouchStartToBeExpectedSoon(); | 2446 ForceTouchStartToBeExpectedSoon(); |
| 2427 scheduler_->BeginFrameNotExpectedSoon(); | 2447 scheduler_->BeginFrameNotExpectedSoon(); |
| 2428 | 2448 |
| 2429 PostTestTasks(&run_order, "T1 D1"); | 2449 PostTestTasks(&run_order, "T1 D1"); |
| 2430 RunUntilIdle(); | 2450 RunUntilIdle(); |
| 2431 | 2451 |
| 2432 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2452 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2433 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2453 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2434 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2454 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2435 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2455 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2436 EXPECT_TRUE(TouchStartExpectedSoon()); | 2456 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2437 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2457 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2458 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2438 } | 2459 } |
| 2439 | 2460 |
| 2440 TEST_F(RendererSchedulerImplTest, | 2461 TEST_F(RendererSchedulerImplTest, |
| 2441 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { | 2462 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { |
| 2442 std::vector<std::string> run_order; | 2463 std::vector<std::string> run_order; |
| 2443 | 2464 |
| 2444 DoMainFrame(); | 2465 DoMainFrame(); |
| 2445 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2466 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2446 SimulateExpensiveTasks(loading_task_runner_); | 2467 SimulateExpensiveTasks(loading_task_runner_); |
| 2447 ForceTouchStartToBeExpectedSoon(); | 2468 ForceTouchStartToBeExpectedSoon(); |
| 2448 scheduler_->AddPendingNavigation( | 2469 scheduler_->AddPendingNavigation( |
| 2449 blink::WebScheduler::NavigatingFrameType::kChildFrame); | 2470 blink::WebScheduler::NavigatingFrameType::kChildFrame); |
| 2450 | 2471 |
| 2451 PostTestTasks(&run_order, "L1 D1"); | 2472 PostTestTasks(&run_order, "L1 D1"); |
| 2452 RunUntilIdle(); | 2473 RunUntilIdle(); |
| 2453 | 2474 |
| 2454 // The expensive loading task gets blocked. | 2475 // The expensive loading task gets blocked. |
| 2455 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2476 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2477 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2456 } | 2478 } |
| 2457 | 2479 |
| 2458 TEST_F(RendererSchedulerImplTest, | 2480 TEST_F(RendererSchedulerImplTest, |
| 2459 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { | 2481 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { |
| 2460 std::vector<std::string> run_order; | 2482 std::vector<std::string> run_order; |
| 2461 | 2483 |
| 2462 DoMainFrame(); | 2484 DoMainFrame(); |
| 2463 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2485 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2464 SimulateExpensiveTasks(loading_task_runner_); | 2486 SimulateExpensiveTasks(loading_task_runner_); |
| 2465 ForceTouchStartToBeExpectedSoon(); | 2487 ForceTouchStartToBeExpectedSoon(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2480 | 2502 |
| 2481 // After the nagigation has been cancelled, the expensive loading tasks should | 2503 // After the nagigation has been cancelled, the expensive loading tasks should |
| 2482 // get blocked. | 2504 // get blocked. |
| 2483 scheduler_->RemovePendingNavigation( | 2505 scheduler_->RemovePendingNavigation( |
| 2484 blink::WebScheduler::NavigatingFrameType::kMainFrame); | 2506 blink::WebScheduler::NavigatingFrameType::kMainFrame); |
| 2485 run_order.clear(); | 2507 run_order.clear(); |
| 2486 | 2508 |
| 2487 PostTestTasks(&run_order, "L1 D1"); | 2509 PostTestTasks(&run_order, "L1 D1"); |
| 2488 RunUntilIdle(); | 2510 RunUntilIdle(); |
| 2489 | 2511 |
| 2490 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2512 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2491 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2513 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2492 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2514 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2493 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2515 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2494 EXPECT_TRUE(TouchStartExpectedSoon()); | 2516 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2495 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2517 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
| 2496 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2518 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2519 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2497 } | 2520 } |
| 2498 | 2521 |
| 2499 TEST_F( | 2522 TEST_F( |
| 2500 RendererSchedulerImplTest, | 2523 RendererSchedulerImplTest, |
| 2501 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { | 2524 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { |
| 2502 std::vector<std::string> run_order; | 2525 std::vector<std::string> run_order; |
| 2503 | 2526 |
| 2504 DoMainFrame(); | 2527 DoMainFrame(); |
| 2505 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2528 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2506 SimulateExpensiveTasks(loading_task_runner_); | 2529 SimulateExpensiveTasks(loading_task_runner_); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2542 | 2565 |
| 2543 | 2566 |
| 2544 run_order.clear(); | 2567 run_order.clear(); |
| 2545 scheduler_->RemovePendingNavigation( | 2568 scheduler_->RemovePendingNavigation( |
| 2546 blink::WebScheduler::NavigatingFrameType::kMainFrame); | 2569 blink::WebScheduler::NavigatingFrameType::kMainFrame); |
| 2547 // Navigation task expected ref count is now zero, the expensive loading tasks | 2570 // Navigation task expected ref count is now zero, the expensive loading tasks |
| 2548 // should get blocked. | 2571 // should get blocked. |
| 2549 PostTestTasks(&run_order, "L1 D1"); | 2572 PostTestTasks(&run_order, "L1 D1"); |
| 2550 RunUntilIdle(); | 2573 RunUntilIdle(); |
| 2551 | 2574 |
| 2552 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2575 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2553 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2576 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2554 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2577 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2555 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2578 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2556 EXPECT_TRUE(TouchStartExpectedSoon()); | 2579 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2557 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2580 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
| 2558 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2581 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2582 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2559 } | 2583 } |
| 2560 | 2584 |
| 2561 TEST_F(RendererSchedulerImplTest, | 2585 TEST_F(RendererSchedulerImplTest, |
| 2562 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { | 2586 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { |
| 2563 std::vector<std::string> run_order; | 2587 std::vector<std::string> run_order; |
| 2564 | 2588 |
| 2565 SimulateExpensiveTasks(loading_task_runner_); | 2589 SimulateExpensiveTasks(loading_task_runner_); |
| 2566 | 2590 |
| 2567 // Loading tasks should not be disabled during main thread user interactions. | 2591 // Loading tasks should not be disabled during main thread user interactions. |
| 2568 PostTestTasks(&run_order, "C1 L1"); | 2592 PostTestTasks(&run_order, "C1 L1"); |
| 2569 | 2593 |
| 2570 // Trigger main_thread_gesture UseCase | 2594 // Trigger main_thread_gesture UseCase |
| 2571 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2595 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2572 blink::WebInputEvent::GestureScrollBegin); | 2596 blink::WebInputEvent::GestureScrollBegin); |
| 2573 RunUntilIdle(); | 2597 RunUntilIdle(); |
| 2574 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2598 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2575 CurrentUseCase()); | 2599 CurrentUseCase()); |
| 2576 | 2600 |
| 2577 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2601 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2578 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2602 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2579 EXPECT_THAT(run_order, | 2603 EXPECT_THAT(run_order, |
| 2580 testing::ElementsAre(std::string("C1"), std::string("L1"))); | 2604 testing::ElementsAre(std::string("C1"), std::string("L1"))); |
| 2605 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2581 } | 2606 } |
| 2582 | 2607 |
| 2583 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { | 2608 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { |
| 2584 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2609 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2585 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2610 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2586 blink::WebInputEvent::TouchMove); | 2611 blink::WebInputEvent::TouchMove); |
| 2587 RunUntilIdle(); | 2612 RunUntilIdle(); |
| 2588 for (int i = 0; i < 20; i++) { | 2613 for (int i = 0; i < 20; i++) { |
| 2589 simulate_timer_task_ran_ = false; | 2614 simulate_timer_task_ran_ = false; |
| 2590 | 2615 |
| 2591 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2616 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2592 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2617 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2593 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2618 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2594 begin_frame_args.on_critical_path = false; | 2619 begin_frame_args.on_critical_path = false; |
| 2595 scheduler_->WillBeginFrame(begin_frame_args); | 2620 scheduler_->WillBeginFrame(begin_frame_args); |
| 2596 | 2621 |
| 2597 compositor_task_runner_->PostTask( | 2622 compositor_task_runner_->PostTask( |
| 2598 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: | 2623 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2599 SimulateMainThreadInputHandlingCompositorTask, | 2624 SimulateMainThreadInputHandlingCompositorTask, |
| 2600 base::Unretained(this), | 2625 base::Unretained(this), |
| 2601 base::TimeDelta::FromMilliseconds(8))); | 2626 base::TimeDelta::FromMilliseconds(8))); |
| 2602 timer_task_runner_->PostTask( | 2627 timer_task_runner_->PostTask( |
| 2603 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2628 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2604 base::Unretained(this), | 2629 base::Unretained(this), |
| 2605 base::TimeDelta::FromMilliseconds(4))); | 2630 base::TimeDelta::FromMilliseconds(4))); |
| 2606 | 2631 |
| 2607 RunUntilIdle(); | 2632 RunUntilIdle(); |
| 2608 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2633 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2609 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2634 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2610 CurrentUseCase()) | 2635 CurrentUseCase()) |
| 2611 << " i = " << i; | 2636 << " i = " << i; |
| 2612 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2637 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2613 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2638 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2614 | 2639 |
| 2615 base::TimeDelta time_till_next_frame = | 2640 base::TimeDelta time_till_next_frame = |
| 2616 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2641 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2617 if (time_till_next_frame > base::TimeDelta()) | 2642 if (time_till_next_frame > base::TimeDelta()) |
| 2618 clock_->Advance(time_till_next_frame); | 2643 clock_->Advance(time_till_next_frame); |
| 2619 } | 2644 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2638 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, | 2663 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, |
| 2639 base::Unretained(this), | 2664 base::Unretained(this), |
| 2640 base::TimeDelta::FromMilliseconds(8))); | 2665 base::TimeDelta::FromMilliseconds(8))); |
| 2641 timer_task_runner_->PostTask( | 2666 timer_task_runner_->PostTask( |
| 2642 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2667 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2643 base::Unretained(this), | 2668 base::Unretained(this), |
| 2644 base::TimeDelta::FromMilliseconds(40))); | 2669 base::TimeDelta::FromMilliseconds(40))); |
| 2645 | 2670 |
| 2646 RunUntilIdle(); | 2671 RunUntilIdle(); |
| 2647 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2672 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2648 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()) | 2673 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 2674 CurrentUseCase()) |
| 2649 << " i = " << i; | 2675 << " i = " << i; |
| 2650 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2676 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2651 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2677 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2652 | 2678 |
| 2653 base::TimeDelta time_till_next_frame = | 2679 base::TimeDelta time_till_next_frame = |
| 2654 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2680 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2655 if (time_till_next_frame > base::TimeDelta()) | 2681 if (time_till_next_frame > base::TimeDelta()) |
| 2656 clock_->Advance(time_till_next_frame); | 2682 clock_->Advance(time_till_next_frame); |
| 2657 } | 2683 } |
| 2658 } | 2684 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2676 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: | 2702 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2677 SimulateMainThreadInputHandlingCompositorTask, | 2703 SimulateMainThreadInputHandlingCompositorTask, |
| 2678 base::Unretained(this), | 2704 base::Unretained(this), |
| 2679 base::TimeDelta::FromMilliseconds(8))); | 2705 base::TimeDelta::FromMilliseconds(8))); |
| 2680 timer_task_runner_->PostTask( | 2706 timer_task_runner_->PostTask( |
| 2681 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2707 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2682 base::Unretained(this), | 2708 base::Unretained(this), |
| 2683 base::TimeDelta::FromMilliseconds(10))); | 2709 base::TimeDelta::FromMilliseconds(10))); |
| 2684 | 2710 |
| 2685 RunUntilIdle(); | 2711 RunUntilIdle(); |
| 2686 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2712 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2687 CurrentUseCase()) | 2713 CurrentUseCase()) |
| 2688 << " i = " << i; | 2714 << " i = " << i; |
| 2689 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2715 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2690 if (i == 0) { | 2716 if (i == 0) { |
| 2691 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2717 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2692 } else { | 2718 } else { |
| 2693 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; | 2719 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2694 } | 2720 } |
| 2695 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2721 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2696 | 2722 |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3135 now += base::TimeDelta::FromMilliseconds(500); | 3161 now += base::TimeDelta::FromMilliseconds(500); |
| 3136 EXPECT_FALSE(idle_delegate->CanEnterLongIdlePeriod(now, &next_time_to_check)); | 3162 EXPECT_FALSE(idle_delegate->CanEnterLongIdlePeriod(now, &next_time_to_check)); |
| 3137 EXPECT_GE(next_time_to_check, base::TimeDelta()); | 3163 EXPECT_GE(next_time_to_check, base::TimeDelta()); |
| 3138 } | 3164 } |
| 3139 | 3165 |
| 3140 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_TouchStartDuringFling) { | 3166 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_TouchStartDuringFling) { |
| 3141 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 3167 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 3142 scheduler_->DidAnimateForInputOnCompositorThread(); | 3168 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 3143 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a | 3169 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a |
| 3144 // policy update. | 3170 // policy update. |
| 3145 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, | 3171 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 3146 ForceUpdatePolicyAndGetCurrentUseCase()); | 3172 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3147 | 3173 |
| 3148 // Make sure TouchStart causes a policy change. | 3174 // Make sure TouchStart causes a policy change. |
| 3149 scheduler_->DidHandleInputEventOnCompositorThread( | 3175 scheduler_->DidHandleInputEventOnCompositorThread( |
| 3150 FakeInputEvent(blink::WebInputEvent::TouchStart), | 3176 FakeInputEvent(blink::WebInputEvent::TouchStart), |
| 3151 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 3177 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 3152 EXPECT_EQ(RendererScheduler::UseCase::TOUCHSTART, | 3178 EXPECT_EQ(RendererSchedulerImpl::UseCase::TOUCHSTART, |
| 3153 ForceUpdatePolicyAndGetCurrentUseCase()); | 3179 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3154 } | 3180 } |
| 3155 | 3181 |
| 3156 TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { | 3182 TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { |
| 3157 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 3183 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 3158 | 3184 |
| 3159 // With the compositor task taking 20ms, there is not enough time to run | 3185 // With the compositor task taking 20ms, there is not enough time to run |
| 3160 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks | 3186 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks |
| 3161 // should therefore not get prioritized. | 3187 // should therefore not get prioritized. |
| 3162 std::vector<std::string> run_order; | 3188 std::vector<std::string> run_order; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3268 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, | 3294 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, |
| 3269 base::Unretained(this))); | 3295 base::Unretained(this))); |
| 3270 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; | 3296 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; |
| 3271 } | 3297 } |
| 3272 | 3298 |
| 3273 EXPECT_EQ(TaskQueue::HIGH_PRIORITY, | 3299 EXPECT_EQ(TaskQueue::HIGH_PRIORITY, |
| 3274 scheduler_->CompositorTaskRunner()->GetQueuePriority()); | 3300 scheduler_->CompositorTaskRunner()->GetQueuePriority()); |
| 3275 EXPECT_EQ(279u, run_order.size()); | 3301 EXPECT_EQ(279u, run_order.size()); |
| 3276 } | 3302 } |
| 3277 | 3303 |
| 3304 TEST_F(RendererSchedulerImplTest, TestDefaultRAILMode) { |
| 3305 scheduler_->BeginFrameNotExpectedSoon(); |
| 3306 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3307 EXPECT_EQ(v8::PERFORMANCE_DEFAULT, RAILMode()); |
| 3308 } |
| 3309 |
| 3310 TEST_F(RendererSchedulerImplTest, TestResponseRAILMode) { |
| 3311 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 3312 ForceTouchStartToBeExpectedSoon(); |
| 3313 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3314 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 3315 } |
| 3316 |
| 3317 TEST_F(RendererSchedulerImplTest, TestAnimateRAILMode) { |
| 3318 EXPECT_FALSE(BeginFrameNotExpectedSoon()); |
| 3319 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3320 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 3321 } |
| 3322 |
| 3323 TEST_F(RendererSchedulerImplTest, TestIdleRAILMode) { |
| 3324 scheduler_->SetAllRenderWidgetsHidden(true); |
| 3325 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3326 EXPECT_EQ(v8::PERFORMANCE_IDLE, RAILMode()); |
| 3327 scheduler_->SetAllRenderWidgetsHidden(false); |
| 3328 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3329 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 3330 } |
| 3331 |
| 3278 } // namespace scheduler | 3332 } // namespace scheduler |
| OLD | NEW |