const els = document.querySelectorAll('.test-el'); const key = "{{GET[key]}}"; const keyRaw = keyMapping[key] || key; const expectedData = key === "Enter" ? "\n" : key; const selectionStart = {{GET[selectionStart]}}; const selectionEnd = {{GET[selectionEnd]}}; const expectedValue = "{{GET[expectedValue]}}"; for (const el of els) { promise_test(t => { return new Promise((resolve, reject) => { let beforeinputEvents = 0; let textInputEvents = 0; el.addEventListener('beforeinput', t.step_func(e => { beforeinputEvents++; })); el.addEventListener('textInput', t.step_func(e => { textInputEvents++; assert_equals(beforeinputEvents, 1); assert_equals(e.data, expectedData); assert_true(e.bubbles); assert_true(e.cancelable); assert_equals(e.view, window); assert_equals(e.detail, 0); assert_true(e instanceof window.TextEvent); })); el.addEventListener('input', t.step_func(e => { assert_equals(textInputEvents, 1); if (expectedValue === "\n" && !(el instanceof HTMLInputElement) && !(el instanceof HTMLTextAreaElement)) { // New paragraph in contenteditable during editing is weird. // innerHTML is