Index: third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
diff --git a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
index bb860a3a8588ca16be005edf6aea31b1c05affe8..5e9389b4cf697e233562da5996adf70b92c020ed 100644 |
--- a/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
+++ b/third_party/WebKit/Source/platform/scheduler/renderer/renderer_scheduler_impl.cc |
@@ -203,7 +203,9 @@ RendererSchedulerImpl::AnyThread::AnyThread() |
begin_main_frame_on_critical_path(false), |
last_gesture_was_compositor_driven(false), |
default_gesture_prevented(true), |
- have_seen_touchstart(false) {} |
+ have_seen_touchstart(false), |
+ waiting_for_meaningful_paint(false), |
+ have_seen_input_since_navigation(false) {} |
RendererSchedulerImpl::AnyThread::~AnyThread() {} |
@@ -623,6 +625,7 @@ void RendererSchedulerImpl::UpdateForInputEventOnCompositorThread( |
AnyThread().awaiting_touch_start_response; |
AnyThread().user_model.DidStartProcessingInputEvent(type, now); |
+ AnyThread().have_seen_input_since_navigation = true; |
if (input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR) |
AnyThread().user_model.DidFinishProcessingInputEvent(now); |
@@ -982,8 +985,8 @@ void RendererSchedulerImpl::UpdatePolicyLocked(UpdateType update_type) { |
case UseCase::LOADING: |
new_policy.rail_mode = v8::PERFORMANCE_LOAD; |
- new_policy.loading_queue_policy.priority = TaskQueue::HIGH_PRIORITY; |
- new_policy.default_queue_policy.priority = TaskQueue::HIGH_PRIORITY; |
+ // TODO(skyostil): Experiment with increasing loading and default queue |
+ // priorities and throttling rendering frame rate. |
break; |
default: |
@@ -1189,8 +1192,13 @@ RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase( |
} |
} |
- // TODO(alexclarke): return UseCase::LOADING if signals suggest the system is |
- // in the initial 1s of RAIL loading. |
+ // Occasionally the meaningful paint fails to be detected, so as a fallback we |
+ // treat the presence of input as an indirect signal that there is meaningful |
+ // content on the page. |
+ if (AnyThread().waiting_for_meaningful_paint && |
+ !AnyThread().have_seen_input_since_navigation) { |
+ return UseCase::LOADING; |
+ } |
return UseCase::NONE; |
} |
@@ -1335,6 +1343,10 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
state->SetBoolean("renderer_hidden", MainThreadOnly().renderer_hidden); |
state->SetBoolean("have_seen_a_begin_main_frame", |
MainThreadOnly().have_seen_a_begin_main_frame); |
+ state->SetBoolean("waiting_for_meaningful_paint", |
+ AnyThread().waiting_for_meaningful_paint); |
+ state->SetBoolean("have_seen_input_since_navigation", |
+ AnyThread().have_seen_input_since_navigation); |
state->SetBoolean( |
"have_reported_blocking_intervention_in_current_policy", |
MainThreadOnly().have_reported_blocking_intervention_in_current_policy); |
@@ -1349,10 +1361,6 @@ RendererSchedulerImpl::AsValueLocked(base::TimeTicks optional_now) const { |
MainThreadOnly().timer_queue_suspend_count); |
state->SetDouble("now", (optional_now - base::TimeTicks()).InMillisecondsF()); |
state->SetDouble( |
- "rails_loading_priority_deadline", |
- (AnyThread().rails_loading_priority_deadline - base::TimeTicks()) |
- .InMillisecondsF()); |
- state->SetDouble( |
"fling_compositor_escalation_deadline", |
(AnyThread().fling_compositor_escalation_deadline - base::TimeTicks()) |
.InMillisecondsF()); |
@@ -1478,13 +1486,19 @@ void RendererSchedulerImpl::OnNavigationStarted() { |
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
"RendererSchedulerImpl::OnNavigationStarted"); |
base::AutoLock lock(any_thread_lock_); |
- AnyThread().rails_loading_priority_deadline = |
- helper_.scheduler_tqm_delegate()->NowTicks() + |
- base::TimeDelta::FromMilliseconds( |
- kRailsInitialLoadingPrioritizationMillis); |
ResetForNavigationLocked(); |
} |
+void RendererSchedulerImpl::OnFirstMeaningfulPaint() { |
+ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), |
+ "RendererSchedulerImpl::OnFirstMeaningfulPaint"); |
+ { |
+ base::AutoLock lock(any_thread_lock_); |
+ AnyThread().waiting_for_meaningful_paint = false; |
+ } |
+ UpdatePolicy(); |
alex clarke (OOO till 29th)
2016/11/24 17:54:23
Can we call
UpdatePolicyLocked(UpdateType::MAY_
Sami
2016/11/24 18:41:37
Oh, well spotted, thanks!
|
+} |
+ |
void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() { |
DCHECK(MainThreadOnly().renderer_backgrounded); |
if (MainThreadOnly().timer_queue_suspended_when_backgrounded) |
@@ -1510,6 +1524,8 @@ void RendererSchedulerImpl::ResetForNavigationLocked() { |
any_thread_lock_.AssertAcquired(); |
AnyThread().user_model.Reset(helper_.scheduler_tqm_delegate()->NowTicks()); |
AnyThread().have_seen_touchstart = false; |
+ AnyThread().waiting_for_meaningful_paint = true; |
+ AnyThread().have_seen_input_since_navigation = false; |
MainThreadOnly().loading_task_cost_estimator.Clear(); |
MainThreadOnly().timer_task_cost_estimator.Clear(); |
MainThreadOnly().idle_time_estimator.Clear(); |