Files
orca/tests/e2e/fixtures/windows-wsl-2set-hangul-dom-trace.json
NeilandOrca 41ba29d79a test(e2e): headless preedit-geometry coverage for Korean and CJK terminal input (#14500)
* test(e2e): headless preedit-geometry coverage for Korean and CJK terminal input

Both IME defects that shipped and were reverted passed a suite of ~3000 IME
assertions, because every one of them checked bytes reaching the pty and a
preedit rendered into a hidden overlay satisfies all of them while the user
composes blind. The one arm that asserted real geometry was headful-gated and
macOS-only, so it never ran in CI.

Drives composition through CDP Input.imeSetComposition rather than a native
input source, which removes the accessibility grant, the system input source
and the visible window that forced that gate, so this runs in the ordinary
electron-headless project.

The load-bearing assertion is the composition overlay's real bounding rect.
Verified to have teeth: with max-width 0 and overflow hidden injected, the
active class, the textContent, display block and checkVisibility all still
pass, and only the rect assertion fails.

* test(e2e): restore the CDP composition drivers the preedit specs need

The trimmed copy on main kept only the key-dispatch helpers, so the composition
drivers the geometry specs import were missing. Adds them back: setImeComposition,
commitImeText, dispatchImeProcessKey, composeHangulSyllable and
dispatchResumedCompositionUpdate. The shared helpers are unchanged.

Co-authored-by: Orca <help@stably.ai>

---------

Co-authored-by: Orca <help@stably.ai>
2026-08-14 01:47:03 -07:00

2280 lines
47 KiB
JSON

{
"recordedFrom": "11919-windows-wsl-current/11919-current-owner.json",
"inputFramework": "windows-ime",
"engine": "microsoft-korean",
"note": "Windows/WSL 2-Set Korean, 11 committed syllables. Only the capture's immediate-phase records are kept: the source recorder logged every event twice, once on dispatch and once as a batched next-frame snapshot, so keeping both would replay each event a second time and manufacture orderings the IME never emitted.",
"onData": [
{
"data": "문",
"hex": "ebacb8",
"now": 2465839,
"wallMs": 1785868361391
},
{
"data": "제",
"hex": "eca09c",
"now": 2466055.2000000477,
"wallMs": 1785868361607
},
{
"data": "\r",
"hex": "0d",
"now": 2466056.2999999523,
"wallMs": 1785868361608
},
{
"data": "모",
"hex": "ebaaa8",
"now": 2466991,
"wallMs": 1785868362543
},
{
"data": "르",
"hex": "eba5b4",
"now": 2467240.4000000954,
"wallMs": 1785868362792
},
{
"data": "겠",
"hex": "eab2a0",
"now": 2467522.5999999046,
"wallMs": 1785868363074
},
{
"data": "네",
"hex": "eb84a4",
"now": 2467761.5999999046,
"wallMs": 1785868363313
},
{
"data": "\r",
"hex": "0d",
"now": 2467761.7999999523,
"wallMs": 1785868363314
},
{
"data": "안",
"hex": "ec9588",
"now": 2468805.4000000954,
"wallMs": 1785868364357
},
{
"data": "녕",
"hex": "eb8595",
"now": 2469178,
"wallMs": 1785868364730
},
{
"data": "하",
"hex": "ed9598",
"now": 2469555.0999999046,
"wallMs": 1785868365107
},
{
"data": "세",
"hex": "ec84b8",
"now": 2469801.7000000477,
"wallMs": 1785868365353
},
{
"data": "요",
"hex": "ec9a94",
"now": 2469916.4000000954,
"wallMs": 1785868365468
},
{
"data": "\r",
"hex": "0d",
"now": 2469916.7000000477,
"wallMs": 1785868365468
},
{
"data": "h",
"hex": "68",
"now": 2471057,
"wallMs": 1785868366609
},
{
"data": "e",
"hex": "65",
"now": 2471177,
"wallMs": 1785868366729
},
{
"data": "l",
"hex": "6c",
"now": 2471302.2999999523,
"wallMs": 1785868366854
},
{
"data": "l",
"hex": "6c",
"now": 2471427.7000000477,
"wallMs": 1785868366979
},
{
"data": "o",
"hex": "6f",
"now": 2471553.2999999523,
"wallMs": 1785868367105
},
{
"data": "\r",
"hex": "0d",
"now": 2471678.7000000477,
"wallMs": 1785868367230
}
],
"dom": [
{
"type": "keyup",
"key": "HangulMode",
"code": "",
"keyCode": 21,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionstart",
"data": "",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionupdate",
"data": "ㅁ",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "beforeinput",
"data": "ㅁ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "input",
"data": "ㅁ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "a",
"code": "",
"keyCode": 65,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "무",
"value": "ㅁ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "무",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅁ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "무",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "무",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "무",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "n",
"code": "",
"keyCode": 78,
"isComposing": true,
"value": "무",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "무",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "문",
"value": "무",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "문",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "무",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "문",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "s",
"code": "",
"keyCode": 83,
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "묹",
"value": "문",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "묹",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "묹",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "묹",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "묹",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "w",
"code": "",
"keyCode": 87,
"isComposing": true,
"value": "묹",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "묹",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "문",
"value": "묹",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "문",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "묹",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "문",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionend",
"data": "문",
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionstart",
"data": "",
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "제",
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "제",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "input",
"data": "제",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "p",
"code": "",
"keyCode": 80,
"isComposing": true,
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "제",
"value": "문제",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "제",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문제",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "제",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionend",
"data": "제",
"value": "문제",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionstart",
"data": "",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionupdate",
"data": "ㅁ",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "beforeinput",
"data": "ㅁ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "input",
"data": "ㅁ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "a",
"code": "",
"keyCode": 65,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅁ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "모",
"value": "ㅁ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "모",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅁ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "모",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "h",
"code": "",
"keyCode": 72,
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "몰",
"value": "모",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "몰",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "몰",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "몰",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "몰",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "f",
"code": "",
"keyCode": 70,
"isComposing": true,
"value": "몰",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "몰",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "모",
"value": "몰",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "모",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "몰",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "모",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionend",
"data": "모",
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionstart",
"data": "",
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "르",
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "르",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "input",
"data": "르",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "m",
"code": "",
"keyCode": 77,
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "륵",
"value": "모르",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "륵",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "륵",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모륵",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모륵",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "r",
"code": "",
"keyCode": 82,
"isComposing": true,
"value": "모륵",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모륵",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "르",
"value": "모륵",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "르",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모륵",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "르",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionend",
"data": "르",
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionstart",
"data": "",
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "게",
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "게",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "input",
"data": "게",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "p",
"code": "",
"keyCode": 80,
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Shift",
"code": "",
"keyCode": 16,
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르게",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "겠",
"value": "모르게",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "겠",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르게",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "input",
"data": "겠",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "T",
"code": "",
"keyCode": 84,
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Shift",
"code": "",
"keyCode": 16,
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "겠",
"value": "모르겠",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "겠",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "input",
"data": "겠",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionend",
"data": "겠",
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionstart",
"data": "",
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "ㄴ",
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "ㄴ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "input",
"data": "ㄴ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠ㄴ",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠ㄴ",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "s",
"code": "",
"keyCode": 83,
"isComposing": true,
"value": "모르겠ㄴ",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠ㄴ",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionupdate",
"data": "네",
"value": "모르겠ㄴ",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "beforeinput",
"data": "네",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠ㄴ",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "input",
"data": "네",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "p",
"code": "",
"keyCode": 80,
"isComposing": true,
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionupdate",
"data": "네",
"value": "모르겠네",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "beforeinput",
"data": "네",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠네",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "input",
"data": "네",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionend",
"data": "네",
"value": "모르겠네",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keydown",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionstart",
"data": "",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "compositionupdate",
"data": "ㅇ",
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "beforeinput",
"data": "ㅇ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "input",
"data": "ㅇ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅇ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅇ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "d",
"code": "",
"keyCode": 68,
"isComposing": true,
"value": "ㅇ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "ㅇ",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "아",
"value": "ㅇ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "아",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "ㅇ",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "아",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "아",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "아",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "k",
"code": "",
"keyCode": 75,
"isComposing": true,
"value": "아",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "아",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "안",
"value": "아",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "안",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "아",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "안",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keyup",
"key": "s",
"code": "",
"keyCode": 83,
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "안",
"value": "안",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "안",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안",
"selectionStart": 0,
"selectionEnd": 1
},
{
"type": "input",
"data": "안",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionend",
"data": "안",
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionstart",
"data": "",
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "compositionupdate",
"data": "ㄴ",
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "beforeinput",
"data": "ㄴ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안",
"selectionStart": 1,
"selectionEnd": 1
},
{
"type": "input",
"data": "ㄴ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안ㄴ",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안ㄴ",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "s",
"code": "",
"keyCode": 83,
"isComposing": true,
"value": "안ㄴ",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안ㄴ",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "녀",
"value": "안ㄴ",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "녀",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안ㄴ",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "녀",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녀",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녀",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "u",
"code": "",
"keyCode": 85,
"isComposing": true,
"value": "안녀",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녀",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "녕",
"value": "안녀",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "녕",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녀",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "녕",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keyup",
"key": "d",
"code": "",
"keyCode": 68,
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "녕",
"value": "안녕",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "녕",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕",
"selectionStart": 1,
"selectionEnd": 2
},
{
"type": "input",
"data": "녕",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionend",
"data": "녕",
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionstart",
"data": "",
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "compositionupdate",
"data": "ㅎ",
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "beforeinput",
"data": "ㅎ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕",
"selectionStart": 2,
"selectionEnd": 2
},
{
"type": "input",
"data": "ㅎ",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕ㅎ",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕ㅎ",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "g",
"code": "",
"keyCode": 71,
"isComposing": true,
"value": "안녕ㅎ",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕ㅎ",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "하",
"value": "안녕ㅎ",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "하",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕ㅎ",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "input",
"data": "하",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "k",
"code": "",
"keyCode": 75,
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "핫",
"value": "안녕하",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "핫",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "input",
"data": "핫",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕핫",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕핫",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keyup",
"key": "t",
"code": "",
"keyCode": 84,
"isComposing": true,
"value": "안녕핫",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕핫",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "하",
"value": "안녕핫",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "하",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕핫",
"selectionStart": 2,
"selectionEnd": 3
},
{
"type": "input",
"data": "하",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionend",
"data": "하",
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionstart",
"data": "",
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "compositionupdate",
"data": "세",
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "beforeinput",
"data": "세",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하",
"selectionStart": 3,
"selectionEnd": 3
},
{
"type": "input",
"data": "세",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "p",
"code": "",
"keyCode": 80,
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionupdate",
"data": "셍",
"value": "안녕하세",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "beforeinput",
"data": "셍",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "input",
"data": "셍",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하셍",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하셍",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keyup",
"key": "d",
"code": "",
"keyCode": 68,
"isComposing": true,
"value": "안녕하셍",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하셍",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionupdate",
"data": "세",
"value": "안녕하셍",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "beforeinput",
"data": "세",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하셍",
"selectionStart": 3,
"selectionEnd": 4
},
{
"type": "input",
"data": "세",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionend",
"data": "세",
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionstart",
"data": "",
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "compositionupdate",
"data": "요",
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "beforeinput",
"data": "요",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세",
"selectionStart": 4,
"selectionEnd": 4
},
{
"type": "input",
"data": "요",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "keyup",
"key": "y",
"code": "",
"keyCode": 89,
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "keydown",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "compositionupdate",
"data": "요",
"value": "안녕하세요",
"selectionStart": 4,
"selectionEnd": 5
},
{
"type": "beforeinput",
"data": "요",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 4,
"selectionEnd": 5
},
{
"type": "input",
"data": "요",
"inputType": "insertCompositionText",
"isComposing": true,
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "compositionend",
"data": "요",
"value": "안녕하세요",
"selectionStart": 5,
"selectionEnd": 5
},
{
"type": "keydown",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Process",
"code": "",
"keyCode": 229,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "h",
"code": "",
"keyCode": 72,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "h",
"code": "",
"keyCode": 72,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "e",
"code": "",
"keyCode": 69,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "e",
"code": "",
"keyCode": 69,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "l",
"code": "",
"keyCode": 76,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "l",
"code": "",
"keyCode": 76,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "l",
"code": "",
"keyCode": 76,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "l",
"code": "",
"keyCode": 76,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "o",
"code": "",
"keyCode": 79,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "o",
"code": "",
"keyCode": 79,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keydown",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
},
{
"type": "keyup",
"key": "Enter",
"code": "",
"keyCode": 13,
"isComposing": false,
"value": "",
"selectionStart": 0,
"selectionEnd": 0
}
]
}