Skip to content

Commit 01877c1

Browse files
authored
fix: prevent IME composition Enter from auto‑sending edited message (RooCodeInc#3477)
1 parent f8a7b56 commit 01877c1

File tree

3 files changed

+50
-1
lines changed

3 files changed

+50
-1
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"claude-dev": patch
3+
---
4+
5+
prevent IME composition Enter from auto‑sending edited message

webview-ui/src/components/chat/UserMessage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ const UserMessage: React.FC<UserMessageProps> = ({ text, images, messageTs, send
7575
setIsEditing(false)
7676
} else if (e.key === "Enter" && e.metaKey && !checkpointTrackerErrorMessage) {
7777
handleRestoreWorkspace("taskAndWorkspace")
78-
} else if (e.key === "Enter" && !e.shiftKey) {
78+
} else if (e.key === "Enter" && !e.shiftKey && !e.nativeEvent.isComposing && e.keyCode !== 229) {
7979
e.preventDefault()
8080
handleRestoreWorkspace("task")
8181
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/**
2+
* UserMessage – IME composition Enter test
3+
* --------------------------------------------------
4+
* Confirm that sendMessageFromChatRow is not called
5+
* even if you confirm the IME conversion (Enter) in message re-edit mode.
6+
*/
7+
8+
import React from "react"
9+
import { render, fireEvent } from "@testing-library/react"
10+
import { describe, it, expect, vi } from "vitest"
11+
12+
vi.mock("@/context/ExtensionStateContext", () => ({
13+
__esModule: true,
14+
useExtensionState: () => ({
15+
state: {},
16+
dispatch: vi.fn(),
17+
}),
18+
}))
19+
20+
import UserMessage from "../UserMessage"
21+
22+
describe("UserMessage – IME composition handling", () => {
23+
it("does NOT send when IME composition Enter is pressed while editing", () => {
24+
const sendMessageFromChatRow = vi.fn()
25+
26+
const { getByText } = render(
27+
<UserMessage text="変換テスト" images={[]} messageTs={Date.now()} sendMessageFromChatRow={sendMessageFromChatRow} />,
28+
)
29+
30+
const editable = getByText("変換テスト") as HTMLElement
31+
editable.setAttribute("contenteditable", "true")
32+
editable.focus()
33+
34+
fireEvent.compositionStart(editable)
35+
fireEvent.keyDown(editable, {
36+
key: "Enter",
37+
keyCode: 13,
38+
nativeEvent: { isComposing: true },
39+
})
40+
fireEvent.compositionEnd(editable)
41+
42+
expect(sendMessageFromChatRow).not.toHaveBeenCalled()
43+
})
44+
})

0 commit comments

Comments
 (0)