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

Commit f32d290

Browse files
authored
Add DOM TouchEvent modifiers accessors (#36836)
1 parent d6ccb2d commit f32d290

File tree

2 files changed

+78
-0
lines changed

2 files changed

+78
-0
lines changed

lib/web_ui/lib/src/engine/dom.dart

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1149,6 +1149,10 @@ extension DomWheelEventExtension on DomWheelEvent {
11491149
class DomTouchEvent extends DomUIEvent {}
11501150

11511151
extension DomTouchEventExtension on DomTouchEvent {
1152+
external bool get altKey;
1153+
external bool get ctrlKey;
1154+
external bool get metaKey;
1155+
external bool get shiftKey;
11521156
List<DomTouch>? get changedTouches => js_util
11531157
.getProperty<List<Object?>?>(this, 'changedTouches')
11541158
?.cast<DomTouch>();

lib/web_ui/test/engine/pointer_binding_test.dart

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,19 @@ void testMain() {
234234
expect(events[1].buttons, equals(0));
235235
expect(events[1].client.x, equals(0));
236236
expect(events[1].client.y, equals(0));
237+
238+
context.pressAllModifiers();
239+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
240+
expect(event.getModifierState('Alt'), true);
241+
expect(event.getModifierState('Control'), true);
242+
expect(event.getModifierState('Meta'), true);
243+
expect(event.getModifierState('Shift'), true);
244+
context.unpressAllModifiers();
245+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
246+
expect(event.getModifierState('Alt'), false);
247+
expect(event.getModifierState('Control'), false);
248+
expect(event.getModifierState('Meta'), false);
249+
expect(event.getModifierState('Shift'), false);
237250
});
238251

239252
test('_TouchEventContext generates expected events', () {
@@ -330,6 +343,19 @@ void testMain() {
330343
expect(events[0].changedTouches![1].identifier, equals(105));
331344
expect(events[0].changedTouches![1].client.x, equals(322));
332345
expect(events[0].changedTouches![1].client.y, equals(323));
346+
347+
context.pressAllModifiers();
348+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
349+
expect(event.altKey, true);
350+
expect(event.ctrlKey, true);
351+
expect(event.metaKey, true);
352+
expect(event.shiftKey, true);
353+
context.unpressAllModifiers();
354+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
355+
expect(event.altKey, false);
356+
expect(event.ctrlKey, false);
357+
expect(event.metaKey, false);
358+
expect(event.shiftKey, false);
333359
});
334360

335361
test('_MouseEventContext generates expected events', () {
@@ -419,6 +445,19 @@ void testMain() {
419445
expect(event.buttons, equals(0));
420446
expect(event.client.x, equals(400));
421447
expect(event.client.y, equals(401));
448+
449+
context.pressAllModifiers();
450+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
451+
expect(event.getModifierState('Alt'), true);
452+
expect(event.getModifierState('Control'), true);
453+
expect(event.getModifierState('Meta'), true);
454+
expect(event.getModifierState('Shift'), true);
455+
context.unpressAllModifiers();
456+
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
457+
expect(event.getModifierState('Alt'), false);
458+
expect(event.getModifierState('Control'), false);
459+
expect(event.getModifierState('Meta'), false);
460+
expect(event.getModifierState('Shift'), false);
422461
});
423462

424463
// ALL ADAPTERS
@@ -2420,6 +2459,15 @@ abstract class _BasicEventContext implements PointerSupportDetector {
24202459

24212460
bool get isSupported;
24222461

2462+
// Accepted modifier keys are 'Alt', 'Control', 'Meta' and 'Shift'.
2463+
// https://www.w3.org/TR/uievents-key/#keys-modifier defines more modifiers,
2464+
// but only the four main modifiers could be set from MouseEvent, PointerEvent
2465+
// and TouchEvent constructors.
2466+
bool altPressed = false;
2467+
bool ctrlPressed = false;
2468+
bool metaPressed = false;
2469+
bool shitPressed = false;
2470+
24232471
// Generate an event that is:
24242472
//
24252473
// * For mouse, a left click
@@ -2437,6 +2485,20 @@ abstract class _BasicEventContext implements PointerSupportDetector {
24372485
// * For mouse, release LMB
24382486
// * For touch, a touch up
24392487
DomEvent primaryUp({double clientX, double clientY});
2488+
2489+
void pressAllModifiers() {
2490+
altPressed = true;
2491+
ctrlPressed = true;
2492+
metaPressed = true;
2493+
shitPressed = true;
2494+
}
2495+
2496+
void unpressAllModifiers() {
2497+
altPressed = false;
2498+
ctrlPressed = false;
2499+
metaPressed = false;
2500+
shitPressed = false;
2501+
}
24402502
}
24412503

24422504
mixin _ButtonedEventMixin on _BasicEventContext {
@@ -2622,6 +2684,10 @@ class _TouchEventContext extends _BasicEventContext
26222684
),
26232685
)
26242686
.toList(),
2687+
'altKey': altPressed,
2688+
'ctrlKey': ctrlPressed,
2689+
'metaKey': metaPressed,
2690+
'shiftKey': shitPressed,
26252691
},
26262692
);
26272693
}
@@ -2757,6 +2823,10 @@ class _MouseEventContext extends _BasicEventContext
27572823
'button': button,
27582824
'clientX': clientX,
27592825
'clientY': clientY,
2826+
'altKey': altPressed,
2827+
'ctrlKey': ctrlPressed,
2828+
'metaKey': metaPressed,
2829+
'shiftKey': shitPressed,
27602830
}
27612831
];
27622832
return js_util.callConstructor<DomMouseEvent>(
@@ -2835,6 +2905,10 @@ class _PointerEventContext extends _BasicEventContext
28352905
'clientX': clientX,
28362906
'clientY': clientY,
28372907
'pointerType': pointerType,
2908+
'altKey': altPressed,
2909+
'ctrlKey': ctrlPressed,
2910+
'metaKey': metaPressed,
2911+
'shiftKey': shitPressed,
28382912
});
28392913
}
28402914

0 commit comments

Comments
 (0)