fixes PointerEventConverter to handle malformed scrolling event (#118124)
* fixes PointerEventConverter to handle malformed scrolling event * update
This commit is contained in:
parent
458b298f98
commit
54405bfa38
@ -52,7 +52,7 @@ class PointerEventConverter {
|
||||
static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) {
|
||||
return data
|
||||
.where((ui.PointerData datum) => datum.signalKind != ui.PointerSignalKind.unknown)
|
||||
.map((ui.PointerData datum) {
|
||||
.map<PointerEvent?>((ui.PointerData datum) {
|
||||
final Offset position = Offset(datum.physicalX, datum.physicalY) / devicePixelRatio;
|
||||
final Offset delta = Offset(datum.physicalDeltaX, datum.physicalDeltaY) / devicePixelRatio;
|
||||
final double radiusMinor = _toLogicalPixels(datum.radiusMinor, devicePixelRatio);
|
||||
@ -247,6 +247,9 @@ class PointerEventConverter {
|
||||
);
|
||||
}
|
||||
case ui.PointerSignalKind.scroll:
|
||||
if (!datum.scrollDeltaX.isFinite || !datum.scrollDeltaY.isFinite || devicePixelRatio <= 0) {
|
||||
return null;
|
||||
}
|
||||
final Offset scrollDelta =
|
||||
Offset(datum.scrollDeltaX, datum.scrollDeltaY) / devicePixelRatio;
|
||||
return PointerScrollEvent(
|
||||
@ -280,7 +283,7 @@ class PointerEventConverter {
|
||||
// enumeration to PointerSignalKind.
|
||||
throw StateError('Unreachable');
|
||||
}
|
||||
});
|
||||
}).whereType<PointerEvent>();
|
||||
}
|
||||
|
||||
static double _toLogicalPixels(double physicalPixels, double devicePixelRatio) => physicalPixels / devicePixelRatio;
|
||||
|
@ -177,6 +177,47 @@ void main() {
|
||||
expect(events[4], isA<PointerHoverEvent>());
|
||||
});
|
||||
|
||||
test('Can handle malformed scrolling event.', () {
|
||||
ui.PointerDataPacket packet = const ui.PointerDataPacket(
|
||||
data: <ui.PointerData>[
|
||||
ui.PointerData(change: ui.PointerChange.add, device: 24),
|
||||
],
|
||||
);
|
||||
List<PointerEvent> events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
|
||||
|
||||
expect(events.length, 1);
|
||||
expect(events[0], isA<PointerAddedEvent>());
|
||||
|
||||
// Send packet contains malformed scroll events.
|
||||
packet = const ui.PointerDataPacket(
|
||||
data: <ui.PointerData>[
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.infinity, scrollDeltaY: 10),
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.nan, scrollDeltaY: 10),
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: double.negativeInfinity, scrollDeltaY: 10),
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.infinity, scrollDeltaX: 10),
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.nan, scrollDeltaX: 10),
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaY: double.negativeInfinity, scrollDeltaX: 10),
|
||||
],
|
||||
);
|
||||
events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
|
||||
expect(events.length, 0);
|
||||
|
||||
// Send packet with a valid scroll event.
|
||||
packet = const ui.PointerDataPacket(
|
||||
data: <ui.PointerData>[
|
||||
ui.PointerData(signalKind: ui.PointerSignalKind.scroll, device: 24, scrollDeltaX: 10, scrollDeltaY: 10),
|
||||
],
|
||||
);
|
||||
// Make sure PointerEventConverter can expand when device pixel ratio is valid.
|
||||
events = PointerEventConverter.expand(packet.data, GestureBinding.instance.window.devicePixelRatio).toList();
|
||||
expect(events.length, 1);
|
||||
expect(events[0], isA<PointerScrollEvent>());
|
||||
|
||||
// Make sure PointerEventConverter returns none when device pixel ratio is invalid.
|
||||
events = PointerEventConverter.expand(packet.data, 0).toList();
|
||||
expect(events.length, 0);
|
||||
});
|
||||
|
||||
test('Can expand pointer scroll events', () {
|
||||
const ui.PointerDataPacket packet = ui.PointerDataPacket(
|
||||
data: <ui.PointerData>[
|
||||
|
Loading…
x
Reference in New Issue
Block a user