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() |