Chromium Code Reviews| 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() |