@@ -1147,6 +1147,229 @@ void testMain() {
1147
1147
},
1148
1148
);
1149
1149
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
+
1150
1373
_testEach <_ButtonedEventMixin >(
1151
1374
< _ButtonedEventMixin > [
1152
1375
if (! isIosSafari) _PointerEventContext (),
@@ -2854,6 +3077,9 @@ mixin _ButtonedEventMixin on _BasicEventContext {
2854
3077
required double ? clientY,
2855
3078
required double ? deltaX,
2856
3079
required double ? deltaY,
3080
+ double ? wheelDeltaX,
3081
+ double ? wheelDeltaY,
3082
+ int ? timeStamp,
2857
3083
}) {
2858
3084
final Function jsWheelEvent = js_util.getProperty <Function >(domWindow, 'WheelEvent' );
2859
3085
final List <dynamic > eventArgs = < dynamic > [
@@ -2864,12 +3090,30 @@ mixin _ButtonedEventMixin on _BasicEventContext {
2864
3090
'clientY' : clientY,
2865
3091
'deltaX' : deltaX,
2866
3092
'deltaY' : deltaY,
3093
+ 'wheelDeltaX' : wheelDeltaX,
3094
+ 'wheelDeltaY' : wheelDeltaY,
2867
3095
}
2868
3096
];
2869
- return js_util.callConstructor <DomEvent >(
3097
+ final DomEvent event = js_util.callConstructor <DomEvent >(
2870
3098
jsWheelEvent,
2871
3099
js_util.jsify (eventArgs) as List <Object ?>,
2872
3100
);
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;
2873
3117
}
2874
3118
}
2875
3119
0 commit comments