From 2bc49cd5e5466bf60b159abeddf379f8a9f87475 Mon Sep 17 00:00:00 2001 From: Neil <4138956+nwparker@users.noreply.github.com> Date: Tue, 4 Aug 2026 10:08:26 -0700 Subject: [PATCH] fix(chat): retain active IME confirmation --- .../native-chat/NativeChatComposerField.tsx | 2 +- .../native-chat-composer-autogrow.test.tsx | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) 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