| 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 947 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2305 EXPECT_THAT(run_order, | 2319 EXPECT_THAT(run_order, |
| 2306 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2320 testing::ElementsAre(std::string("L1"), std::string("D1"))); |
| 2307 | 2321 |
| 2308 // Emit a BeginMainFrame, and the loading task should get blocked. | 2322 // Emit a BeginMainFrame, and the loading task should get blocked. |
| 2309 DoMainFrame(); | 2323 DoMainFrame(); |
| 2310 run_order.clear(); | 2324 run_order.clear(); |
| 2311 | 2325 |
| 2312 PostTestTasks(&run_order, "L1 D1"); | 2326 PostTestTasks(&run_order, "L1 D1"); |
| 2313 RunUntilIdle(); | 2327 RunUntilIdle(); |
| 2314 | 2328 |
| 2315 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2329 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2316 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2330 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2317 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2331 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2318 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2332 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2319 EXPECT_TRUE(TouchStartExpectedSoon()); | 2333 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2320 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2334 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2335 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2321 } | 2336 } |
| 2322 | 2337 |
| 2323 TEST_F(RendererSchedulerImplTest, | 2338 TEST_F(RendererSchedulerImplTest, |
| 2324 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { | 2339 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { |
| 2325 std::vector<std::string> run_order; | 2340 std::vector<std::string> run_order; |
| 2326 | 2341 |
| 2327 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); | 2342 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); |
| 2328 DoMainFrame(); | 2343 DoMainFrame(); |
| 2329 SimulateExpensiveTasks(loading_task_runner_); | 2344 SimulateExpensiveTasks(loading_task_runner_); |
| 2330 ForceTouchStartToBeExpectedSoon(); | 2345 ForceTouchStartToBeExpectedSoon(); |
| 2331 PostTestTasks(&run_order, "L1 D1"); | 2346 PostTestTasks(&run_order, "L1 D1"); |
| 2332 RunUntilIdle(); | 2347 RunUntilIdle(); |
| 2333 | 2348 |
| 2334 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2349 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2335 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2350 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2336 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2351 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2337 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2352 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2338 EXPECT_FALSE(TouchStartExpectedSoon()); | 2353 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 2339 EXPECT_THAT(run_order, | 2354 EXPECT_THAT(run_order, |
| 2340 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2355 testing::ElementsAre(std::string("L1"), std::string("D1"))); |
| 2356 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2341 } | 2357 } |
| 2342 | 2358 |
| 2343 TEST_F(RendererSchedulerImplTest, | 2359 TEST_F(RendererSchedulerImplTest, |
| 2344 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { | 2360 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { |
| 2345 std::vector<std::string> run_order; | 2361 std::vector<std::string> run_order; |
| 2346 | 2362 |
| 2347 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2363 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2348 DoMainFrame(); | 2364 DoMainFrame(); |
| 2349 SimulateExpensiveTasks(timer_task_runner_); | 2365 SimulateExpensiveTasks(timer_task_runner_); |
| 2350 ForceTouchStartToBeExpectedSoon(); | 2366 ForceTouchStartToBeExpectedSoon(); |
| 2351 | 2367 |
| 2352 PostTestTasks(&run_order, "T1 D1"); | 2368 PostTestTasks(&run_order, "T1 D1"); |
| 2353 RunUntilIdle(); | 2369 RunUntilIdle(); |
| 2354 | 2370 |
| 2355 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2371 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2356 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2372 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2357 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2373 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2358 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2374 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2359 EXPECT_TRUE(TouchStartExpectedSoon()); | 2375 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2360 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2376 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2377 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2361 } | 2378 } |
| 2362 | 2379 |
| 2363 TEST_F(RendererSchedulerImplTest, | 2380 TEST_F(RendererSchedulerImplTest, |
| 2364 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { | 2381 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { |
| 2365 std::vector<std::string> run_order; | 2382 std::vector<std::string> run_order; |
| 2366 | 2383 |
| 2367 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2384 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2368 DoMainFrame(); | 2385 DoMainFrame(); |
| 2369 SimulateExpensiveTasks(timer_task_runner_); | 2386 SimulateExpensiveTasks(timer_task_runner_); |
| 2370 | 2387 |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2385 PostTestTasks(&run_order, "T1 D1"); | 2402 PostTestTasks(&run_order, "T1 D1"); |
| 2386 RunUntilIdle(); | 2403 RunUntilIdle(); |
| 2387 | 2404 |
| 2388 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2405 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2389 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2406 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2390 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2407 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2391 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2408 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2392 EXPECT_TRUE(TouchStartExpectedSoon()); | 2409 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2393 EXPECT_THAT(run_order, | 2410 EXPECT_THAT(run_order, |
| 2394 testing::ElementsAre(std::string("T1"), std::string("D1"))); | 2411 testing::ElementsAre(std::string("T1"), std::string("D1"))); |
| 2412 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2395 } | 2413 } |
| 2396 | 2414 |
| 2397 TEST_F(RendererSchedulerImplTest, | 2415 TEST_F(RendererSchedulerImplTest, |
| 2398 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { | 2416 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { |
| 2399 std::vector<std::string> run_order; | 2417 std::vector<std::string> run_order; |
| 2400 | 2418 |
| 2401 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2419 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2402 DoMainFrame(); | 2420 DoMainFrame(); |
| 2403 SimulateExpensiveTasks(timer_task_runner_); | 2421 SimulateExpensiveTasks(timer_task_runner_); |
| 2404 ForceTouchStartToBeExpectedSoon(); | 2422 ForceTouchStartToBeExpectedSoon(); |
| 2405 scheduler_->DidAnimateForInputOnCompositorThread(); | 2423 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 2406 | 2424 |
| 2407 PostTestTasks(&run_order, "T1 D1"); | 2425 PostTestTasks(&run_order, "T1 D1"); |
| 2408 RunUntilIdle(); | 2426 RunUntilIdle(); |
| 2409 | 2427 |
| 2410 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 2428 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| 2411 ForceUpdatePolicyAndGetCurrentUseCase()); | 2429 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2412 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2430 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2413 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2431 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2414 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2432 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2415 EXPECT_TRUE(TouchStartExpectedSoon()); | 2433 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2416 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2434 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2435 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2417 } | 2436 } |
| 2418 | 2437 |
| 2419 TEST_F(RendererSchedulerImplTest, | 2438 TEST_F(RendererSchedulerImplTest, |
| 2420 ExpensiveTimerTaskNotBlockedIfDissalowed_UseCase_COMPOSITOR_GESTURE) { | 2439 ExpensiveTimerTaskNotBlockedIfDisallowed_UseCase_COMPOSITOR_GESTURE) { |
| 2421 std::vector<std::string> run_order; | 2440 std::vector<std::string> run_order; |
| 2422 | 2441 |
| 2423 scheduler_->SetExpensiveTaskBlockingAllowed(false); | 2442 scheduler_->SetExpensiveTaskBlockingAllowed(false); |
| 2424 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2443 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2425 DoMainFrame(); | 2444 DoMainFrame(); |
| 2426 SimulateExpensiveTasks(timer_task_runner_); | 2445 SimulateExpensiveTasks(timer_task_runner_); |
| 2427 ForceTouchStartToBeExpectedSoon(); | 2446 ForceTouchStartToBeExpectedSoon(); |
| 2428 scheduler_->DidAnimateForInputOnCompositorThread(); | 2447 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 2429 | 2448 |
| 2430 PostTestTasks(&run_order, "T1 D1"); | 2449 PostTestTasks(&run_order, "T1 D1"); |
| 2431 RunUntilIdle(); | 2450 RunUntilIdle(); |
| 2432 | 2451 |
| 2433 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 2452 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
| 2434 ForceUpdatePolicyAndGetCurrentUseCase()); | 2453 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2435 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2454 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2436 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2455 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2437 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2456 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2438 EXPECT_TRUE(TouchStartExpectedSoon()); | 2457 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2439 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), | 2458 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), |
| 2440 std::string("D1"))); | 2459 std::string("D1"))); |
| 2460 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2441 } | 2461 } |
| 2442 | 2462 |
| 2443 TEST_F(RendererSchedulerImplTest, | 2463 TEST_F(RendererSchedulerImplTest, |
| 2444 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { | 2464 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { |
| 2445 std::vector<std::string> run_order; | 2465 std::vector<std::string> run_order; |
| 2446 | 2466 |
| 2447 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2467 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2448 DoMainFrame(); | 2468 DoMainFrame(); |
| 2449 SimulateExpensiveTasks(timer_task_runner_); | 2469 SimulateExpensiveTasks(timer_task_runner_); |
| 2450 ForceTouchStartToBeExpectedSoon(); | 2470 ForceTouchStartToBeExpectedSoon(); |
| 2451 scheduler_->BeginFrameNotExpectedSoon(); | 2471 scheduler_->BeginFrameNotExpectedSoon(); |
| 2452 | 2472 |
| 2453 PostTestTasks(&run_order, "T1 D1"); | 2473 PostTestTasks(&run_order, "T1 D1"); |
| 2454 RunUntilIdle(); | 2474 RunUntilIdle(); |
| 2455 | 2475 |
| 2456 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2476 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2457 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2477 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2458 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2478 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2459 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2479 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2460 EXPECT_TRUE(TouchStartExpectedSoon()); | 2480 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2461 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2481 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2482 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2462 } | 2483 } |
| 2463 | 2484 |
| 2464 TEST_F(RendererSchedulerImplTest, | 2485 TEST_F(RendererSchedulerImplTest, |
| 2465 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { | 2486 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { |
| 2466 std::vector<std::string> run_order; | 2487 std::vector<std::string> run_order; |
| 2467 | 2488 |
| 2468 DoMainFrame(); | 2489 DoMainFrame(); |
| 2469 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2490 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2470 SimulateExpensiveTasks(loading_task_runner_); | 2491 SimulateExpensiveTasks(loading_task_runner_); |
| 2471 ForceTouchStartToBeExpectedSoon(); | 2492 ForceTouchStartToBeExpectedSoon(); |
| 2472 scheduler_->AddPendingNavigation( | 2493 scheduler_->AddPendingNavigation( |
| 2473 blink::WebScheduler::NavigatingFrameType::kChildFrame); | 2494 blink::WebScheduler::NavigatingFrameType::kChildFrame); |
| 2474 | 2495 |
| 2475 PostTestTasks(&run_order, "L1 D1"); | 2496 PostTestTasks(&run_order, "L1 D1"); |
| 2476 RunUntilIdle(); | 2497 RunUntilIdle(); |
| 2477 | 2498 |
| 2478 // The expensive loading task gets blocked. | 2499 // The expensive loading task gets blocked. |
| 2479 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2500 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2501 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2480 } | 2502 } |
| 2481 | 2503 |
| 2482 TEST_F(RendererSchedulerImplTest, | 2504 TEST_F(RendererSchedulerImplTest, |
| 2483 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { | 2505 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { |
| 2484 std::vector<std::string> run_order; | 2506 std::vector<std::string> run_order; |
| 2485 | 2507 |
| 2486 DoMainFrame(); | 2508 DoMainFrame(); |
| 2487 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2509 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2488 SimulateExpensiveTasks(loading_task_runner_); | 2510 SimulateExpensiveTasks(loading_task_runner_); |
| 2489 ForceTouchStartToBeExpectedSoon(); | 2511 ForceTouchStartToBeExpectedSoon(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 2504 | 2526 |
| 2505 // After the nagigation has been cancelled, the expensive loading tasks should | 2527 // After the nagigation has been cancelled, the expensive loading tasks should |
| 2506 // get blocked. | 2528 // get blocked. |
| 2507 scheduler_->RemovePendingNavigation( | 2529 scheduler_->RemovePendingNavigation( |
| 2508 blink::WebScheduler::NavigatingFrameType::kMainFrame); | 2530 blink::WebScheduler::NavigatingFrameType::kMainFrame); |
| 2509 run_order.clear(); | 2531 run_order.clear(); |
| 2510 | 2532 |
| 2511 PostTestTasks(&run_order, "L1 D1"); | 2533 PostTestTasks(&run_order, "L1 D1"); |
| 2512 RunUntilIdle(); | 2534 RunUntilIdle(); |
| 2513 | 2535 |
| 2514 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2536 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2515 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2537 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2516 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2538 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2517 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2539 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2518 EXPECT_TRUE(TouchStartExpectedSoon()); | 2540 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2519 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2541 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
| 2520 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2542 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2543 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2521 } | 2544 } |
| 2522 | 2545 |
| 2523 TEST_F( | 2546 TEST_F( |
| 2524 RendererSchedulerImplTest, | 2547 RendererSchedulerImplTest, |
| 2525 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { | 2548 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { |
| 2526 std::vector<std::string> run_order; | 2549 std::vector<std::string> run_order; |
| 2527 | 2550 |
| 2528 DoMainFrame(); | 2551 DoMainFrame(); |
| 2529 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2552 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2530 SimulateExpensiveTasks(loading_task_runner_); | 2553 SimulateExpensiveTasks(loading_task_runner_); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2566 | 2589 |
| 2567 | 2590 |
| 2568 run_order.clear(); | 2591 run_order.clear(); |
| 2569 scheduler_->RemovePendingNavigation( | 2592 scheduler_->RemovePendingNavigation( |
| 2570 blink::WebScheduler::NavigatingFrameType::kMainFrame); | 2593 blink::WebScheduler::NavigatingFrameType::kMainFrame); |
| 2571 // Navigation task expected ref count is now zero, the expensive loading tasks | 2594 // Navigation task expected ref count is now zero, the expensive loading tasks |
| 2572 // should get blocked. | 2595 // should get blocked. |
| 2573 PostTestTasks(&run_order, "L1 D1"); | 2596 PostTestTasks(&run_order, "L1 D1"); |
| 2574 RunUntilIdle(); | 2597 RunUntilIdle(); |
| 2575 | 2598 |
| 2576 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2599 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
| 2577 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2600 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2578 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2601 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2579 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2602 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2580 EXPECT_TRUE(TouchStartExpectedSoon()); | 2603 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2581 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2604 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
| 2582 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2605 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2606 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 2583 } | 2607 } |
| 2584 | 2608 |
| 2585 TEST_F(RendererSchedulerImplTest, | 2609 TEST_F(RendererSchedulerImplTest, |
| 2586 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { | 2610 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { |
| 2587 std::vector<std::string> run_order; | 2611 std::vector<std::string> run_order; |
| 2588 | 2612 |
| 2589 SimulateExpensiveTasks(loading_task_runner_); | 2613 SimulateExpensiveTasks(loading_task_runner_); |
| 2590 | 2614 |
| 2591 // Loading tasks should not be disabled during main thread user interactions. | 2615 // Loading tasks should not be disabled during main thread user interactions. |
| 2592 PostTestTasks(&run_order, "C1 L1"); | 2616 PostTestTasks(&run_order, "C1 L1"); |
| 2593 | 2617 |
| 2594 // Trigger main_thread_gesture UseCase | 2618 // Trigger main_thread_gesture UseCase |
| 2595 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2619 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2596 blink::WebInputEvent::GestureScrollBegin); | 2620 blink::WebInputEvent::GestureScrollBegin); |
| 2597 RunUntilIdle(); | 2621 RunUntilIdle(); |
| 2598 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2622 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2599 CurrentUseCase()); | 2623 CurrentUseCase()); |
| 2600 | 2624 |
| 2601 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2625 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2602 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2626 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2603 EXPECT_THAT(run_order, | 2627 EXPECT_THAT(run_order, |
| 2604 testing::ElementsAre(std::string("C1"), std::string("L1"))); | 2628 testing::ElementsAre(std::string("C1"), std::string("L1"))); |
| 2629 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 2605 } | 2630 } |
| 2606 | 2631 |
| 2607 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { | 2632 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { |
| 2608 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2633 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2609 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2634 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2610 blink::WebInputEvent::TouchMove); | 2635 blink::WebInputEvent::TouchMove); |
| 2611 RunUntilIdle(); | 2636 RunUntilIdle(); |
| 2612 for (int i = 0; i < 20; i++) { | 2637 for (int i = 0; i < 20; i++) { |
| 2613 simulate_timer_task_ran_ = false; | 2638 simulate_timer_task_ran_ = false; |
| 2614 | 2639 |
| 2615 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2640 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2616 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2641 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| 2617 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); | 2642 base::TimeDelta::FromMilliseconds(16), cc::BeginFrameArgs::NORMAL); |
| 2618 begin_frame_args.on_critical_path = false; | 2643 begin_frame_args.on_critical_path = false; |
| 2619 scheduler_->WillBeginFrame(begin_frame_args); | 2644 scheduler_->WillBeginFrame(begin_frame_args); |
| 2620 | 2645 |
| 2621 compositor_task_runner_->PostTask( | 2646 compositor_task_runner_->PostTask( |
| 2622 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: | 2647 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2623 SimulateMainThreadInputHandlingCompositorTask, | 2648 SimulateMainThreadInputHandlingCompositorTask, |
| 2624 base::Unretained(this), | 2649 base::Unretained(this), |
| 2625 base::TimeDelta::FromMilliseconds(8))); | 2650 base::TimeDelta::FromMilliseconds(8))); |
| 2626 timer_task_runner_->PostTask( | 2651 timer_task_runner_->PostTask( |
| 2627 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2652 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2628 base::Unretained(this), | 2653 base::Unretained(this), |
| 2629 base::TimeDelta::FromMilliseconds(4))); | 2654 base::TimeDelta::FromMilliseconds(4))); |
| 2630 | 2655 |
| 2631 RunUntilIdle(); | 2656 RunUntilIdle(); |
| 2632 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2657 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2633 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2658 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2634 CurrentUseCase()) | 2659 CurrentUseCase()) |
| 2635 << " i = " << i; | 2660 << " i = " << i; |
| 2636 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2661 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2637 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2662 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2638 | 2663 |
| 2639 base::TimeDelta time_till_next_frame = | 2664 base::TimeDelta time_till_next_frame = |
| 2640 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2665 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2641 if (time_till_next_frame > base::TimeDelta()) | 2666 if (time_till_next_frame > base::TimeDelta()) |
| 2642 clock_->Advance(time_till_next_frame); | 2667 clock_->Advance(time_till_next_frame); |
| 2643 } | 2668 } |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2662 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, | 2687 base::Bind(&RendererSchedulerImplTest::SimulateMainThreadCompositorTask, |
| 2663 base::Unretained(this), | 2688 base::Unretained(this), |
| 2664 base::TimeDelta::FromMilliseconds(8))); | 2689 base::TimeDelta::FromMilliseconds(8))); |
| 2665 timer_task_runner_->PostTask( | 2690 timer_task_runner_->PostTask( |
| 2666 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2691 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2667 base::Unretained(this), | 2692 base::Unretained(this), |
| 2668 base::TimeDelta::FromMilliseconds(40))); | 2693 base::TimeDelta::FromMilliseconds(40))); |
| 2669 | 2694 |
| 2670 RunUntilIdle(); | 2695 RunUntilIdle(); |
| 2671 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2696 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2672 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, CurrentUseCase()) | 2697 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 2698 CurrentUseCase()) |
| 2673 << " i = " << i; | 2699 << " i = " << i; |
| 2674 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2700 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2675 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2701 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2676 | 2702 |
| 2677 base::TimeDelta time_till_next_frame = | 2703 base::TimeDelta time_till_next_frame = |
| 2678 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2704 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2679 if (time_till_next_frame > base::TimeDelta()) | 2705 if (time_till_next_frame > base::TimeDelta()) |
| 2680 clock_->Advance(time_till_next_frame); | 2706 clock_->Advance(time_till_next_frame); |
| 2681 } | 2707 } |
| 2682 } | 2708 } |
| (...skipping 17 matching lines...) Expand all Loading... |
| 2700 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: | 2726 FROM_HERE, base::Bind(&RendererSchedulerImplTest:: |
| 2701 SimulateMainThreadInputHandlingCompositorTask, | 2727 SimulateMainThreadInputHandlingCompositorTask, |
| 2702 base::Unretained(this), | 2728 base::Unretained(this), |
| 2703 base::TimeDelta::FromMilliseconds(8))); | 2729 base::TimeDelta::FromMilliseconds(8))); |
| 2704 timer_task_runner_->PostTask( | 2730 timer_task_runner_->PostTask( |
| 2705 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, | 2731 FROM_HERE, base::Bind(&RendererSchedulerImplTest::SimulateTimerTask, |
| 2706 base::Unretained(this), | 2732 base::Unretained(this), |
| 2707 base::TimeDelta::FromMilliseconds(10))); | 2733 base::TimeDelta::FromMilliseconds(10))); |
| 2708 | 2734 |
| 2709 RunUntilIdle(); | 2735 RunUntilIdle(); |
| 2710 EXPECT_EQ(RendererScheduler::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2736 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
| 2711 CurrentUseCase()) | 2737 CurrentUseCase()) |
| 2712 << " i = " << i; | 2738 << " i = " << i; |
| 2713 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2739 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2714 if (i == 0) { | 2740 if (i == 0) { |
| 2715 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2741 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2716 } else { | 2742 } else { |
| 2717 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; | 2743 EXPECT_TRUE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2718 } | 2744 } |
| 2719 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; | 2745 EXPECT_TRUE(simulate_timer_task_ran_) << " i = " << i; |
| 2720 | 2746 |
| (...skipping 438 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3159 now += base::TimeDelta::FromMilliseconds(500); | 3185 now += base::TimeDelta::FromMilliseconds(500); |
| 3160 EXPECT_FALSE(idle_delegate->CanEnterLongIdlePeriod(now, &next_time_to_check)); | 3186 EXPECT_FALSE(idle_delegate->CanEnterLongIdlePeriod(now, &next_time_to_check)); |
| 3161 EXPECT_GE(next_time_to_check, base::TimeDelta()); | 3187 EXPECT_GE(next_time_to_check, base::TimeDelta()); |
| 3162 } | 3188 } |
| 3163 | 3189 |
| 3164 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_TouchStartDuringFling) { | 3190 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_TouchStartDuringFling) { |
| 3165 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 3191 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 3166 scheduler_->DidAnimateForInputOnCompositorThread(); | 3192 scheduler_->DidAnimateForInputOnCompositorThread(); |
| 3167 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a | 3193 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a |
| 3168 // policy update. | 3194 // policy update. |
| 3169 EXPECT_EQ(RendererScheduler::UseCase::COMPOSITOR_GESTURE, | 3195 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
| 3170 ForceUpdatePolicyAndGetCurrentUseCase()); | 3196 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3171 | 3197 |
| 3172 // Make sure TouchStart causes a policy change. | 3198 // Make sure TouchStart causes a policy change. |
| 3173 scheduler_->DidHandleInputEventOnCompositorThread( | 3199 scheduler_->DidHandleInputEventOnCompositorThread( |
| 3174 FakeInputEvent(blink::WebInputEvent::TouchStart), | 3200 FakeInputEvent(blink::WebInputEvent::TouchStart), |
| 3175 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 3201 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 3176 EXPECT_EQ(RendererScheduler::UseCase::TOUCHSTART, | 3202 EXPECT_EQ(RendererSchedulerImpl::UseCase::TOUCHSTART, |
| 3177 ForceUpdatePolicyAndGetCurrentUseCase()); | 3203 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3178 } | 3204 } |
| 3179 | 3205 |
| 3180 TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { | 3206 TEST_F(RendererSchedulerImplTest, SYNCHRONIZED_GESTURE_CompositingExpensive) { |
| 3181 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 3207 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
| 3182 | 3208 |
| 3183 // With the compositor task taking 20ms, there is not enough time to run | 3209 // With the compositor task taking 20ms, there is not enough time to run |
| 3184 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks | 3210 // other tasks in the same 16ms frame. To avoid starvation, compositing tasks |
| 3185 // should therefore not get prioritized. | 3211 // should therefore not get prioritized. |
| 3186 std::vector<std::string> run_order; | 3212 std::vector<std::string> run_order; |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3292 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, | 3318 base::Bind(&RendererSchedulerImplTest::SimulatedCompositorTaskPending, |
| 3293 base::Unretained(this))); | 3319 base::Unretained(this))); |
| 3294 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; | 3320 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, CurrentUseCase()) << "i = " << i; |
| 3295 } | 3321 } |
| 3296 | 3322 |
| 3297 EXPECT_EQ(TaskQueue::HIGH_PRIORITY, | 3323 EXPECT_EQ(TaskQueue::HIGH_PRIORITY, |
| 3298 scheduler_->CompositorTaskRunner()->GetQueuePriority()); | 3324 scheduler_->CompositorTaskRunner()->GetQueuePriority()); |
| 3299 EXPECT_EQ(279u, run_order.size()); | 3325 EXPECT_EQ(279u, run_order.size()); |
| 3300 } | 3326 } |
| 3301 | 3327 |
| 3328 class MockRAILModeObserver : public RendererScheduler::RAILModeObserver { |
| 3329 public: |
| 3330 MOCK_METHOD1(OnRAILModeChanged, void(v8::RAILMode rail_mode)); |
| 3331 }; |
| 3332 |
| 3333 TEST_F(RendererSchedulerImplTest, TestResponseRAILMode) { |
| 3334 MockRAILModeObserver observer; |
| 3335 scheduler_->SetRAILModeObserver(&observer); |
| 3336 EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_RESPONSE)); |
| 3337 |
| 3338 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 3339 ForceTouchStartToBeExpectedSoon(); |
| 3340 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3341 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, RAILMode()); |
| 3342 scheduler_->SetRAILModeObserver(nullptr); |
| 3343 } |
| 3344 |
| 3345 TEST_F(RendererSchedulerImplTest, TestAnimateRAILMode) { |
| 3346 MockRAILModeObserver observer; |
| 3347 scheduler_->SetRAILModeObserver(&observer); |
| 3348 EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)).Times(0); |
| 3349 |
| 3350 EXPECT_FALSE(BeginFrameNotExpectedSoon()); |
| 3351 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3352 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 3353 scheduler_->SetRAILModeObserver(nullptr); |
| 3354 } |
| 3355 |
| 3356 TEST_F(RendererSchedulerImplTest, TestIdleRAILMode) { |
| 3357 MockRAILModeObserver observer; |
| 3358 scheduler_->SetRAILModeObserver(&observer); |
| 3359 EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_ANIMATION)); |
| 3360 EXPECT_CALL(observer, OnRAILModeChanged(v8::PERFORMANCE_IDLE)); |
| 3361 |
| 3362 scheduler_->SetAllRenderWidgetsHidden(true); |
| 3363 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3364 EXPECT_EQ(v8::PERFORMANCE_IDLE, RAILMode()); |
| 3365 scheduler_->SetAllRenderWidgetsHidden(false); |
| 3366 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 3367 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, RAILMode()); |
| 3368 scheduler_->SetRAILModeObserver(nullptr); |
| 3369 } |
| 3370 |
| 3302 } // namespace scheduler | 3371 } // namespace scheduler |
| OLD | NEW |