| 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 |