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 "content/renderer/scheduler/renderer_scheduler_impl.h" | 5 #include "content/renderer/scheduler/renderer_scheduler_impl.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "cc/output/begin_frame_args.h" | 8 #include "cc/output/begin_frame_args.h" |
9 #include "cc/test/ordered_simple_task_runner.h" | 9 #include "cc/test/ordered_simple_task_runner.h" |
| 10 #include "content/renderer/scheduler/nestable_task_runner_for_test.h" |
| 11 #include "content/renderer/scheduler/renderer_scheduler_message_loop_delegate.h" |
10 #include "testing/gmock/include/gmock/gmock.h" | 12 #include "testing/gmock/include/gmock/gmock.h" |
11 #include "testing/gtest/include/gtest/gtest.h" | 13 #include "testing/gtest/include/gtest/gtest.h" |
12 | 14 |
13 namespace content { | 15 namespace content { |
14 | 16 |
15 namespace { | 17 namespace { |
16 class FakeInputEvent : public blink::WebInputEvent { | 18 class FakeInputEvent : public blink::WebInputEvent { |
17 public: | 19 public: |
18 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) | 20 explicit FakeInputEvent(blink::WebInputEvent::Type event_type) |
19 : WebInputEvent(sizeof(FakeInputEvent)) { | 21 : WebInputEvent(sizeof(FakeInputEvent)) { |
(...skipping 20 matching lines...) Expand all Loading... |
40 | 42 |
41 }; // namespace | 43 }; // namespace |
42 | 44 |
43 class RendererSchedulerImplTest : public testing::Test { | 45 class RendererSchedulerImplTest : public testing::Test { |
44 public: | 46 public: |
45 using Policy = RendererSchedulerImpl::Policy; | 47 using Policy = RendererSchedulerImpl::Policy; |
46 | 48 |
47 RendererSchedulerImplTest() | 49 RendererSchedulerImplTest() |
48 : clock_(cc::TestNowSource::Create(5000)), | 50 : clock_(cc::TestNowSource::Create(5000)), |
49 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), | 51 mock_task_runner_(new cc::OrderedSimpleTaskRunner(clock_, false)), |
50 scheduler_(new RendererSchedulerImpl(mock_task_runner_)), | 52 nestable_task_runner_( |
| 53 NestableTaskRunnerForTest::Create(mock_task_runner_)), |
| 54 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
51 default_task_runner_(scheduler_->DefaultTaskRunner()), | 55 default_task_runner_(scheduler_->DefaultTaskRunner()), |
52 compositor_task_runner_(scheduler_->CompositorTaskRunner()), | 56 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
53 loading_task_runner_(scheduler_->LoadingTaskRunner()), | 57 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
| 58 idle_task_runner_(scheduler_->IdleTaskRunner()) { |
| 59 scheduler_->SetTimeSourceForTesting(clock_); |
| 60 } |
| 61 |
| 62 RendererSchedulerImplTest(base::MessageLoop* message_loop) |
| 63 : clock_(cc::TestNowSource::Create(5000)), |
| 64 message_loop_(message_loop), |
| 65 nestable_task_runner_( |
| 66 RendererSchedulerMessageLoopDelegate::Create(message_loop)), |
| 67 scheduler_(new RendererSchedulerImpl(nestable_task_runner_)), |
| 68 default_task_runner_(scheduler_->DefaultTaskRunner()), |
| 69 compositor_task_runner_(scheduler_->CompositorTaskRunner()), |
| 70 loading_task_runner_(scheduler_->LoadingTaskRunner()), |
54 idle_task_runner_(scheduler_->IdleTaskRunner()) { | 71 idle_task_runner_(scheduler_->IdleTaskRunner()) { |
55 scheduler_->SetTimeSourceForTesting(clock_); | 72 scheduler_->SetTimeSourceForTesting(clock_); |
56 } | 73 } |
57 ~RendererSchedulerImplTest() override {} | 74 ~RendererSchedulerImplTest() override {} |
58 | 75 |
59 void TearDown() override { | 76 void TearDown() override { |
60 // Check that all tests stop posting tasks. | 77 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
61 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 78 if (mock_task_runner_.get()) { |
62 while (RunUntilIdle()) { | 79 // Check that all tests stop posting tasks. |
| 80 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
| 81 while (mock_task_runner_->RunUntilIdle()) { |
| 82 } |
| 83 } else { |
| 84 message_loop_->RunUntilIdle(); |
63 } | 85 } |
64 } | 86 } |
65 | 87 |
66 bool RunUntilIdle() { return mock_task_runner_->RunUntilIdle(); } | 88 void RunUntilIdle() { |
| 89 // Only one of mock_task_runner_ or message_loop_ should be set. |
| 90 DCHECK(!mock_task_runner_.get() || !message_loop_.get()); |
| 91 if (mock_task_runner_.get()) |
| 92 mock_task_runner_->RunUntilIdle(); |
| 93 else |
| 94 message_loop_->RunUntilIdle(); |
| 95 } |
67 | 96 |
68 void DoMainFrame() { | 97 void DoMainFrame() { |
69 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( | 98 scheduler_->WillBeginFrame(cc::BeginFrameArgs::Create( |
70 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), | 99 BEGINFRAME_FROM_HERE, clock_->Now(), base::TimeTicks(), |
71 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); | 100 base::TimeDelta::FromMilliseconds(1000), cc::BeginFrameArgs::NORMAL)); |
72 scheduler_->DidCommitFrameToCompositor(); | 101 scheduler_->DidCommitFrameToCompositor(); |
73 } | 102 } |
74 | 103 |
75 void EnableIdleTasks() { DoMainFrame(); } | 104 void EnableIdleTasks() { DoMainFrame(); } |
76 | 105 |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
123 } | 152 } |
124 } | 153 } |
125 | 154 |
126 protected: | 155 protected: |
127 static base::TimeDelta priority_escalation_after_input_duration() { | 156 static base::TimeDelta priority_escalation_after_input_duration() { |
128 return base::TimeDelta::FromMilliseconds( | 157 return base::TimeDelta::FromMilliseconds( |
129 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); | 158 RendererSchedulerImpl::kPriorityEscalationAfterInputMillis); |
130 } | 159 } |
131 | 160 |
132 scoped_refptr<cc::TestNowSource> clock_; | 161 scoped_refptr<cc::TestNowSource> clock_; |
| 162 // Only one of mock_task_runner_ or message_loop_ will be set. |
133 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; | 163 scoped_refptr<cc::OrderedSimpleTaskRunner> mock_task_runner_; |
| 164 scoped_ptr<base::MessageLoop> message_loop_; |
134 | 165 |
| 166 scoped_refptr<NestableSingleThreadTaskRunner> nestable_task_runner_; |
135 scoped_ptr<RendererSchedulerImpl> scheduler_; | 167 scoped_ptr<RendererSchedulerImpl> scheduler_; |
136 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; | 168 scoped_refptr<base::SingleThreadTaskRunner> default_task_runner_; |
137 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; | 169 scoped_refptr<base::SingleThreadTaskRunner> compositor_task_runner_; |
138 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; | 170 scoped_refptr<base::SingleThreadTaskRunner> loading_task_runner_; |
139 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; | 171 scoped_refptr<SingleThreadIdleTaskRunner> idle_task_runner_; |
140 | 172 |
141 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); | 173 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplTest); |
142 }; | 174 }; |
143 | 175 |
144 void NullTask() { | 176 void NullTask() { |
(...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
860 // Process the input event with a new BeginMainFrame. | 892 // Process the input event with a new BeginMainFrame. |
861 DoMainFrame(); | 893 DoMainFrame(); |
862 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); | 894 clock_->AdvanceNow(2 * priority_escalation_after_input_duration()); |
863 RunUntilIdle(); | 895 RunUntilIdle(); |
864 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); | 896 EXPECT_EQ(Policy::NORMAL, CurrentPolicy()); |
865 } | 897 } |
866 | 898 |
867 class RendererSchedulerImplForTest : public RendererSchedulerImpl { | 899 class RendererSchedulerImplForTest : public RendererSchedulerImpl { |
868 public: | 900 public: |
869 RendererSchedulerImplForTest( | 901 RendererSchedulerImplForTest( |
870 scoped_refptr<base::SingleThreadTaskRunner> main_task_runner) | 902 scoped_refptr<NestableSingleThreadTaskRunner> main_task_runner) |
871 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} | 903 : RendererSchedulerImpl(main_task_runner), update_policy_count_(0) {} |
872 | 904 |
873 void UpdatePolicyLocked() override { | 905 void UpdatePolicyLocked() override { |
874 update_policy_count_++; | 906 update_policy_count_++; |
875 RendererSchedulerImpl::UpdatePolicyLocked(); | 907 RendererSchedulerImpl::UpdatePolicyLocked(); |
876 } | 908 } |
877 | 909 |
878 int update_policy_count_; | 910 int update_policy_count_; |
879 }; | 911 }; |
880 | 912 |
881 TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) { | 913 TEST_F(RendererSchedulerImplTest, OnlyOnePendingUrgentPolicyUpdatey) { |
882 RendererSchedulerImplForTest* mock_scheduler = | 914 RendererSchedulerImplForTest* mock_scheduler = |
883 new RendererSchedulerImplForTest(mock_task_runner_); | 915 new RendererSchedulerImplForTest(nestable_task_runner_); |
884 scheduler_.reset(mock_scheduler); | 916 scheduler_.reset(mock_scheduler); |
885 | 917 |
886 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 918 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
887 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 919 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
888 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 920 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
889 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 921 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
890 | 922 |
891 RunUntilIdle(); | 923 RunUntilIdle(); |
892 | 924 |
893 EXPECT_EQ(1, mock_scheduler->update_policy_count_); | 925 EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
894 } | 926 } |
895 | 927 |
896 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { | 928 TEST_F(RendererSchedulerImplTest, OnePendingDelayedAndOneUrgentUpdatePolicy) { |
897 RendererSchedulerImplForTest* mock_scheduler = | 929 RendererSchedulerImplForTest* mock_scheduler = |
898 new RendererSchedulerImplForTest(mock_task_runner_); | 930 new RendererSchedulerImplForTest(nestable_task_runner_); |
899 scheduler_.reset(mock_scheduler); | 931 scheduler_.reset(mock_scheduler); |
900 scheduler_->SetTimeSourceForTesting(clock_); | 932 scheduler_->SetTimeSourceForTesting(clock_); |
901 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 933 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
902 | 934 |
903 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 935 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
904 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 936 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
905 | 937 |
906 RunUntilIdle(); | 938 RunUntilIdle(); |
907 | 939 |
908 // We expect both the urgent and the delayed updates to run. | 940 // We expect both the urgent and the delayed updates to run. |
909 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 941 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
910 } | 942 } |
911 | 943 |
912 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { | 944 TEST_F(RendererSchedulerImplTest, OneUrgentAndOnePendingDelayedUpdatePolicy) { |
913 RendererSchedulerImplForTest* mock_scheduler = | 945 RendererSchedulerImplForTest* mock_scheduler = |
914 new RendererSchedulerImplForTest(mock_task_runner_); | 946 new RendererSchedulerImplForTest(nestable_task_runner_); |
915 scheduler_.reset(mock_scheduler); | 947 scheduler_.reset(mock_scheduler); |
916 scheduler_->SetTimeSourceForTesting(clock_); | 948 scheduler_->SetTimeSourceForTesting(clock_); |
917 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 949 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
918 | 950 |
919 EnsureUrgentPolicyUpdatePostedOnMainThread(); | 951 EnsureUrgentPolicyUpdatePostedOnMainThread(); |
920 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); | 952 ScheduleDelayedPolicyUpdate(base::TimeDelta::FromMilliseconds(1)); |
921 | 953 |
922 RunUntilIdle(); | 954 RunUntilIdle(); |
923 | 955 |
924 // We expect both the urgent and the delayed updates to run. | 956 // We expect both the urgent and the delayed updates to run. |
925 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 957 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
926 } | 958 } |
927 | 959 |
928 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { | 960 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByOneInputEvent) { |
929 RendererSchedulerImplForTest* mock_scheduler = | 961 RendererSchedulerImplForTest* mock_scheduler = |
930 new RendererSchedulerImplForTest(mock_task_runner_); | 962 new RendererSchedulerImplForTest(nestable_task_runner_); |
931 scheduler_.reset(mock_scheduler); | 963 scheduler_.reset(mock_scheduler); |
932 scheduler_->SetTimeSourceForTesting(clock_); | 964 scheduler_->SetTimeSourceForTesting(clock_); |
933 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 965 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
934 | 966 |
935 scheduler_->DidReceiveInputEventOnCompositorThread( | 967 scheduler_->DidReceiveInputEventOnCompositorThread( |
936 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 968 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
937 | 969 |
938 RunUntilIdle(); | 970 RunUntilIdle(); |
939 | 971 |
940 // We expect an urgent policy update followed by a delayed one 100ms later. | 972 // We expect an urgent policy update followed by a delayed one 100ms later. |
941 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 973 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
942 } | 974 } |
943 | 975 |
944 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { | 976 TEST_F(RendererSchedulerImplTest, UpdatePolicyCountTriggeredByTwoInputEvents) { |
945 RendererSchedulerImplForTest* mock_scheduler = | 977 RendererSchedulerImplForTest* mock_scheduler = |
946 new RendererSchedulerImplForTest(mock_task_runner_); | 978 new RendererSchedulerImplForTest(nestable_task_runner_); |
947 scheduler_.reset(mock_scheduler); | 979 scheduler_.reset(mock_scheduler); |
948 scheduler_->SetTimeSourceForTesting(clock_); | 980 scheduler_->SetTimeSourceForTesting(clock_); |
949 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 981 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
950 | 982 |
951 scheduler_->DidReceiveInputEventOnCompositorThread( | 983 scheduler_->DidReceiveInputEventOnCompositorThread( |
952 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 984 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
953 scheduler_->DidReceiveInputEventOnCompositorThread( | 985 scheduler_->DidReceiveInputEventOnCompositorThread( |
954 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 986 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
955 | 987 |
956 RunUntilIdle(); | 988 RunUntilIdle(); |
957 | 989 |
958 // We expect an urgent policy update followed by a delayed one 100ms later. | 990 // We expect an urgent policy update followed by a delayed one 100ms later. |
959 EXPECT_EQ(2, mock_scheduler->update_policy_count_); | 991 EXPECT_EQ(2, mock_scheduler->update_policy_count_); |
960 } | 992 } |
961 | 993 |
962 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { | 994 TEST_F(RendererSchedulerImplTest, EnsureUpdatePolicyNotTriggeredTooOften) { |
963 RendererSchedulerImplForTest* mock_scheduler = | 995 RendererSchedulerImplForTest* mock_scheduler = |
964 new RendererSchedulerImplForTest(mock_task_runner_); | 996 new RendererSchedulerImplForTest(nestable_task_runner_); |
965 scheduler_.reset(mock_scheduler); | 997 scheduler_.reset(mock_scheduler); |
966 scheduler_->SetTimeSourceForTesting(clock_); | 998 scheduler_->SetTimeSourceForTesting(clock_); |
967 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); | 999 mock_task_runner_->SetAutoAdvanceNowToPendingTasks(true); |
968 | 1000 |
969 scheduler_->DidReceiveInputEventOnCompositorThread( | 1001 scheduler_->DidReceiveInputEventOnCompositorThread( |
970 FakeInputEvent(blink::WebInputEvent::TouchStart)); | 1002 FakeInputEvent(blink::WebInputEvent::TouchStart)); |
971 scheduler_->DidReceiveInputEventOnCompositorThread( | 1003 scheduler_->DidReceiveInputEventOnCompositorThread( |
972 FakeInputEvent(blink::WebInputEvent::TouchMove)); | 1004 FakeInputEvent(blink::WebInputEvent::TouchMove)); |
973 | 1005 |
974 // We expect the first call to IsHighPriorityWorkAnticipated to be called | 1006 // We expect the first call to IsHighPriorityWorkAnticipated to be called |
(...skipping 12 matching lines...) Expand all Loading... |
987 scheduler_->ShouldYieldForHighPriorityWork(); | 1019 scheduler_->ShouldYieldForHighPriorityWork(); |
988 | 1020 |
989 EXPECT_EQ(1, mock_scheduler->update_policy_count_); | 1021 EXPECT_EQ(1, mock_scheduler->update_policy_count_); |
990 | 1022 |
991 RunUntilIdle(); | 1023 RunUntilIdle(); |
992 // We expect both the urgent and the delayed updates to run in addition to the | 1024 // We expect both the urgent and the delayed updates to run in addition to the |
993 // earlier updated cause by IsHighPriorityWorkAnticipated. | 1025 // earlier updated cause by IsHighPriorityWorkAnticipated. |
994 EXPECT_EQ(3, mock_scheduler->update_policy_count_); | 1026 EXPECT_EQ(3, mock_scheduler->update_policy_count_); |
995 } | 1027 } |
996 | 1028 |
| 1029 class RendererSchedulerImplWithMessageLoopTest |
| 1030 : public RendererSchedulerImplTest { |
| 1031 public: |
| 1032 RendererSchedulerImplWithMessageLoopTest() |
| 1033 : RendererSchedulerImplTest(new base::MessageLoop()) {} |
| 1034 ~RendererSchedulerImplWithMessageLoopTest() override {} |
| 1035 |
| 1036 void PostFromNestedRunloop(std::vector< |
| 1037 std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>>* tasks) { |
| 1038 base::MessageLoop::ScopedNestableTaskAllower allow(message_loop_.get()); |
| 1039 for (std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>& pair : *tasks) { |
| 1040 if (pair.second) { |
| 1041 idle_task_runner_->PostIdleTask(FROM_HERE, pair.first); |
| 1042 } else { |
| 1043 idle_task_runner_->PostNonNestableIdleTask(FROM_HERE, pair.first); |
| 1044 } |
| 1045 } |
| 1046 EnableIdleTasks(); |
| 1047 message_loop_->RunUntilIdle(); |
| 1048 } |
| 1049 |
| 1050 private: |
| 1051 DISALLOW_COPY_AND_ASSIGN(RendererSchedulerImplWithMessageLoopTest); |
| 1052 }; |
| 1053 |
| 1054 TEST_F(RendererSchedulerImplWithMessageLoopTest, |
| 1055 NonNestableIdleTaskDoesntExecuteInNestedLoop) { |
| 1056 std::vector<std::string> order; |
| 1057 idle_task_runner_->PostIdleTask( |
| 1058 FROM_HERE, |
| 1059 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("1"))); |
| 1060 idle_task_runner_->PostIdleTask( |
| 1061 FROM_HERE, |
| 1062 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("2"))); |
| 1063 |
| 1064 std::vector<std::pair<SingleThreadIdleTaskRunner::IdleTask, bool>> |
| 1065 tasks_to_post_from_nested_loop; |
| 1066 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
| 1067 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("3")), |
| 1068 false)); |
| 1069 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
| 1070 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("4")), true)); |
| 1071 tasks_to_post_from_nested_loop.push_back(std::make_pair( |
| 1072 base::Bind(&AppendToVectorIdleTestTask, &order, std::string("5")), true)); |
| 1073 |
| 1074 default_task_runner_->PostTask( |
| 1075 FROM_HERE, |
| 1076 base::Bind( |
| 1077 &RendererSchedulerImplWithMessageLoopTest::PostFromNestedRunloop, |
| 1078 base::Unretained(this), |
| 1079 base::Unretained(&tasks_to_post_from_nested_loop))); |
| 1080 |
| 1081 EnableIdleTasks(); |
| 1082 RunUntilIdle(); |
| 1083 // Note we expect task 3 to run last because it's non-nestable. |
| 1084 EXPECT_THAT(order, testing::ElementsAre(std::string("1"), std::string("2"), |
| 1085 std::string("4"), std::string("5"), |
| 1086 std::string("3"))); |
| 1087 } |
| 1088 |
997 } // namespace content | 1089 } // namespace content |
OLD | NEW |