Fix key duplication on Android with physical keyboards

When typing rapidly on Android with physical keyboards, characters often
duplicate on the terminal. This is because physical keyboard events
always go through IME on Android, even for plain English characters, and
rapid typing causes a race condition in the composition helper.

This patch fixes the issue by making sure textarea changes are handled
correctly.
This commit is contained in:
Shuhei Takahashi
2025-11-07 12:33:59 +09:00
parent 65a0e03b66
commit d03416467d
+10 -1
View File
@@ -41,6 +41,11 @@ export class CompositionHelper {
*/
private _dataAlreadySent: string;
/**
* The pending textarea change timer, if any.
*/
private _textareaChangeTimer?: number;
constructor(
private readonly _textarea: HTMLTextAreaElement,
private readonly _compositionView: HTMLElement,
@@ -184,8 +189,12 @@ export class CompositionHelper {
* IME is active.
*/
private _handleAnyTextareaChanges(): void {
if (this._textareaChangeTimer) {
return;
}
const oldValue = this._textarea.value;
setTimeout(() => {
this._textareaChangeTimer = window.setTimeout(() => {
this._textareaChangeTimer = undefined;
// Ignore if a composition has started since the timeout
if (!this._isComposing) {
const newValue = this._textarea.value;