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(``)