项目文件夹

文件
Saurav Panda e0dcdd6905 press_key: support shortcuts; canonical code/vk for letters and digits
Two related issues that have shown up across recent PRs:

1. press_key always emitted a `char` event after every single-char
   keyDown, regardless of modifiers. With Ctrl/Cmd held, that `char`
   makes Chrome treat the press as printable text input (typing "a")
   instead of firing the shortcut (Cmd+A). PR #258 worked around this
   inside fill_input by dispatching the select-all directly via raw
   CDP calls, but every other shortcut was still broken.

2. The keyDown's `code` and `windowsVirtualKeyCode` for letters/digits
   came from a literal-key fallback (code="a", vk=ord("a")=97). CDP's
   shortcut handlers compare against canonical physical-key codes —
   "KeyA" / 65 for the A key, "Digit5" / 53 for the 5 key. Without
   that, e.code in JS is wrong and shortcut listeners that check
   `e.code === "KeyA"` (a common pattern) do not fire.

Fix at source so every shortcut works for any caller:

- Added _key_metadata(key) which returns the canonical (vk, code, text)
  for letters (Key{X}, ord(upper)), digits (Digit{N}, ord(N)), and the
  pre-existing special-key table. Punctuation/symbols fall back to
  ASCII vk + literal code.
- press_key suppresses both `text` on keyDown and the entire `char`
  event when any of Alt/Ctrl/Meta is set (modifier bits 0b0111).
  Shift alone is still text input.
- fill_input's clear path now just calls press_key("a", modifiers=...)
  instead of dispatching directly via cdp; the helper does the right
  thing now.

10 new tests in tests/unit/test_helpers.py cover:
- canonical code/vk for letters (KeyA/65, KeyZ/90) and digits (Digit5/53)
- Enter/Backspace/etc still use the _KEYS table
- no-modifier press emits text + char
- Ctrl / Meta / Alt each suppress text + char
- Shift alone keeps text + char
- Ctrl+Shift combo suppresses (modifier wins over Shift)
- keyUp metadata is consistent

Identified via codex review (P1). Full suite: 93 passed (83 -> 93).
2026-05-04 19:51:58 -07:00
..