| 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..7fe922c0c8ebc419a6c93b6ffbb23ae486f47349 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,17 @@ 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;
|
| + UpdatePolicyLocked(UpdateType::MAY_EARLY_OUT_IF_POLICY_UNCHANGED);
|
| +}
|
| +
|
| void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() {
|
| DCHECK(MainThreadOnly().renderer_backgrounded);
|
| if (MainThreadOnly().timer_queue_suspended_when_backgrounded)
|
| @@ -1510,6 +1522,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();
|
|
|