ladybird/Tests/LibWeb/Text/input/UIEvents/KeyEvent-alt-text-insertion.html
Andreas Kling d9d8c5ce89 LibWeb: Allow Option-generated text insertion
Track whether a keydown should perform text insertion separately from
the delivered code point. Native frontends and text-oriented test paths
can now mark events that came from text input, while shortcut-style key
events keep Alt-modified default insertion suppressed.

This lets macOS Option-generated text such as Option+A and Option+Space
insert into editable controls without making plain Alt shortcuts insert
their base character. Add coverage for Alt text, Ctrl+Alt text,
separator text, Ctrl-only shortcuts, and Alt shortcuts.
2026-06-03 13:51:32 +02:00

36 lines
1.5 KiB
HTML

<!DOCTYPE html>
<meta charset="utf-8">
<input id="input" />
<script src="../include.js"></script>
<script>
test(() => {
let input = document.getElementById("input");
let codePoints = text => Array.from(text, character => character.codePointAt(0).toString(16)).join(" ");
input.addEventListener("keydown", e => {
println(`keydown key=${e.key} keyCodePoints=${codePoints(e.key)} altKey=${e.altKey} ctrlKey=${e.ctrlKey}`);
});
input.addEventListener("beforeinput", e => {
println(`beforeinput data=${e.data} dataCodePoints=${codePoints(e.data)} inputType=${e.inputType}`);
});
internals.sendText(input, "å", internals.MOD_ALT);
println(`value after Alt: ${input.value}`);
internals.sendText(input, "@", internals.MOD_ALT | internals.MOD_CTRL);
println(`value after Ctrl+Alt: ${input.value}`);
internals.sendText(input, "\u00A0", internals.MOD_ALT);
println(`value after Alt+Space: ${input.value}`);
println(`value code points after Alt+Space: ${codePoints(input.value)}`);
internals.sendKey(input, "F", internals.MOD_ALT);
println(`value after Alt+F shortcut: ${input.value}`);
println(`value code points after Alt+F shortcut: ${codePoints(input.value)}`);
internals.sendText(input, "x", internals.MOD_CTRL);
println(`value after Ctrl: ${input.value}`);
println(`value code points after Ctrl: ${codePoints(input.value)}`);
});
</script>