Chrome autocomplete incorrectly triggers actions with keydown events (regardless of KeyboardEvent filters)

Open
#852 1 comment 2 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
42/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
typescript
Domain
frontend

Research direction

Start with the linked CodePen and reproduce the autocomplete-selection case in Chrome, then trace Stimulus's keydown action and KeyboardEvent-filter handling. Done means autocomplete suggestions no longer invoke filtered keydown actions when Chrome dispatches a non-KeyboardEvent, with the existing reproduction covered by a regression test if the test location is identified.

Written by the indexing model from the issue text.

Description

When using a Stimulus action like:

<button data-action="keydown.meta+k@window->search#open">

In Google Chrome, clicking an input’s autocomplete suggestion unexpectedly triggers the controller action even though no key is pressed.

It seems that Chrome dispatches an Event with type === "keydown", but it is not an instance of KeyboardEvent. This happens regardless of the key filter (and using @window or not).

Reproduction

Use this CodePen: https://codepen.io/matheusrich/pen/xbwOOqm

Steps:
  1. Click inside the input field and wait for the autocomplete list to appear.
  2. Pick a suggestion from the autocomplete list.
  3. ✅ Stimulus incorrectly triggers the action
Workaround

On my controller, I'm using this to prevent this behavior for now

if (event.type == "keydown" && !(event instanceof KeyboardEvent)) return

I'll submit a fix to for this on Stimulus.

Chrome Version 138.0.7204.169 (Official Build) (x86_64)

Dominant language
TypeScript
Stars
13.1k
Forks
441
PR merge metrics
No merged PRs in 30d

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from hotwired/stimulus

All issues in hotwired/stimulus

Similar issues

More TypeScript issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.