 Chromium Code Reviews
 Chromium Code Reviews Issue 2902303002:
  phase based wheel scroll latching for mac  (Closed)
    
  
    Issue 2902303002:
  phase based wheel scroll latching for mac  (Closed) 
  | Index: content/browser/renderer_host/render_widget_host_view_mac.mm | 
| diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm | 
| index efe95f0a6e7492a295e168eaa7c62e2d5582fbc3..f6988b5dfec8539a7509ebf0cc2be4f86cd72531 100644 | 
| --- a/content/browser/renderer_host/render_widget_host_view_mac.mm | 
| +++ b/content/browser/renderer_host/render_widget_host_view_mac.mm | 
| @@ -1755,6 +1755,33 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( | 
| UpdateScreenInfo(cocoa_view_); | 
| } | 
| +void RenderWidgetHostViewMac::SendSyntheticWheelEventWithPhaseEnded( | 
| + blink::WebMouseWheelEvent wheel_event, | 
| + bool should_route_event) { | 
| + wheel_event.dispatch_type = | 
| + blink::WebInputEvent::DispatchType::kEventNonBlocking; | 
| + if (should_route_event) { | 
| + render_widget_host_->delegate() | 
| + ->GetInputEventRouter() | 
| + ->RouteMouseWheelEvent(this, &wheel_event, | 
| + ui::LatencyInfo(ui::SourceEventType::WHEEL)); | 
| + } else { | 
| + ProcessMouseWheelEvent(wheel_event, | 
| + ui::LatencyInfo(ui::SourceEventType::WHEEL)); | 
| + } | 
| +} | 
| + | 
| +void RenderWidgetHostViewMac::StartMouseWheelEndDispatchTimer( | 
| + blink::WebMouseWheelEvent wheel_event, | 
| + bool should_route_event) { | 
| + mouse_wheel_end_dispatch_timer_.Start( | 
| + FROM_HERE, | 
| + base::TimeDelta::FromMilliseconds( | 
| + kDefaultMouseWheelLatchingTransactionMs), | 
| + base::Bind( | 
| + &RenderWidgetHostViewMac::SendSyntheticWheelEventWithPhaseEnded, | 
| + base::Unretained(this), wheel_event, should_route_event)); | 
| +} | 
| } // namespace content | 
| @@ -2356,10 +2383,14 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( | 
| WebMouseWheelEvent webEvent = WebMouseWheelEventBuilder::Build( | 
| event, self); | 
| webEvent.rails_mode = mouseWheelFilter_.UpdateRailsMode(webEvent); | 
| - ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL); | 
| - latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 
| - renderWidgetHostView_->render_widget_host_-> | 
| - ForwardWheelEventWithLatencyInfo(webEvent, latency_info); | 
| + if (renderWidgetHostView_->WheelScrollLatchingEnabled()) { | 
| + renderWidgetHostView_->StartMouseWheelEndDispatchTimer(webEvent, false); | 
| + } else { | 
| + ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL); | 
| + latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 
| + renderWidgetHostView_->render_widget_host_ | 
| + ->ForwardWheelEventWithLatencyInfo(webEvent, latency_info); | 
| + } | 
| } | 
| if (endWheelMonitor_) { | 
| @@ -2565,6 +2596,30 @@ void RenderWidgetHostViewMac::OnDisplayMetricsChanged( | 
| webEvent.rails_mode = mouseWheelFilter_.UpdateRailsMode(webEvent); | 
| ui::LatencyInfo latency_info(ui::SourceEventType::WHEEL); | 
| latency_info.AddLatencyNumber(ui::INPUT_EVENT_LATENCY_UI_COMPONENT, 0, 0); | 
| + if (renderWidgetHostView_->WheelScrollLatchingEnabled()) { | 
| + if (webEvent.phase == blink::WebMouseWheelEvent::kPhaseEnded) { | 
| 
tdresser
2017/05/25 15:18:36
Could you add a comment per condition here?
 
sahel
2017/05/25 16:00:04
Done.
 | 
| + renderWidgetHostView_->StartMouseWheelEndDispatchTimer( | 
| + webEvent, renderWidgetHostView_->ShouldRouteEvent(webEvent)); | 
| + return; | 
| + } | 
| + if (webEvent.phase == blink::WebMouseWheelEvent::kPhaseBegan) { | 
| + // A new scrolling sequence hase started, stop the timer and send its | 
| 
tdresser
2017/05/25 15:18:36
hase -> has
 
sahel
2017/05/25 16:00:04
Done.
 | 
| + // wheel end event. | 
| + if (renderWidgetHostView_->mouse_wheel_end_dispatch_timer_ | 
| + .IsRunning()) { | 
| + base::Closure task = | 
| + renderWidgetHostView_->mouse_wheel_end_dispatch_timer_ | 
| + .user_task(); | 
| + renderWidgetHostView_->mouse_wheel_end_dispatch_timer_.Stop(); | 
| + task.Run(); | 
| + } | 
| + | 
| + } else if (webEvent.momentum_phase == | 
| + blink::WebMouseWheelEvent::kPhaseBegan) { | 
| + renderWidgetHostView_->mouse_wheel_end_dispatch_timer_.Stop(); | 
| + } | 
| + } | 
| + | 
| if (renderWidgetHostView_->ShouldRouteEvent(webEvent)) { | 
| renderWidgetHostView_->render_widget_host_->delegate() | 
| ->GetInputEventRouter() |