Skip to content

Commit 065a5d2

Browse files
authored
[web] Fix quasi-composite input after pressing backspace in iOS (#2559)
Fixes https://youtrack.jetbrains.com/issue/CMP-8773 ## Testing manual (mobile devices) and `gradlew testWeb` ## Release Notes ### Fixes - Web - Hangul input behaves inconsistently after deleting with Backspace
1 parent e2447f1 commit 065a5d2

File tree

2 files changed

+53
-13
lines changed

2 files changed

+53
-13
lines changed

compose/ui/ui/src/webCommonW3C/kotlin/androidx/compose/ui/platform/NativeInputEventsProcessor.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,12 @@ internal abstract class NativeInputEventsProcessor(
8585
if (isInIMEComposition) return@fastForEach
8686

8787
evt as KeyboardEvent
88-
if (isTypedEvent(evt)) return@fastForEach
88+
if (isTypedEvent(evt)) {
89+
// we need to reset this each time we consider something to be typed
90+
// see https://youtrack.jetbrains.com/issue/CMP-8773
91+
lastProcessedEventIsBackspace = evt.key == "Backspace"
92+
return@fastForEach
93+
}
8994

9095
val isFromLastComposition = timestamp < lastCompositionEndTimestamp
9196

compose/ui/ui/src/webTest/kotlin/androidx/compose/ui/input/specs/CompositeInputTestSpec.kt

Lines changed: 47 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -241,20 +241,55 @@ internal interface IosCompositeInput : СompositeInputTestSpec {
241241
fun `input hangul-hol`() = runApplicationTest {
242242
val textFieldValue = createApplicationWithHolder()
243243
eventsSequence(
244-
keyEvent(key= "", code = "Unidentified", keyCode = 0),
245-
beforeInput("insertText", data = "", isComposing = false),
246-
keyEvent(key= "", code = "Unidentified", keyCode = 0, type = "keyup"),
247-
keyEvent(key= "", code = "Unidentified", keyCode = 0),
248-
beforeInput("deleteContentBackward", data = null, isComposing = false),
249-
beforeInput("insertText", data = "", isComposing = false),
250-
keyEvent(key= "", code = "Unidentified", keyCode = 0, type = "keyup"),
251-
keyEvent(key= "", code = "Unidentified", keyCode = 0),
252-
beforeInput("deleteContentBackward", data = null, isComposing = false),
253-
beforeInput("insertText", data = "", isComposing = false),
254-
keyEvent(key= "", code = "Unidentified", keyCode = 0, type = "keyup")
244+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
245+
beforeInput(inputType = "insertText", data = "", isComposing = false),
246+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
247+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
248+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
249+
beforeInput(inputType = "insertText", data = "", isComposing = false),
250+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
251+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
252+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
253+
beforeInput(inputType = "insertText", data = "", isComposing = false),
254+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
255255
).sendToHtmlInput()
256256

257-
textFieldValue.awaitAndAssertTextEquals("")
257+
textFieldValue.awaitAndAssertTextEquals("", "hangul first time")
258+
259+
// deleting all and starting all over again
260+
// https://youtrack.jetbrains.com/issue/CMP-8773
261+
262+
eventsSequence(
263+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8),
264+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
265+
beforeInput(inputType = "insertText", data = "", isComposing = false),
266+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8, type = "keyup"),
267+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8),
268+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
269+
beforeInput(inputType = "insertText", data = "", isComposing = false),
270+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8, type = "keyup"),
271+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8),
272+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
273+
keyEvent(key = "Backspace", code = "Backspace", keyCode = 8, type = "keyup"),
274+
).sendToHtmlInput()
275+
276+
textFieldValue.awaitAndAssertTextEquals("")
277+
278+
eventsSequence(
279+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
280+
beforeInput(inputType = "insertText", data = "", isComposing = false),
281+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
282+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
283+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
284+
beforeInput(inputType = "insertText", data = "", isComposing = false),
285+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
286+
keyEvent(key = "", code = "Unidentified", keyCode = 0),
287+
beforeInput(inputType = "deleteContentBackward", data = "null", isComposing = false),
288+
beforeInput(inputType = "insertText", data = "", isComposing = false),
289+
keyEvent(key = "", code = "Unidentified", keyCode = 0, type = "keyup"),
290+
).sendToHtmlInput()
291+
292+
textFieldValue.awaitAndAssertTextEquals("", "hangul second time")
258293
}
259294
}
260295

0 commit comments

Comments
 (0)