1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "content/browser/renderer_host/input/mouse_wheel_rails_filter_mac.h"
6 
7 using blink::WebInputEvent;
8 using blink::WebMouseWheelEvent;
9 
10 namespace content {
11 
MouseWheelRailsFilterMac()12 MouseWheelRailsFilterMac::MouseWheelRailsFilterMac() {
13 }
14 
~MouseWheelRailsFilterMac()15 MouseWheelRailsFilterMac::~MouseWheelRailsFilterMac() {
16 }
17 
UpdateRailsMode(const WebMouseWheelEvent & event)18 WebInputEvent::RailsMode MouseWheelRailsFilterMac::UpdateRailsMode(
19     const WebMouseWheelEvent& event) {
20   if (event.phase == WebMouseWheelEvent::kPhaseNone &&
21       event.momentum_phase == WebMouseWheelEvent::kPhaseNone) {
22     // We should only set the rails mode for trackpad wheel events. The AppKit
23     // documentation state that legacy mouse events (legacy mouse) do not have
24     // |phase| and |momentum_phase|.
25     // https://developer.apple.com/documentation/appkit/nsevent/1533550-phase.
26     return WebInputEvent::kRailsModeFree;
27   }
28 
29   // A somewhat-arbitrary decay constant for hysteresis.
30   const float kDecayConstant = 0.8f;
31 
32   if (event.phase == WebMouseWheelEvent::kPhaseBegan) {
33     decayed_delta_ = gfx::Vector2dF();
34   }
35   if (event.delta_x == 0 && event.delta_y == 0)
36     return WebInputEvent::kRailsModeFree;
37 
38   decayed_delta_.Scale(kDecayConstant);
39   decayed_delta_ +=
40       gfx::Vector2dF(std::abs(event.delta_x), std::abs(event.delta_y));
41 
42   if (decayed_delta_.y() >= decayed_delta_.x())
43     return WebInputEvent::kRailsModeVertical;
44   return WebInputEvent::kRailsModeHorizontal;
45 }
46 
47 }  // namespace content
48