| Index: content/browser/renderer_host/input/web_input_event_builders_mac.mm
|
| diff --git a/content/browser/renderer_host/input/web_input_event_builders_mac.mm b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
|
| index 45c37416b0d02e754e0700ceaed613b8fbff8bc2..745c6d939fe9d4817ec5a47f749cdf1b6db12bbf 100644
|
| --- a/content/browser/renderer_host/input/web_input_event_builders_mac.mm
|
| +++ b/content/browser/renderer_host/input/web_input_event_builders_mac.mm
|
| @@ -551,17 +551,35 @@ blink::WebMouseWheelEvent WebMouseWheelEventBuilder::Build(
|
| // the point delta data instead, since we cannot distinguish trackpad data
|
| // from data from any other continuous device.
|
|
|
| - if (CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventIsContinuous)) {
|
| - result.deltaX = CGEventGetIntegerValueField(
|
| + int64_t pointDeltaX = CGEventGetIntegerValueField(
|
| cg_event, kCGScrollWheelEventPointDeltaAxis2);
|
| - result.deltaY = CGEventGetIntegerValueField(
|
| + int64_t pointDeltaY = CGEventGetIntegerValueField(
|
| cg_event, kCGScrollWheelEventPointDeltaAxis1);
|
| - result.wheelTicksX = result.deltaX / ui::kScrollbarPixelsPerCocoaTick;
|
| - result.wheelTicksY = result.deltaY / ui::kScrollbarPixelsPerCocoaTick;
|
| +
|
| + if (CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventIsContinuous)) {
|
| + result.deltaX = pointDeltaX;
|
| + result.deltaY = pointDeltaY;
|
| + result.wheelTicksX = pointDeltaX / ui::kScrollbarPixelsPerCocoaTick;
|
| + result.wheelTicksY = pointDeltaY / ui::kScrollbarPixelsPerCocoaTick;
|
| result.hasPreciseScrollingDeltas = true;
|
| } else {
|
| result.deltaX = [event deltaX] * ui::kScrollbarPixelsPerCocoaTick;
|
| result.deltaY = [event deltaY] * ui::kScrollbarPixelsPerCocoaTick;
|
| +
|
| + // A rounding bug on Sierra means that single-tick wheel scrolls may be
|
| + // truncated to zero. Prefer kCGScrollWheelEventPointDeltaAxisXY in those
|
| + // cases. However, kCGScrollWheelEventPointDeltaAxisXY has a "nasty bug"
|
| + // when holding Shift (see "Of Mice and Men", above). So only check vertical
|
| + // scrolls. Also, to be consistent with the values when truncation does NOT
|
| + // scroll, it needs to be multiplied by some factor. The documentation for
|
| + // CGEventSourceGetPixelsPerLine() says "By default, the scale is about ten
|
| + // pixels per line." However, the actual relationship is fuzzy because of
|
| + // acceleration. Using a constant of 10 for small values seems to "feel
|
| + // right" when this bug is encountered. See http://crbug.com/660773.
|
| + const float kPixelsPerLine = 10.0;
|
| + if (result.deltaY == 0 && pointDeltaY != 0)
|
| + result.deltaY = pointDeltaY * kPixelsPerLine;
|
| +
|
| result.wheelTicksY =
|
| CGEventGetIntegerValueField(cg_event, kCGScrollWheelEventDeltaAxis1);
|
| result.wheelTicksX =
|
|
|