diff --git a/src/renderer/src/components/native-chat/NativeChatComposerField.tsx b/src/renderer/src/components/native-chat/NativeChatComposerField.tsx index 2e3f2834e63..840bbad1669 100644 --- a/src/renderer/src/components/native-chat/NativeChatComposerField.tsx +++ b/src/renderer/src/components/native-chat/NativeChatComposerField.tsx @@ -182,7 +182,7 @@ export function NativeChatComposerField({ onChange={(e) => onDraftChange(e.target.value, e.currentTarget)} onKeyDown={(event) => { const ownsCompositionEnter = - event.nativeEvent.isComposing && + (event.nativeEvent.isComposing || compositionActiveRef.current) && ((event.key === 'Enter' && (event.keyCode === 13 || event.keyCode === 229)) || (event.key === 'Process' && event.keyCode === 229)) if (ownsCompositionEnter) { diff --git a/src/renderer/src/components/native-chat/native-chat-composer-autogrow.test.tsx b/src/renderer/src/components/native-chat/native-chat-composer-autogrow.test.tsx index 02d09331dc3..e03b967692c 100644 --- a/src/renderer/src/components/native-chat/native-chat-composer-autogrow.test.tsx +++ b/src/renderer/src/components/native-chat/native-chat-composer-autogrow.test.tsx @@ -192,6 +192,28 @@ describe('native chat composer composition ownership', () => { expect(onKeyDown).toHaveBeenCalledOnce() }) + it('retains an active composition when the Process event omits its composing flag', () => { + const onKeyDown = vi.fn() + render(composerField('가', { onKeyDown })) + const textarea = screen.getByRole('textbox') as HTMLTextAreaElement + fireEvent.compositionStart(textarea) + fireEvent.keyDown(textarea, { + key: 'Process', + keyCode: 229, + isComposing: false + }) + fireEvent.compositionEnd(textarea, { data: '가' }) + + const redispatchResult = fireEvent.keyDown(textarea, { + key: 'Enter', + keyCode: 13, + isComposing: false + }) + + expect(redispatchResult).toBe(false) + expect(onKeyDown).not.toHaveBeenCalled() + }) + it('retains the macOS marked Enter/229 gesture through its unmarked redispatch', () => { const onKeyDown = vi.fn() let clearPending: FrameRequestCallback | undefined