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 bb5dc7224f7cbf2650d316d3e55060fae20b09b2..e852d91413ca0f65e5863630a87ff8d8b5c08691 100644 |
--- a/components/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/components/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -116,7 +116,8 @@ RendererSchedulerImpl::MainThreadOnly::MainThreadOnly() |
RendererSchedulerImpl::MainThreadOnly::~MainThreadOnly() {} |
RendererSchedulerImpl::AnyThread::AnyThread() |
- : awaiting_touch_start_response(false), |
+ : navigation_expected(false), |
+ awaiting_touch_start_response(false), |
in_idle_period(false), |
begin_main_frame_on_critical_path(false) {} |
@@ -593,6 +594,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 (AnyThread().navigation_expected) |
+ block_expensive_tasks = false; |
+ |
if (block_expensive_tasks && loading_tasks_seem_expensive) |
new_policy.loading_queue_priority = TaskQueue::DISABLED_PRIORITY; |
@@ -769,6 +774,7 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
"rails_loading_priority_deadline", |
(AnyThread().rails_loading_priority_deadline - base::TimeTicks()) |
.InMillisecondsF()); |
+ state->SetBoolean("navigation_expected", AnyThread().navigation_expected); |
state->SetDouble("last_idle_period_end_time", |
(AnyThread().last_idle_period_end_time - base::TimeTicks()) |
.InMillisecondsF()); |
@@ -811,9 +817,21 @@ void RendererSchedulerImpl::OnIdlePeriodEnded() { |
UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
} |
-void RendererSchedulerImpl::OnPageLoadStarted() { |
+void RendererSchedulerImpl::OnNavigationExpected() { |
+ base::AutoLock lock(any_thread_lock_); |
Sami
2015/09/24 14:15:04
nit: helper_.CheckOnValidThread();
alex clarke (OOO till 29th)
2015/09/24 14:53:10
Done.
|
+ AnyThread().navigation_expected = true; |
+ UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
+} |
+ |
+void RendererSchedulerImpl::OnNavigationCanceled() { |
+ base::AutoLock lock(any_thread_lock_); |
Sami
2015/09/24 14:15:04
Ditto.
alex clarke (OOO till 29th)
2015/09/24 14:53:10
Done.
|
+ AnyThread().navigation_expected = false; |
+ UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |
+} |
+ |
+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( |
@@ -854,6 +872,7 @@ void RendererSchedulerImpl::ResetForNavigationLocked() { |
// Make sure that we don't initially assume there is no idle time. |
MainThreadOnly().short_idle_period_duration.InsertSample( |
cc::BeginFrameArgs::DefaultInterval()); |
+ AnyThread().navigation_expected = false; |
AnyThread().user_model.Reset(); |
MainThreadOnly().have_seen_a_begin_main_frame = false; |
UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED); |