Index: components/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/components/scheduler/renderer/renderer_scheduler_impl.cc b/components/scheduler/renderer/renderer_scheduler_impl.cc |
index 51015be4f074331d8c7b114d13da895e6365063c..24f98749ed128759df218141eae4e872d3574c10 100644 |
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -610,11 +610,13 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
} |
Policy new_policy; |
- bool block_expensive_tasks = false; |
+ bool block_expensive_loading_tasks = false; |
+ bool block_expensive_timer_tasks = false; |
switch (use_case) { |
case UseCase::COMPOSITOR_GESTURE: |
if (touchstart_expected_soon) { |
- block_expensive_tasks = true; |
+ block_expensive_loading_tasks = true; |
+ block_expensive_timer_tasks = true; |
} else { |
// What we really want to do is priorize loading tasks, but that doesn't |
// seem to be safe. Instead we do that by proxy by deprioritizing |
@@ -625,20 +627,29 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
break; |
case UseCase::MAIN_THREAD_GESTURE: |
+ // In main thread gestures we don't have perfect knowledge about which |
+ // things we should be prioritizing. The following is best guess |
+ // heuristic which lets us produce frames quickly but does not prevent |
+ // loading of additional content. |
new_policy.compositor_queue_priority = TaskQueue::HIGH_PRIORITY; |
- block_expensive_tasks = true; |
+ block_expensive_loading_tasks = false; |
+ block_expensive_timer_tasks = true; |
break; |
case UseCase::TOUCHSTART: |
new_policy.compositor_queue_priority = TaskQueue::HIGH_PRIORITY; |
new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY; |
new_policy.timer_queue_priority = TaskQueue::DISABLED_PRIORITY; |
- block_expensive_tasks = true; // NOTE this is a nop due to the above. |
+ // NOTE these are nops due to the above. |
+ block_expensive_loading_tasks = true; |
+ block_expensive_timer_tasks = true; |
break; |
case UseCase::NONE: |
- if (touchstart_expected_soon) |
- block_expensive_tasks = true; |
+ if (touchstart_expected_soon) { |
+ block_expensive_loading_tasks = true; |
+ block_expensive_timer_tasks = true; |
+ } |
break; |
case UseCase::LOADING: |
@@ -651,17 +662,21 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
} |
// Don't block expensive tasks unless we have actually seen something. |
- if (!MainThreadOnly().have_seen_a_begin_main_frame) |
- block_expensive_tasks = false; |
+ if (!MainThreadOnly().have_seen_a_begin_main_frame) { |
+ block_expensive_loading_tasks = false; |
+ block_expensive_timer_tasks = false; |
+ } |
// Don't block expensive tasks if we are expecting a navigation. |
- if (MainThreadOnly().navigation_task_expected_count > 0) |
- block_expensive_tasks = false; |
+ if (MainThreadOnly().navigation_task_expected_count > 0) { |
+ block_expensive_loading_tasks = false; |
+ block_expensive_timer_tasks = false; |
+ } |
- if (block_expensive_tasks && loading_tasks_seem_expensive) |
+ if (block_expensive_loading_tasks && loading_tasks_seem_expensive) |
new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY; |
- if ((block_expensive_tasks && timer_tasks_seem_expensive) || |
+ if ((block_expensive_timer_tasks && timer_tasks_seem_expensive) || |
MainThreadOnly().timer_queue_suspend_count != 0 || |
MainThreadOnly().timer_queue_suspended_when_backgrounded) { |
new_policy.timer_queue_priority = TaskQueue::DISABLED_PRIORITY; |