Unverified Commit 314eb3ba authored by chunhtai's avatar chunhtai Committed by GitHub

Moving pointer event sanitizing to engine. (#44217)

parent f8cafd9d
...@@ -4,42 +4,8 @@ ...@@ -4,42 +4,8 @@
import 'dart:ui' as ui show PointerData, PointerChange, PointerSignalKind; import 'dart:ui' as ui show PointerData, PointerChange, PointerSignalKind;
import 'package:flutter/foundation.dart' show visibleForTesting;
import 'events.dart'; import 'events.dart';
class _PointerState {
_PointerState(this.lastPosition);
int get pointer => _pointer; // The identifier used in PointerEvent objects.
int _pointer;
static int _pointerCount = 0;
void startNewPointer() {
_pointerCount += 1;
_pointer = _pointerCount;
}
bool get down => _down;
bool _down = false;
void setDown() {
assert(!_down);
_down = true;
}
void setUp() {
assert(_down);
_down = false;
}
Offset lastPosition;
Offset deltaTo(Offset to) => to - lastPosition;
@override
String toString() {
return '_PointerState(pointer: $pointer, down: $down, lastPosition: $lastPosition)';
}
}
// Add `kPrimaryButton` to [buttons] when a pointer of certain devices is down. // Add `kPrimaryButton` to [buttons] when a pointer of certain devices is down.
// //
// TODO(tongmu): This patch is supposed to be done by embedders. Patching it // TODO(tongmu): This patch is supposed to be done by embedders. Patching it
...@@ -68,25 +34,6 @@ int _synthesiseDownButtons(int buttons, PointerDeviceKind kind) { ...@@ -68,25 +34,6 @@ int _synthesiseDownButtons(int buttons, PointerDeviceKind kind) {
class PointerEventConverter { class PointerEventConverter {
PointerEventConverter._(); PointerEventConverter._();
/// Clears internal state mapping platform pointer identifiers to
/// [PointerEvent] pointer identifiers.
///
/// Visible only so that tests can reset the global state contained in
/// [PointerEventConverter].
@visibleForTesting
static void clearPointers() => _pointers.clear();
// Map from platform pointer identifiers to PointerEvent pointer identifiers.
// Static to guarantee that pointers are unique.
static final Map<int, _PointerState> _pointers = <int, _PointerState>{};
static _PointerState _ensureStateForPointer(ui.PointerData datum, Offset position) {
return _pointers.putIfAbsent(
datum.device,
() => _PointerState(position),
);
}
/// Expand the given packet of pointer data into a sequence of framework /// Expand the given packet of pointer data into a sequence of framework
/// pointer events. /// pointer events.
/// ///
...@@ -97,6 +44,7 @@ class PointerEventConverter { ...@@ -97,6 +44,7 @@ class PointerEventConverter {
static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) sync* { static Iterable<PointerEvent> expand(Iterable<ui.PointerData> data, double devicePixelRatio) sync* {
for (ui.PointerData datum in data) { for (ui.PointerData datum in data) {
final Offset position = Offset(datum.physicalX, datum.physicalY) / devicePixelRatio; 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); final double radiusMinor = _toLogicalPixels(datum.radiusMinor, devicePixelRatio);
final double radiusMajor = _toLogicalPixels(datum.radiusMajor, devicePixelRatio); final double radiusMajor = _toLogicalPixels(datum.radiusMajor, devicePixelRatio);
final double radiusMin = _toLogicalPixels(datum.radiusMin, devicePixelRatio); final double radiusMin = _toLogicalPixels(datum.radiusMin, devicePixelRatio);
...@@ -107,9 +55,6 @@ class PointerEventConverter { ...@@ -107,9 +55,6 @@ class PointerEventConverter {
if (datum.signalKind == null || datum.signalKind == ui.PointerSignalKind.none) { if (datum.signalKind == null || datum.signalKind == ui.PointerSignalKind.none) {
switch (datum.change) { switch (datum.change) {
case ui.PointerChange.add: case ui.PointerChange.add:
assert(!_pointers.containsKey(datum.device));
final _PointerState state = _ensureStateForPointer(datum, position);
assert(state.lastPosition == position);
yield PointerAddedEvent( yield PointerAddedEvent(
timeStamp: timeStamp, timeStamp: timeStamp,
kind: kind, kind: kind,
...@@ -127,33 +72,12 @@ class PointerEventConverter { ...@@ -127,33 +72,12 @@ class PointerEventConverter {
); );
break; break;
case ui.PointerChange.hover: case ui.PointerChange.hover:
final bool alreadyAdded = _pointers.containsKey(datum.device);
final _PointerState state = _ensureStateForPointer(datum, position);
assert(!state.down);
if (!alreadyAdded) {
assert(state.lastPosition == position);
yield PointerAddedEvent(
timeStamp: timeStamp,
kind: kind,
device: datum.device,
position: position,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
}
yield PointerHoverEvent( yield PointerHoverEvent(
timeStamp: timeStamp, timeStamp: timeStamp,
kind: kind, kind: kind,
device: datum.device, device: datum.device,
position: position, position: position,
delta: state.deltaTo(position), delta: delta,
buttons: datum.buttons, buttons: datum.buttons,
obscured: datum.obscured, obscured: datum.obscured,
pressureMin: datum.pressureMin, pressureMin: datum.pressureMin,
...@@ -167,63 +91,13 @@ class PointerEventConverter { ...@@ -167,63 +91,13 @@ class PointerEventConverter {
radiusMax: radiusMax, radiusMax: radiusMax,
orientation: datum.orientation, orientation: datum.orientation,
tilt: datum.tilt, tilt: datum.tilt,
synthesized: datum.synthesized,
); );
state.lastPosition = position;
break; break;
case ui.PointerChange.down: case ui.PointerChange.down:
final bool alreadyAdded = _pointers.containsKey(datum.device);
final _PointerState state = _ensureStateForPointer(datum, position);
assert(!state.down);
if (!alreadyAdded) {
assert(state.lastPosition == position);
yield PointerAddedEvent(
timeStamp: timeStamp,
kind: kind,
device: datum.device,
position: position,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
}
if (state.lastPosition != position) {
// Not all sources of pointer packets respect the invariant that
// they hover the pointer to the down location before sending the
// down event. We restore the invariant here for our clients.
yield PointerHoverEvent(
timeStamp: timeStamp,
kind: kind,
device: datum.device,
position: position,
delta: state.deltaTo(position),
buttons: datum.buttons,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
);
state.lastPosition = position;
}
state.startNewPointer();
state.setDown();
yield PointerDownEvent( yield PointerDownEvent(
timeStamp: timeStamp, timeStamp: timeStamp,
pointer: state.pointer, pointer: datum.pointerIdentifier,
kind: kind, kind: kind,
device: datum.device, device: datum.device,
position: position, position: position,
...@@ -243,19 +117,13 @@ class PointerEventConverter { ...@@ -243,19 +117,13 @@ class PointerEventConverter {
); );
break; break;
case ui.PointerChange.move: case ui.PointerChange.move:
// If the service starts supporting hover pointers, then it must also
// start sending us ADDED and REMOVED data points.
// See also: https://github.com/flutter/flutter/issues/720
assert(_pointers.containsKey(datum.device));
final _PointerState state = _pointers[datum.device];
assert(state.down);
yield PointerMoveEvent( yield PointerMoveEvent(
timeStamp: timeStamp, timeStamp: timeStamp,
pointer: state.pointer, pointer: datum.pointerIdentifier,
kind: kind, kind: kind,
device: datum.device, device: datum.device,
position: position, position: position,
delta: state.deltaTo(position), delta: delta,
buttons: _synthesiseDownButtons(datum.buttons, kind), buttons: _synthesiseDownButtons(datum.buttons, kind),
obscured: datum.obscured, obscured: datum.obscured,
pressure: datum.pressure, pressure: datum.pressure,
...@@ -270,140 +138,55 @@ class PointerEventConverter { ...@@ -270,140 +138,55 @@ class PointerEventConverter {
orientation: datum.orientation, orientation: datum.orientation,
tilt: datum.tilt, tilt: datum.tilt,
platformData: datum.platformData, platformData: datum.platformData,
synthesized: datum.synthesized,
); );
state.lastPosition = position;
break; break;
case ui.PointerChange.up: case ui.PointerChange.up:
yield PointerUpEvent(
timeStamp: timeStamp,
pointer: datum.pointerIdentifier,
kind: kind,
device: datum.device,
position: position,
buttons: datum.buttons,
obscured: datum.obscured,
pressure: datum.pressure,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
break;
case ui.PointerChange.cancel: case ui.PointerChange.cancel:
assert(_pointers.containsKey(datum.device)); yield PointerCancelEvent(
final _PointerState state = _pointers[datum.device]; timeStamp: timeStamp,
assert(state.down); pointer: datum.pointerIdentifier,
if (position != state.lastPosition) { kind: kind,
// Not all sources of pointer packets respect the invariant that device: datum.device,
// they move the pointer to the up location before sending the up position: position,
// event. For example, in the iOS simulator, of you drag outside the buttons: datum.buttons,
// window, you'll get a stream of pointers that violates that obscured: datum.obscured,
// invariant. We restore the invariant here for our clients. pressureMin: datum.pressureMin,
yield PointerMoveEvent( pressureMax: datum.pressureMax,
timeStamp: timeStamp, distance: datum.distance,
pointer: state.pointer, distanceMax: datum.distanceMax,
kind: kind, size: datum.size,
device: datum.device, radiusMajor: radiusMajor,
position: position, radiusMinor: radiusMinor,
delta: state.deltaTo(position), radiusMin: radiusMin,
buttons: _synthesiseDownButtons(datum.buttons, kind), radiusMax: radiusMax,
obscured: datum.obscured, orientation: datum.orientation,
pressure: datum.pressure, tilt: datum.tilt,
pressureMin: datum.pressureMin, );
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
);
state.lastPosition = position;
}
assert(position == state.lastPosition);
state.setUp();
if (datum.change == ui.PointerChange.up) {
yield PointerUpEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
device: datum.device,
position: position,
buttons: datum.buttons,
obscured: datum.obscured,
pressure: datum.pressure,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
} else {
yield PointerCancelEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
device: datum.device,
position: position,
buttons: datum.buttons,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
}
break; break;
case ui.PointerChange.remove: case ui.PointerChange.remove:
assert(_pointers.containsKey(datum.device));
final _PointerState state = _pointers[datum.device];
if (state.down) {
yield PointerCancelEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
device: datum.device,
position: state.lastPosition, // Change position in Hover
buttons: datum.buttons,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
);
}
if (position != state.lastPosition) {
yield PointerHoverEvent(
timeStamp: timeStamp,
kind: kind,
device: datum.device,
position: position,
delta: state.deltaTo(position),
buttons: datum.buttons,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
);
}
_pointers.remove(datum.device);
yield PointerRemovedEvent( yield PointerRemovedEvent(
timeStamp: timeStamp, timeStamp: timeStamp,
kind: kind, kind: kind,
...@@ -421,62 +204,6 @@ class PointerEventConverter { ...@@ -421,62 +204,6 @@ class PointerEventConverter {
} else { } else {
switch (datum.signalKind) { switch (datum.signalKind) {
case ui.PointerSignalKind.scroll: case ui.PointerSignalKind.scroll:
// Devices must be added before they send scroll events.
assert(_pointers.containsKey(datum.device));
final _PointerState state = _ensureStateForPointer(datum, position);
if (state.lastPosition != position) {
// Synthesize a hover/move of the pointer to the scroll location
// before sending the scroll event, if necessary, so that clients
// don't have to worry about native ordering of hover and scroll
// events.
if (state.down) {
yield PointerMoveEvent(
timeStamp: timeStamp,
pointer: state.pointer,
kind: kind,
device: datum.device,
position: position,
delta: state.deltaTo(position),
buttons: _synthesiseDownButtons(datum.buttons, kind),
obscured: datum.obscured,
pressure: datum.pressure,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
);
} else {
yield PointerHoverEvent(
timeStamp: timeStamp,
kind: kind,
device: datum.device,
position: position,
delta: state.deltaTo(position),
buttons: datum.buttons,
obscured: datum.obscured,
pressureMin: datum.pressureMin,
pressureMax: datum.pressureMax,
distance: datum.distance,
distanceMax: datum.distanceMax,
size: datum.size,
radiusMajor: radiusMajor,
radiusMinor: radiusMinor,
radiusMin: radiusMin,
radiusMax: radiusMax,
orientation: datum.orientation,
tilt: datum.tilt,
synthesized: true,
);
}
state.lastPosition = position;
}
final Offset scrollDelta = final Offset scrollDelta =
Offset(datum.scrollDeltaX, datum.scrollDeltaY) / devicePixelRatio; Offset(datum.scrollDeltaX, datum.scrollDeltaY) / devicePixelRatio;
yield PointerScrollEvent( yield PointerScrollEvent(
......
...@@ -26,7 +26,6 @@ TestGestureFlutterBinding _binding = TestGestureFlutterBinding(); ...@@ -26,7 +26,6 @@ TestGestureFlutterBinding _binding = TestGestureFlutterBinding();
void ensureTestGestureBinding() { void ensureTestGestureBinding() {
_binding ??= TestGestureFlutterBinding(); _binding ??= TestGestureFlutterBinding();
PointerEventConverter.clearPointers();
assert(GestureBinding.instance != null); assert(GestureBinding.instance != null);
} }
...@@ -72,9 +71,11 @@ void main() { ...@@ -72,9 +71,11 @@ void main() {
test('Pointer hover events', () { test('Pointer hover events', () {
const ui.PointerDataPacket packet = ui.PointerDataPacket( const ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[ data: <ui.PointerData>[
ui.PointerData(change: ui.PointerChange.add),
ui.PointerData(change: ui.PointerChange.hover), ui.PointerData(change: ui.PointerChange.hover),
ui.PointerData(change: ui.PointerChange.hover), ui.PointerData(change: ui.PointerChange.hover),
ui.PointerData(change: ui.PointerChange.remove), ui.PointerData(change: ui.PointerChange.remove),
ui.PointerData(change: ui.PointerChange.add),
ui.PointerData(change: ui.PointerChange.hover), ui.PointerData(change: ui.PointerChange.hover),
], ],
); );
...@@ -97,33 +98,6 @@ void main() { ...@@ -97,33 +98,6 @@ void main() {
expect(pointerRouterEvents[5].runtimeType, equals(PointerHoverEvent)); expect(pointerRouterEvents[5].runtimeType, equals(PointerHoverEvent));
}); });
test('Synthetic move events', () {
final ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[
ui.PointerData(
change: ui.PointerChange.down,
physicalX: 1.0 * ui.window.devicePixelRatio,
physicalY: 3.0 * ui.window.devicePixelRatio,
),
ui.PointerData(
change: ui.PointerChange.up,
physicalX: 10.0 * ui.window.devicePixelRatio,
physicalY: 15.0 * ui.window.devicePixelRatio,
),
],
);
final List<PointerEvent> events = <PointerEvent>[];
_binding.callback = events.add;
ui.window.onPointerDataPacket(packet);
expect(events.length, 3);
expect(events[0].runtimeType, equals(PointerDownEvent));
expect(events[1].runtimeType, equals(PointerMoveEvent));
expect(events[1].delta, equals(const Offset(9.0, 12.0)));
expect(events[2].runtimeType, equals(PointerUpEvent));
});
test('Pointer cancel events', () { test('Pointer cancel events', () {
const ui.PointerDataPacket packet = ui.PointerDataPacket( const ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[ data: <ui.PointerData>[
...@@ -168,6 +142,7 @@ void main() { ...@@ -168,6 +142,7 @@ void main() {
ui.PointerData(change: ui.PointerChange.add, device: 24), ui.PointerData(change: ui.PointerChange.add, device: 24),
ui.PointerData(change: ui.PointerChange.hover, device: 24), ui.PointerData(change: ui.PointerChange.hover, device: 24),
ui.PointerData(change: ui.PointerChange.remove, device: 24), ui.PointerData(change: ui.PointerChange.remove, device: 24),
ui.PointerData(change: ui.PointerChange.add, device: 24),
ui.PointerData(change: ui.PointerChange.hover, device: 24), ui.PointerData(change: ui.PointerChange.hover, device: 24),
], ],
); );
...@@ -183,28 +158,6 @@ void main() { ...@@ -183,28 +158,6 @@ void main() {
expect(events[4].runtimeType, equals(PointerHoverEvent)); expect(events[4].runtimeType, equals(PointerHoverEvent));
}); });
test('Synthetic hover and cancel for misplaced down and remove', () {
final ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[
ui.PointerData(change: ui.PointerChange.add, device: 25, physicalX: 10.0 * ui.window.devicePixelRatio, physicalY: 10.0 * ui.window.devicePixelRatio),
ui.PointerData(change: ui.PointerChange.down, device: 25, physicalX: 15.0 * ui.window.devicePixelRatio, physicalY: 17.0 * ui.window.devicePixelRatio),
const ui.PointerData(change: ui.PointerChange.remove, device: 25),
],
);
final List<PointerEvent> events = PointerEventConverter.expand(
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 6);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[1].runtimeType, equals(PointerHoverEvent));
expect(events[1].delta, equals(const Offset(5.0, 7.0)));
expect(events[2].runtimeType, equals(PointerDownEvent));
expect(events[3].runtimeType, equals(PointerCancelEvent));
expect(events[4].runtimeType, equals(PointerHoverEvent));
expect(events[5].runtimeType, equals(PointerRemovedEvent));
});
test('Can expand pointer scroll events', () { test('Can expand pointer scroll events', () {
const ui.PointerDataPacket packet = ui.PointerDataPacket( const ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[ data: <ui.PointerData>[
...@@ -221,36 +174,6 @@ void main() { ...@@ -221,36 +174,6 @@ void main() {
expect(events[1].runtimeType, equals(PointerScrollEvent)); expect(events[1].runtimeType, equals(PointerScrollEvent));
}); });
test('Synthetic hover/move for misplaced scrolls', () {
final Offset lastLocation = const Offset(10.0, 10.0) * ui.window.devicePixelRatio;
const Offset unexpectedOffset = Offset(5.0, 7.0);
final Offset scrollLocation = lastLocation + unexpectedOffset * ui.window.devicePixelRatio;
final ui.PointerDataPacket packet = ui.PointerDataPacket(
data: <ui.PointerData>[
ui.PointerData(change: ui.PointerChange.add, physicalX: lastLocation.dx, physicalY: lastLocation.dy),
ui.PointerData(change: ui.PointerChange.hover, physicalX: scrollLocation.dx, physicalY: scrollLocation.dy, signalKind: ui.PointerSignalKind.scroll),
// Move back to starting location, click, and repeat to test mouse-down version.
ui.PointerData(change: ui.PointerChange.hover, physicalX: lastLocation.dx, physicalY: lastLocation.dy),
ui.PointerData(change: ui.PointerChange.down, physicalX: lastLocation.dx, physicalY: lastLocation.dy),
ui.PointerData(change: ui.PointerChange.hover, physicalX: scrollLocation.dx, physicalY: scrollLocation.dy, signalKind: ui.PointerSignalKind.scroll),
],
);
final List<PointerEvent> events = PointerEventConverter.expand(
packet.data, ui.window.devicePixelRatio).toList();
expect(events.length, 7);
expect(events[0].runtimeType, equals(PointerAddedEvent));
expect(events[1].runtimeType, equals(PointerHoverEvent));
expect(events[1].delta, equals(unexpectedOffset));
expect(events[2].runtimeType, equals(PointerScrollEvent));
expect(events[3].runtimeType, equals(PointerHoverEvent));
expect(events[4].runtimeType, equals(PointerDownEvent));
expect(events[5].runtimeType, equals(PointerMoveEvent));
expect(events[5].delta, equals(unexpectedOffset));
expect(events[6].runtimeType, equals(PointerScrollEvent));
});
test('Should synthesize kPrimaryButton for touch', () { test('Should synthesize kPrimaryButton for touch', () {
final Offset location = const Offset(10.0, 10.0) * ui.window.devicePixelRatio; final Offset location = const Offset(10.0, 10.0) * ui.window.devicePixelRatio;
const PointerDeviceKind kind = PointerDeviceKind.touch; const PointerDeviceKind kind = PointerDeviceKind.touch;
...@@ -278,8 +201,6 @@ void main() { ...@@ -278,8 +201,6 @@ void main() {
expect(events[3].buttons, equals(kPrimaryButton)); expect(events[3].buttons, equals(kPrimaryButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4].runtimeType, equals(PointerUpEvent));
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
PointerEventConverter.clearPointers();
}); });
test('Should synthesize kPrimaryButton for stylus', () { test('Should synthesize kPrimaryButton for stylus', () {
...@@ -313,8 +234,6 @@ void main() { ...@@ -313,8 +234,6 @@ void main() {
expect(events[3].buttons, equals(kPrimaryButton | kSecondaryStylusButton)); expect(events[3].buttons, equals(kPrimaryButton | kSecondaryStylusButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4].runtimeType, equals(PointerUpEvent));
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
PointerEventConverter.clearPointers();
} }
}); });
...@@ -345,8 +264,6 @@ void main() { ...@@ -345,8 +264,6 @@ void main() {
expect(events[3].buttons, equals(kPrimaryButton)); expect(events[3].buttons, equals(kPrimaryButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4].runtimeType, equals(PointerUpEvent));
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
PointerEventConverter.clearPointers();
}); });
test('Should not synthesize kPrimaryButton for mouse', () { test('Should not synthesize kPrimaryButton for mouse', () {
...@@ -378,8 +295,6 @@ void main() { ...@@ -378,8 +295,6 @@ void main() {
expect(events[3].buttons, equals(kMiddleMouseButton | kSecondaryMouseButton)); expect(events[3].buttons, equals(kMiddleMouseButton | kSecondaryMouseButton));
expect(events[4].runtimeType, equals(PointerUpEvent)); expect(events[4].runtimeType, equals(PointerUpEvent));
expect(events[4].buttons, equals(0)); expect(events[4].buttons, equals(0));
PointerEventConverter.clearPointers();
} }
}); });
} }
...@@ -77,7 +77,6 @@ void main() { ...@@ -77,7 +77,6 @@ void main() {
setUp(() { setUp(() {
_ensureTestGestureBinding(); _ensureTestGestureBinding();
_binding.postFrameCallbacks.clear(); _binding.postFrameCallbacks.clear();
PointerEventConverter.clearPointers();
}); });
test('MouseTrackerAnnotation has correct toString', () { test('MouseTrackerAnnotation has correct toString', () {
...@@ -134,11 +133,10 @@ void main() { ...@@ -134,11 +133,10 @@ void main() {
// Remove // Remove
ui.window.onPointerDataPacket(ui.PointerDataPacket(data: <ui.PointerData>[ ui.window.onPointerDataPacket(ui.PointerDataPacket(data: <ui.PointerData>[
_pointerData(PointerChange.remove, const Offset(1.0, 201.0)), _pointerData(PointerChange.remove, const Offset(1.0, 101.0)),
])); ]));
expect(events, _equalToEventsOnCriticalFields(<PointerEvent>[ expect(events, _equalToEventsOnCriticalFields(<PointerEvent>[
const PointerHoverEvent(position: Offset(1.0, 201.0)), const PointerExitEvent(position: Offset(1.0, 101.0)),
const PointerExitEvent(position: Offset(1.0, 201.0)),
])); ]));
expect(listenerLogs, <bool>[false]); expect(listenerLogs, <bool>[false]);
events.clear(); events.clear();
...@@ -286,12 +284,12 @@ void main() { ...@@ -286,12 +284,12 @@ void main() {
_setUpWithOneAnnotation(logEvents: events); _setUpWithOneAnnotation(logEvents: events);
ui.window.onPointerDataPacket(ui.PointerDataPacket(data: <ui.PointerData>[ ui.window.onPointerDataPacket(ui.PointerDataPacket(data: <ui.PointerData>[
_pointerData(PointerChange.add, const Offset(0.0, 101.0)),
_pointerData(PointerChange.down, const Offset(0.0, 101.0)), _pointerData(PointerChange.down, const Offset(0.0, 101.0)),
])); ]));
expect(events, _equalToEventsOnCriticalFields(<PointerEvent>[ expect(events, _equalToEventsOnCriticalFields(<PointerEvent>[
// This Enter event is triggered by the [PointerAddedEvent] that was // This Enter event is triggered by the [PointerAddedEvent] The
// synthesized during the event normalization of pointer event converter. // [PointerDownEvent] is ignored by [MouseTracker].
// The [PointerDownEvent] is ignored by [MouseTracker].
const PointerEnterEvent(position: Offset(0.0, 101.0)), const PointerEnterEvent(position: Offset(0.0, 101.0)),
])); ]));
events.clear(); events.clear();
......
...@@ -808,8 +808,6 @@ abstract class TestWidgetsFlutterBinding extends BindingBase ...@@ -808,8 +808,6 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
'active mouse gesture to remove the mouse pointer.'); 'active mouse gesture to remove the mouse pointer.');
// ignore: invalid_use_of_visible_for_testing_member // ignore: invalid_use_of_visible_for_testing_member
RendererBinding.instance.initMouseTracker(); RendererBinding.instance.initMouseTracker();
// ignore: invalid_use_of_visible_for_testing_member
PointerEventConverter.clearPointers();
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment