diff --git a/frontend/src/components/message/PromptInput.command.test.tsx b/frontend/src/components/message/PromptInput.command.test.tsx index 5cd875cb1..f560876d1 100644 --- a/frontend/src/components/message/PromptInput.command.test.tsx +++ b/frontend/src/components/message/PromptInput.command.test.tsx @@ -642,6 +642,10 @@ describe('PromptInput command submission', () => { renderComponent() const input = await screen.findByPlaceholderText('Send a message...') + expect(input).toHaveAttribute('autocomplete', 'off') + expect(input).toHaveAttribute('autocorrect', 'off') + expect(input).toHaveAttribute('autocapitalize', 'off') + expect(input).toHaveAttribute('spellcheck', 'false') fireEvent.focus(input) fireEvent.change(input, { target: { value: 'text' } }) expect(screen.getByRole('button', { name: 'bash !' })).toBeDisabled() @@ -654,6 +658,9 @@ describe('PromptInput command submission', () => { expect(input).toHaveValue('!') expect(screen.getByTestId('composer-mode-badge')).toHaveTextContent('BASH') expect(screen.getByRole('button', { name: 'cmd /' })).toBeDisabled() + expect(input).toHaveAttribute('autocorrect', 'off') + expect(input).toHaveAttribute('autocapitalize', 'off') + expect(input).toHaveAttribute('spellcheck', 'false') fireEvent.click(screen.getByRole('button', { name: 'bash !' })) expect(input).toHaveValue('') diff --git a/frontend/src/components/message/PromptInput.tsx b/frontend/src/components/message/PromptInput.tsx index f0a8d4598..c951ed077 100644 --- a/frontend/src/components/message/PromptInput.tsx +++ b/frontend/src/components/message/PromptInput.tsx @@ -1280,6 +1280,10 @@ return ( onDragOver={handleDragOver} onDragLeave={handleDragLeave} onDrop={handleDrop} + autoComplete="off" + autoCorrect="off" + autoCapitalize="off" + spellCheck={false} placeholder={ isBashMode ? "Enter bash command..." diff --git a/frontend/src/lib/keyboardShortcuts.test.ts b/frontend/src/lib/keyboardShortcuts.test.ts index 9e1dfce71..65d33622d 100644 --- a/frontend/src/lib/keyboardShortcuts.test.ts +++ b/frontend/src/lib/keyboardShortcuts.test.ts @@ -23,6 +23,13 @@ describe('keyboardShortcuts', () => { expect(formatShortcutEvent(new KeyboardEvent('keydown', { key: 'Shift', shiftKey: true }))).toBeNull() }) + it('ignores a key event without a key, such as one Chrome autofill dispatches', () => { + const autofillEvent = new KeyboardEvent('keydown') + Object.defineProperty(autofillEvent, 'key', { value: undefined }) + + expect(formatShortcutEvent(autofillEvent)).toBeNull() + }) + it('returns the shared defaults with the key set', () => { expect(Object.keys(getDefaultKeyboardShortcuts())).toEqual(Object.keys(DEFAULT_KEYBOARD_SHORTCUTS)) }) diff --git a/frontend/src/lib/keyboardShortcuts.ts b/frontend/src/lib/keyboardShortcuts.ts index 418eca7b0..52bf4c017 100644 --- a/frontend/src/lib/keyboardShortcuts.ts +++ b/frontend/src/lib/keyboardShortcuts.ts @@ -59,7 +59,7 @@ export function formatEventModifiers(e: KeyboardEvent): string { * Formats a keydown event as a canonical shortcut string such as `Cmd+Shift+Z`, or null for a lone modifier key. */ export function formatShortcutEvent(e: KeyboardEvent): string | null { - if (isModifierOnlyEvent(e)) return null + if (!e.key || isModifierOnlyEvent(e)) return null return [...eventModifiers(e), eventMainKey(e)].join('+') }