diff --git a/src/keyboard/index.ts b/src/keyboard/index.ts index d4687c0f..7c08a8eb 100644 --- a/src/keyboard/index.ts +++ b/src/keyboard/index.ts @@ -33,7 +33,7 @@ async function keyboardAction( if (!releasePrevious) { for (let i = 1; i <= repeat; i++) { - await system.keyboard.keydown(instance, keyDef) + await system.keyboard.keydown(instance, keyDef, i > 1) if (i < repeat) { await wait(instance.config) diff --git a/src/system/keyboard.ts b/src/system/keyboard.ts index 8702d28e..8178af9a 100644 --- a/src/system/keyboard.ts +++ b/src/system/keyboard.ts @@ -117,7 +117,7 @@ export class KeyboardHost { } /** Press a key */ - async keydown(instance: Instance, keyDef: keyboardKey) { + async keydown(instance: Instance, keyDef: keyboardKey, repeat: boolean = false) { const key = String(keyDef.key) const code = String(keyDef.code) @@ -133,6 +133,7 @@ export class KeyboardHost { const unprevented = instance.dispatchUIEvent(target, 'keydown', { key, code, + repeat, }) if (isModifierLock(key) && !this.modifiers[key]) { diff --git a/tests/keyboard/keyboardAction.ts b/tests/keyboard/keyboardAction.ts index 1ea6fa9b..19c6b611 100644 --- a/tests/keyboard/keyboardAction.ts +++ b/tests/keyboard/keyboardAction.ts @@ -50,6 +50,19 @@ test('do not leak repeatKey in state', async () => { expect(keyboardState).not.toHaveProperty('repeatKey') }) +test('set `repeat` on repeated keydown events', async () => { + const {element, user} = setup(``) + + const repeats: boolean[] = [] + element.addEventListener('keydown', e => { + repeats.push((e as KeyboardEvent).repeat) + }) + + await user.keyboard('{a>5}') + + expect(repeats).toEqual([false, true, true, true, true]) +}) + describe('pressing and releasing keys', () => { test('fires event with releasing key twice', async () => { const {getEventSnapshot, user} = setup(``)