@@ -1147,6 +1147,229 @@ void testMain() {
11471147 },
11481148 );
11491149
1150+ _testEach <_ButtonedEventMixin >(
1151+ < _ButtonedEventMixin > [
1152+ if (! isIosSafari) _PointerEventContext (),
1153+ if (! isIosSafari) _MouseEventContext (),
1154+ ],
1155+ 'does set pointer device kind based on delta precision and wheelDelta' ,
1156+ (_ButtonedEventMixin context) {
1157+ if (isFirefox) {
1158+ // Firefox does not support trackpad events, as they cannot be
1159+ // disambiguated from smoothed mouse wheel events.
1160+ return ;
1161+ }
1162+ PointerBinding .instance! .debugOverrideDetector (context);
1163+ final List <ui.PointerDataPacket > packets = < ui.PointerDataPacket > [];
1164+ ui.window.onPointerDataPacket = (ui.PointerDataPacket packet) {
1165+ packets.add (packet);
1166+ };
1167+
1168+ glassPane.dispatchEvent (context.wheel (
1169+ buttons: 0 ,
1170+ clientX: 10 ,
1171+ clientY: 10 ,
1172+ deltaX: 119 ,
1173+ deltaY: 119 ,
1174+ wheelDeltaX: - 357 ,
1175+ wheelDeltaY: - 357 ,
1176+ timeStamp: 0 ,
1177+ ));
1178+
1179+ glassPane.dispatchEvent (context.wheel (
1180+ buttons: 0 ,
1181+ clientX: 10 ,
1182+ clientY: 10 ,
1183+ deltaX: 120 ,
1184+ deltaY: 120 ,
1185+ wheelDeltaX: - 360 ,
1186+ wheelDeltaY: - 360 ,
1187+ timeStamp: 10 ,
1188+ ));
1189+
1190+ glassPane.dispatchEvent (context.wheel (
1191+ buttons: 0 ,
1192+ clientX: 10 ,
1193+ clientY: 10 ,
1194+ deltaX: 120 ,
1195+ deltaY: 120 ,
1196+ wheelDeltaX: - 360 ,
1197+ wheelDeltaY: - 360 ,
1198+ timeStamp: 20 ,
1199+ ));
1200+
1201+ glassPane.dispatchEvent (context.wheel (
1202+ buttons: 0 ,
1203+ clientX: 10 ,
1204+ clientY: 10 ,
1205+ deltaX: 119 ,
1206+ deltaY: 119 ,
1207+ wheelDeltaX: - 357 ,
1208+ wheelDeltaY: - 357 ,
1209+ timeStamp: 1000 ,
1210+ ));
1211+
1212+ glassPane.dispatchEvent (context.wheel (
1213+ buttons: 0 ,
1214+ clientX: 10 ,
1215+ clientY: 10 ,
1216+ deltaX: - 120 ,
1217+ deltaY: - 120 ,
1218+ wheelDeltaX: 360 ,
1219+ wheelDeltaY: 360 ,
1220+ timeStamp: 1010 ,
1221+ ));
1222+
1223+ glassPane.dispatchEvent (context.wheel (
1224+ buttons: 0 ,
1225+ clientX: 10 ,
1226+ clientY: 10 ,
1227+ deltaX: 0 ,
1228+ deltaY: - 120 ,
1229+ wheelDeltaX: 0 ,
1230+ wheelDeltaY: 360 ,
1231+ timeStamp: 2000 ,
1232+ ));
1233+
1234+ glassPane.dispatchEvent (context.wheel (
1235+ buttons: 0 ,
1236+ clientX: 10 ,
1237+ clientY: 10 ,
1238+ deltaX: 0 ,
1239+ deltaY: 40 ,
1240+ wheelDeltaX: 0 ,
1241+ wheelDeltaY: - 360 ,
1242+ timeStamp: 3000 ,
1243+ ));
1244+
1245+ expect (packets, hasLength (7 ));
1246+
1247+ // An add will be synthesized.
1248+ expect (packets[0 ].data, hasLength (2 ));
1249+ expect (packets[0 ].data[0 ].change, equals (ui.PointerChange .add));
1250+ expect (packets[0 ].data[0 ].pointerIdentifier, equals (0 ));
1251+ expect (packets[0 ].data[0 ].synthesized, isTrue);
1252+ expect (packets[0 ].data[0 ].physicalX, equals (10.0 * dpi));
1253+ expect (packets[0 ].data[0 ].physicalY, equals (10.0 * dpi));
1254+ expect (packets[0 ].data[0 ].physicalDeltaX, equals (0.0 ));
1255+ expect (packets[0 ].data[0 ].physicalDeltaY, equals (0.0 ));
1256+ // Because the delta is not in increments of 120 and has matching wheelDelta,
1257+ // it will be a trackpad event.
1258+ expect (packets[0 ].data[1 ].change, equals (ui.PointerChange .hover));
1259+ expect (
1260+ packets[0 ].data[1 ].signalKind, equals (ui.PointerSignalKind .scroll));
1261+ expect (
1262+ packets[0 ].data[1 ].kind, equals (ui.PointerDeviceKind .trackpad));
1263+ expect (packets[0 ].data[1 ].pointerIdentifier, equals (0 ));
1264+ expect (packets[0 ].data[1 ].synthesized, isFalse);
1265+ expect (packets[0 ].data[1 ].physicalX, equals (10.0 * dpi));
1266+ expect (packets[0 ].data[1 ].physicalY, equals (10.0 * dpi));
1267+ expect (packets[0 ].data[1 ].physicalDeltaX, equals (0.0 ));
1268+ expect (packets[0 ].data[1 ].physicalDeltaY, equals (0.0 ));
1269+ expect (packets[0 ].data[1 ].scrollDeltaX, equals (119.0 ));
1270+ expect (packets[0 ].data[1 ].scrollDeltaY, equals (119.0 ));
1271+
1272+ // Because the delta is in increments of 120, but is similar to the
1273+ // previous event, it will be a trackpad event.
1274+ expect (packets[1 ].data[0 ].change, equals (ui.PointerChange .hover));
1275+ expect (
1276+ packets[1 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1277+ expect (
1278+ packets[1 ].data[0 ].kind, equals (ui.PointerDeviceKind .trackpad));
1279+ expect (packets[1 ].data[0 ].pointerIdentifier, equals (0 ));
1280+ expect (packets[1 ].data[0 ].synthesized, isFalse);
1281+ expect (packets[1 ].data[0 ].physicalX, equals (10.0 * dpi));
1282+ expect (packets[1 ].data[0 ].physicalY, equals (10.0 * dpi));
1283+ expect (packets[1 ].data[0 ].physicalDeltaX, equals (0.0 ));
1284+ expect (packets[1 ].data[0 ].physicalDeltaY, equals (0.0 ));
1285+ expect (packets[1 ].data[0 ].scrollDeltaX, equals (120.0 ));
1286+ expect (packets[1 ].data[0 ].scrollDeltaY, equals (120.0 ));
1287+
1288+ // Because the delta is in increments of 120, but is again similar to the
1289+ // previous event, it will be a trackpad event.
1290+ expect (packets[2 ].data[0 ].change, equals (ui.PointerChange .hover));
1291+ expect (
1292+ packets[2 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1293+ expect (
1294+ packets[2 ].data[0 ].kind, equals (ui.PointerDeviceKind .trackpad));
1295+ expect (packets[2 ].data[0 ].pointerIdentifier, equals (0 ));
1296+ expect (packets[2 ].data[0 ].synthesized, isFalse);
1297+ expect (packets[2 ].data[0 ].physicalX, equals (10.0 * dpi));
1298+ expect (packets[2 ].data[0 ].physicalY, equals (10.0 * dpi));
1299+ expect (packets[2 ].data[0 ].physicalDeltaX, equals (0.0 ));
1300+ expect (packets[2 ].data[0 ].physicalDeltaY, equals (0.0 ));
1301+ expect (packets[2 ].data[0 ].scrollDeltaX, equals (120.0 ));
1302+ expect (packets[2 ].data[0 ].scrollDeltaY, equals (120.0 ));
1303+
1304+ // Because the delta is not in increments of 120 and has matching wheelDelta,
1305+ // it will be a trackpad event.
1306+ expect (packets[3 ].data[0 ].change, equals (ui.PointerChange .hover));
1307+ expect (
1308+ packets[3 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1309+ expect (
1310+ packets[3 ].data[0 ].kind, equals (ui.PointerDeviceKind .trackpad));
1311+ expect (packets[3 ].data[0 ].pointerIdentifier, equals (0 ));
1312+ expect (packets[3 ].data[0 ].synthesized, isFalse);
1313+ expect (packets[3 ].data[0 ].physicalX, equals (10.0 * dpi));
1314+ expect (packets[3 ].data[0 ].physicalY, equals (10.0 * dpi));
1315+ expect (packets[3 ].data[0 ].physicalDeltaX, equals (0.0 ));
1316+ expect (packets[3 ].data[0 ].physicalDeltaY, equals (0.0 ));
1317+ expect (packets[3 ].data[0 ].scrollDeltaX, equals (119.0 ));
1318+ expect (packets[3 ].data[0 ].scrollDeltaY, equals (119.0 ));
1319+
1320+ // Because the delta is in increments of 120, and is not similar to the
1321+ // previous event, but occured soon after the previous event, it will be
1322+ // a trackpad event.
1323+ expect (packets[4 ].data[0 ].change, equals (ui.PointerChange .hover));
1324+ expect (
1325+ packets[4 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1326+ expect (
1327+ packets[4 ].data[0 ].kind, equals (ui.PointerDeviceKind .trackpad));
1328+ expect (packets[4 ].data[0 ].pointerIdentifier, equals (0 ));
1329+ expect (packets[4 ].data[0 ].synthesized, isFalse);
1330+ expect (packets[4 ].data[0 ].physicalX, equals (10.0 * dpi));
1331+ expect (packets[4 ].data[0 ].physicalY, equals (10.0 * dpi));
1332+ expect (packets[4 ].data[0 ].physicalDeltaX, equals (0.0 ));
1333+ expect (packets[4 ].data[0 ].physicalDeltaY, equals (0.0 ));
1334+ expect (packets[4 ].data[0 ].scrollDeltaX, equals (- 120.0 ));
1335+ expect (packets[4 ].data[0 ].scrollDeltaY, equals (- 120.0 ));
1336+
1337+ // Because the delta is in increments of 120, and is not similar to
1338+ // the previous event, and occured long after the previous event, it will be a mouse event.
1339+ expect (packets[5 ].data, hasLength (1 ));
1340+ expect (packets[5 ].data[0 ].change, equals (ui.PointerChange .hover));
1341+ expect (
1342+ packets[5 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1343+ expect (
1344+ packets[5 ].data[0 ].kind, equals (ui.PointerDeviceKind .mouse));
1345+ expect (packets[5 ].data[0 ].pointerIdentifier, equals (0 ));
1346+ expect (packets[5 ].data[0 ].synthesized, isFalse);
1347+ expect (packets[5 ].data[0 ].physicalX, equals (10.0 * dpi));
1348+ expect (packets[5 ].data[0 ].physicalY, equals (10.0 * dpi));
1349+ expect (packets[5 ].data[0 ].physicalDeltaX, equals (0.0 ));
1350+ expect (packets[5 ].data[0 ].physicalDeltaY, equals (0.0 ));
1351+ expect (packets[5 ].data[0 ].scrollDeltaX, equals (0.0 ));
1352+ expect (packets[5 ].data[0 ].scrollDeltaY, equals (- 120.0 ));
1353+
1354+ // Because the delta is not in increments of 120 and has non-matching
1355+ // wheelDelta, it will be a mouse event.
1356+ expect (packets[6 ].data, hasLength (1 ));
1357+ expect (packets[6 ].data[0 ].change, equals (ui.PointerChange .hover));
1358+ expect (
1359+ packets[6 ].data[0 ].signalKind, equals (ui.PointerSignalKind .scroll));
1360+ expect (
1361+ packets[6 ].data[0 ].kind, equals (ui.PointerDeviceKind .mouse));
1362+ expect (packets[6 ].data[0 ].pointerIdentifier, equals (0 ));
1363+ expect (packets[6 ].data[0 ].synthesized, isFalse);
1364+ expect (packets[6 ].data[0 ].physicalX, equals (10.0 * dpi));
1365+ expect (packets[6 ].data[0 ].physicalY, equals (10.0 * dpi));
1366+ expect (packets[6 ].data[0 ].physicalDeltaX, equals (0.0 ));
1367+ expect (packets[6 ].data[0 ].physicalDeltaY, equals (0.0 ));
1368+ expect (packets[6 ].data[0 ].scrollDeltaX, equals (0.0 ));
1369+ expect (packets[6 ].data[0 ].scrollDeltaY, equals (40.0 ));
1370+ },
1371+ );
1372+
11501373 _testEach <_ButtonedEventMixin >(
11511374 < _ButtonedEventMixin > [
11521375 if (! isIosSafari) _PointerEventContext (),
@@ -2854,6 +3077,9 @@ mixin _ButtonedEventMixin on _BasicEventContext {
28543077 required double ? clientY,
28553078 required double ? deltaX,
28563079 required double ? deltaY,
3080+ double ? wheelDeltaX,
3081+ double ? wheelDeltaY,
3082+ int ? timeStamp,
28573083 }) {
28583084 final Function jsWheelEvent = js_util.getProperty <Function >(domWindow, 'WheelEvent' );
28593085 final List <dynamic > eventArgs = < dynamic > [
@@ -2864,12 +3090,30 @@ mixin _ButtonedEventMixin on _BasicEventContext {
28643090 'clientY' : clientY,
28653091 'deltaX' : deltaX,
28663092 'deltaY' : deltaY,
3093+ 'wheelDeltaX' : wheelDeltaX,
3094+ 'wheelDeltaY' : wheelDeltaY,
28673095 }
28683096 ];
2869- return js_util.callConstructor <DomEvent >(
3097+ final DomEvent event = js_util.callConstructor <DomEvent >(
28703098 jsWheelEvent,
28713099 js_util.jsify (eventArgs) as List <Object ?>,
28723100 );
3101+ // timeStamp can't be set in the constructor, need to override the getter.
3102+ if (timeStamp != null ) {
3103+ js_util.callMethod (
3104+ objectConstructor,
3105+ 'defineProperty' ,
3106+ < dynamic > [
3107+ event,
3108+ 'timeStamp' ,
3109+ js_util.jsify (< String , dynamic > {
3110+ 'value' : timeStamp,
3111+ 'configurable' : true
3112+ })
3113+ ]
3114+ );
3115+ }
3116+ return event;
28733117 }
28743118}
28753119
0 commit comments