| 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 1c061b2bf6b728ab2ee751822a9ee6d2a46029b0..d128670cb9cb570ed9ba916e3c0f3663af1f0993 100644
|
| --- a/components/scheduler/renderer/renderer_scheduler_impl.cc
|
| +++ b/components/scheduler/renderer/renderer_scheduler_impl.cc
|
| @@ -102,6 +102,7 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly()
|
| short_idle_period_duration(kShortIdlePeriodDurationSampleCount),
|
| current_use_case(UseCase::NONE),
|
| timer_queue_suspend_count(0),
|
| + navigation_task_expected_count(0),
|
| renderer_hidden(false),
|
| renderer_backgrounded(false),
|
| timer_queue_suspension_when_backgrounded_enabled(false),
|
| @@ -631,6 +632,10 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) {
|
| if (!MainThreadOnly().have_seen_a_begin_main_frame)
|
| block_expensive_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 (block_expensive_tasks && loading_tasks_seem_expensive)
|
| new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY;
|
|
|
| @@ -816,6 +821,8 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const {
|
| "rails_loading_priority_deadline",
|
| (AnyThread().rails_loading_priority_deadline - base::TimeTicks())
|
| .InMillisecondsF());
|
| + state->SetInteger("navigation_task_expected_count",
|
| + MainThreadOnly().navigation_task_expected_count);
|
| state->SetDouble("last_idle_period_end_time",
|
| (AnyThread().last_idle_period_end_time - base::TimeTicks())
|
| .InMillisecondsF());
|
| @@ -858,9 +865,23 @@ void RendererSchedulerImpl::OnIdlePeriodEnded() {
|
| UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);
|
| }
|
|
|
| -void RendererSchedulerImpl::OnPageLoadStarted() {
|
| +void RendererSchedulerImpl::AddPendingNavigation() {
|
| + helper_.CheckOnValidThread();
|
| + MainThreadOnly().navigation_task_expected_count++;
|
| + UpdatePolicy();
|
| +}
|
| +
|
| +void RendererSchedulerImpl::RemovePendingNavigation() {
|
| + helper_.CheckOnValidThread();
|
| + DCHECK_GT(MainThreadOnly().navigation_task_expected_count, 0);
|
| + if (MainThreadOnly().navigation_task_expected_count > 0)
|
| + MainThreadOnly().navigation_task_expected_count--;
|
| + UpdatePolicy();
|
| +}
|
| +
|
| +void RendererSchedulerImpl::OnNavigationStarted() {
|
| TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"),
|
| - "RendererSchedulerImpl::OnPageLoadStarted");
|
| + "RendererSchedulerImpl::OnNavigationStarted");
|
| base::AutoLock lock(any_thread_lock_);
|
| AnyThread().rails_loading_priority_deadline =
|
| helper_.Now() + base::TimeDelta::FromMilliseconds(
|
|
|