| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" | 5 #include "components/scheduler/renderer/renderer_scheduler_impl.h" |
| 6 | 6 |
| 7 #include "base/callback.h" | 7 #include "base/callback.h" |
| 8 #include "base/test/simple_test_tick_clock.h" | 8 #include "base/test/simple_test_tick_clock.h" |
| 9 #include "cc/output/begin_frame_args.h" | 9 #include "cc/output/begin_frame_args.h" |
| 10 #include "cc/test/ordered_simple_task_runner.h" | 10 #include "cc/test/ordered_simple_task_runner.h" |
| (...skipping 886 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 897 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, | 897 SimulateMainThreadGestureStart(TouchEventPolicy::DONT_SEND_TOUCH_START, |
| 898 blink::WebInputEvent::GestureScrollBegin); | 898 blink::WebInputEvent::GestureScrollBegin); |
| 899 scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period | 899 scheduler_->DidCommitFrameToCompositor(); // Starts Idle Period |
| 900 RunUntilIdle(); | 900 RunUntilIdle(); |
| 901 | 901 |
| 902 EXPECT_THAT(run_order, | 902 EXPECT_THAT(run_order, |
| 903 testing::ElementsAre(std::string("C1"), std::string("T1"))); | 903 testing::ElementsAre(std::string("C1"), std::string("T1"))); |
| 904 } | 904 } |
| 905 | 905 |
| 906 TEST_F(RendererSchedulerImplTest, | 906 TEST_F(RendererSchedulerImplTest, |
| 907 ExpensiveTimersDontRunWhenMainThreadScrolling) { | 907 ExpensiveTimersDontRunWhenMainThreadScrolling_DISABLED) { |
| 908 std::vector<std::string> run_order; | 908 std::vector<std::string> run_order; |
| 909 | 909 |
| 910 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 910 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 911 SimulateExpensiveTasks(timer_task_runner_); | 911 SimulateExpensiveTasks(timer_task_runner_); |
| 912 DoMainFrame(); | 912 DoMainFrame(); |
| 913 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 913 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 914 blink::WebInputEvent::GestureScrollBegin); | 914 blink::WebInputEvent::GestureScrollBegin); |
| 915 | 915 |
| 916 // Timers should now be disabled during main thread user user interactions. | 916 // Timers should now be disabled during main thread user user interactions. |
| 917 PostTestTasks(&run_order, "C1 T1"); | 917 PostTestTasks(&run_order, "C1 T1"); |
| (...skipping 12 matching lines...) Expand all Loading... |
| 930 | 930 |
| 931 clock_->Advance(subsequent_input_expected_after_input_duration() * 2); | 931 clock_->Advance(subsequent_input_expected_after_input_duration() * 2); |
| 932 | 932 |
| 933 run_order.clear(); | 933 run_order.clear(); |
| 934 RunUntilIdle(); | 934 RunUntilIdle(); |
| 935 EXPECT_FALSE(TouchStartExpectedSoon()); | 935 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 936 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 936 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| 937 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"))); | 937 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"))); |
| 938 } | 938 } |
| 939 | 939 |
| 940 TEST_F(RendererSchedulerImplTest, | 940 TEST_F( |
| 941 ExpensiveTimersDontRunWhenMainThreadScrolling_AndOnCriticalPath) { | 941 RendererSchedulerImplTest, |
| 942 ExpensiveTimersDontRunWhenMainThreadScrolling_AndOnCriticalPath_DISABLED) { |
| 942 std::vector<std::string> run_order; | 943 std::vector<std::string> run_order; |
| 943 | 944 |
| 944 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 945 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 945 SimulateExpensiveTasks(timer_task_runner_); | 946 SimulateExpensiveTasks(timer_task_runner_); |
| 946 DoMainFrameOnCriticalPath(); | 947 DoMainFrameOnCriticalPath(); |
| 947 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 948 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 948 blink::WebInputEvent::GestureScrollBegin); | 949 blink::WebInputEvent::GestureScrollBegin); |
| 949 | 950 |
| 950 // Timers should now be disabled during main thread user user interactions. | 951 // Timers should now be disabled during main thread user user interactions. |
| 951 PostTestTasks(&run_order, "C1 T1"); | 952 PostTestTasks(&run_order, "C1 T1"); |
| (...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2109 testing::ElementsAre(std::string("T4"), std::string("T5"))); | 2110 testing::ElementsAre(std::string("T4"), std::string("T5"))); |
| 2110 | 2111 |
| 2111 // Subsequent timer tasks should fire as usual. | 2112 // Subsequent timer tasks should fire as usual. |
| 2112 run_order.clear(); | 2113 run_order.clear(); |
| 2113 PostTestTasks(&run_order, "T6"); | 2114 PostTestTasks(&run_order, "T6"); |
| 2114 RunUntilIdle(); | 2115 RunUntilIdle(); |
| 2115 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6"))); | 2116 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T6"))); |
| 2116 } | 2117 } |
| 2117 | 2118 |
| 2118 TEST_F(RendererSchedulerImplTest, | 2119 TEST_F(RendererSchedulerImplTest, |
| 2119 ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame) { | 2120 ExpensiveLoadingTasksNotBlockedTillFirstBeginMainFrame_DISABLED) { |
| 2120 std::vector<std::string> run_order; | 2121 std::vector<std::string> run_order; |
| 2121 | 2122 |
| 2122 EnableTaskBlocking(); | 2123 EnableTaskBlocking(); |
| 2123 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2124 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2124 SimulateExpensiveTasks(loading_task_runner_); | 2125 SimulateExpensiveTasks(loading_task_runner_); |
| 2125 ForceTouchStartToBeExpectedSoon(); | 2126 ForceTouchStartToBeExpectedSoon(); |
| 2126 PostTestTasks(&run_order, "L1 D1"); | 2127 PostTestTasks(&run_order, "L1 D1"); |
| 2127 RunUntilIdle(); | 2128 RunUntilIdle(); |
| 2128 | 2129 |
| 2129 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2130 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2163 | 2164 |
| 2164 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); | 2165 EXPECT_EQ(UseCase::NONE, ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2165 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2166 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2166 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2167 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2167 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2168 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2168 EXPECT_FALSE(TouchStartExpectedSoon()); | 2169 EXPECT_FALSE(TouchStartExpectedSoon()); |
| 2169 EXPECT_THAT(run_order, | 2170 EXPECT_THAT(run_order, |
| 2170 testing::ElementsAre(std::string("L1"), std::string("D1"))); | 2171 testing::ElementsAre(std::string("L1"), std::string("D1"))); |
| 2171 } | 2172 } |
| 2172 | 2173 |
| 2173 TEST_F(RendererSchedulerImplTest, ExpensiveTimerTaskBlocked) { | 2174 TEST_F(RendererSchedulerImplTest, ExpensiveTimerTaskBlocked_DISABLED) { |
| 2174 std::vector<std::string> run_order; | 2175 std::vector<std::string> run_order; |
| 2175 | 2176 |
| 2176 EnableTaskBlocking(); | 2177 EnableTaskBlocking(); |
| 2177 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2178 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2178 DoMainFrame(); | 2179 DoMainFrame(); |
| 2179 SimulateExpensiveTasks(timer_task_runner_); | 2180 SimulateExpensiveTasks(timer_task_runner_); |
| 2180 ForceTouchStartToBeExpectedSoon(); | 2181 ForceTouchStartToBeExpectedSoon(); |
| 2181 | 2182 |
| 2182 scheduler_->DidHandleInputEventOnCompositorThread( | 2183 scheduler_->DidHandleInputEventOnCompositorThread( |
| 2183 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), | 2184 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| (...skipping 29 matching lines...) Expand all Loading... |
| 2213 ForceUpdatePolicyAndGetCurrentUseCase()); | 2214 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2214 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2215 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2215 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2216 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2216 EXPECT_TRUE(TimerTasksSeemExpensive()); | 2217 EXPECT_TRUE(TimerTasksSeemExpensive()); |
| 2217 EXPECT_TRUE(TouchStartExpectedSoon()); | 2218 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2218 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), | 2219 EXPECT_THAT(run_order, testing::ElementsAre(std::string("T1"), |
| 2219 std::string("D1"))); | 2220 std::string("D1"))); |
| 2220 } | 2221 } |
| 2221 | 2222 |
| 2222 TEST_F(RendererSchedulerImplTest, | 2223 TEST_F(RendererSchedulerImplTest, |
| 2223 ExpensiveTimerTaskNotBlocked_IfBeginMainFrameNotExpectedSoon) { | 2224 ExpensiveTimerTaskNotBlocked_IfBeginMainFrameNotExpectedSoon_DISABLED) { |
| 2224 std::vector<std::string> run_order; | 2225 std::vector<std::string> run_order; |
| 2225 | 2226 |
| 2226 EnableTaskBlocking(); | 2227 EnableTaskBlocking(); |
| 2227 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2228 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2228 DoMainFrame(); | 2229 DoMainFrame(); |
| 2229 SimulateExpensiveTasks(timer_task_runner_); | 2230 SimulateExpensiveTasks(timer_task_runner_); |
| 2230 ForceTouchStartToBeExpectedSoon(); | 2231 ForceTouchStartToBeExpectedSoon(); |
| 2231 scheduler_->BeginFrameNotExpectedSoon(); | 2232 scheduler_->BeginFrameNotExpectedSoon(); |
| 2232 | 2233 |
| 2233 scheduler_->DidHandleInputEventOnCompositorThread( | 2234 scheduler_->DidHandleInputEventOnCompositorThread( |
| 2234 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), | 2235 FakeInputEvent(blink::WebInputEvent::GestureFlingStart), |
| 2235 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); | 2236 RendererScheduler::InputEventState::EVENT_FORWARDED_TO_MAIN_THREAD); |
| 2236 PostTestTasks(&run_order, "T1 D1"); | 2237 PostTestTasks(&run_order, "T1 D1"); |
| 2237 RunUntilIdle(); | 2238 RunUntilIdle(); |
| 2238 | 2239 |
| 2239 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, | 2240 EXPECT_EQ(UseCase::MAIN_THREAD_GESTURE, |
| 2240 ForceUpdatePolicyAndGetCurrentUseCase()); | 2241 ForceUpdatePolicyAndGetCurrentUseCase()); |
| 2241 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2242 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2242 EXPECT_FALSE(LoadingTasksSeemExpensive()); | 2243 EXPECT_FALSE(LoadingTasksSeemExpensive()); |
| 2243 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2244 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2244 EXPECT_TRUE(TouchStartExpectedSoon()); | 2245 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2245 EXPECT_THAT(run_order, | 2246 EXPECT_THAT(run_order, |
| 2246 testing::ElementsAre(std::string("T1"), std::string("D1"))); | 2247 testing::ElementsAre(std::string("T1"), std::string("D1"))); |
| 2247 } | 2248 } |
| 2248 | 2249 |
| 2249 TEST_F(RendererSchedulerImplTest, | 2250 TEST_F(RendererSchedulerImplTest, |
| 2250 ExpensiveLoadingTasksNotBlockedIfNavigationExpected) { | 2251 ExpensiveLoadingTasksNotBlockedIfNavigationExpected_DISABLED) { |
| 2251 std::vector<std::string> run_order; | 2252 std::vector<std::string> run_order; |
| 2252 | 2253 |
| 2253 EnableTaskBlocking(); | 2254 EnableTaskBlocking(); |
| 2254 DoMainFrame(); | 2255 DoMainFrame(); |
| 2255 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2256 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2256 SimulateExpensiveTasks(loading_task_runner_); | 2257 SimulateExpensiveTasks(loading_task_runner_); |
| 2257 ForceTouchStartToBeExpectedSoon(); | 2258 ForceTouchStartToBeExpectedSoon(); |
| 2258 scheduler_->AddPendingNavigation(); | 2259 scheduler_->AddPendingNavigation(); |
| 2259 | 2260 |
| 2260 PostTestTasks(&run_order, "L1 D1"); | 2261 PostTestTasks(&run_order, "L1 D1"); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 2279 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); | 2280 EXPECT_EQ(RendererScheduler::UseCase::NONE, CurrentUseCase()); |
| 2280 EXPECT_TRUE(HaveSeenABeginMainframe()); | 2281 EXPECT_TRUE(HaveSeenABeginMainframe()); |
| 2281 EXPECT_TRUE(LoadingTasksSeemExpensive()); | 2282 EXPECT_TRUE(LoadingTasksSeemExpensive()); |
| 2282 EXPECT_FALSE(TimerTasksSeemExpensive()); | 2283 EXPECT_FALSE(TimerTasksSeemExpensive()); |
| 2283 EXPECT_TRUE(TouchStartExpectedSoon()); | 2284 EXPECT_TRUE(TouchStartExpectedSoon()); |
| 2284 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); | 2285 EXPECT_THAT(run_order, testing::ElementsAre(std::string("D1"))); |
| 2285 } | 2286 } |
| 2286 | 2287 |
| 2287 TEST_F( | 2288 TEST_F( |
| 2288 RendererSchedulerImplTest, | 2289 RendererSchedulerImplTest, |
| 2289 ExpensiveLoadingTasksNotBlockedIfNavigationExpected_MultipleNavigations) { | 2290 ExpensiveLoadingTasksNotBlockedIfNavigationExpected_MultipleNavigations_DISA
BLED) { |
| 2290 std::vector<std::string> run_order; | 2291 std::vector<std::string> run_order; |
| 2291 | 2292 |
| 2292 EnableTaskBlocking(); | 2293 EnableTaskBlocking(); |
| 2293 DoMainFrame(); | 2294 DoMainFrame(); |
| 2294 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2295 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2295 SimulateExpensiveTasks(loading_task_runner_); | 2296 SimulateExpensiveTasks(loading_task_runner_); |
| 2296 ForceTouchStartToBeExpectedSoon(); | 2297 ForceTouchStartToBeExpectedSoon(); |
| 2297 scheduler_->AddPendingNavigation(); | 2298 scheduler_->AddPendingNavigation(); |
| 2298 scheduler_->AddPendingNavigation(); | 2299 scheduler_->AddPendingNavigation(); |
| 2299 | 2300 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2395 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; | 2396 EXPECT_FALSE(LoadingTasksSeemExpensive()) << " i = " << i; |
| 2396 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; | 2397 EXPECT_FALSE(TimerTasksSeemExpensive()) << " i = " << i; |
| 2397 | 2398 |
| 2398 base::TimeDelta time_till_next_frame = | 2399 base::TimeDelta time_till_next_frame = |
| 2399 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2400 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2400 if (time_till_next_frame > base::TimeDelta()) | 2401 if (time_till_next_frame > base::TimeDelta()) |
| 2401 clock_->Advance(time_till_next_frame); | 2402 clock_->Advance(time_till_next_frame); |
| 2402 } | 2403 } |
| 2403 } | 2404 } |
| 2404 | 2405 |
| 2405 TEST_F(RendererSchedulerImplTest, ExpensiveTimer_Blocked) { | 2406 TEST_F(RendererSchedulerImplTest, ExpensiveTimer_Blocked_DISABLED) { |
| 2406 EnableTaskBlocking(); | 2407 EnableTaskBlocking(); |
| 2407 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); | 2408 scheduler_->SetHasVisibleRenderWidgetWithTouchHandler(true); |
| 2408 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, | 2409 SimulateMainThreadGestureStart(TouchEventPolicy::SEND_TOUCH_START, |
| 2409 blink::WebInputEvent::TouchMove); | 2410 blink::WebInputEvent::TouchMove); |
| 2410 RunUntilIdle(); | 2411 RunUntilIdle(); |
| 2411 for (int i = 0; i < 20; i++) { | 2412 for (int i = 0; i < 20; i++) { |
| 2412 simulate_timer_task_ran_ = false; | 2413 simulate_timer_task_ran_ = false; |
| 2413 | 2414 |
| 2414 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( | 2415 cc::BeginFrameArgs begin_frame_args = cc::BeginFrameArgs::Create( |
| 2415 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), | 2416 BEGINFRAME_FROM_HERE, clock_->NowTicks(), base::TimeTicks(), |
| (...skipping 24 matching lines...) Expand all Loading... |
| 2440 } | 2441 } |
| 2441 | 2442 |
| 2442 base::TimeDelta time_till_next_frame = | 2443 base::TimeDelta time_till_next_frame = |
| 2443 EstimatedNextFrameBegin() - clock_->NowTicks(); | 2444 EstimatedNextFrameBegin() - clock_->NowTicks(); |
| 2444 if (time_till_next_frame > base::TimeDelta()) | 2445 if (time_till_next_frame > base::TimeDelta()) |
| 2445 clock_->Advance(time_till_next_frame); | 2446 clock_->Advance(time_till_next_frame); |
| 2446 } | 2447 } |
| 2447 } | 2448 } |
| 2448 | 2449 |
| 2449 } // namespace scheduler | 2450 } // namespace scheduler |
| OLD | NEW |