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 "platform/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "platform/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 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
249 int update_policy_count_; | 249 int update_policy_count_; |
250 std::vector<std::string> use_cases_; | 250 std::vector<std::string> use_cases_; |
251 }; | 251 }; |
252 | 252 |
253 // Lets gtest print human readable Policy values. | 253 // Lets gtest print human readable Policy values. |
254 ::std::ostream& operator<<(::std::ostream& os, | 254 ::std::ostream& operator<<(::std::ostream& os, |
255 const RendererSchedulerImpl::UseCase& use_case) { | 255 const RendererSchedulerImpl::UseCase& use_case) { |
256 return os << RendererSchedulerImpl::UseCaseToString(use_case); | 256 return os << RendererSchedulerImpl::UseCaseToString(use_case); |
257 } | 257 } |
258 | 258 |
259 class RendererSchedulerImplTest : public testing::Test { | 259 class RendererSchedulerImplTest : public ::testing::Test { |
260 public: | 260 public: |
261 using UseCase = RendererSchedulerImpl::UseCase; | 261 using UseCase = RendererSchedulerImpl::UseCase; |
262 | 262 |
263 RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) { | 263 RendererSchedulerImplTest() : clock_(new base::SimpleTestTickClock()) { |
264 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 264 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
265 } | 265 } |
266 | 266 |
267 RendererSchedulerImplTest(base::MessageLoop* message_loop) | 267 RendererSchedulerImplTest(base::MessageLoop* message_loop) |
268 : clock_(new base::SimpleTestTickClock()), message_loop_(message_loop) { | 268 : clock_(new base::SimpleTestTickClock()), message_loop_(message_loop) { |
269 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); | 269 clock_->Advance(base::TimeDelta::FromMicroseconds(5000)); |
(...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
698 | 698 |
699 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); | 699 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); |
700 }; | 700 }; |
701 | 701 |
702 TEST_F(RendererSchedulerImplTest, TestPostDefaultTask) { | 702 TEST_F(RendererSchedulerImplTest, TestPostDefaultTask) { |
703 std::vector<std::string> run_order; | 703 std::vector<std::string> run_order; |
704 PostTestTasks(&run_order, "D1 D2 D3 D4"); | 704 PostTestTasks(&run_order, "D1 D2 D3 D4"); |
705 | 705 |
706 RunUntilIdle(); | 706 RunUntilIdle(); |
707 EXPECT_THAT(run_order, | 707 EXPECT_THAT(run_order, |
708 testing::ElementsAre(std::string("D1"), std::string("D2"), | 708 ::testing::ElementsAre(std::string("D1"), std::string("D2"), |
709 std::string("D3"), std::string("D4"))); | 709 std::string("D3"), std::string("D4"))); |
710 } | 710 } |
711 | 711 |
712 TEST_F(RendererSchedulerImplTest, TestPostDefaultAndCompositor) { | 712 TEST_F(RendererSchedulerImplTest, TestPostDefaultAndCompositor) { |
713 std::vector<std::string> run_order; | 713 std::vector<std::string> run_order; |
714 PostTestTasks(&run_order, "D1 C1"); | 714 PostTestTasks(&run_order, "D1 C1"); |
715 RunUntilIdle(); | 715 RunUntilIdle(); |
716 EXPECT_THAT(run_order, testing::Contains("D1")); | 716 EXPECT_THAT(run_order, ::testing::Contains("D1")); |
717 EXPECT_THAT(run_order, testing::Contains("C1")); | 717 EXPECT_THAT(run_order, ::testing::Contains("C1")); |
718 } | 718 } |
719 | 719 |
720 TEST_F(RendererSchedulerImplTest, TestRentrantTask) { | 720 TEST_F(RendererSchedulerImplTest, TestRentrantTask) { |
721 int count = 0; | 721 int count = 0; |
722 std::vector<int> run_order; | 722 std::vector<int> run_order; |
723 default_task_runner_->PostTask( | 723 default_task_runner_->PostTask( |
724 FROM_HERE, base::Bind(AppendToVectorReentrantTask, | 724 FROM_HERE, base::Bind(AppendToVectorReentrantTask, |
725 base::RetainedRef(default_task_runner_), &run_order, | 725 base::RetainedRef(default_task_runner_), &run_order, |
726 &count, 5)); | 726 &count, 5)); |
727 RunUntilIdle(); | 727 RunUntilIdle(); |
728 | 728 |
729 EXPECT_THAT(run_order, testing::ElementsAre(0, 1, 2, 3, 4)); | 729 EXPECT_THAT(run_order, ::testing::ElementsAre(0, 1, 2, 3, 4)); |
730 } | 730 } |
731 | 731 |
732 TEST_F(RendererSchedulerImplTest, TestPostIdleTask) { | 732 TEST_F(RendererSchedulerImplTest, TestPostIdleTask) { |
733 int run_count = 0; | 733 int run_count = 0; |
734 base::TimeTicks expected_deadline = | 734 base::TimeTicks expected_deadline = |
735 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300); | 735 clock_->NowTicks() + base::TimeDelta::FromMilliseconds(2300); |
736 base::TimeTicks deadline_in_task; | 736 base::TimeTicks deadline_in_task; |
737 | 737 |
738 clock_->Advance(base::TimeDelta::FromMilliseconds(100)); | 738 clock_->Advance(base::TimeDelta::FromMilliseconds(100)); |
739 idle_task_runner_->PostIdleTask( | 739 idle_task_runner_->PostIdleTask( |
(...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
847 EXPECT_EQ(1, run_count); // We should still be in the new idle period. | 847 EXPECT_EQ(1, run_count); // We should still be in the new idle period. |
848 } | 848 } |
849 | 849 |
850 TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { | 850 TEST_F(RendererSchedulerImplTest, TestDefaultPolicy) { |
851 std::vector<std::string> run_order; | 851 std::vector<std::string> run_order; |
852 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 852 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
853 | 853 |
854 EnableIdleTasks(); | 854 EnableIdleTasks(); |
855 RunUntilIdle(); | 855 RunUntilIdle(); |
856 EXPECT_THAT(run_order, | 856 EXPECT_THAT(run_order, |
857 testing::ElementsAre(std::string("C1"), std::string("C2"), | 857 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
858 std::string("L1"), std::string("D1"), | 858 std::string("L1"), std::string("D1"), |
859 std::string("D2"), std::string("I1"))); | 859 std::string("D2"), std::string("I1"))); |
860 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 860 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
861 } | 861 } |
862 | 862 |
863 TEST_F(RendererSchedulerImplTest, TestDefaultPolicyWithSlowCompositor) { | 863 TEST_F(RendererSchedulerImplTest, TestDefaultPolicyWithSlowCompositor) { |
864 RunSlowCompositorTask(); | 864 RunSlowCompositorTask(); |
865 | 865 |
866 std::vector<std::string> run_order; | 866 std::vector<std::string> run_order; |
867 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 867 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
868 | 868 |
869 EnableIdleTasks(); | 869 EnableIdleTasks(); |
870 RunUntilIdle(); | 870 RunUntilIdle(); |
871 EXPECT_THAT(run_order, | 871 EXPECT_THAT(run_order, |
872 testing::ElementsAre(std::string("L1"), std::string("D1"), | 872 ::testing::ElementsAre(std::string("L1"), std::string("D1"), |
873 std::string("C1"), std::string("D2"), | 873 std::string("C1"), std::string("D2"), |
874 std::string("C2"), std::string("I1"))); | 874 std::string("C2"), std::string("I1"))); |
875 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 875 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
876 } | 876 } |
877 | 877 |
878 TEST_F(RendererSchedulerImplTest, | 878 TEST_F(RendererSchedulerImplTest, |
879 TestCompositorPolicy_CompositorHandlesInput_WithTouchHandler) { | 879 TestCompositorPolicy_CompositorHandlesInput_WithTouchHandler) { |
880 std::vector<std::string> run_order; | 880 std::vector<std::string> run_order; |
881 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 881 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
882 | 882 |
883 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 883 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
884 EnableIdleTasks(); | 884 EnableIdleTasks(); |
885 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 885 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
886 RunUntilIdle(); | 886 RunUntilIdle(); |
887 EXPECT_THAT(run_order, | 887 EXPECT_THAT(run_order, |
888 testing::ElementsAre(std::string("L1"), std::string("D1"), | 888 ::testing::ElementsAre(std::string("L1"), std::string("D1"), |
889 std::string("D2"), std::string("C1"), | 889 std::string("D2"), std::string("C1"), |
890 std::string("C2"), std::string("I1"))); | 890 std::string("C2"), std::string("I1"))); |
891 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 891 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
892 CurrentUseCase()); | 892 CurrentUseCase()); |
893 } | 893 } |
894 | 894 |
895 TEST_F(RendererSchedulerImplTest, | 895 TEST_F(RendererSchedulerImplTest, |
896 TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) { | 896 TestCompositorPolicy_MainThreadHandlesInput_WithoutScrollUpdates) { |
897 std::vector<std::string> run_order; | 897 std::vector<std::string> run_order; |
898 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 898 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
899 | 899 |
900 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 900 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
901 EnableIdleTasks(); | 901 EnableIdleTasks(); |
902 SimulateMainThreadGestureWithoutScrollUpdates(); | 902 SimulateMainThreadGestureWithoutScrollUpdates(); |
903 RunUntilIdle(); | 903 RunUntilIdle(); |
904 EXPECT_THAT(run_order, | 904 EXPECT_THAT(run_order, |
905 testing::ElementsAre(std::string("C1"), std::string("C2"), | 905 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
906 std::string("L1"), std::string("D1"), | 906 std::string("L1"), std::string("D1"), |
907 std::string("D2"), std::string("I1"))); | 907 std::string("D2"), std::string("I1"))); |
908 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 908 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
909 CurrentUseCase()); | 909 CurrentUseCase()); |
910 } | 910 } |
911 | 911 |
912 TEST_F(RendererSchedulerImplTest, | 912 TEST_F(RendererSchedulerImplTest, |
913 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { | 913 TestCompositorPolicy_MainThreadHandlesInput_WithoutPreventDefault) { |
914 std::vector<std::string> run_order; | 914 std::vector<std::string> run_order; |
915 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 915 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
916 | 916 |
917 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 917 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
918 EnableIdleTasks(); | 918 EnableIdleTasks(); |
919 SimulateMainThreadGestureWithoutPreventDefault(); | 919 SimulateMainThreadGestureWithoutPreventDefault(); |
920 RunUntilIdle(); | 920 RunUntilIdle(); |
921 EXPECT_THAT(run_order, | 921 EXPECT_THAT(run_order, |
922 testing::ElementsAre(std::string("L1"), std::string("D1"), | 922 ::testing::ElementsAre(std::string("L1"), std::string("D1"), |
923 std::string("D2"), std::string("C1"), | 923 std::string("D2"), std::string("C1"), |
924 std::string("C2"), std::string("I1"))); | 924 std::string("C2"), std::string("I1"))); |
925 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 925 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
926 CurrentUseCase()); | 926 CurrentUseCase()); |
927 } | 927 } |
928 | 928 |
929 TEST_F(RendererSchedulerImplTest, | 929 TEST_F(RendererSchedulerImplTest, |
930 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { | 930 TestCompositorPolicy_CompositorHandlesInput_LongGestureDuration) { |
931 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 931 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
932 EnableIdleTasks(); | 932 EnableIdleTasks(); |
933 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); | 933 SimulateCompositorGestureStart(TouchEventPolicy::SEND_TOUCH_START); |
934 | 934 |
(...skipping 10 matching lines...) Expand all Loading... |
945 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 945 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
946 clock_->Advance(base::TimeDelta::FromMilliseconds(16)); | 946 clock_->Advance(base::TimeDelta::FromMilliseconds(16)); |
947 RunUntilIdle(); | 947 RunUntilIdle(); |
948 } | 948 } |
949 | 949 |
950 std::vector<std::string> run_order; | 950 std::vector<std::string> run_order; |
951 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 951 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
952 | 952 |
953 RunUntilIdle(); | 953 RunUntilIdle(); |
954 EXPECT_THAT(run_order, | 954 EXPECT_THAT(run_order, |
955 testing::ElementsAre(std::string("C1"), std::string("C2"), | 955 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
956 std::string("L1"), std::string("D1"), | 956 std::string("L1"), std::string("D1"), |
957 std::string("D2"))); | 957 std::string("D2"))); |
958 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 958 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
959 CurrentUseCase()); | 959 CurrentUseCase()); |
960 } | 960 } |
961 | 961 |
962 TEST_F(RendererSchedulerImplTest, | 962 TEST_F(RendererSchedulerImplTest, |
963 TestCompositorPolicy_CompositorHandlesInput_WithoutTouchHandler) { | 963 TestCompositorPolicy_CompositorHandlesInput_WithoutTouchHandler) { |
964 std::vector<std::string> run_order; | 964 std::vector<std::string> run_order; |
965 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 965 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
966 | 966 |
967 EnableIdleTasks(); | 967 EnableIdleTasks(); |
968 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); | 968 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); |
969 RunUntilIdle(); | 969 RunUntilIdle(); |
970 EXPECT_THAT(run_order, | 970 EXPECT_THAT(run_order, |
971 testing::ElementsAre(std::string("L1"), std::string("D1"), | 971 ::testing::ElementsAre(std::string("L1"), std::string("D1"), |
972 std::string("D2"), std::string("C1"), | 972 std::string("D2"), std::string("C1"), |
973 std::string("C2"), std::string("I1"))); | 973 std::string("C2"), std::string("I1"))); |
974 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 974 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
975 CurrentUseCase()); | 975 CurrentUseCase()); |
976 } | 976 } |
977 | 977 |
978 TEST_F(RendererSchedulerImplTest, | 978 TEST_F(RendererSchedulerImplTest, |
979 TestCompositorPolicy_MainThreadHandlesInput_WithTouchHandler) { | 979 TestCompositorPolicy_MainThreadHandlesInput_WithTouchHandler) { |
980 std::vector<std::string> run_order; | 980 std::vector<std::string> run_order; |
981 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 981 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
982 | 982 |
983 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 983 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
984 EnableIdleTasks(); | 984 EnableIdleTasks(); |
985 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 985 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
986 blink::WebInputEvent::kGestureScrollBegin); | 986 blink::WebInputEvent::kGestureScrollBegin); |
987 RunUntilIdle(); | 987 RunUntilIdle(); |
988 EXPECT_THAT(run_order, | 988 EXPECT_THAT(run_order, |
989 testing::ElementsAre(std::string("C1"), std::string("C2"), | 989 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
990 std::string("L1"), std::string("D1"), | 990 std::string("L1"), std::string("D1"), |
991 std::string("D2"), std::string("I1"))); | 991 std::string("D2"), std::string("I1"))); |
992 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 992 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
993 CurrentUseCase()); | 993 CurrentUseCase()); |
994 scheduler_->DidHandleInputEventOnMainThread( | 994 scheduler_->DidHandleInputEventOnMainThread( |
995 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), | 995 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), |
996 WebInputEventResult::kHandledSystem); | 996 WebInputEventResult::kHandledSystem); |
997 } | 997 } |
998 | 998 |
999 TEST_F(RendererSchedulerImplTest, | 999 TEST_F(RendererSchedulerImplTest, |
1000 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { | 1000 TestCompositorPolicy_MainThreadHandlesInput_WithoutTouchHandler) { |
1001 std::vector<std::string> run_order; | 1001 std::vector<std::string> run_order; |
1002 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 1002 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
1003 | 1003 |
1004 EnableIdleTasks(); | 1004 EnableIdleTasks(); |
1005 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1005 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
1006 blink::WebInputEvent::kGestureScrollBegin); | 1006 blink::WebInputEvent::kGestureScrollBegin); |
1007 RunUntilIdle(); | 1007 RunUntilIdle(); |
1008 EXPECT_THAT(run_order, | 1008 EXPECT_THAT(run_order, |
1009 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1009 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1010 std::string("L1"), std::string("D1"), | 1010 std::string("L1"), std::string("D1"), |
1011 std::string("D2"), std::string("I1"))); | 1011 std::string("D2"), std::string("I1"))); |
1012 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1012 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1013 CurrentUseCase()); | 1013 CurrentUseCase()); |
1014 scheduler_->DidHandleInputEventOnMainThread( | 1014 scheduler_->DidHandleInputEventOnMainThread( |
1015 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), | 1015 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), |
1016 WebInputEventResult::kHandledSystem); | 1016 WebInputEventResult::kHandledSystem); |
1017 } | 1017 } |
1018 | 1018 |
1019 TEST_F(RendererSchedulerImplTest, | 1019 TEST_F(RendererSchedulerImplTest, |
1020 TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_PreventDefault) { | 1020 TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_PreventDefault) { |
1021 std::vector<std::string> run_order; | 1021 std::vector<std::string> run_order; |
1022 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 1022 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
1023 | 1023 |
1024 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1024 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1025 EnableIdleTasks(); | 1025 EnableIdleTasks(); |
1026 scheduler_->DidHandleInputEventOnCompositorThread( | 1026 scheduler_->DidHandleInputEventOnCompositorThread( |
1027 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1027 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1028 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1028 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1029 scheduler_->DidHandleInputEventOnMainThread( | 1029 scheduler_->DidHandleInputEventOnMainThread( |
1030 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1030 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1031 WebInputEventResult::kHandledApplication); | 1031 WebInputEventResult::kHandledApplication); |
1032 RunUntilIdle(); | 1032 RunUntilIdle(); |
1033 // Because the main thread is performing custom input handling, we let all | 1033 // Because the main thread is performing custom input handling, we let all |
1034 // tasks run. However compositing tasks are still given priority. | 1034 // tasks run. However compositing tasks are still given priority. |
1035 EXPECT_THAT(run_order, | 1035 EXPECT_THAT(run_order, |
1036 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1036 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1037 std::string("L1"), std::string("D1"), | 1037 std::string("L1"), std::string("D1"), |
1038 std::string("D2"), std::string("I1"))); | 1038 std::string("D2"), std::string("I1"))); |
1039 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1039 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1040 CurrentUseCase()); | 1040 CurrentUseCase()); |
1041 } | 1041 } |
1042 | 1042 |
1043 TEST_F( | 1043 TEST_F( |
1044 RendererSchedulerImplTest, | 1044 RendererSchedulerImplTest, |
1045 TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_NoPreventDefault) { | 1045 TestCompositorPolicy_MainThreadHandlesInput_SingleEvent_NoPreventDefault) { |
1046 std::vector<std::string> run_order; | 1046 std::vector<std::string> run_order; |
1047 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); | 1047 PostTestTasks(&run_order, "L1 I1 D1 C1 D2 C2"); |
1048 | 1048 |
1049 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1049 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1050 EnableIdleTasks(); | 1050 EnableIdleTasks(); |
1051 scheduler_->DidHandleInputEventOnCompositorThread( | 1051 scheduler_->DidHandleInputEventOnCompositorThread( |
1052 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1052 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1053 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1053 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1054 scheduler_->DidHandleInputEventOnMainThread( | 1054 scheduler_->DidHandleInputEventOnMainThread( |
1055 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1055 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1056 WebInputEventResult::kHandledSystem); | 1056 WebInputEventResult::kHandledSystem); |
1057 RunUntilIdle(); | 1057 RunUntilIdle(); |
1058 // Because we are still waiting for the touchstart to be processed, | 1058 // Because we are still waiting for the touchstart to be processed, |
1059 // non-essential tasks like loading tasks are blocked. | 1059 // non-essential tasks like loading tasks are blocked. |
1060 EXPECT_THAT(run_order, | 1060 EXPECT_THAT(run_order, |
1061 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1061 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1062 std::string("D1"), std::string("D2"), | 1062 std::string("D1"), std::string("D2"), |
1063 std::string("I1"))); | 1063 std::string("I1"))); |
1064 EXPECT_EQ(RendererSchedulerImpl::UseCase::TOUCHSTART, CurrentUseCase()); | 1064 EXPECT_EQ(RendererSchedulerImpl::UseCase::TOUCHSTART, CurrentUseCase()); |
1065 } | 1065 } |
1066 | 1066 |
1067 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { | 1067 TEST_F(RendererSchedulerImplTest, TestCompositorPolicy_DidAnimateForInput) { |
1068 std::vector<std::string> run_order; | 1068 std::vector<std::string> run_order; |
1069 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1069 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1070 | 1070 |
1071 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1071 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1072 scheduler_->DidAnimateForInputOnCompositorThread(); | 1072 scheduler_->DidAnimateForInputOnCompositorThread(); |
1073 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a | 1073 // Note DidAnimateForInputOnCompositorThread does not by itself trigger a |
1074 // policy update. | 1074 // policy update. |
1075 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 1075 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
1076 ForceUpdatePolicyAndGetCurrentUseCase()); | 1076 ForceUpdatePolicyAndGetCurrentUseCase()); |
1077 EnableIdleTasks(); | 1077 EnableIdleTasks(); |
1078 RunUntilIdle(); | 1078 RunUntilIdle(); |
1079 EXPECT_THAT(run_order, | 1079 EXPECT_THAT(run_order, |
1080 testing::ElementsAre(std::string("D1"), std::string("D2"), | 1080 ::testing::ElementsAre(std::string("D1"), std::string("D2"), |
1081 std::string("C1"), std::string("C2"), | 1081 std::string("C1"), std::string("C2"), |
1082 std::string("I1"))); | 1082 std::string("I1"))); |
1083 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 1083 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
1084 CurrentUseCase()); | 1084 CurrentUseCase()); |
1085 } | 1085 } |
1086 | 1086 |
1087 TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { | 1087 TEST_F(RendererSchedulerImplTest, Navigation_ResetsTaskCostEstimations) { |
1088 std::vector<std::string> run_order; | 1088 std::vector<std::string> run_order; |
1089 | 1089 |
1090 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1090 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1091 SimulateExpensiveTasks(timer_task_runner_); | 1091 SimulateExpensiveTasks(timer_task_runner_); |
1092 DoMainFrame(); | 1092 DoMainFrame(); |
1093 // A navigation occurs which creates a new Document thus resetting the task | 1093 // A navigation occurs which creates a new Document thus resetting the task |
1094 // cost estimations. | 1094 // cost estimations. |
1095 scheduler_->OnNavigate(); | 1095 scheduler_->OnNavigate(); |
1096 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1096 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
1097 blink::WebInputEvent::kGestureScrollUpdate); | 1097 blink::WebInputEvent::kGestureScrollUpdate); |
1098 | 1098 |
1099 PostTestTasks(&run_order, "C1 T1"); | 1099 PostTestTasks(&run_order, "C1 T1"); |
1100 | 1100 |
1101 RunUntilIdle(); | 1101 RunUntilIdle(); |
1102 | 1102 |
1103 EXPECT_THAT(run_order, | 1103 EXPECT_THAT(run_order, |
1104 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1104 ::testing::ElementsAre(std::string("C1"), std::string("T1"))); |
1105 } | 1105 } |
1106 | 1106 |
1107 TEST_F(RendererSchedulerImplTest, | 1107 TEST_F(RendererSchedulerImplTest, |
1108 ExpensiveTimersDontRunWhenMainThreadScrolling) { | 1108 ExpensiveTimersDontRunWhenMainThreadScrolling) { |
1109 std::vector<std::string> run_order; | 1109 std::vector<std::string> run_order; |
1110 | 1110 |
1111 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1111 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1112 SimulateExpensiveTasks(timer_task_runner_); | 1112 SimulateExpensiveTasks(timer_task_runner_); |
1113 DoMainFrame(); | 1113 DoMainFrame(); |
1114 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1114 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
1115 blink::WebInputEvent::kGestureScrollUpdate); | 1115 blink::WebInputEvent::kGestureScrollUpdate); |
1116 | 1116 |
1117 PostTestTasks(&run_order, "C1 T1"); | 1117 PostTestTasks(&run_order, "C1 T1"); |
1118 | 1118 |
1119 RunUntilIdle(); | 1119 RunUntilIdle(); |
1120 EXPECT_FALSE(TouchStartExpectedSoon()); | 1120 EXPECT_FALSE(TouchStartExpectedSoon()); |
1121 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_GESTURE, | 1121 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_GESTURE, |
1122 CurrentUseCase()); | 1122 CurrentUseCase()); |
1123 | 1123 |
1124 EXPECT_THAT(run_order, testing::ElementsAre(std::string("C1"))); | 1124 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("C1"))); |
1125 } | 1125 } |
1126 | 1126 |
1127 TEST_F(RendererSchedulerImplTest, | 1127 TEST_F(RendererSchedulerImplTest, |
1128 ExpensiveTimersDoRunWhenMainThreadInputHandling) { | 1128 ExpensiveTimersDoRunWhenMainThreadInputHandling) { |
1129 std::vector<std::string> run_order; | 1129 std::vector<std::string> run_order; |
1130 | 1130 |
1131 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1131 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1132 SimulateExpensiveTasks(timer_task_runner_); | 1132 SimulateExpensiveTasks(timer_task_runner_); |
1133 DoMainFrame(); | 1133 DoMainFrame(); |
1134 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1134 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
1135 blink::WebInputEvent::kUndefined); | 1135 blink::WebInputEvent::kUndefined); |
1136 | 1136 |
1137 PostTestTasks(&run_order, "C1 T1"); | 1137 PostTestTasks(&run_order, "C1 T1"); |
1138 | 1138 |
1139 RunUntilIdle(); | 1139 RunUntilIdle(); |
1140 EXPECT_FALSE(TouchStartExpectedSoon()); | 1140 EXPECT_FALSE(TouchStartExpectedSoon()); |
1141 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1141 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1142 CurrentUseCase()); | 1142 CurrentUseCase()); |
1143 | 1143 |
1144 EXPECT_THAT(run_order, | 1144 EXPECT_THAT(run_order, |
1145 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1145 ::testing::ElementsAre(std::string("C1"), std::string("T1"))); |
1146 } | 1146 } |
1147 | 1147 |
1148 TEST_F(RendererSchedulerImplTest, | 1148 TEST_F(RendererSchedulerImplTest, |
1149 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { | 1149 ExpensiveTimersDoRunWhenMainThreadScrolling_AndOnCriticalPath) { |
1150 std::vector<std::string> run_order; | 1150 std::vector<std::string> run_order; |
1151 | 1151 |
1152 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1152 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1153 SimulateExpensiveTasks(timer_task_runner_); | 1153 SimulateExpensiveTasks(timer_task_runner_); |
1154 DoMainFrameOnCriticalPath(); | 1154 DoMainFrameOnCriticalPath(); |
1155 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1155 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
1156 blink::WebInputEvent::kGestureScrollBegin); | 1156 blink::WebInputEvent::kGestureScrollBegin); |
1157 | 1157 |
1158 PostTestTasks(&run_order, "C1 T1"); | 1158 PostTestTasks(&run_order, "C1 T1"); |
1159 | 1159 |
1160 RunUntilIdle(); | 1160 RunUntilIdle(); |
1161 EXPECT_FALSE(TouchStartExpectedSoon()); | 1161 EXPECT_FALSE(TouchStartExpectedSoon()); |
1162 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1162 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1163 CurrentUseCase()); | 1163 CurrentUseCase()); |
1164 | 1164 |
1165 EXPECT_THAT(run_order, | 1165 EXPECT_THAT(run_order, |
1166 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 1166 ::testing::ElementsAre(std::string("C1"), std::string("T1"))); |
1167 } | 1167 } |
1168 | 1168 |
1169 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { | 1169 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_Compositor) { |
1170 std::vector<std::string> run_order; | 1170 std::vector<std::string> run_order; |
1171 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); | 1171 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); |
1172 | 1172 |
1173 // Observation of touchstart should defer execution of timer, idle and loading | 1173 // Observation of touchstart should defer execution of timer, idle and loading |
1174 // tasks. | 1174 // tasks. |
1175 scheduler_->DidHandleInputEventOnCompositorThread( | 1175 scheduler_->DidHandleInputEventOnCompositorThread( |
1176 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1176 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1177 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1177 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1178 EnableIdleTasks(); | 1178 EnableIdleTasks(); |
1179 RunUntilIdle(); | 1179 RunUntilIdle(); |
1180 EXPECT_THAT(run_order, | 1180 EXPECT_THAT(run_order, |
1181 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1181 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1182 std::string("D1"), std::string("D2"))); | 1182 std::string("D1"), std::string("D2"))); |
1183 | 1183 |
1184 // Animation or meta events like TapDown/FlingCancel shouldn't affect the | 1184 // Animation or meta events like TapDown/FlingCancel shouldn't affect the |
1185 // priority. | 1185 // priority. |
1186 run_order.clear(); | 1186 run_order.clear(); |
1187 scheduler_->DidAnimateForInputOnCompositorThread(); | 1187 scheduler_->DidAnimateForInputOnCompositorThread(); |
1188 scheduler_->DidHandleInputEventOnCompositorThread( | 1188 scheduler_->DidHandleInputEventOnCompositorThread( |
1189 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), | 1189 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), |
1190 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1190 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1191 scheduler_->DidHandleInputEventOnCompositorThread( | 1191 scheduler_->DidHandleInputEventOnCompositorThread( |
1192 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), | 1192 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), |
1193 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1193 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1194 RunUntilIdle(); | 1194 RunUntilIdle(); |
1195 EXPECT_THAT(run_order, testing::ElementsAre()); | 1195 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
1196 | 1196 |
1197 // Action events like ScrollBegin will kick us back into compositor priority, | 1197 // Action events like ScrollBegin will kick us back into compositor priority, |
1198 // allowing service of the timer, loading and idle queues. | 1198 // allowing service of the timer, loading and idle queues. |
1199 run_order.clear(); | 1199 run_order.clear(); |
1200 scheduler_->DidHandleInputEventOnCompositorThread( | 1200 scheduler_->DidHandleInputEventOnCompositorThread( |
1201 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), | 1201 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), |
1202 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1202 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1203 RunUntilIdle(); | 1203 RunUntilIdle(); |
1204 | 1204 |
1205 EXPECT_THAT(run_order, | 1205 EXPECT_THAT(run_order, |
1206 testing::ElementsAre(std::string("L1"), std::string("T1"), | 1206 ::testing::ElementsAre(std::string("L1"), std::string("T1"), |
1207 std::string("T2"))); | 1207 std::string("T2"))); |
1208 } | 1208 } |
1209 | 1209 |
1210 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_MainThread) { | 1210 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicy_MainThread) { |
1211 std::vector<std::string> run_order; | 1211 std::vector<std::string> run_order; |
1212 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); | 1212 PostTestTasks(&run_order, "L1 D1 C1 D2 C2 T1 T2"); |
1213 | 1213 |
1214 // Observation of touchstart should defer execution of timer, idle and loading | 1214 // Observation of touchstart should defer execution of timer, idle and loading |
1215 // tasks. | 1215 // tasks. |
1216 scheduler_->DidHandleInputEventOnCompositorThread( | 1216 scheduler_->DidHandleInputEventOnCompositorThread( |
1217 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1217 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1218 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1218 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1219 scheduler_->DidHandleInputEventOnMainThread( | 1219 scheduler_->DidHandleInputEventOnMainThread( |
1220 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1220 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1221 WebInputEventResult::kHandledSystem); | 1221 WebInputEventResult::kHandledSystem); |
1222 EnableIdleTasks(); | 1222 EnableIdleTasks(); |
1223 RunUntilIdle(); | 1223 RunUntilIdle(); |
1224 EXPECT_THAT(run_order, | 1224 EXPECT_THAT(run_order, |
1225 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1225 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1226 std::string("D1"), std::string("D2"))); | 1226 std::string("D1"), std::string("D2"))); |
1227 | 1227 |
1228 // Meta events like TapDown/FlingCancel shouldn't affect the priority. | 1228 // Meta events like TapDown/FlingCancel shouldn't affect the priority. |
1229 run_order.clear(); | 1229 run_order.clear(); |
1230 scheduler_->DidHandleInputEventOnCompositorThread( | 1230 scheduler_->DidHandleInputEventOnCompositorThread( |
1231 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), | 1231 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), |
1232 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1232 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1233 scheduler_->DidHandleInputEventOnMainThread( | 1233 scheduler_->DidHandleInputEventOnMainThread( |
1234 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), | 1234 FakeInputEvent(blink::WebInputEvent::kGestureFlingCancel), |
1235 WebInputEventResult::kHandledSystem); | 1235 WebInputEventResult::kHandledSystem); |
1236 scheduler_->DidHandleInputEventOnCompositorThread( | 1236 scheduler_->DidHandleInputEventOnCompositorThread( |
1237 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), | 1237 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), |
1238 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1238 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1239 scheduler_->DidHandleInputEventOnMainThread( | 1239 scheduler_->DidHandleInputEventOnMainThread( |
1240 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), | 1240 FakeInputEvent(blink::WebInputEvent::kGestureTapDown), |
1241 WebInputEventResult::kHandledSystem); | 1241 WebInputEventResult::kHandledSystem); |
1242 RunUntilIdle(); | 1242 RunUntilIdle(); |
1243 EXPECT_THAT(run_order, testing::ElementsAre()); | 1243 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
1244 | 1244 |
1245 // Action events like ScrollBegin will kick us back into compositor priority, | 1245 // Action events like ScrollBegin will kick us back into compositor priority, |
1246 // allowing service of the timer, loading and idle queues. | 1246 // allowing service of the timer, loading and idle queues. |
1247 run_order.clear(); | 1247 run_order.clear(); |
1248 scheduler_->DidHandleInputEventOnCompositorThread( | 1248 scheduler_->DidHandleInputEventOnCompositorThread( |
1249 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), | 1249 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), |
1250 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1250 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1251 scheduler_->DidHandleInputEventOnMainThread( | 1251 scheduler_->DidHandleInputEventOnMainThread( |
1252 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), | 1252 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), |
1253 WebInputEventResult::kHandledSystem); | 1253 WebInputEventResult::kHandledSystem); |
1254 RunUntilIdle(); | 1254 RunUntilIdle(); |
1255 | 1255 |
1256 EXPECT_THAT(run_order, | 1256 EXPECT_THAT(run_order, |
1257 testing::ElementsAre(std::string("L1"), std::string("T1"), | 1257 ::testing::ElementsAre(std::string("L1"), std::string("T1"), |
1258 std::string("T2"))); | 1258 std::string("T2"))); |
1259 } | 1259 } |
1260 | 1260 |
1261 // TODO(alexclarke): Reenable once we've reinstaed the Loading UseCase. | 1261 // TODO(alexclarke): Reenable once we've reinstaed the Loading UseCase. |
1262 TEST_F(RendererSchedulerImplTest, DISABLED_LoadingUseCase) { | 1262 TEST_F(RendererSchedulerImplTest, DISABLED_LoadingUseCase) { |
1263 std::vector<std::string> run_order; | 1263 std::vector<std::string> run_order; |
1264 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); | 1264 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); |
1265 | 1265 |
1266 scheduler_->OnNavigate(); | 1266 scheduler_->OnNavigate(); |
1267 EnableIdleTasks(); | 1267 EnableIdleTasks(); |
1268 RunUntilIdle(); | 1268 RunUntilIdle(); |
1269 | 1269 |
1270 // In loading policy, loading tasks are prioritized other others. | 1270 // In loading policy, loading tasks are prioritized other others. |
1271 std::string loading_policy_expected[] = { | 1271 std::string loading_policy_expected[] = { |
1272 std::string("D1"), std::string("L1"), std::string("D2"), | 1272 std::string("D1"), std::string("L1"), std::string("D2"), |
1273 std::string("L2"), std::string("C1"), std::string("T1"), | 1273 std::string("L2"), std::string("C1"), std::string("T1"), |
1274 std::string("C2"), std::string("T2"), std::string("I1")}; | 1274 std::string("C2"), std::string("T2"), std::string("I1")}; |
1275 EXPECT_THAT(run_order, testing::ElementsAreArray(loading_policy_expected)); | 1275 EXPECT_THAT(run_order, ::testing::ElementsAreArray(loading_policy_expected)); |
1276 EXPECT_EQ(RendererSchedulerImpl::UseCase::LOADING, CurrentUseCase()); | 1276 EXPECT_EQ(RendererSchedulerImpl::UseCase::LOADING, CurrentUseCase()); |
1277 | 1277 |
1278 // Advance 15s and try again, the loading policy should have ended and the | 1278 // Advance 15s and try again, the loading policy should have ended and the |
1279 // task order should return to the NONE use case where loading tasks are no | 1279 // task order should return to the NONE use case where loading tasks are no |
1280 // longer prioritized. | 1280 // longer prioritized. |
1281 clock_->Advance(base::TimeDelta::FromMilliseconds(150000)); | 1281 clock_->Advance(base::TimeDelta::FromMilliseconds(150000)); |
1282 run_order.clear(); | 1282 run_order.clear(); |
1283 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); | 1283 PostTestTasks(&run_order, "I1 D1 C1 T1 L1 D2 C2 T2 L2"); |
1284 EnableIdleTasks(); | 1284 EnableIdleTasks(); |
1285 RunUntilIdle(); | 1285 RunUntilIdle(); |
1286 | 1286 |
1287 std::string default_order_expected[] = { | 1287 std::string default_order_expected[] = { |
1288 std::string("D1"), std::string("C1"), std::string("T1"), | 1288 std::string("D1"), std::string("C1"), std::string("T1"), |
1289 std::string("L1"), std::string("D2"), std::string("C2"), | 1289 std::string("L1"), std::string("D2"), std::string("C2"), |
1290 std::string("T2"), std::string("L2"), std::string("I1")}; | 1290 std::string("T2"), std::string("L2"), std::string("I1")}; |
1291 EXPECT_THAT(run_order, testing::ElementsAreArray(default_order_expected)); | 1291 EXPECT_THAT(run_order, ::testing::ElementsAreArray(default_order_expected)); |
1292 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 1292 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
1293 } | 1293 } |
1294 | 1294 |
1295 TEST_F(RendererSchedulerImplTest, | 1295 TEST_F(RendererSchedulerImplTest, |
1296 EventConsumedOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { | 1296 EventConsumedOnCompositorThread_IgnoresMouseMove_WhenMouseUp) { |
1297 RunSlowCompositorTask(); | 1297 RunSlowCompositorTask(); |
1298 | 1298 |
1299 std::vector<std::string> run_order; | 1299 std::vector<std::string> run_order; |
1300 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1300 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1301 | 1301 |
1302 EnableIdleTasks(); | 1302 EnableIdleTasks(); |
1303 scheduler_->DidHandleInputEventOnCompositorThread( | 1303 scheduler_->DidHandleInputEventOnCompositorThread( |
1304 FakeInputEvent(blink::WebInputEvent::kMouseMove), | 1304 FakeInputEvent(blink::WebInputEvent::kMouseMove), |
1305 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1305 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1306 RunUntilIdle(); | 1306 RunUntilIdle(); |
1307 // Note compositor tasks are not prioritized. | 1307 // Note compositor tasks are not prioritized. |
1308 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 1308 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
1309 EXPECT_THAT(run_order, | 1309 EXPECT_THAT(run_order, |
1310 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1310 ::testing::ElementsAre(std::string("D1"), std::string("C1"), |
1311 std::string("D2"), std::string("C2"), | 1311 std::string("D2"), std::string("C2"), |
1312 std::string("I1"))); | 1312 std::string("I1"))); |
1313 } | 1313 } |
1314 | 1314 |
1315 TEST_F(RendererSchedulerImplTest, | 1315 TEST_F(RendererSchedulerImplTest, |
1316 EventForwardedToMainThread_IgnoresMouseMove_WhenMouseUp) { | 1316 EventForwardedToMainThread_IgnoresMouseMove_WhenMouseUp) { |
1317 RunSlowCompositorTask(); | 1317 RunSlowCompositorTask(); |
1318 | 1318 |
1319 std::vector<std::string> run_order; | 1319 std::vector<std::string> run_order; |
1320 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1320 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1321 | 1321 |
1322 EnableIdleTasks(); | 1322 EnableIdleTasks(); |
1323 scheduler_->DidHandleInputEventOnCompositorThread( | 1323 scheduler_->DidHandleInputEventOnCompositorThread( |
1324 FakeInputEvent(blink::WebInputEvent::kMouseMove), | 1324 FakeInputEvent(blink::WebInputEvent::kMouseMove), |
1325 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1325 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1326 RunUntilIdle(); | 1326 RunUntilIdle(); |
1327 // Note compositor tasks are not prioritized. | 1327 // Note compositor tasks are not prioritized. |
1328 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 1328 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
1329 EXPECT_THAT(run_order, | 1329 EXPECT_THAT(run_order, |
1330 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1330 ::testing::ElementsAre(std::string("D1"), std::string("C1"), |
1331 std::string("D2"), std::string("C2"), | 1331 std::string("D2"), std::string("C2"), |
1332 std::string("I1"))); | 1332 std::string("I1"))); |
1333 } | 1333 } |
1334 | 1334 |
1335 TEST_F(RendererSchedulerImplTest, | 1335 TEST_F(RendererSchedulerImplTest, |
1336 EventConsumedOnCompositorThread_MouseMove_WhenMouseDown) { | 1336 EventConsumedOnCompositorThread_MouseMove_WhenMouseDown) { |
1337 std::vector<std::string> run_order; | 1337 std::vector<std::string> run_order; |
1338 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1338 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1339 | 1339 |
1340 // Note that currently the compositor will never consume mouse move events, | 1340 // Note that currently the compositor will never consume mouse move events, |
1341 // but this test reflects what should happen if that was the case. | 1341 // but this test reflects what should happen if that was the case. |
1342 EnableIdleTasks(); | 1342 EnableIdleTasks(); |
1343 scheduler_->DidHandleInputEventOnCompositorThread( | 1343 scheduler_->DidHandleInputEventOnCompositorThread( |
1344 FakeInputEvent(blink::WebInputEvent::kMouseMove, | 1344 FakeInputEvent(blink::WebInputEvent::kMouseMove, |
1345 blink::WebInputEvent::kLeftButtonDown), | 1345 blink::WebInputEvent::kLeftButtonDown), |
1346 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1346 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1347 RunUntilIdle(); | 1347 RunUntilIdle(); |
1348 // Note compositor tasks deprioritized. | 1348 // Note compositor tasks deprioritized. |
1349 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 1349 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
1350 CurrentUseCase()); | 1350 CurrentUseCase()); |
1351 EXPECT_THAT(run_order, | 1351 EXPECT_THAT(run_order, |
1352 testing::ElementsAre(std::string("D1"), std::string("D2"), | 1352 ::testing::ElementsAre(std::string("D1"), std::string("D2"), |
1353 std::string("C1"), std::string("C2"), | 1353 std::string("C1"), std::string("C2"), |
1354 std::string("I1"))); | 1354 std::string("I1"))); |
1355 } | 1355 } |
1356 | 1356 |
1357 TEST_F(RendererSchedulerImplTest, | 1357 TEST_F(RendererSchedulerImplTest, |
1358 EventForwardedToMainThread_MouseMove_WhenMouseDown) { | 1358 EventForwardedToMainThread_MouseMove_WhenMouseDown) { |
1359 std::vector<std::string> run_order; | 1359 std::vector<std::string> run_order; |
1360 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1360 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1361 | 1361 |
1362 EnableIdleTasks(); | 1362 EnableIdleTasks(); |
1363 scheduler_->DidHandleInputEventOnCompositorThread( | 1363 scheduler_->DidHandleInputEventOnCompositorThread( |
1364 FakeInputEvent(blink::WebInputEvent::kMouseMove, | 1364 FakeInputEvent(blink::WebInputEvent::kMouseMove, |
1365 blink::WebInputEvent::kLeftButtonDown), | 1365 blink::WebInputEvent::kLeftButtonDown), |
1366 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1366 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1367 RunUntilIdle(); | 1367 RunUntilIdle(); |
1368 // Note compositor tasks are prioritized. | 1368 // Note compositor tasks are prioritized. |
1369 EXPECT_THAT(run_order, | 1369 EXPECT_THAT(run_order, |
1370 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1370 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1371 std::string("D1"), std::string("D2"), | 1371 std::string("D1"), std::string("D2"), |
1372 std::string("I1"))); | 1372 std::string("I1"))); |
1373 scheduler_->DidHandleInputEventOnMainThread( | 1373 scheduler_->DidHandleInputEventOnMainThread( |
1374 FakeInputEvent(blink::WebInputEvent::kMouseMove, | 1374 FakeInputEvent(blink::WebInputEvent::kMouseMove, |
1375 blink::WebInputEvent::kLeftButtonDown), | 1375 blink::WebInputEvent::kLeftButtonDown), |
1376 WebInputEventResult::kHandledSystem); | 1376 WebInputEventResult::kHandledSystem); |
1377 } | 1377 } |
1378 | 1378 |
1379 TEST_F(RendererSchedulerImplTest, | 1379 TEST_F(RendererSchedulerImplTest, |
1380 EventForwardedToMainThread_MouseMove_WhenMouseDown_AfterMouseWheel) { | 1380 EventForwardedToMainThread_MouseMove_WhenMouseDown_AfterMouseWheel) { |
1381 // Simulate a main thread driven mouse wheel scroll gesture. | 1381 // Simulate a main thread driven mouse wheel scroll gesture. |
1382 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 1382 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
(...skipping 17 matching lines...) Expand all Loading... |
1400 FakeInputEvent(blink::WebInputEvent::kMouseMove, | 1400 FakeInputEvent(blink::WebInputEvent::kMouseMove, |
1401 blink::WebInputEvent::kLeftButtonDown), | 1401 blink::WebInputEvent::kLeftButtonDown), |
1402 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1402 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1403 RunUntilIdle(); | 1403 RunUntilIdle(); |
1404 | 1404 |
1405 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1405 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1406 CurrentUseCase()); | 1406 CurrentUseCase()); |
1407 | 1407 |
1408 // Note compositor tasks are prioritized. | 1408 // Note compositor tasks are prioritized. |
1409 EXPECT_THAT(run_order, | 1409 EXPECT_THAT(run_order, |
1410 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1410 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1411 std::string("D1"), std::string("D2"), | 1411 std::string("D1"), std::string("D2"), |
1412 std::string("I1"))); | 1412 std::string("I1"))); |
1413 } | 1413 } |
1414 | 1414 |
1415 TEST_F(RendererSchedulerImplTest, | 1415 TEST_F(RendererSchedulerImplTest, |
1416 EventForwardedToMainThread_MouseClick) { | 1416 EventForwardedToMainThread_MouseClick) { |
1417 // A mouse click should be detected as main thread input handling, which means | 1417 // A mouse click should be detected as main thread input handling, which means |
1418 // we won't try to defer expensive tasks because of one. We can, however, | 1418 // we won't try to defer expensive tasks because of one. We can, however, |
1419 // prioritize compositing/input handling. | 1419 // prioritize compositing/input handling. |
1420 std::vector<std::string> run_order; | 1420 std::vector<std::string> run_order; |
1421 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1421 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1422 EnableIdleTasks(); | 1422 EnableIdleTasks(); |
1423 | 1423 |
1424 scheduler_->DidHandleInputEventOnCompositorThread( | 1424 scheduler_->DidHandleInputEventOnCompositorThread( |
1425 FakeInputEvent(blink::WebInputEvent::kMouseDown, | 1425 FakeInputEvent(blink::WebInputEvent::kMouseDown, |
1426 blink::WebInputEvent::kLeftButtonDown), | 1426 blink::WebInputEvent::kLeftButtonDown), |
1427 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1427 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1428 scheduler_->DidHandleInputEventOnCompositorThread( | 1428 scheduler_->DidHandleInputEventOnCompositorThread( |
1429 FakeInputEvent(blink::WebInputEvent::kMouseUp, | 1429 FakeInputEvent(blink::WebInputEvent::kMouseUp, |
1430 blink::WebInputEvent::kLeftButtonDown), | 1430 blink::WebInputEvent::kLeftButtonDown), |
1431 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1431 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1432 RunUntilIdle(); | 1432 RunUntilIdle(); |
1433 | 1433 |
1434 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1434 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1435 CurrentUseCase()); | 1435 CurrentUseCase()); |
1436 | 1436 |
1437 // Note compositor tasks are prioritized. | 1437 // Note compositor tasks are prioritized. |
1438 EXPECT_THAT(run_order, | 1438 EXPECT_THAT(run_order, |
1439 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1439 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1440 std::string("D1"), std::string("D2"), | 1440 std::string("D1"), std::string("D2"), |
1441 std::string("I1"))); | 1441 std::string("I1"))); |
1442 } | 1442 } |
1443 | 1443 |
1444 TEST_F(RendererSchedulerImplTest, EventConsumedOnCompositorThread_MouseWheel) { | 1444 TEST_F(RendererSchedulerImplTest, EventConsumedOnCompositorThread_MouseWheel) { |
1445 std::vector<std::string> run_order; | 1445 std::vector<std::string> run_order; |
1446 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1446 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1447 | 1447 |
1448 EnableIdleTasks(); | 1448 EnableIdleTasks(); |
1449 scheduler_->DidHandleInputEventOnCompositorThread( | 1449 scheduler_->DidHandleInputEventOnCompositorThread( |
1450 FakeInputEvent(blink::WebInputEvent::kMouseWheel), | 1450 FakeInputEvent(blink::WebInputEvent::kMouseWheel), |
1451 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1451 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1452 RunUntilIdle(); | 1452 RunUntilIdle(); |
1453 // Note compositor tasks are not prioritized. | 1453 // Note compositor tasks are not prioritized. |
1454 EXPECT_THAT(run_order, | 1454 EXPECT_THAT(run_order, |
1455 testing::ElementsAre(std::string("D1"), std::string("D2"), | 1455 ::testing::ElementsAre(std::string("D1"), std::string("D2"), |
1456 std::string("C1"), std::string("C2"), | 1456 std::string("C1"), std::string("C2"), |
1457 std::string("I1"))); | 1457 std::string("I1"))); |
1458 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 1458 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
1459 CurrentUseCase()); | 1459 CurrentUseCase()); |
1460 } | 1460 } |
1461 | 1461 |
1462 TEST_F(RendererSchedulerImplTest, | 1462 TEST_F(RendererSchedulerImplTest, |
1463 EventForwardedToMainThread_MouseWheel_PreventDefault) { | 1463 EventForwardedToMainThread_MouseWheel_PreventDefault) { |
1464 std::vector<std::string> run_order; | 1464 std::vector<std::string> run_order; |
1465 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1465 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1466 | 1466 |
1467 EnableIdleTasks(); | 1467 EnableIdleTasks(); |
1468 scheduler_->DidHandleInputEventOnCompositorThread( | 1468 scheduler_->DidHandleInputEventOnCompositorThread( |
1469 FakeInputEvent(blink::WebInputEvent::kMouseWheel), | 1469 FakeInputEvent(blink::WebInputEvent::kMouseWheel), |
1470 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1470 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1471 RunUntilIdle(); | 1471 RunUntilIdle(); |
1472 // Note compositor tasks are prioritized (since they are fast). | 1472 // Note compositor tasks are prioritized (since they are fast). |
1473 EXPECT_THAT(run_order, | 1473 EXPECT_THAT(run_order, |
1474 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1474 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1475 std::string("D1"), std::string("D2"), | 1475 std::string("D1"), std::string("D2"), |
1476 std::string("I1"))); | 1476 std::string("I1"))); |
1477 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 1477 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
1478 CurrentUseCase()); | 1478 CurrentUseCase()); |
1479 } | 1479 } |
1480 | 1480 |
1481 TEST_F(RendererSchedulerImplTest, EventForwardedToMainThread_NoPreventDefault) { | 1481 TEST_F(RendererSchedulerImplTest, EventForwardedToMainThread_NoPreventDefault) { |
1482 std::vector<std::string> run_order; | 1482 std::vector<std::string> run_order; |
1483 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1483 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1484 | 1484 |
1485 EnableIdleTasks(); | 1485 EnableIdleTasks(); |
1486 scheduler_->DidHandleInputEventOnCompositorThread( | 1486 scheduler_->DidHandleInputEventOnCompositorThread( |
1487 FakeInputEvent(blink::WebInputEvent::kMouseWheel), | 1487 FakeInputEvent(blink::WebInputEvent::kMouseWheel), |
1488 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1488 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1489 scheduler_->DidHandleInputEventOnCompositorThread( | 1489 scheduler_->DidHandleInputEventOnCompositorThread( |
1490 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), | 1490 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), |
1491 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1491 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1492 scheduler_->DidHandleInputEventOnCompositorThread( | 1492 scheduler_->DidHandleInputEventOnCompositorThread( |
1493 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), | 1493 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), |
1494 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1494 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1495 scheduler_->DidHandleInputEventOnCompositorThread( | 1495 scheduler_->DidHandleInputEventOnCompositorThread( |
1496 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), | 1496 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), |
1497 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1497 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1498 RunUntilIdle(); | 1498 RunUntilIdle(); |
1499 // Note compositor tasks are prioritized. | 1499 // Note compositor tasks are prioritized. |
1500 EXPECT_THAT(run_order, | 1500 EXPECT_THAT(run_order, |
1501 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1501 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1502 std::string("D1"), std::string("D2"), | 1502 std::string("D1"), std::string("D2"), |
1503 std::string("I1"))); | 1503 std::string("I1"))); |
1504 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_GESTURE, | 1504 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_GESTURE, |
1505 CurrentUseCase()); | 1505 CurrentUseCase()); |
1506 } | 1506 } |
1507 | 1507 |
1508 TEST_F( | 1508 TEST_F( |
1509 RendererSchedulerImplTest, | 1509 RendererSchedulerImplTest, |
1510 EventForwardedToMainThreadAndBackToCompositor_MouseWheel_NoPreventDefault) { | 1510 EventForwardedToMainThreadAndBackToCompositor_MouseWheel_NoPreventDefault) { |
1511 std::vector<std::string> run_order; | 1511 std::vector<std::string> run_order; |
1512 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1512 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1513 | 1513 |
1514 EnableIdleTasks(); | 1514 EnableIdleTasks(); |
1515 scheduler_->DidHandleInputEventOnCompositorThread( | 1515 scheduler_->DidHandleInputEventOnCompositorThread( |
1516 FakeInputEvent(blink::WebInputEvent::kMouseWheel), | 1516 FakeInputEvent(blink::WebInputEvent::kMouseWheel), |
1517 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1517 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1518 scheduler_->DidHandleInputEventOnCompositorThread( | 1518 scheduler_->DidHandleInputEventOnCompositorThread( |
1519 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), | 1519 FakeInputEvent(blink::WebInputEvent::kGestureScrollBegin), |
1520 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1520 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1521 scheduler_->DidHandleInputEventOnCompositorThread( | 1521 scheduler_->DidHandleInputEventOnCompositorThread( |
1522 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), | 1522 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), |
1523 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1523 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1524 scheduler_->DidHandleInputEventOnCompositorThread( | 1524 scheduler_->DidHandleInputEventOnCompositorThread( |
1525 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), | 1525 FakeInputEvent(blink::WebInputEvent::kGestureScrollUpdate), |
1526 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1526 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1527 RunUntilIdle(); | 1527 RunUntilIdle(); |
1528 // Note compositor tasks are not prioritized. | 1528 // Note compositor tasks are not prioritized. |
1529 EXPECT_THAT(run_order, | 1529 EXPECT_THAT(run_order, |
1530 testing::ElementsAre(std::string("D1"), std::string("D2"), | 1530 ::testing::ElementsAre(std::string("D1"), std::string("D2"), |
1531 std::string("C1"), std::string("C2"), | 1531 std::string("C1"), std::string("C2"), |
1532 std::string("I1"))); | 1532 std::string("I1"))); |
1533 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, | 1533 EXPECT_EQ(RendererSchedulerImpl::UseCase::COMPOSITOR_GESTURE, |
1534 CurrentUseCase()); | 1534 CurrentUseCase()); |
1535 } | 1535 } |
1536 | 1536 |
1537 TEST_F(RendererSchedulerImplTest, | 1537 TEST_F(RendererSchedulerImplTest, |
1538 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { | 1538 EventConsumedOnCompositorThread_IgnoresKeyboardEvents) { |
1539 RunSlowCompositorTask(); | 1539 RunSlowCompositorTask(); |
1540 | 1540 |
1541 std::vector<std::string> run_order; | 1541 std::vector<std::string> run_order; |
1542 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1542 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1543 | 1543 |
1544 EnableIdleTasks(); | 1544 EnableIdleTasks(); |
1545 scheduler_->DidHandleInputEventOnCompositorThread( | 1545 scheduler_->DidHandleInputEventOnCompositorThread( |
1546 FakeInputEvent(blink::WebInputEvent::kKeyDown), | 1546 FakeInputEvent(blink::WebInputEvent::kKeyDown), |
1547 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1547 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1548 RunUntilIdle(); | 1548 RunUntilIdle(); |
1549 // Note compositor tasks are not prioritized. | 1549 // Note compositor tasks are not prioritized. |
1550 EXPECT_THAT(run_order, | 1550 EXPECT_THAT(run_order, |
1551 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1551 ::testing::ElementsAre(std::string("D1"), std::string("C1"), |
1552 std::string("D2"), std::string("C2"), | 1552 std::string("D2"), std::string("C2"), |
1553 std::string("I1"))); | 1553 std::string("I1"))); |
1554 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 1554 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
1555 } | 1555 } |
1556 | 1556 |
1557 TEST_F(RendererSchedulerImplTest, | 1557 TEST_F(RendererSchedulerImplTest, |
1558 EventForwardedToMainThread_IgnoresKeyboardEvents) { | 1558 EventForwardedToMainThread_IgnoresKeyboardEvents) { |
1559 RunSlowCompositorTask(); | 1559 RunSlowCompositorTask(); |
1560 | 1560 |
1561 std::vector<std::string> run_order; | 1561 std::vector<std::string> run_order; |
1562 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); | 1562 PostTestTasks(&run_order, "I1 D1 C1 D2 C2"); |
1563 | 1563 |
1564 EnableIdleTasks(); | 1564 EnableIdleTasks(); |
1565 scheduler_->DidHandleInputEventOnCompositorThread( | 1565 scheduler_->DidHandleInputEventOnCompositorThread( |
1566 FakeInputEvent(blink::WebInputEvent::kKeyDown), | 1566 FakeInputEvent(blink::WebInputEvent::kKeyDown), |
1567 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 1567 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
1568 RunUntilIdle(); | 1568 RunUntilIdle(); |
1569 // Note compositor tasks are not prioritized. | 1569 // Note compositor tasks are not prioritized. |
1570 EXPECT_THAT(run_order, | 1570 EXPECT_THAT(run_order, |
1571 testing::ElementsAre(std::string("D1"), std::string("C1"), | 1571 ::testing::ElementsAre(std::string("D1"), std::string("C1"), |
1572 std::string("D2"), std::string("C2"), | 1572 std::string("D2"), std::string("C2"), |
1573 std::string("I1"))); | 1573 std::string("I1"))); |
1574 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 1574 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
1575 // Note compositor tasks are not prioritized. | 1575 // Note compositor tasks are not prioritized. |
1576 scheduler_->DidHandleInputEventOnMainThread( | 1576 scheduler_->DidHandleInputEventOnMainThread( |
1577 FakeInputEvent(blink::WebInputEvent::kKeyDown), | 1577 FakeInputEvent(blink::WebInputEvent::kKeyDown), |
1578 WebInputEventResult::kHandledSystem); | 1578 WebInputEventResult::kHandledSystem); |
1579 } | 1579 } |
1580 | 1580 |
1581 TEST_F(RendererSchedulerImplTest, | 1581 TEST_F(RendererSchedulerImplTest, |
1582 TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { | 1582 TestMainthreadScrollingUseCaseDoesNotStarveDefaultTasks) { |
1583 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 1583 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
1584 blink::WebInputEvent::kGestureScrollBegin); | 1584 blink::WebInputEvent::kGestureScrollBegin); |
1585 EnableIdleTasks(); | 1585 EnableIdleTasks(); |
1586 | 1586 |
1587 std::vector<std::string> run_order; | 1587 std::vector<std::string> run_order; |
1588 PostTestTasks(&run_order, "D1 C1"); | 1588 PostTestTasks(&run_order, "D1 C1"); |
1589 | 1589 |
1590 for (int i = 0; i < 20; i++) { | 1590 for (int i = 0; i < 20; i++) { |
1591 compositor_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); | 1591 compositor_task_runner_->PostTask(FROM_HERE, base::Bind(&NullTask)); |
1592 } | 1592 } |
1593 PostTestTasks(&run_order, "C2"); | 1593 PostTestTasks(&run_order, "C2"); |
1594 | 1594 |
1595 scheduler_->DidHandleInputEventOnCompositorThread( | 1595 scheduler_->DidHandleInputEventOnCompositorThread( |
1596 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), | 1596 FakeInputEvent(blink::WebInputEvent::kGestureFlingStart), |
1597 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1597 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1598 RunUntilIdle(); | 1598 RunUntilIdle(); |
1599 // Ensure that the default D1 task gets to run at some point before the final | 1599 // Ensure that the default D1 task gets to run at some point before the final |
1600 // C2 compositor task. | 1600 // C2 compositor task. |
1601 EXPECT_THAT(run_order, | 1601 EXPECT_THAT(run_order, |
1602 testing::ElementsAre(std::string("C1"), std::string("D1"), | 1602 ::testing::ElementsAre(std::string("C1"), std::string("D1"), |
1603 std::string("C2"))); | 1603 std::string("C2"))); |
1604 } | 1604 } |
1605 | 1605 |
1606 TEST_F(RendererSchedulerImplTest, | 1606 TEST_F(RendererSchedulerImplTest, |
1607 TestCompositorPolicyEnds_CompositorHandlesInput) { | 1607 TestCompositorPolicyEnds_CompositorHandlesInput) { |
1608 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); | 1608 SimulateCompositorGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START); |
1609 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 1609 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
1610 ForceUpdatePolicyAndGetCurrentUseCase()); | 1610 ForceUpdatePolicyAndGetCurrentUseCase()); |
1611 | 1611 |
1612 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); | 1612 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
1613 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 1613 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
(...skipping 12 matching lines...) Expand all Loading... |
1626 | 1626 |
1627 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { | 1627 TEST_F(RendererSchedulerImplTest, TestTouchstartPolicyEndsAfterTimeout) { |
1628 std::vector<std::string> run_order; | 1628 std::vector<std::string> run_order; |
1629 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); | 1629 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); |
1630 | 1630 |
1631 scheduler_->DidHandleInputEventOnCompositorThread( | 1631 scheduler_->DidHandleInputEventOnCompositorThread( |
1632 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1632 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1633 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1633 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1634 RunUntilIdle(); | 1634 RunUntilIdle(); |
1635 EXPECT_THAT(run_order, | 1635 EXPECT_THAT(run_order, |
1636 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1636 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1637 std::string("D1"), std::string("D2"))); | 1637 std::string("D1"), std::string("D2"))); |
1638 | 1638 |
1639 run_order.clear(); | 1639 run_order.clear(); |
1640 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); | 1640 clock_->Advance(base::TimeDelta::FromMilliseconds(1000)); |
1641 | 1641 |
1642 // Don't post any compositor tasks to simulate a very long running event | 1642 // Don't post any compositor tasks to simulate a very long running event |
1643 // handler. | 1643 // handler. |
1644 PostTestTasks(&run_order, "D1 D2"); | 1644 PostTestTasks(&run_order, "D1 D2"); |
1645 | 1645 |
1646 // Touchstart policy mode should have ended now that the clock has advanced. | 1646 // Touchstart policy mode should have ended now that the clock has advanced. |
1647 RunUntilIdle(); | 1647 RunUntilIdle(); |
1648 EXPECT_THAT(run_order, | 1648 EXPECT_THAT(run_order, |
1649 testing::ElementsAre(std::string("L1"), std::string("D1"), | 1649 ::testing::ElementsAre(std::string("L1"), std::string("D1"), |
1650 std::string("D2"))); | 1650 std::string("D2"))); |
1651 } | 1651 } |
1652 | 1652 |
1653 TEST_F(RendererSchedulerImplTest, | 1653 TEST_F(RendererSchedulerImplTest, |
1654 TestTouchstartPolicyEndsAfterConsecutiveTouchmoves) { | 1654 TestTouchstartPolicyEndsAfterConsecutiveTouchmoves) { |
1655 std::vector<std::string> run_order; | 1655 std::vector<std::string> run_order; |
1656 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); | 1656 PostTestTasks(&run_order, "L1 D1 C1 D2 C2"); |
1657 | 1657 |
1658 // Observation of touchstart should defer execution of idle and loading tasks. | 1658 // Observation of touchstart should defer execution of idle and loading tasks. |
1659 scheduler_->DidHandleInputEventOnCompositorThread( | 1659 scheduler_->DidHandleInputEventOnCompositorThread( |
1660 FakeInputEvent(blink::WebInputEvent::kTouchStart), | 1660 FakeInputEvent(blink::WebInputEvent::kTouchStart), |
1661 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1661 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1662 RunUntilIdle(); | 1662 RunUntilIdle(); |
1663 EXPECT_THAT(run_order, | 1663 EXPECT_THAT(run_order, |
1664 testing::ElementsAre(std::string("C1"), std::string("C2"), | 1664 ::testing::ElementsAre(std::string("C1"), std::string("C2"), |
1665 std::string("D1"), std::string("D2"))); | 1665 std::string("D1"), std::string("D2"))); |
1666 | 1666 |
1667 // Receiving the first touchmove will not affect scheduler priority. | 1667 // Receiving the first touchmove will not affect scheduler priority. |
1668 run_order.clear(); | 1668 run_order.clear(); |
1669 scheduler_->DidHandleInputEventOnCompositorThread( | 1669 scheduler_->DidHandleInputEventOnCompositorThread( |
1670 FakeInputEvent(blink::WebInputEvent::kTouchMove), | 1670 FakeInputEvent(blink::WebInputEvent::kTouchMove), |
1671 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1671 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1672 RunUntilIdle(); | 1672 RunUntilIdle(); |
1673 EXPECT_THAT(run_order, testing::ElementsAre()); | 1673 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
1674 | 1674 |
1675 // Receiving the second touchmove will kick us back into compositor priority. | 1675 // Receiving the second touchmove will kick us back into compositor priority. |
1676 run_order.clear(); | 1676 run_order.clear(); |
1677 scheduler_->DidHandleInputEventOnCompositorThread( | 1677 scheduler_->DidHandleInputEventOnCompositorThread( |
1678 FakeInputEvent(blink::WebInputEvent::kTouchMove), | 1678 FakeInputEvent(blink::WebInputEvent::kTouchMove), |
1679 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); | 1679 RendererScheduler::InputEventState::EVENT_CONSUMED_BY_COMPOSITOR); |
1680 RunUntilIdle(); | 1680 RunUntilIdle(); |
1681 EXPECT_THAT(run_order, testing::ElementsAre(std::string("L1"))); | 1681 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("L1"))); |
1682 } | 1682 } |
1683 | 1683 |
1684 TEST_F(RendererSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { | 1684 TEST_F(RendererSchedulerImplTest, TestIsHighPriorityWorkAnticipated) { |
1685 bool is_anticipated_before = false; | 1685 bool is_anticipated_before = false; |
1686 bool is_anticipated_after = false; | 1686 bool is_anticipated_after = false; |
1687 | 1687 |
1688 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 1688 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
1689 default_task_runner_->PostTask( | 1689 default_task_runner_->PostTask( |
1690 FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), | 1690 FROM_HERE, base::Bind(&AnticipationTestTask, scheduler_.get(), |
1691 SimulateInputType::kNone, &is_anticipated_before, | 1691 SimulateInputType::kNone, &is_anticipated_before, |
(...skipping 345 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2037 WebInputEventResult::kHandledSystem); | 2037 WebInputEventResult::kHandledSystem); |
2038 | 2038 |
2039 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); | 2039 EXPECT_EQ(2, mock_scheduler_->update_policy_count_); |
2040 | 2040 |
2041 // We expect both the urgent and the delayed updates to run in addition to the | 2041 // We expect both the urgent and the delayed updates to run in addition to the |
2042 // earlier updated cause by IsHighPriorityWorkAnticipated, a final update | 2042 // earlier updated cause by IsHighPriorityWorkAnticipated, a final update |
2043 // transitions from 'not_scrolling touchstart expected' to 'not_scrolling'. | 2043 // transitions from 'not_scrolling touchstart expected' to 'not_scrolling'. |
2044 RunUntilIdle(); | 2044 RunUntilIdle(); |
2045 EXPECT_THAT( | 2045 EXPECT_THAT( |
2046 mock_scheduler_->use_cases_, | 2046 mock_scheduler_->use_cases_, |
2047 testing::ElementsAre( | 2047 ::testing::ElementsAre( |
2048 std::string("none"), std::string("compositor_gesture"), | 2048 std::string("none"), std::string("compositor_gesture"), |
2049 std::string("compositor_gesture touchstart expected"), | 2049 std::string("compositor_gesture touchstart expected"), |
2050 std::string("none touchstart expected"), std::string("none"))); | 2050 std::string("none touchstart expected"), std::string("none"))); |
2051 } | 2051 } |
2052 | 2052 |
2053 class RendererSchedulerImplWithMessageLoopTest | 2053 class RendererSchedulerImplWithMessageLoopTest |
2054 : public RendererSchedulerImplTest { | 2054 : public RendererSchedulerImplTest { |
2055 public: | 2055 public: |
2056 RendererSchedulerImplWithMessageLoopTest() | 2056 RendererSchedulerImplWithMessageLoopTest() |
2057 : RendererSchedulerImplTest(new base::MessageLoop()) {} | 2057 : RendererSchedulerImplTest(new base::MessageLoop()) {} |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2099 default_task_runner_->PostTask( | 2099 default_task_runner_->PostTask( |
2100 FROM_HERE, | 2100 FROM_HERE, |
2101 base::Bind( | 2101 base::Bind( |
2102 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, | 2102 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, |
2103 base::Unretained(this), | 2103 base::Unretained(this), |
2104 base::Unretained(&tasks_to_post_from_nested_loop))); | 2104 base::Unretained(&tasks_to_post_from_nested_loop))); |
2105 | 2105 |
2106 EnableIdleTasks(); | 2106 EnableIdleTasks(); |
2107 RunUntilIdle(); | 2107 RunUntilIdle(); |
2108 // Note we expect task 3 to run last because it's non-nestable. | 2108 // Note we expect task 3 to run last because it's non-nestable. |
2109 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), | 2109 EXPECT_THAT(order, ::testing::ElementsAre(std::string("1"), std::string("2"), |
2110 std::string("4"), std::string("5"), | 2110 std::string("4"), std::string("5"), |
2111 std::string("3"))); | 2111 std::string("3"))); |
2112 } | 2112 } |
2113 | 2113 |
2114 TEST_F(RendererSchedulerImplTest, TestBeginMainFrameNotExpectedUntil) { | 2114 TEST_F(RendererSchedulerImplTest, TestBeginMainFrameNotExpectedUntil) { |
2115 base::TimeDelta ten_millis(base::TimeDelta::FromMilliseconds(10)); | 2115 base::TimeDelta ten_millis(base::TimeDelta::FromMilliseconds(10)); |
2116 base::TimeTicks expected_deadline = clock_->NowTicks() + ten_millis; | 2116 base::TimeTicks expected_deadline = clock_->NowTicks() + ten_millis; |
2117 base::TimeTicks deadline_in_task; | 2117 base::TimeTicks deadline_in_task; |
2118 int run_count = 0; | 2118 int run_count = 0; |
2119 | 2119 |
2120 idle_task_runner_->PostIdleTask( | 2120 idle_task_runner_->PostIdleTask( |
2121 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); | 2121 FROM_HERE, base::Bind(&IdleTestTask, &run_count, &deadline_in_task)); |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2206 idle_task_runner_->PostIdleTask( | 2206 idle_task_runner_->PostIdleTask( |
2207 FROM_HERE, | 2207 FROM_HERE, |
2208 base::Bind(&RepostingUpdateClockIdleTestTask, | 2208 base::Bind(&RepostingUpdateClockIdleTestTask, |
2209 base::RetainedRef(idle_task_runner_), &run_count, clock_.get(), | 2209 base::RetainedRef(idle_task_runner_), &run_count, clock_.get(), |
2210 idle_task_runtime, &actual_deadlines)); | 2210 idle_task_runtime, &actual_deadlines)); |
2211 scheduler_->BeginFrameNotExpectedSoon(); | 2211 scheduler_->BeginFrameNotExpectedSoon(); |
2212 RunUntilIdle(); | 2212 RunUntilIdle(); |
2213 EXPECT_EQ(3, run_count); | 2213 EXPECT_EQ(3, run_count); |
2214 EXPECT_THAT( | 2214 EXPECT_THAT( |
2215 actual_deadlines, | 2215 actual_deadlines, |
2216 testing::ElementsAre( | 2216 ::testing::ElementsAre( |
2217 clock_before + maximum_idle_period_duration(), | 2217 clock_before + maximum_idle_period_duration(), |
2218 clock_before + idle_task_runtime + maximum_idle_period_duration(), | 2218 clock_before + idle_task_runtime + maximum_idle_period_duration(), |
2219 clock_before + (2 * idle_task_runtime) + | 2219 clock_before + (2 * idle_task_runtime) + |
2220 maximum_idle_period_duration())); | 2220 maximum_idle_period_duration())); |
2221 | 2221 |
2222 // Check that idle tasks don't run after the idle period ends with a | 2222 // Check that idle tasks don't run after the idle period ends with a |
2223 // new BeginMainFrame. | 2223 // new BeginMainFrame. |
2224 g_max_idle_task_reposts = 5; | 2224 g_max_idle_task_reposts = 5; |
2225 idle_task_runner_->PostIdleTask( | 2225 idle_task_runner_->PostIdleTask( |
2226 FROM_HERE, | 2226 FROM_HERE, |
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2344 base::TimeDelta::FromMilliseconds(10)); | 2344 base::TimeDelta::FromMilliseconds(10)); |
2345 RunUntilIdle(); | 2345 RunUntilIdle(); |
2346 EXPECT_EQ(2, run_count); | 2346 EXPECT_EQ(2, run_count); |
2347 } | 2347 } |
2348 | 2348 |
2349 TEST_F(RendererSchedulerImplTest, TimerQueueEnabledByDefault) { | 2349 TEST_F(RendererSchedulerImplTest, TimerQueueEnabledByDefault) { |
2350 std::vector<std::string> run_order; | 2350 std::vector<std::string> run_order; |
2351 PostTestTasks(&run_order, "T1 T2"); | 2351 PostTestTasks(&run_order, "T1 T2"); |
2352 RunUntilIdle(); | 2352 RunUntilIdle(); |
2353 EXPECT_THAT(run_order, | 2353 EXPECT_THAT(run_order, |
2354 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 2354 ::testing::ElementsAre(std::string("T1"), std::string("T2"))); |
2355 } | 2355 } |
2356 | 2356 |
2357 TEST_F(RendererSchedulerImplTest, SuspendAndResumeTimerQueue) { | 2357 TEST_F(RendererSchedulerImplTest, SuspendAndResumeTimerQueue) { |
2358 std::vector<std::string> run_order; | 2358 std::vector<std::string> run_order; |
2359 PostTestTasks(&run_order, "T1 T2"); | 2359 PostTestTasks(&run_order, "T1 T2"); |
2360 | 2360 |
2361 scheduler_->SuspendTimerQueue(); | 2361 scheduler_->SuspendTimerQueue(); |
2362 RunUntilIdle(); | 2362 RunUntilIdle(); |
2363 EXPECT_THAT(run_order, testing::ElementsAre()); | 2363 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2364 | 2364 |
2365 scheduler_->ResumeTimerQueue(); | 2365 scheduler_->ResumeTimerQueue(); |
2366 RunUntilIdle(); | 2366 RunUntilIdle(); |
2367 EXPECT_THAT(run_order, | 2367 EXPECT_THAT(run_order, |
2368 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 2368 ::testing::ElementsAre(std::string("T1"), std::string("T2"))); |
2369 } | 2369 } |
2370 | 2370 |
2371 TEST_F(RendererSchedulerImplTest, SuspendAndThrottleTimerQueue) { | 2371 TEST_F(RendererSchedulerImplTest, SuspendAndThrottleTimerQueue) { |
2372 std::vector<std::string> run_order; | 2372 std::vector<std::string> run_order; |
2373 PostTestTasks(&run_order, "T1 T2"); | 2373 PostTestTasks(&run_order, "T1 T2"); |
2374 | 2374 |
2375 scheduler_->SuspendTimerQueue(); | 2375 scheduler_->SuspendTimerQueue(); |
2376 RunUntilIdle(); | 2376 RunUntilIdle(); |
2377 scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( | 2377 scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( |
2378 static_cast<TaskQueue*>(timer_task_runner_.get())); | 2378 static_cast<TaskQueue*>(timer_task_runner_.get())); |
2379 RunUntilIdle(); | 2379 RunUntilIdle(); |
2380 EXPECT_THAT(run_order, testing::ElementsAre()); | 2380 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2381 } | 2381 } |
2382 | 2382 |
2383 TEST_F(RendererSchedulerImplTest, ThrottleAndSuspendTimerQueue) { | 2383 TEST_F(RendererSchedulerImplTest, ThrottleAndSuspendTimerQueue) { |
2384 std::vector<std::string> run_order; | 2384 std::vector<std::string> run_order; |
2385 PostTestTasks(&run_order, "T1 T2"); | 2385 PostTestTasks(&run_order, "T1 T2"); |
2386 | 2386 |
2387 scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( | 2387 scheduler_->task_queue_throttler()->IncreaseThrottleRefCount( |
2388 static_cast<TaskQueue*>(timer_task_runner_.get())); | 2388 static_cast<TaskQueue*>(timer_task_runner_.get())); |
2389 RunUntilIdle(); | 2389 RunUntilIdle(); |
2390 scheduler_->SuspendTimerQueue(); | 2390 scheduler_->SuspendTimerQueue(); |
2391 RunUntilIdle(); | 2391 RunUntilIdle(); |
2392 EXPECT_THAT(run_order, testing::ElementsAre()); | 2392 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2393 } | 2393 } |
2394 | 2394 |
2395 TEST_F(RendererSchedulerImplTest, MultipleSuspendsNeedMultipleResumes) { | 2395 TEST_F(RendererSchedulerImplTest, MultipleSuspendsNeedMultipleResumes) { |
2396 std::vector<std::string> run_order; | 2396 std::vector<std::string> run_order; |
2397 PostTestTasks(&run_order, "T1 T2"); | 2397 PostTestTasks(&run_order, "T1 T2"); |
2398 | 2398 |
2399 scheduler_->SuspendTimerQueue(); | 2399 scheduler_->SuspendTimerQueue(); |
2400 scheduler_->SuspendTimerQueue(); | 2400 scheduler_->SuspendTimerQueue(); |
2401 scheduler_->SuspendTimerQueue(); | 2401 scheduler_->SuspendTimerQueue(); |
2402 RunUntilIdle(); | 2402 RunUntilIdle(); |
2403 EXPECT_THAT(run_order, testing::ElementsAre()); | 2403 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2404 | 2404 |
2405 scheduler_->ResumeTimerQueue(); | 2405 scheduler_->ResumeTimerQueue(); |
2406 RunUntilIdle(); | 2406 RunUntilIdle(); |
2407 EXPECT_THAT(run_order, testing::ElementsAre()); | 2407 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2408 | 2408 |
2409 scheduler_->ResumeTimerQueue(); | 2409 scheduler_->ResumeTimerQueue(); |
2410 RunUntilIdle(); | 2410 RunUntilIdle(); |
2411 EXPECT_THAT(run_order, testing::ElementsAre()); | 2411 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2412 | 2412 |
2413 scheduler_->ResumeTimerQueue(); | 2413 scheduler_->ResumeTimerQueue(); |
2414 RunUntilIdle(); | 2414 RunUntilIdle(); |
2415 EXPECT_THAT(run_order, | 2415 EXPECT_THAT(run_order, |
2416 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 2416 ::testing::ElementsAre(std::string("T1"), std::string("T2"))); |
2417 } | 2417 } |
2418 | 2418 |
2419 TEST_F(RendererSchedulerImplTest, SuspendRenderer) { | 2419 TEST_F(RendererSchedulerImplTest, SuspendRenderer) { |
2420 // Assume that the renderer is backgrounded. | 2420 // Assume that the renderer is backgrounded. |
2421 scheduler_->SetRendererBackgrounded(true); | 2421 scheduler_->SetRendererBackgrounded(true); |
2422 | 2422 |
2423 // Tasks in some queues don't fire when the renderer is suspended. | 2423 // Tasks in some queues don't fire when the renderer is suspended. |
2424 std::vector<std::string> run_order; | 2424 std::vector<std::string> run_order; |
2425 PostTestTasks(&run_order, "D1 C1 L1 I1 T1"); | 2425 PostTestTasks(&run_order, "D1 C1 L1 I1 T1"); |
2426 scheduler_->SuspendRenderer(); | 2426 scheduler_->SuspendRenderer(); |
2427 EnableIdleTasks(); | 2427 EnableIdleTasks(); |
2428 RunUntilIdle(); | 2428 RunUntilIdle(); |
2429 EXPECT_THAT(run_order, | 2429 EXPECT_THAT(run_order, |
2430 testing::ElementsAre(std::string("C1"), std::string("D1"), | 2430 ::testing::ElementsAre(std::string("C1"), std::string("D1"), |
2431 std::string("I1"))); | 2431 std::string("I1"))); |
2432 | 2432 |
2433 // The rest queued tasks fire when the tab goes foregrounded. | 2433 // The rest queued tasks fire when the tab goes foregrounded. |
2434 run_order.clear(); | 2434 run_order.clear(); |
2435 scheduler_->SetRendererBackgrounded(false); | 2435 scheduler_->SetRendererBackgrounded(false); |
2436 RunUntilIdle(); | 2436 RunUntilIdle(); |
2437 EXPECT_THAT(run_order, | 2437 EXPECT_THAT(run_order, |
2438 testing::ElementsAre(std::string("L1"), std::string("T1"))); | 2438 ::testing::ElementsAre(std::string("L1"), std::string("T1"))); |
2439 | 2439 |
2440 run_order.clear(); | 2440 run_order.clear(); |
2441 PostTestTasks(&run_order, "D2 T2"); | 2441 PostTestTasks(&run_order, "D2 T2"); |
2442 // The renderer is foregrounded. Suspending doesn't take effect. | 2442 // The renderer is foregrounded. Suspending doesn't take effect. |
2443 scheduler_->SuspendRenderer(); | 2443 scheduler_->SuspendRenderer(); |
2444 RunUntilIdle(); | 2444 RunUntilIdle(); |
2445 EXPECT_THAT(run_order, | 2445 EXPECT_THAT(run_order, |
2446 testing::ElementsAre(std::string("D2"), std::string("T2"))); | 2446 ::testing::ElementsAre(std::string("D2"), std::string("T2"))); |
2447 } | 2447 } |
2448 | 2448 |
2449 TEST_F(RendererSchedulerImplTest, ResumeRenderer) { | 2449 TEST_F(RendererSchedulerImplTest, ResumeRenderer) { |
2450 ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); | 2450 ScopedAutoAdvanceNowEnabler enable_auto_advance_now(mock_task_runner_); |
2451 | 2451 |
2452 // Assume that the renderer is backgrounded. | 2452 // Assume that the renderer is backgrounded. |
2453 scheduler_->SetRendererBackgrounded(true); | 2453 scheduler_->SetRendererBackgrounded(true); |
2454 | 2454 |
2455 // Tasks in some queues don't fire when the renderer is suspended. | 2455 // Tasks in some queues don't fire when the renderer is suspended. |
2456 std::vector<std::string> run_order; | 2456 std::vector<std::string> run_order; |
2457 PostTestTasks(&run_order, "D1 C1 L1 I1 T1"); | 2457 PostTestTasks(&run_order, "D1 C1 L1 I1 T1"); |
2458 scheduler_->SuspendRenderer(); | 2458 scheduler_->SuspendRenderer(); |
2459 EnableIdleTasks(); | 2459 EnableIdleTasks(); |
2460 RunUntilIdle(); | 2460 RunUntilIdle(); |
2461 EXPECT_THAT(run_order, | 2461 EXPECT_THAT(run_order, |
2462 testing::ElementsAre(std::string("C1"), std::string("D1"), | 2462 ::testing::ElementsAre(std::string("C1"), std::string("D1"), |
2463 std::string("I1"))); | 2463 std::string("I1"))); |
2464 | 2464 |
2465 // The rest queued tasks fire when the renderer is resumed. | 2465 // The rest queued tasks fire when the renderer is resumed. |
2466 run_order.clear(); | 2466 run_order.clear(); |
2467 scheduler_->ResumeRenderer(); | 2467 scheduler_->ResumeRenderer(); |
2468 RunUntilIdle(); | 2468 RunUntilIdle(); |
2469 EXPECT_THAT(run_order, | 2469 EXPECT_THAT(run_order, |
2470 testing::ElementsAre(std::string("L1"), std::string("T1"))); | 2470 ::testing::ElementsAre(std::string("L1"), std::string("T1"))); |
2471 | 2471 |
2472 run_order.clear(); | 2472 run_order.clear(); |
2473 // No crash occurs when the renderer is suspended again, and | 2473 // No crash occurs when the renderer is suspended again, and |
2474 // tasks in some queues don't fire because of suspended. | 2474 // tasks in some queues don't fire because of suspended. |
2475 PostTestTasks(&run_order, "D2 C2 L2 I2 T2"); | 2475 PostTestTasks(&run_order, "D2 C2 L2 I2 T2"); |
2476 scheduler_->SuspendRenderer(); | 2476 scheduler_->SuspendRenderer(); |
2477 EnableIdleTasks(); | 2477 EnableIdleTasks(); |
2478 RunUntilIdle(); | 2478 RunUntilIdle(); |
2479 EXPECT_THAT(run_order, | 2479 EXPECT_THAT(run_order, |
2480 testing::ElementsAre(std::string("C2"), std::string("D2"), | 2480 ::testing::ElementsAre(std::string("C2"), std::string("D2"), |
2481 std::string("I2"))); | 2481 std::string("I2"))); |
2482 | 2482 |
2483 // The rest queued tasks fire when the renderer is resumed. | 2483 // The rest queued tasks fire when the renderer is resumed. |
2484 run_order.clear(); | 2484 run_order.clear(); |
2485 scheduler_->ResumeRenderer(); | 2485 scheduler_->ResumeRenderer(); |
2486 RunUntilIdle(); | 2486 RunUntilIdle(); |
2487 EXPECT_THAT(run_order, | 2487 EXPECT_THAT(run_order, |
2488 testing::ElementsAre(std::string("L2"), std::string("T2"))); | 2488 ::testing::ElementsAre(std::string("L2"), std::string("T2"))); |
2489 | 2489 |
2490 run_order.clear(); | 2490 run_order.clear(); |
2491 PostTestTasks(&run_order, "D3 T3"); | 2491 PostTestTasks(&run_order, "D3 T3"); |
2492 // No crash occurs when the resumed renderer goes foregrounded. | 2492 // No crash occurs when the resumed renderer goes foregrounded. |
2493 // Posted tasks while the renderer is resumed fire. | 2493 // Posted tasks while the renderer is resumed fire. |
2494 scheduler_->SetRendererBackgrounded(false); | 2494 scheduler_->SetRendererBackgrounded(false); |
2495 RunUntilIdle(); | 2495 RunUntilIdle(); |
2496 EXPECT_THAT(run_order, | 2496 EXPECT_THAT(run_order, |
2497 testing::ElementsAre(std::string("D3"), std::string("T3"))); | 2497 ::testing::ElementsAre(std::string("D3"), std::string("T3"))); |
2498 | 2498 |
2499 run_order.clear(); | 2499 run_order.clear(); |
2500 PostTestTasks(&run_order, "D4 T4"); | 2500 PostTestTasks(&run_order, "D4 T4"); |
2501 // The renderer is foregrounded. Resuming doesn't take effect. | 2501 // The renderer is foregrounded. Resuming doesn't take effect. |
2502 scheduler_->ResumeRenderer(); | 2502 scheduler_->ResumeRenderer(); |
2503 RunUntilIdle(); | 2503 RunUntilIdle(); |
2504 EXPECT_THAT(run_order, | 2504 EXPECT_THAT(run_order, |
2505 testing::ElementsAre(std::string("D4"), std::string("T4"))); | 2505 ::testing::ElementsAre(std::string("D4"), std::string("T4"))); |
2506 } | 2506 } |
2507 | 2507 |
2508 TEST_F(RendererSchedulerImplTest, UseCaseToString) { | 2508 TEST_F(RendererSchedulerImplTest, UseCaseToString) { |
2509 CheckAllUseCaseToString(); | 2509 CheckAllUseCaseToString(); |
2510 } | 2510 } |
2511 | 2511 |
2512 TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { | 2512 TEST_F(RendererSchedulerImplTest, MismatchedDidHandleInputEventOnMainThread) { |
2513 // This should not DCHECK because there was no corresponding compositor side | 2513 // This should not DCHECK because there was no corresponding compositor side |
2514 // call to DidHandleInputEventOnCompositorThread with | 2514 // call to DidHandleInputEventOnCompositorThread with |
2515 // INPUT_EVENT_ACK_STATE_NOT_CONSUMED. There are legitimate reasons for the | 2515 // INPUT_EVENT_ACK_STATE_NOT_CONSUMED. There are legitimate reasons for the |
(...skipping 16 matching lines...) Expand all Loading... |
2532 begin_frame_args.on_critical_path = false; | 2532 begin_frame_args.on_critical_path = false; |
2533 scheduler_->WillBeginFrame(begin_frame_args); | 2533 scheduler_->WillBeginFrame(begin_frame_args); |
2534 ASSERT_FALSE(scheduler_->BeginMainFrameOnCriticalPath()); | 2534 ASSERT_FALSE(scheduler_->BeginMainFrameOnCriticalPath()); |
2535 } | 2535 } |
2536 | 2536 |
2537 TEST_F(RendererSchedulerImplTest, ShutdownPreventsPostingOfNewTasks) { | 2537 TEST_F(RendererSchedulerImplTest, ShutdownPreventsPostingOfNewTasks) { |
2538 scheduler_->Shutdown(); | 2538 scheduler_->Shutdown(); |
2539 std::vector<std::string> run_order; | 2539 std::vector<std::string> run_order; |
2540 PostTestTasks(&run_order, "D1 C1"); | 2540 PostTestTasks(&run_order, "D1 C1"); |
2541 RunUntilIdle(); | 2541 RunUntilIdle(); |
2542 EXPECT_THAT(run_order, testing::ElementsAre()); | 2542 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2543 } | 2543 } |
2544 | 2544 |
2545 TEST_F(RendererSchedulerImplTest, TestRendererBackgroundedTimerSuspension) { | 2545 TEST_F(RendererSchedulerImplTest, TestRendererBackgroundedTimerSuspension) { |
2546 scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled(true); | 2546 scheduler_->SetTimerQueueSuspensionWhenBackgroundedEnabled(true); |
2547 | 2547 |
2548 std::vector<std::string> run_order; | 2548 std::vector<std::string> run_order; |
2549 PostTestTasks(&run_order, "T1 T2"); | 2549 PostTestTasks(&run_order, "T1 T2"); |
2550 | 2550 |
2551 base::TimeTicks now; | 2551 base::TimeTicks now; |
2552 | 2552 |
2553 // The background signal will not immediately suspend the timer queue. | 2553 // The background signal will not immediately suspend the timer queue. |
2554 scheduler_->SetRendererBackgrounded(true); | 2554 scheduler_->SetRendererBackgrounded(true); |
2555 now += base::TimeDelta::FromMilliseconds(1100); | 2555 now += base::TimeDelta::FromMilliseconds(1100); |
2556 clock_->SetNowTicks(now); | 2556 clock_->SetNowTicks(now); |
2557 RunUntilIdle(); | 2557 RunUntilIdle(); |
2558 EXPECT_THAT(run_order, | 2558 EXPECT_THAT(run_order, |
2559 testing::ElementsAre(std::string("T1"), std::string("T2"))); | 2559 ::testing::ElementsAre(std::string("T1"), std::string("T2"))); |
2560 | 2560 |
2561 run_order.clear(); | 2561 run_order.clear(); |
2562 PostTestTasks(&run_order, "T3"); | 2562 PostTestTasks(&run_order, "T3"); |
2563 | 2563 |
2564 now += base::TimeDelta::FromSeconds(1); | 2564 now += base::TimeDelta::FromSeconds(1); |
2565 clock_->SetNowTicks(now); | 2565 clock_->SetNowTicks(now); |
2566 RunUntilIdle(); | 2566 RunUntilIdle(); |
2567 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T3"))); | 2567 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("T3"))); |
2568 | 2568 |
2569 // Advance the time until after the scheduled timer queue suspension. | 2569 // Advance the time until after the scheduled timer queue suspension. |
2570 now = base::TimeTicks() + suspend_timers_when_backgrounded_delay() + | 2570 now = base::TimeTicks() + suspend_timers_when_backgrounded_delay() + |
2571 base::TimeDelta::FromMilliseconds(10); | 2571 base::TimeDelta::FromMilliseconds(10); |
2572 run_order.clear(); | 2572 run_order.clear(); |
2573 clock_->SetNowTicks(now); | 2573 clock_->SetNowTicks(now); |
2574 RunUntilIdle(); | 2574 RunUntilIdle(); |
2575 ASSERT_TRUE(run_order.empty()); | 2575 ASSERT_TRUE(run_order.empty()); |
2576 | 2576 |
2577 // Timer tasks should be suspended until the foregrounded signal. | 2577 // Timer tasks should be suspended until the foregrounded signal. |
2578 PostTestTasks(&run_order, "T4 T5"); | 2578 PostTestTasks(&run_order, "T4 T5"); |
2579 now += base::TimeDelta::FromSeconds(10); | 2579 now += base::TimeDelta::FromSeconds(10); |
2580 clock_->SetNowTicks(now); | 2580 clock_->SetNowTicks(now); |
2581 RunUntilIdle(); | 2581 RunUntilIdle(); |
2582 EXPECT_THAT(run_order, testing::ElementsAre()); | 2582 EXPECT_THAT(run_order, ::testing::ElementsAre()); |
2583 | 2583 |
2584 scheduler_->SetRendererBackgrounded(false); | 2584 scheduler_->SetRendererBackgrounded(false); |
2585 RunUntilIdle(); | 2585 RunUntilIdle(); |
2586 EXPECT_THAT(run_order, | 2586 EXPECT_THAT(run_order, |
2587 testing::ElementsAre(std::string("T4"), std::string("T5"))); | 2587 ::testing::ElementsAre(std::string("T4"), std::string("T5"))); |
2588 | 2588 |
2589 // Subsequent timer tasks should fire as usual. | 2589 // Subsequent timer tasks should fire as usual. |
2590 run_order.clear(); | 2590 run_order.clear(); |
2591 PostTestTasks(&run_order, "T6"); | 2591 PostTestTasks(&run_order, "T6"); |
2592 RunUntilIdle(); | 2592 RunUntilIdle(); |
2593 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6"))); | 2593 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("T6"))); |
2594 } | 2594 } |
2595 | 2595 |
2596 TEST_F(RendererSchedulerImplTest, | 2596 TEST_F(RendererSchedulerImplTest, |
2597 ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame) { | 2597 ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame) { |
2598 std::vector<std::string> run_order; | 2598 std::vector<std::string> run_order; |
2599 | 2599 |
2600 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2600 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2601 SimulateExpensiveTasks(loading_task_runner_); | 2601 SimulateExpensiveTasks(loading_task_runner_); |
2602 ForceTouchStartToBeExpectedSoon(); | 2602 ForceTouchStartToBeExpectedSoon(); |
2603 PostTestTasks(&run_order, "L1 D1"); | 2603 PostTestTasks(&run_order, "L1 D1"); |
2604 RunUntilIdle(); | 2604 RunUntilIdle(); |
2605 | 2605 |
2606 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2606 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2607 EXPECT_FALSE(HaveSeenABeginMainframe()); | 2607 EXPECT_FALSE(HaveSeenABeginMainframe()); |
2608 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2608 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2609 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2609 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2610 EXPECT_TRUE(TouchStartExpectedSoon()); | 2610 EXPECT_TRUE(TouchStartExpectedSoon()); |
2611 EXPECT_THAT(run_order, | 2611 EXPECT_THAT(run_order, |
2612 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2612 ::testing::ElementsAre(std::string("L1"), std::string("D1"))); |
2613 | 2613 |
2614 // Emit a BeginMainFrame, and the loading task should get blocked. | 2614 // Emit a BeginMainFrame, and the loading task should get blocked. |
2615 DoMainFrame(); | 2615 DoMainFrame(); |
2616 run_order.clear(); | 2616 run_order.clear(); |
2617 | 2617 |
2618 PostTestTasks(&run_order, "L1 D1"); | 2618 PostTestTasks(&run_order, "L1 D1"); |
2619 RunUntilIdle(); | 2619 RunUntilIdle(); |
2620 | 2620 |
2621 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 2621 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
2622 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2622 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2623 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2623 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2624 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2624 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2625 EXPECT_TRUE(TouchStartExpectedSoon()); | 2625 EXPECT_TRUE(TouchStartExpectedSoon()); |
2626 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2626 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2627 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2627 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2628 } | 2628 } |
2629 | 2629 |
2630 TEST_F(RendererSchedulerImplTest, | 2630 TEST_F(RendererSchedulerImplTest, |
2631 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { | 2631 ExpensiveLoadingTasksNotBlockedIfNoTouchHandler) { |
2632 std::vector<std::string> run_order; | 2632 std::vector<std::string> run_order; |
2633 | 2633 |
2634 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); | 2634 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(false); |
2635 DoMainFrame(); | 2635 DoMainFrame(); |
2636 SimulateExpensiveTasks(loading_task_runner_); | 2636 SimulateExpensiveTasks(loading_task_runner_); |
2637 ForceTouchStartToBeExpectedSoon(); | 2637 ForceTouchStartToBeExpectedSoon(); |
2638 PostTestTasks(&run_order, "L1 D1"); | 2638 PostTestTasks(&run_order, "L1 D1"); |
2639 RunUntilIdle(); | 2639 RunUntilIdle(); |
2640 | 2640 |
2641 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2641 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2642 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2642 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2643 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2643 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2644 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2644 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2645 EXPECT_FALSE(TouchStartExpectedSoon()); | 2645 EXPECT_FALSE(TouchStartExpectedSoon()); |
2646 EXPECT_THAT(run_order, | 2646 EXPECT_THAT(run_order, |
2647 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2647 ::testing::ElementsAre(std::string("L1"), std::string("D1"))); |
2648 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); | 2648 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); |
2649 } | 2649 } |
2650 | 2650 |
2651 TEST_F(RendererSchedulerImplTest, | 2651 TEST_F(RendererSchedulerImplTest, |
2652 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { | 2652 ExpensiveTimerTaskBlocked_UseCase_NONE_PreviousCompositorGesture) { |
2653 std::vector<std::string> run_order; | 2653 std::vector<std::string> run_order; |
2654 | 2654 |
2655 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2655 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2656 DoMainFrame(); | 2656 DoMainFrame(); |
2657 SimulateExpensiveTasks(timer_task_runner_); | 2657 SimulateExpensiveTasks(timer_task_runner_); |
2658 ForceTouchStartToBeExpectedSoon(); | 2658 ForceTouchStartToBeExpectedSoon(); |
2659 | 2659 |
2660 PostTestTasks(&run_order, "T1 D1"); | 2660 PostTestTasks(&run_order, "T1 D1"); |
2661 RunUntilIdle(); | 2661 RunUntilIdle(); |
2662 | 2662 |
2663 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2663 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2664 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2664 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2665 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2665 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
2666 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2666 EXPECT_TRUE(TimerTasksSeemExpensive()); |
2667 EXPECT_TRUE(TouchStartExpectedSoon()); | 2667 EXPECT_TRUE(TouchStartExpectedSoon()); |
2668 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2668 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2669 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2669 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2670 } | 2670 } |
2671 | 2671 |
2672 TEST_F(RendererSchedulerImplTest, | 2672 TEST_F(RendererSchedulerImplTest, |
2673 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { | 2673 ExpensiveTimerTaskNotBlocked_UseCase_NONE_PreviousMainThreadGesture) { |
2674 std::vector<std::string> run_order; | 2674 std::vector<std::string> run_order; |
2675 | 2675 |
2676 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2676 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2677 DoMainFrame(); | 2677 DoMainFrame(); |
2678 SimulateExpensiveTasks(timer_task_runner_); | 2678 SimulateExpensiveTasks(timer_task_runner_); |
(...skipping 15 matching lines...) Expand all Loading... |
2694 | 2694 |
2695 PostTestTasks(&run_order, "T1 D1"); | 2695 PostTestTasks(&run_order, "T1 D1"); |
2696 RunUntilIdle(); | 2696 RunUntilIdle(); |
2697 | 2697 |
2698 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2698 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2699 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2699 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2700 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2700 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
2701 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2701 EXPECT_TRUE(TimerTasksSeemExpensive()); |
2702 EXPECT_TRUE(TouchStartExpectedSoon()); | 2702 EXPECT_TRUE(TouchStartExpectedSoon()); |
2703 EXPECT_THAT(run_order, | 2703 EXPECT_THAT(run_order, |
2704 testing::ElementsAre(std::string("T1"), std::string("D1"))); | 2704 ::testing::ElementsAre(std::string("T1"), std::string("D1"))); |
2705 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); | 2705 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); |
2706 } | 2706 } |
2707 | 2707 |
2708 TEST_F(RendererSchedulerImplTest, | 2708 TEST_F(RendererSchedulerImplTest, |
2709 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { | 2709 ExpensiveTimerTaskBlocked_UseCase_COMPOSITOR_GESTURE) { |
2710 std::vector<std::string> run_order; | 2710 std::vector<std::string> run_order; |
2711 | 2711 |
2712 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2712 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2713 DoMainFrame(); | 2713 DoMainFrame(); |
2714 SimulateExpensiveTasks(timer_task_runner_); | 2714 SimulateExpensiveTasks(timer_task_runner_); |
2715 ForceTouchStartToBeExpectedSoon(); | 2715 ForceTouchStartToBeExpectedSoon(); |
2716 scheduler_->DidAnimateForInputOnCompositorThread(); | 2716 scheduler_->DidAnimateForInputOnCompositorThread(); |
2717 | 2717 |
2718 PostTestTasks(&run_order, "T1 D1"); | 2718 PostTestTasks(&run_order, "T1 D1"); |
2719 RunUntilIdle(); | 2719 RunUntilIdle(); |
2720 | 2720 |
2721 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, | 2721 EXPECT_EQ(UseCase::COMPOSITOR_GESTURE, |
2722 ForceUpdatePolicyAndGetCurrentUseCase()); | 2722 ForceUpdatePolicyAndGetCurrentUseCase()); |
2723 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2723 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2724 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2724 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
2725 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2725 EXPECT_TRUE(TimerTasksSeemExpensive()); |
2726 EXPECT_TRUE(TouchStartExpectedSoon()); | 2726 EXPECT_TRUE(TouchStartExpectedSoon()); |
2727 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2727 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2728 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2728 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2729 } | 2729 } |
2730 | 2730 |
2731 TEST_F(RendererSchedulerImplTest, | 2731 TEST_F(RendererSchedulerImplTest, |
2732 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { | 2732 ExpensiveTimerTaskBlocked_EvenIfBeginMainFrameNotExpectedSoon) { |
2733 std::vector<std::string> run_order; | 2733 std::vector<std::string> run_order; |
2734 | 2734 |
2735 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2735 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2736 DoMainFrame(); | 2736 DoMainFrame(); |
2737 SimulateExpensiveTasks(timer_task_runner_); | 2737 SimulateExpensiveTasks(timer_task_runner_); |
2738 ForceTouchStartToBeExpectedSoon(); | 2738 ForceTouchStartToBeExpectedSoon(); |
2739 scheduler_->BeginFrameNotExpectedSoon(); | 2739 scheduler_->BeginFrameNotExpectedSoon(); |
2740 | 2740 |
2741 PostTestTasks(&run_order, "T1 D1"); | 2741 PostTestTasks(&run_order, "T1 D1"); |
2742 RunUntilIdle(); | 2742 RunUntilIdle(); |
2743 | 2743 |
2744 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2744 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2745 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2745 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2746 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2746 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
2747 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2747 EXPECT_TRUE(TimerTasksSeemExpensive()); |
2748 EXPECT_TRUE(TouchStartExpectedSoon()); | 2748 EXPECT_TRUE(TouchStartExpectedSoon()); |
2749 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2749 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2750 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2750 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2751 } | 2751 } |
2752 | 2752 |
2753 TEST_F(RendererSchedulerImplTest, | 2753 TEST_F(RendererSchedulerImplTest, |
2754 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { | 2754 ExpensiveLoadingTasksBlockedIfChildFrameNavigationExpected) { |
2755 std::vector<std::string> run_order; | 2755 std::vector<std::string> run_order; |
2756 | 2756 |
2757 DoMainFrame(); | 2757 DoMainFrame(); |
2758 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2758 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2759 SimulateExpensiveTasks(loading_task_runner_); | 2759 SimulateExpensiveTasks(loading_task_runner_); |
2760 ForceTouchStartToBeExpectedSoon(); | 2760 ForceTouchStartToBeExpectedSoon(); |
2761 scheduler_->AddPendingNavigation( | 2761 scheduler_->AddPendingNavigation( |
2762 scheduler::RendererScheduler::NavigatingFrameType::kChildFrame); | 2762 scheduler::RendererScheduler::NavigatingFrameType::kChildFrame); |
2763 | 2763 |
2764 PostTestTasks(&run_order, "L1 D1"); | 2764 PostTestTasks(&run_order, "L1 D1"); |
2765 RunUntilIdle(); | 2765 RunUntilIdle(); |
2766 | 2766 |
2767 // The expensive loading task gets blocked. | 2767 // The expensive loading task gets blocked. |
2768 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2768 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2769 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2769 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2770 } | 2770 } |
2771 | 2771 |
2772 TEST_F(RendererSchedulerImplTest, | 2772 TEST_F(RendererSchedulerImplTest, |
2773 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { | 2773 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected) { |
2774 std::vector<std::string> run_order; | 2774 std::vector<std::string> run_order; |
2775 | 2775 |
2776 DoMainFrame(); | 2776 DoMainFrame(); |
2777 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2777 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2778 SimulateExpensiveTasks(loading_task_runner_); | 2778 SimulateExpensiveTasks(loading_task_runner_); |
2779 ForceTouchStartToBeExpectedSoon(); | 2779 ForceTouchStartToBeExpectedSoon(); |
2780 scheduler_->AddPendingNavigation( | 2780 scheduler_->AddPendingNavigation( |
2781 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2781 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2782 | 2782 |
2783 PostTestTasks(&run_order, "L1 D1"); | 2783 PostTestTasks(&run_order, "L1 D1"); |
2784 RunUntilIdle(); | 2784 RunUntilIdle(); |
2785 | 2785 |
2786 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2786 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2787 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2787 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2788 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2788 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2789 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2789 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2790 EXPECT_TRUE(TouchStartExpectedSoon()); | 2790 EXPECT_TRUE(TouchStartExpectedSoon()); |
2791 EXPECT_EQ(1, NavigationTaskExpectedCount()); | 2791 EXPECT_EQ(1, NavigationTaskExpectedCount()); |
2792 EXPECT_THAT(run_order, | 2792 EXPECT_THAT(run_order, |
2793 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2793 ::testing::ElementsAre(std::string("L1"), std::string("D1"))); |
2794 | 2794 |
2795 // After the nagigation has been cancelled, the expensive loading tasks should | 2795 // After the nagigation has been cancelled, the expensive loading tasks should |
2796 // get blocked. | 2796 // get blocked. |
2797 scheduler_->RemovePendingNavigation( | 2797 scheduler_->RemovePendingNavigation( |
2798 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2798 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2799 run_order.clear(); | 2799 run_order.clear(); |
2800 | 2800 |
2801 PostTestTasks(&run_order, "L1 D1"); | 2801 PostTestTasks(&run_order, "L1 D1"); |
2802 RunUntilIdle(); | 2802 RunUntilIdle(); |
2803 | 2803 |
2804 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 2804 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
2805 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2805 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2806 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2806 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2807 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2807 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2808 EXPECT_TRUE(TouchStartExpectedSoon()); | 2808 EXPECT_TRUE(TouchStartExpectedSoon()); |
2809 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2809 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
2810 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2810 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2811 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2811 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2812 } | 2812 } |
2813 | 2813 |
2814 TEST_F(RendererSchedulerImplTest, | 2814 TEST_F(RendererSchedulerImplTest, |
2815 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { | 2815 ExpensiveLoadingTasksNotBlockedIfMainFrameNavigationExpected_Multiple) { |
2816 std::vector<std::string> run_order; | 2816 std::vector<std::string> run_order; |
2817 | 2817 |
2818 DoMainFrame(); | 2818 DoMainFrame(); |
2819 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2819 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2820 SimulateExpensiveTasks(loading_task_runner_); | 2820 SimulateExpensiveTasks(loading_task_runner_); |
2821 ForceTouchStartToBeExpectedSoon(); | 2821 ForceTouchStartToBeExpectedSoon(); |
2822 scheduler_->AddPendingNavigation( | 2822 scheduler_->AddPendingNavigation( |
2823 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2823 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2824 scheduler_->AddPendingNavigation( | 2824 scheduler_->AddPendingNavigation( |
2825 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2825 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2826 | 2826 |
2827 PostTestTasks(&run_order, "L1 D1"); | 2827 PostTestTasks(&run_order, "L1 D1"); |
2828 RunUntilIdle(); | 2828 RunUntilIdle(); |
2829 | 2829 |
2830 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2830 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2831 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2831 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2832 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2832 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2833 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2833 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2834 EXPECT_TRUE(TouchStartExpectedSoon()); | 2834 EXPECT_TRUE(TouchStartExpectedSoon()); |
2835 EXPECT_EQ(2, NavigationTaskExpectedCount()); | 2835 EXPECT_EQ(2, NavigationTaskExpectedCount()); |
2836 EXPECT_THAT(run_order, | 2836 EXPECT_THAT(run_order, |
2837 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2837 ::testing::ElementsAre(std::string("L1"), std::string("D1"))); |
2838 | 2838 |
2839 run_order.clear(); | 2839 run_order.clear(); |
2840 scheduler_->RemovePendingNavigation( | 2840 scheduler_->RemovePendingNavigation( |
2841 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2841 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2842 // Navigation task expected ref count non-zero so expensive tasks still not | 2842 // Navigation task expected ref count non-zero so expensive tasks still not |
2843 // blocked. | 2843 // blocked. |
2844 PostTestTasks(&run_order, "L1 D1"); | 2844 PostTestTasks(&run_order, "L1 D1"); |
2845 RunUntilIdle(); | 2845 RunUntilIdle(); |
2846 | 2846 |
2847 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2847 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
2848 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2848 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2849 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2849 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2850 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2850 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2851 EXPECT_TRUE(TouchStartExpectedSoon()); | 2851 EXPECT_TRUE(TouchStartExpectedSoon()); |
2852 EXPECT_EQ(1, NavigationTaskExpectedCount()); | 2852 EXPECT_EQ(1, NavigationTaskExpectedCount()); |
2853 EXPECT_THAT(run_order, | 2853 EXPECT_THAT(run_order, |
2854 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2854 ::testing::ElementsAre(std::string("L1"), std::string("D1"))); |
2855 | 2855 |
2856 run_order.clear(); | 2856 run_order.clear(); |
2857 scheduler_->RemovePendingNavigation( | 2857 scheduler_->RemovePendingNavigation( |
2858 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); | 2858 scheduler::RendererScheduler::NavigatingFrameType::kMainFrame); |
2859 // Navigation task expected ref count is now zero, the expensive loading tasks | 2859 // Navigation task expected ref count is now zero, the expensive loading tasks |
2860 // should get blocked. | 2860 // should get blocked. |
2861 PostTestTasks(&run_order, "L1 D1"); | 2861 PostTestTasks(&run_order, "L1 D1"); |
2862 RunUntilIdle(); | 2862 RunUntilIdle(); |
2863 | 2863 |
2864 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); | 2864 EXPECT_EQ(RendererSchedulerImpl::UseCase::NONE, CurrentUseCase()); |
2865 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2865 EXPECT_TRUE(HaveSeenABeginMainframe()); |
2866 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2866 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2867 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2867 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2868 EXPECT_TRUE(TouchStartExpectedSoon()); | 2868 EXPECT_TRUE(TouchStartExpectedSoon()); |
2869 EXPECT_EQ(0, NavigationTaskExpectedCount()); | 2869 EXPECT_EQ(0, NavigationTaskExpectedCount()); |
2870 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2870 EXPECT_THAT(run_order, ::testing::ElementsAre(std::string("D1"))); |
2871 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); | 2871 EXPECT_EQ(v8::PERFORMANCE_RESPONSE, GetRAILMode()); |
2872 } | 2872 } |
2873 | 2873 |
2874 TEST_F(RendererSchedulerImplTest, | 2874 TEST_F(RendererSchedulerImplTest, |
2875 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { | 2875 ExpensiveLoadingTasksNotBlockedDuringMainThreadGestures) { |
2876 std::vector<std::string> run_order; | 2876 std::vector<std::string> run_order; |
2877 | 2877 |
2878 SimulateExpensiveTasks(loading_task_runner_); | 2878 SimulateExpensiveTasks(loading_task_runner_); |
2879 | 2879 |
2880 // Loading tasks should not be disabled during main thread user interactions. | 2880 // Loading tasks should not be disabled during main thread user interactions. |
2881 PostTestTasks(&run_order, "C1 L1"); | 2881 PostTestTasks(&run_order, "C1 L1"); |
2882 | 2882 |
2883 // Trigger main_thread_gesture UseCase | 2883 // Trigger main_thread_gesture UseCase |
2884 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2884 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
2885 blink::WebInputEvent::kGestureScrollBegin); | 2885 blink::WebInputEvent::kGestureScrollBegin); |
2886 RunUntilIdle(); | 2886 RunUntilIdle(); |
2887 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, | 2887 EXPECT_EQ(RendererSchedulerImpl::UseCase::MAIN_THREAD_CUSTOM_INPUT_HANDLING, |
2888 CurrentUseCase()); | 2888 CurrentUseCase()); |
2889 | 2889 |
2890 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2890 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
2891 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2891 EXPECT_FALSE(TimerTasksSeemExpensive()); |
2892 EXPECT_THAT(run_order, | 2892 EXPECT_THAT(run_order, |
2893 testing::ElementsAre(std::string("C1"), std::string("L1"))); | 2893 ::testing::ElementsAre(std::string("C1"), std::string("L1"))); |
2894 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); | 2894 EXPECT_EQ(v8::PERFORMANCE_ANIMATION, GetRAILMode()); |
2895 } | 2895 } |
2896 | 2896 |
2897 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { | 2897 TEST_F(RendererSchedulerImplTest, ModeratelyExpensiveTimer_NotBlocked) { |
2898 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2898 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
2899 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2899 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
2900 blink::WebInputEvent::kTouchMove); | 2900 blink::WebInputEvent::kTouchMove); |
2901 RunUntilIdle(); | 2901 RunUntilIdle(); |
2902 for (int i = 0; i < 20; i++) { | 2902 for (int i = 0; i < 20; i++) { |
2903 simulate_timer_task_ran_ = false; | 2903 simulate_timer_task_ran_ = false; |
(...skipping 953 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3857 scheduler_->SetRendererBackgrounded(true); | 3857 scheduler_->SetRendererBackgrounded(true); |
3858 | 3858 |
3859 std::vector<base::TimeTicks> run_times; | 3859 std::vector<base::TimeTicks> run_times; |
3860 | 3860 |
3861 timer_task_runner_->PostTask( | 3861 timer_task_runner_->PostTask( |
3862 FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get())); | 3862 FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get())); |
3863 | 3863 |
3864 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 3864 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
3865 base::TimeDelta::FromMilliseconds(1100)); | 3865 base::TimeDelta::FromMilliseconds(1100)); |
3866 | 3866 |
3867 EXPECT_THAT(run_times, testing::ElementsAre(base::TimeTicks() + | 3867 EXPECT_THAT(run_times, |
3868 base::TimeDelta::FromSeconds(1))); | 3868 ::testing::ElementsAre(base::TimeTicks() + |
| 3869 base::TimeDelta::FromSeconds(1))); |
3869 run_times.clear(); | 3870 run_times.clear(); |
3870 | 3871 |
3871 timer_task_runner_->PostDelayedTask( | 3872 timer_task_runner_->PostDelayedTask( |
3872 FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get()), | 3873 FROM_HERE, base::Bind(&RecordingTimeTestTask, &run_times, clock_.get()), |
3873 base::TimeDelta::FromMilliseconds(200)); | 3874 base::TimeDelta::FromMilliseconds(200)); |
3874 | 3875 |
3875 scheduler_->SetRendererBackgrounded(false); | 3876 scheduler_->SetRendererBackgrounded(false); |
3876 | 3877 |
3877 mock_task_runner_->RunUntilTime(base::TimeTicks() + | 3878 mock_task_runner_->RunUntilTime(base::TimeTicks() + |
3878 base::TimeDelta::FromMilliseconds(1500)); | 3879 base::TimeDelta::FromMilliseconds(1500)); |
3879 | 3880 |
3880 EXPECT_THAT(run_times, | 3881 EXPECT_THAT(run_times, |
3881 testing::ElementsAre(base::TimeTicks() + | 3882 ::testing::ElementsAre(base::TimeTicks() + |
3882 base::TimeDelta::FromMilliseconds(1300))); | 3883 base::TimeDelta::FromMilliseconds(1300))); |
3883 } | 3884 } |
3884 | 3885 |
3885 TEST_F(RendererSchedulerImplTest, UnresponsiveMainThread) { | 3886 TEST_F(RendererSchedulerImplTest, UnresponsiveMainThread) { |
3886 EXPECT_FALSE( | 3887 EXPECT_FALSE( |
3887 scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); | 3888 scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); |
3888 | 3889 |
3889 // Add one second long task. | 3890 // Add one second long task. |
3890 AdvanceTimeWithTask(1); | 3891 AdvanceTimeWithTask(1); |
3891 EXPECT_TRUE( | 3892 EXPECT_TRUE( |
3892 scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); | 3893 scheduler_->MainThreadSeemsUnresponsive(responsiveness_threshold())); |
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4053 | 4054 |
4054 scheduler_->OnFirstMeaningfulPaint(); | 4055 scheduler_->OnFirstMeaningfulPaint(); |
4055 scheduler_->DidCommitProvisionalLoad(true /* is_web_history_inert_commit */, | 4056 scheduler_->DidCommitProvisionalLoad(true /* is_web_history_inert_commit */, |
4056 true /* is_reload */, | 4057 true /* is_reload */, |
4057 true /* is_main_frame */); | 4058 true /* is_main_frame */); |
4058 EXPECT_TRUE(scheduler_->waiting_for_meaningful_paint()); // State cleared. | 4059 EXPECT_TRUE(scheduler_->waiting_for_meaningful_paint()); // State cleared. |
4059 } | 4060 } |
4060 | 4061 |
4061 } // namespace scheduler | 4062 } // namespace scheduler |
4062 } // namespace blink | 4063 } // namespace blink |
OLD | NEW |