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

Add DOM TouchEvent modifiers accessors #36836

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions lib/web_ui/lib/src/engine/dom.dart
Original file line number Diff line number Diff line change
Expand Up @@ -1142,6 +1142,10 @@ extension DomWheelEventExtension on DomWheelEvent {
class DomTouchEvent extends DomUIEvent {}

extension DomTouchEventExtension on DomTouchEvent {
external bool get altKey;
external bool get ctrlKey;
external bool get metaKey;
external bool get shiftKey;
List<DomTouch>? get changedTouches => js_util
.getProperty<List<Object?>?>(this, 'changedTouches')
?.cast<DomTouch>();
Expand Down
74 changes: 74 additions & 0 deletions lib/web_ui/test/engine/pointer_binding_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,19 @@ void testMain() {
expect(events[1].buttons, equals(0));
expect(events[1].client.x, equals(0));
expect(events[1].client.y, equals(0));

context.pressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.getModifierState('Alt'), true);
expect(event.getModifierState('Control'), true);
expect(event.getModifierState('Meta'), true);
expect(event.getModifierState('Shift'), true);
context.unpressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.getModifierState('Alt'), false);
expect(event.getModifierState('Control'), false);
expect(event.getModifierState('Meta'), false);
expect(event.getModifierState('Shift'), false);
});

test('_TouchEventContext generates expected events', () {
Expand Down Expand Up @@ -330,6 +343,19 @@ void testMain() {
expect(events[0].changedTouches![1].identifier, equals(105));
expect(events[0].changedTouches![1].client.x, equals(322));
expect(events[0].changedTouches![1].client.y, equals(323));

context.pressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.altKey, true);
expect(event.ctrlKey, true);
expect(event.metaKey, true);
expect(event.shiftKey, true);
context.unpressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.altKey, false);
expect(event.ctrlKey, false);
expect(event.metaKey, false);
expect(event.shiftKey, false);
});

test('_MouseEventContext generates expected events', () {
Expand Down Expand Up @@ -419,6 +445,19 @@ void testMain() {
expect(event.buttons, equals(0));
expect(event.client.x, equals(400));
expect(event.client.y, equals(401));

context.pressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.getModifierState('Alt'), true);
expect(event.getModifierState('Control'), true);
expect(event.getModifierState('Meta'), true);
expect(event.getModifierState('Shift'), true);
context.unpressAllModifiers();
event = expectCorrectType(context.primaryDown(clientX: 100, clientY: 101));
expect(event.getModifierState('Alt'), false);
expect(event.getModifierState('Control'), false);
expect(event.getModifierState('Meta'), false);
expect(event.getModifierState('Shift'), false);
});

// ALL ADAPTERS
Expand Down Expand Up @@ -2420,6 +2459,15 @@ abstract class _BasicEventContext implements PointerSupportDetector {

bool get isSupported;

// Accepted modifier keys are 'Alt', 'Control', 'Meta' and 'Shift'.
// https://www.w3.org/TR/uievents-key/#keys-modifier defines more modifiers,
// but only the four main modifiers could be set from MouseEvent, PointerEvent
// and TouchEvent constructors.
bool altPressed = false;
bool ctrlPressed = false;
bool metaPressed = false;
bool shitPressed = false;

// Generate an event that is:
//
// * For mouse, a left click
Expand All @@ -2437,6 +2485,20 @@ abstract class _BasicEventContext implements PointerSupportDetector {
// * For mouse, release LMB
// * For touch, a touch up
DomEvent primaryUp({double clientX, double clientY});

void pressAllModifiers() {
altPressed = true;
ctrlPressed = true;
metaPressed = true;
shitPressed = true;
}

void unpressAllModifiers() {
altPressed = false;
ctrlPressed = false;
metaPressed = false;
shitPressed = false;
}
}

mixin _ButtonedEventMixin on _BasicEventContext {
Expand Down Expand Up @@ -2622,6 +2684,10 @@ class _TouchEventContext extends _BasicEventContext
),
)
.toList(),
'altKey': altPressed,
'ctrlKey': ctrlPressed,
'metaKey': metaPressed,
'shiftKey': shitPressed,
},
);
}
Expand Down Expand Up @@ -2757,6 +2823,10 @@ class _MouseEventContext extends _BasicEventContext
'button': button,
'clientX': clientX,
'clientY': clientY,
'altKey': altPressed,
'ctrlKey': ctrlPressed,
'metaKey': metaPressed,
'shiftKey': shitPressed,
}
];
return js_util.callConstructor<DomMouseEvent>(
Expand Down Expand Up @@ -2835,6 +2905,10 @@ class _PointerEventContext extends _BasicEventContext
'clientX': clientX,
'clientY': clientY,
'pointerType': pointerType,
'altKey': altPressed,
'ctrlKey': ctrlPressed,
'metaKey': metaPressed,
'shiftKey': shitPressed,
});
}

Expand Down