| <!doctype html> |
| <meta charset=utf-8> |
| <title>Test that execCommand with <input> or <textarea></title> |
| <script src=/resources/testharness.js></script> |
| <script src=/resources/testharnessreport.js></script> |
| <div id="container"></div> |
| <script> |
| "use strict"; |
| |
| setup({explicit_done: true}); |
| |
| /** |
| * This test checks whether document.execCommand() does something expected or |
| * not in <input> and <textarea> with/without contenteditable parent. Although |
| * this is not standardized even by any drafts. So, this test uses expected |
| * values which may be expected by web developers. |
| */ |
| function runTests() { |
| let container = document.getElementById("container"); |
| container.innerHTML = "Here <b>is</b> Text: <input id=\"target\">"; |
| runTest(document.getElementById("target"), "In <input>"); |
| container.innerHTML = "Here <b>is</b> Text: <textarea id=\"target\"></textarea>"; |
| runTest(document.getElementById("target"), "In <textarea>"); |
| container.setAttribute("contenteditable", "true"); |
| container.innerHTML = "Here <b>is</b> Text: <input id=\"target\">"; |
| runTest(document.getElementById("target"), "In <input> in contenteditable"); |
| container.innerHTML = "Here <b>is</b> Text: <textarea id=\"target\"></textarea>"; |
| runTest(document.getElementById("target"), "In <textarea> in contenteditable"); |
| |
| done(); |
| } |
| |
| function runTest(aTarget, aDescription) { |
| const kIsTextArea = aTarget.tagName === "TEXTAREA"; |
| const kTests = [ |
| /** |
| * command: command name of execCommand(). |
| * param: param for the command. i.e., the 3rd param of execCommand(). |
| * value: initial value of <input> or <textarea>. must have a pair of |
| * "[" and "]" for specifying selection range. |
| * expectedValue: expected value of <input> or <textarea> after calling |
| * execCommand() with command and param. must have a |
| * pair of "[" and "]" for specifying selection range. |
| * expectedExecCommandResult: expected bool result of execCommand(). |
| * expectedCommandSupported: expected bool result of queryCommandSupported(). |
| * expectedCommandEnabled: expected bool result of queryCommandEnabled(). |
| * beforeinputExpected: if "beforeinput" event shouldn't be fired, set |
| * null. otherwise, expected inputType value and |
| * target element. |
| * inputExpected: if "input" event shouldn't be fired, set null. |
| * otherwise, expected inputType value and target element. |
| */ |
| {command: "getHTML", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "bold", param: "bold", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "italic", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "underline", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "strikethrough", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "superscript", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| // Should return true for web apps implementing custom editor. |
| {command: "cut", param: null, |
| value: "ab[]c", expectedValue: "ab[]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "cut", param: null, |
| value: "a[b]c", expectedValue: "a[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "deleteByCut", target: aTarget }, |
| }, |
| // Should return true for web apps implementing custom editor. |
| {command: "copy", param: null, |
| value: "abc[]d", expectedValue: "abc[]d", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "copy", param: null, |
| value: "a[bc]d", expectedValue: "a[bc]d", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "paste", param: null, |
| value: "a[]c", expectedValue: "a[bc]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "insertFromPaste", target: aTarget }, |
| }, |
| {command: "delete", param: null, |
| value: "ab[]c", expectedValue: "a[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "deleteContentBackward", target: aTarget }, |
| }, |
| {command: "delete", param: null, |
| value: "a[b]c", expectedValue: "a[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "deleteContentBackward", target: aTarget }, |
| }, |
| {command: "forwarddelete", param: null, |
| value: "a[b]c", expectedValue: "a[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "deleteContentForward", target: aTarget }, |
| }, |
| {command: "forwarddelete", param: null, |
| value: "a[]bc", expectedValue: "a[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "deleteContentForward", target: aTarget }, |
| }, |
| {command: "selectall", param: null, |
| value: "a[b]c", expectedValue: "[abc]", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| // Setting value should forget any transactions. |
| {command: "undo", param: null, |
| value: "[a]bc", expectedValue: "[a]bc", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "undo", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| initFunc: () => { |
| document.execCommand("delete", false, null); |
| }, |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "historyUndo", target: aTarget }, |
| }, |
| // Setting value should forget any transactions. |
| {command: "redo", param: null, |
| value: "[a]bc", expectedValue: "[a]bc", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "redo", param: null, |
| value: "a[b]c", expectedValue: "a[]c", |
| initFunc: () => { |
| document.execCommand("delete", false, null); |
| document.execCommand("undo", false, null); |
| }, |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "historyRedo", target: aTarget }, |
| }, |
| {command: "indent", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "outdent", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "backcolor", param: "#000000", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "forecolor", param: "#000000", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "hilitecolor", param: "#000000", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "fontname", param: "DummyFont", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "fontsize", param: "5", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "increasefontsize", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "decreasefontsize", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "inserthorizontalrule", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "createlink", param: "foo.html", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "insertimage", param: "no-image.png", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "inserthtml", param: "<b>inserted</b>", |
| value: "a[b]c", expectedValue: "ainserted[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "insertText", target: aTarget }, |
| }, |
| {command: "inserttext", param: "**inserted**", |
| value: "a[b]c", expectedValue: "a**inserted**[]c", |
| expectedExecCommandResult: true, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: true, |
| beforeinputExpected: null, |
| inputExpected: { inputType: "insertText", target: aTarget }, |
| }, |
| {command: "justifyleft", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "justifyright", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "justifycenter", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "justifyfull", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "removeformat", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "unlink", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "insertorderedlist", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "insertunorderedlist", param: null, |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "insertparagraph", param: null, |
| value: "a[b]c", expectedValue: kIsTextArea ? "a\n[]c" : "a[b]c", |
| expectedExecCommandResult: kIsTextArea, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: kIsTextArea, |
| beforeinputExpected: null, |
| inputExpected: kIsTextArea ? { inputType: "insertParagraph", target: aTarget } : null, |
| }, |
| {command: "insertlinebreak", param: null, |
| value: "a[b]c", expectedValue: kIsTextArea ? "a\n[]c" : "a[b]c", |
| expectedExecCommandResult: kIsTextArea, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: kIsTextArea, |
| beforeinputExpected: null, |
| inputExpected: kIsTextArea ? { inputType: "insertLineBreak", target: aTarget } : null, |
| }, |
| {command: "formatblock", param: "div", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "heading", param: "h1", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| }, |
| {command: "styleWithCSS", param: "true", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: container.isContentEditable, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: container.isContentEditable, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => assert_equals(document.queryCommandState("styleWithCSS"), container.isContentEditable), |
| `${aDescription}: styleWithCSS state should be ${container.isContentEditable} when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => assert_equals(document.queryCommandState("styleWithCSS"), container.isContentEditable), |
| `${aDescription}: styleWithCSS state should be ${container.isContentEditable} when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| {command: "styleWithCSS", param: "false", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: container.isContentEditable, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: container.isContentEditable, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => assert_equals(document.queryCommandState("styleWithCSS"), false), |
| `${aDescription}: styleWithCSS state should be false when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => assert_equals(document.queryCommandState("styleWithCSS"), false), |
| `${aDescription}: styleWithCSS state should be false when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| {command: "contentReadOnly", param: "true", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => assert_equals(document.queryCommandState("contentReadOnly"), false), |
| `${aDescription}: contentReadOnly state should be true when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| test( |
| () => assert_equals(aTarget.readOnly, false), |
| `${aDescription}: readonly property should be true` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => assert_equals(document.queryCommandState("contentReadOnly"), false), |
| `${aDescription}: contentReadOnly state should be false when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| {command: "contentReadOnly", param: "false", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: false, |
| expectedCommandSupported: false, |
| expectedCommandEnabled: false, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => assert_equals(document.queryCommandState("contentReadOnly"), false), |
| `${aDescription}: contentReadOnly state should be false when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| test( |
| () => assert_equals(aTarget.readOnly, false), |
| `${aDescription}: readonly property should be false` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => assert_equals(document.queryCommandState("contentReadOnly"), false), |
| `${aDescription}: contentReadOnly state should be false when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| {command: "defaultParagraphSeparator", param: "p", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: container.isContentEditable, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: container.isContentEditable, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => |
| assert_equals( |
| document.queryCommandValue("defaultParagraphSeparator"), |
| container.isContentEditable ? "p" : "div" |
| ) |
| , |
| `${aDescription}: defaultParagraphSeparator value should be "p" when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => |
| assert_equals( |
| document.queryCommandValue("defaultParagraphSeparator"), |
| container.isContentEditable ? "p" : "div" |
| ), |
| `${aDescription}: defaultParagraphSeparator value should be "p" when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| {command: "defaultParagraphSeparator", param: "div", |
| value: "a[b]c", expectedValue: "a[b]c", |
| expectedExecCommandResult: container.isContentEditable, |
| expectedCommandSupported: true, |
| expectedCommandEnabled: container.isContentEditable, |
| beforeinputExpected: null, inputExpected: null, |
| additionalCheckFunc: aDescription => { |
| test( |
| () => assert_equals(document.queryCommandValue("defaultParagraphSeparator"), "div"), |
| `${aDescription}: defaultParagraphSeparator value should be "div" when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } has focus` |
| ); |
| aTarget.blur(); |
| container.focus(); |
| getSelection().collapse(container, 0); |
| test( |
| () => assert_equals(document.queryCommandValue("defaultParagraphSeparator"), "div"), |
| `${aDescription}: defaultParagraphSeparator value should be "div" when ${ |
| kIsTextArea ? "<textarea>" : "<input>" |
| } does not have focus` |
| ); |
| }, |
| }, |
| ]; |
| |
| for (const kTest of kTests) { |
| const kDescription = |
| `${aDescription}, execCommand("${kTest.command}", false, ${kTest.param}), ${kTest.value})`; |
| aTarget.value = "dummy value to ensure the following value setting clear the undo history"; |
| let value = kTest.value.replace(/[\[\]]/g, ""); |
| aTarget.value = value; |
| aTarget.focus(); |
| aTarget.selectionStart = kTest.value.indexOf("["); |
| aTarget.selectionEnd = kTest.value.indexOf("]") - 1; |
| |
| test( |
| () => assert_equals(document.queryCommandSupported(kTest.command), kTest.expectedCommandSupported), |
| `${kDescription}: The command should ${ |
| kTest.expectedCommandSupported ? "be" : "not be" |
| } supported` |
| ); |
| test( |
| () => assert_equals(document.queryCommandEnabled(kTest.command), kTest.expectedCommandEnabled), |
| `${kDescription}: The command should ${ |
| kTest.expectedCommandEnabled ? "be" : "not be" |
| } enabled` |
| ); |
| |
| if (!document.queryCommandSupported(kTest.command) || !kTest.expectedCommandSupported) { |
| continue; |
| } |
| |
| if (kTest.initFunc) { |
| kTest.initFunc(); |
| } |
| |
| let beforeinput = null; |
| function onBeforeinput(event) { |
| beforeinput = event; |
| } |
| window.addEventListener("beforeinput", onBeforeinput, {capture: true}); |
| let input = null; |
| function onInput(event) { |
| input = event; |
| } |
| window.addEventListener("input", onInput, {capture: true}); |
| let ret; |
| test(function () { |
| ret = document.execCommand(kTest.command, false, kTest.param); |
| assert_equals(ret, kTest.expectedExecCommandResult); |
| }, `${kDescription}: execCommand() should return ${kTest.expectedExecCommandResult}`); |
| test(function () { |
| let value = aTarget.value.substring(0, aTarget.selectionStart) + |
| "[" + |
| aTarget.value.substring(aTarget.selectionStart, aTarget.selectionEnd) + |
| "]" + |
| aTarget.value.substring(aTarget.selectionEnd); |
| assert_equals(value, kTest.expectedValue); |
| }, `${kDescription}: ${kIsTextArea ? "<textarea>" : "<input>"}.value should be "${kTest.expectedValue}"`); |
| test(function () { |
| assert_equals(beforeinput?.inputType, kTest.beforeinputExpected?.inputType); |
| }, `${kDescription}: beforeinput.inputType should be ${kTest.beforeinputExpected?.inputType}`); |
| test(function () { |
| assert_equals(beforeinput?.target, kTest.beforeinputExpected?.target); |
| }, `${kDescription}: beforeinput.target should be ${kTest.beforeinputExpected?.target}`); |
| test(function () { |
| assert_equals(input?.inputType, kTest.inputExpected?.inputType); |
| }, `${kDescription}: input.inputType should be ${kTest.inputExpected?.inputType}`); |
| test(function () { |
| assert_equals(input?.target, kTest.inputExpected?.target); |
| }, `${kDescription}: input.target should be ${kTest.inputExpected?.target}`); |
| if (kTest.additionalCheckFunc) { |
| kTest.additionalCheckFunc(kDescription); |
| } |
| window.removeEventListener("beforeinput", onBeforeinput, {capture: true}); |
| window.removeEventListener("input", onInput, {capture: true}); |
| } |
| } |
| |
| window.addEventListener("load", runTests, {once: true}); |
| </script> |