| 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 9c5e33a261fef355db3ff3399cc626aa9141ce70..9da5037f8a53dcde487cf8d06e8b5b77806b4c04 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
|
| @@ -468,7 +468,8 @@ bool RendererSchedulerImpl::ShouldPrioritizeInputEvent(
|
| const blink::WebInputEvent& web_input_event) {
|
| // We regard MouseMove events with the left mouse button down as a signal
|
| // that the user is doing something requiring a smooth frame rate.
|
| - if (web_input_event.type == blink::WebInputEvent::MouseMove &&
|
| + if ((web_input_event.type == blink::WebInputEvent::MouseDown ||
|
| + web_input_event.type == blink::WebInputEvent::MouseMove) &&
|
| (web_input_event.modifiers & blink::WebInputEvent::LeftButtonDown)) {
|
| return true;
|
| }
|
| @@ -528,58 +529,73 @@ void RendererSchedulerImpl::UpdateForInputEventOnCompositorThread(
|
| if (input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR)
|
| AnyThread().user_model.DidFinishProcessingInputEvent(now);
|
|
|
| - if (type) {
|
| - switch (type) {
|
| - case blink::WebInputEvent::TouchStart:
|
| - AnyThread().awaiting_touch_start_response = true;
|
| - // This is just a fail-safe to reset the state of
|
| - // |last_gesture_was_compositor_driven| to the default. We don't know
|
| - // yet where the gesture will run.
|
| - AnyThread().last_gesture_was_compositor_driven = false;
|
| - AnyThread().have_seen_touchstart = true;
|
| - // Assume the default gesture is prevented until we see evidence
|
| - // otherwise.
|
| - AnyThread().default_gesture_prevented = true;
|
| - break;
|
| -
|
| - case blink::WebInputEvent::TouchMove:
|
| - // Observation of consecutive touchmoves is a strong signal that the
|
| - // page is consuming the touch sequence, in which case touchstart
|
| - // response prioritization is no longer necessary. Otherwise, the
|
| - // initial touchmove should preserve the touchstart response pending
|
| - // state.
|
| - if (AnyThread().awaiting_touch_start_response &&
|
| - CompositorThreadOnly().last_input_type ==
|
| - blink::WebInputEvent::TouchMove) {
|
| - AnyThread().awaiting_touch_start_response = false;
|
| - }
|
| - break;
|
| -
|
| - case blink::WebInputEvent::GesturePinchUpdate:
|
| - case blink::WebInputEvent::GestureScrollUpdate:
|
| - // If we see events for an established gesture, we can lock it to the
|
| - // appropriate thread as the gesture can no longer be cancelled.
|
| - AnyThread().last_gesture_was_compositor_driven =
|
| - input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR;
|
| + switch (type) {
|
| + case blink::WebInputEvent::TouchStart:
|
| + AnyThread().awaiting_touch_start_response = true;
|
| + // This is just a fail-safe to reset the state of
|
| + // |last_gesture_was_compositor_driven| to the default. We don't know
|
| + // yet where the gesture will run.
|
| + AnyThread().last_gesture_was_compositor_driven = false;
|
| + AnyThread().have_seen_touchstart = true;
|
| + // Assume the default gesture is prevented until we see evidence
|
| + // otherwise.
|
| + AnyThread().default_gesture_prevented = true;
|
| + break;
|
| +
|
| + case blink::WebInputEvent::TouchMove:
|
| + // Observation of consecutive touchmoves is a strong signal that the
|
| + // page is consuming the touch sequence, in which case touchstart
|
| + // response prioritization is no longer necessary. Otherwise, the
|
| + // initial touchmove should preserve the touchstart response pending
|
| + // state.
|
| + if (AnyThread().awaiting_touch_start_response &&
|
| + CompositorThreadOnly().last_input_type ==
|
| + blink::WebInputEvent::TouchMove) {
|
| AnyThread().awaiting_touch_start_response = false;
|
| - AnyThread().default_gesture_prevented = false;
|
| - break;
|
| + }
|
| + break;
|
| +
|
| + case blink::WebInputEvent::GesturePinchUpdate:
|
| + case blink::WebInputEvent::GestureScrollUpdate:
|
| + // If we see events for an established gesture, we can lock it to the
|
| + // appropriate thread as the gesture can no longer be cancelled.
|
| + AnyThread().last_gesture_was_compositor_driven =
|
| + input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR;
|
| + AnyThread().awaiting_touch_start_response = false;
|
| + AnyThread().default_gesture_prevented = false;
|
| + break;
|
|
|
| - case blink::WebInputEvent::GestureFlingCancel:
|
| - AnyThread().fling_compositor_escalation_deadline = base::TimeTicks();
|
| - break;
|
| + case blink::WebInputEvent::GestureFlingCancel:
|
| + AnyThread().fling_compositor_escalation_deadline = base::TimeTicks();
|
| + break;
|
|
|
| - case blink::WebInputEvent::GestureTapDown:
|
| - case blink::WebInputEvent::GestureShowPress:
|
| - case blink::WebInputEvent::GestureScrollEnd:
|
| - // With no observable effect, these meta events do not indicate a
|
| - // meaningful touchstart response and should not impact task priority.
|
| - break;
|
| + case blink::WebInputEvent::GestureTapDown:
|
| + case blink::WebInputEvent::GestureShowPress:
|
| + case blink::WebInputEvent::GestureScrollEnd:
|
| + // With no observable effect, these meta events do not indicate a
|
| + // meaningful touchstart response and should not impact task priority.
|
| + break;
|
|
|
| - default:
|
| - AnyThread().awaiting_touch_start_response = false;
|
| - break;
|
| - }
|
| + case blink::WebInputEvent::MouseDown:
|
| + // Reset tracking state at the start of a new mouse drag gesture.
|
| + AnyThread().last_gesture_was_compositor_driven = false;
|
| + AnyThread().default_gesture_prevented = true;
|
| + break;
|
| +
|
| + case blink::WebInputEvent::MouseMove:
|
| + // Consider mouse movement with the left button held down (see
|
| + // ShouldPrioritizeInputEvent) similarly to a touch gesture.
|
| + AnyThread().last_gesture_was_compositor_driven =
|
| + input_event_state == InputEventState::EVENT_CONSUMED_BY_COMPOSITOR;
|
| + AnyThread().awaiting_touch_start_response = false;
|
| + break;
|
| +
|
| + case blink::WebInputEvent::Undefined:
|
| + break;
|
| +
|
| + default:
|
| + AnyThread().awaiting_touch_start_response = false;
|
| + break;
|
| }
|
|
|
| // Avoid unnecessary policy updates if the use case did not change.
|
| @@ -1019,8 +1035,6 @@ RendererSchedulerImpl::UseCase RendererSchedulerImpl::ComputeCurrentUseCase(
|
| // stream of input events and has prevented a default gesture from being
|
| // started.
|
| // 4. SYNCHRONIZED_GESTURE where the gesture is processed on both threads.
|
| - // TODO(skyostil): Consider removing in_idle_period_ and
|
| - // HadAnIdlePeriodRecently() unless we need them here.
|
| if (AnyThread().last_gesture_was_compositor_driven) {
|
| if (AnyThread().begin_main_frame_on_critical_path) {
|
| return UseCase::SYNCHRONIZED_GESTURE;
|
| @@ -1281,12 +1295,6 @@ void RendererSchedulerImpl::OnNavigationStarted() {
|
| ResetForNavigationLocked();
|
| }
|
|
|
| -bool RendererSchedulerImpl::HadAnIdlePeriodRecently(base::TimeTicks now) const {
|
| - return (now - AnyThread().last_idle_period_end_time) <=
|
| - base::TimeDelta::FromMilliseconds(
|
| - kIdlePeriodStarvationThresholdMillis);
|
| -}
|
| -
|
| void RendererSchedulerImpl::SuspendTimerQueueWhenBackgrounded() {
|
| DCHECK(MainThreadOnly().renderer_backgrounded);
|
| if (MainThreadOnly().timer_queue_suspended_when_backgrounded)
|
|
|