const input = document.querySelector("input"); input.focus();
await new Promise(resolve => SimpleTest.executeSoon(resolve));
info("for ");
for (const TEST of INPUT_TESTS) { input.value = TEST.before.value; input.selectionStart = TEST.before.start; input.selectionEnd = TEST.before.end;
await new Promise(resolve => SimpleTest.executeSoon(resolve));
input.addEventListener("beforeinput", e => {
is(e.inputType, "insertReplacementText", "inputType in input must be insertReplacementText by replaceText");
is(input.selectionStart, TEST.before.start, "Before inputReplacementText, start offset is valid");
is(input.selectionEnd, TEST.before.end, "Before inputReplacementText, end offset is valid");
}, { once: true } );
const promiseAfterOnInput =
new Promise(resolve => input.addEventListener("input", e => {
is(e.inputType, "insertReplacementText", "inputType must be insertReplacementText by replaceText");
resolve();
}, { once: true } ));
gDOMWindowUtils.sendContentCommandEvent( "replaceText",
null,
TEST.replace.value,
TEST.replace.start,
TEST.replace.src,
flags
);
await promiseAfterOnInput
is(input.value, TEST.after.value, "replaceText in input replaces inner text");
is(input.selectionStart, TEST.after.start, "replaceText in input sets expected selection start");
is(input.selectionEnd, TEST.after.end, "replaceText in input sets expected selection end");
}
const textarea = document.querySelector("textarea"); textarea.focus();
await new Promise(resolve => SimpleTest.executeSoon(resolve));
info("for );
for (const TEST of TEXTAREA_TESTS) { textarea.value = TEST.before.value; textarea.selectionStart = TEST.before.start; textarea.selectionEnd = TEST.before.end;
textarea.addEventListener("beforeinput", e => {
is(e.inputType, "insertReplacementText", "inputType must be insertReplacementText by replaceText");
is(textarea.selectionStart, TEST.before.start, "Before inputReplacementText, start offset is valid");
is(textarea.selectionEnd, TEST.before.end, "Before inputReplacementText, end offset is valid");
}, { once: true } );
const promiseAfterOnTextarea =
new Promise(resolve => textarea.addEventListener("input", e => {
is(e.inputType, "insertReplacementText", "inputType must be insertReplacementText by replaceText");
resolve();
}, { once: true } ));
gDOMWindowUtils.sendContentCommandEvent( "replaceText",
null,
TEST.replace.value,
TEST.replace.start,
TEST.replace.src,
flags
);
await promiseAfterOnTextarea
is(textarea.value, TEST.after.value, "replaceText in textarea replaces inner text");
is(textarea.selectionStart, TEST.after.start, "replaceText in textarea sets expected selection start");
is(textarea.selectionEnd, TEST.after.end, "replaceText in textarea sets expected selection end");
}
const editingHost = document.querySelector("div[contenteditable]");
editingHost.focus();
await new Promise(resolve => SimpleTest.executeSoon(resolve));
info("for contenteditable");
for (const TEST of CONTENTEDITABLE_TESTS) {
editingHost.innerHTML = TEST.before.value;
window.getSelection().setBaseAndExtent(
// eslint-disable-next-line no-eval
eval(TEST.before.focusNode),
TEST.before.focusOffset,
// eslint-disable-next-line no-eval
eval(TEST.before.focusNode),
TEST.before.focusOffset
);
editingHost.addEventListener("beforeinput", e => {
const selection = window.getSelection();
is(e.inputType, "insertReplacementText", "inputType must be insertReplacementText by replaceText");
// eslint-disable-next-line no-eval
is(selection.focusNode, eval(TEST.before.focusNode), "Before inputReplacementText, focus node is valid");
is(selection.focusOffset, TEST.before.focusOffset, "Before inputReplacementText, focus offset is valid");
}, { once: true } );
const promiseAfterEditingHost =
new Promise(resolve => editingHost.addEventListener("input", e => {
is(e.inputType, "insertReplacementText", "inputType must be insertReplacementText by replaceText");
resolve();
}, { once: true } ));
gDOMWindowUtils.sendContentCommandEvent( "replaceText",
null,
TEST.replace.value,
TEST.replace.start,
TEST.replace.src,
flags
);
await promiseAfterEditingHost
is(input.value, "foo", "replaceText doesn't replace inner text when having composition");
is(input.selectionStart, 3, "replaceText sets caret position to next of replaced text");
is(input.selectionStart, input.selectionEnd, "replaceText sets that selection is collapsed");
});
add_task(async function testReplaceTextBeforeCallingPreventDefault() {
await SimpleTest.promiseFocus();
// Call preventDefault on beforeinput
const input = document.querySelector("input"); input.value = "foo"; input.focus();
await new Promise(resolve => SimpleTest.executeSoon(resolve));
is(input.value, "foo", "replaceText doesn't replace inner text of since preventDefault is called");
is(input.selectionStart, 1, "selectionStart isn't changed since preventDefault is called");
is(input.selectionEnd, 2, "selectionEnd isn't changed since preventDefault is called");
});
add_task(async function testReplaceTextWithoutMatch() {
await SimpleTest.promiseFocus();
gDOMWindowUtils.sendContentCommandEvent("replaceText", null, "bar", 1, "a");
await new Promise(resolve => SimpleTest.executeSoon(resolve));
is(input.value, "foo", "replaceText doesn't replace inner text of due to not matched");
is(input.selectionStart, 1, "selectionStart isn't changed due to failed");
is(input.selectionEnd, 2, "selectionEnd isn't changed due to failed");
});
</script>
</body>
</html>
¤ Diese beiden folgenden Angebotsgruppen bietet das Unternehmen0.14Angebot
Wie Sie bei der Firma Beratungs- und Dienstleistungen beauftragen können
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung ist noch experimentell.