Skip to content
This repository was archived by the owner on Feb 22, 2023. It is now read-only.

Commit 54405bf

Browse files
authored
fixes PointerEventConverter to handle malformed scrolling event (#118124)
* fixes PointerEventConverter to handle malformed scrolling event * update
1 parent 458b298 commit 54405bf

File tree

2 files changed

+46
-2
lines changed

2 files changed

+46
-2
lines changed

packages/flutter/lib/src/gestures/converter.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ class PointerEventConverter {
5252
static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) {
5353
return data
5454
.where((ui.PointerData datum) => datum.signalKind != ui.PointerSignalKind.unknown)
55-
.map((ui.PointerData datum) {
55+
.map<PointerEvent?>((ui.PointerData datum) {
5656
final Offset position = Offset(datum.physicalX, datum.physicalY) / devicePixelRatio;
5757
final Offset delta = Offset(datum.physicalDeltaX, datum.physicalDeltaY) / devicePixelRatio;
5858
final double radiusMinor = _toLogicalPixels(datum.radiusMinor, devicePixelRatio);
@@ -247,6 +247,9 @@ class PointerEventConverter {
247247
);
248248
}
249249
case ui.PointerSignalKind.scroll:
250+
if (!datum.scrollDeltaX.isFinite || !datum.scrollDeltaY.isFinite || devicePixelRatio <= 0) {
251+
return null;
252+
}
250253
final Offset scrollDelta =
251254
Offset(datum.scrollDeltaX, datum.scrollDeltaY) / devicePixelRatio;
252255
return PointerScrollEvent(
@@ -280,7 +283,7 @@ class PointerEventConverter {
280283
// enumeration to PointerSignalKind.
281284
throw StateError('Unreachable');
282285
}
283-
});
286+
}).whereType<PointerEvent>();
284287
}
285288

286289
static double _toLogicalPixels(double physicalPixels, double devicePixelRatio) => physicalPixels / devicePixelRatio;

packages/flutter/test/gestures/gesture_binding_test.dart

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,47 @@ void main() {
177177
expect(events[4], isA<PointerHoverEvent>());
178178
});
179179

180+
test('Can handle malformed scrolling event.', () {
181+
ui.PointerDataPacket packet = const ui.PointerDataPacket(
182+
data: <ui.PointerData>[
183+
ui.PointerData(change: ui.PointerChange.add, device: 24),
184+
],
185+
);
186+
List<PointerEvent> events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
187+
188+
expect(events.length, 1);
189+
expect(events[0], isA<PointerAddedEvent>());
190+
191+
// Send packet contains malformed scroll events.
192+
packet = const ui.PointerDataPacket(
193+
data: <ui.PointerData>[
194+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.infinity, scrollDeltaY: 10),
195+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.nan, scrollDeltaY: 10),
196+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.negativeInfinity, scrollDeltaY: 10),
197+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.infinity, scrollDeltaX: 10),
198+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.nan, scrollDeltaX: 10),
199+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.negativeInfinity, scrollDeltaX: 10),
200+
],
201+
);
202+
events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
203+
expect(events.length, 0);
204+
205+
// Send packet with a valid scroll event.
206+
packet = const ui.PointerDataPacket(
207+
data: <ui.PointerData>[
208+
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: 10, scrollDeltaY: 10),
209+
],
210+
);
211+
// Make sure PointerEventConverter can expand when device pixel ratio is valid.
212+
events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
213+
expect(events.length, 1);
214+
expect(events[0], isA<PointerScrollEvent>());
215+
216+
// Make sure PointerEventConverter returns none when device pixel ratio is invalid.
217+
events = PointerEventConverter.expand(packet.data, 0).toList();
218+
expect(events.length, 0);
219+
});
220+
180221
test('Can expand pointer scroll events', () {
181222
const ui.PointerDataPacket packet = ui.PointerDataPacket(
182223
data: <ui.PointerData>[

0 commit comments

Comments
 (0)