SimpleTest.waitForFocus(async () => {
const editor = document.getElementById("editor");
const waitForFocusEditor = new Promise(resolve =>
editor.addEventListener("focus", resolve, {once: true})
);
editor.focus();
// This seems to be necessary because the selection is not set up properly otherwise
await waitForFocusEditor;
editor.innerHTML = "Log out roc";
sel.collapse(editor.firstChild.firstChild, 0);
testRight(editor.firstChild.firstChild, 3);
testRight(editor.firstChild.nextSibling, 0);
testRight(editor.firstChild.nextSibling, 5);
// In the next test, we expect to be at the end of the
// space that is not collapsed away
testLeft(editor.firstChild.nextSibling, 1);
testLeft(editor.firstChild.firstChild, 4);
testLeft(editor.firstChild.firstChild, 0);
// test word selection in Deseret (alphabet in Plane 1)
editor.innerHTML = DeseretChars + " " + DeseretChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 4);
testRight(editor.firstChild, 9);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
// Latin words separated by a pictographic symbol
editor.innerHTML = "hello" + Symbol + "world";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 11);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 0);
// Latin words separated by an emoji symbol
editor.innerHTML = "hello" + Emoji + "world";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 7);
testRight(editor.firstChild, 12);
testLeft(editor.firstChild, 7);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
// Emoji and Chinese
editor.innerHTML = Emoji + ChineseChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 2);
testRight(editor.firstChild, 4);
testLeft(editor.firstChild, 2);
testLeft(editor.firstChild, 0);
// test that word selection stops at Latin/Chinese boundary
editor.innerHTML = "hello" + ChineseChars + "world";
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 5);
testRight(editor.firstChild, 7);
testRight(editor.firstChild, 12);
testLeft(editor.firstChild, 7);
testLeft(editor.firstChild, 5);
testLeft(editor.firstChild, 0);
// similar, but with Deseret (alphabet in Plane 1) in place of Latin
editor.innerHTML = DeseretChars + ChineseChars + DeseretChars;
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, 4);
testRight(editor.firstChild, 6);
testRight(editor.firstChild, 10);
testLeft(editor.firstChild, 6);
testLeft(editor.firstChild, 4);
testLeft(editor.firstChild, 0);
// Out-of-flow frames around line edges should be treated as independent lines.
for (const floatValue of ["left", "right"]) {
editor.innerHTML = `<b>One</b> <i>Two</i><spanstyle=float:${floatValue}>Three</span>`;
sel.collapse(editor.querySelector("i").firstChild, 0);
testRight(editor.querySelector("i").firstChild, "Two".length);
testRight(editor.querySelector("span").firstChild, "Three".length);
testLeft(editor.querySelector("span").firstChild, 0);
testLeft(editor.querySelector("i").previousSibling, " ".length); // FIXME: Should stop at start of "Two"
editor.innerHTML = `<spanstyle=float:${floatValue}>One</span><b>Two</b> <i>Three</i>`;
sel.collapse(editor.querySelector("b").firstChild, "Two".length);
testLeft(editor.querySelector("b").firstChild, 0);
testLeft(editor.querySelector("span").firstChild, 0);
testRight(editor.querySelector("span").firstChild, "One".length);
testRight(editor.querySelector("b").nextSibling, 0); // FIXME: Should stop at end of "Two"
}
// And also visually connected words which are split by an out-of-flow content
// shouldn't be treated as a word.
editor.innerHTML = 'OneTwoThree';
sel.collapse(editor.firstChild, 0);
testRight(editor.firstChild, "One".length);
testRight(editor.querySelector("span").firstChild, "Two".length);
testRight(editor.lastChild, "Three".length);
testLeft(editor.lastChild, 0);
testLeft(editor.querySelector("span").firstChild, 0);
testLeft(editor.firstChild, 0);
// Simple RTL cases of above.
editor.setAttribute("dir", "rtl");
for (const floatValue of ["left", "right"]) {
editor.innerHTML = `<b>${ArabicOne}</b> <i>${ArabicTwo}</i><spanstyle=float:${floatValue}>${ArabicThree}</span>`;
sel.collapse(editor.querySelector("i").firstChild, 0);
testLeft(editor.querySelector("i").firstChild, ArabicTwo.length);
testLeft(editor.querySelector("span").firstChild, ArabicThree.length);
testRight(editor.querySelector("span").firstChild, 0);
testRight(editor.querySelector("i").previousSibling, " ".length); // FIXME: Should stop at start of ArabicTwo.
editor.innerHTML = `<spanstyle=float:${floatValue}>${ArabicOne}</span><b>${ArabicTwo}</b> <i>${ArabicThree}</i>`;
sel.collapse(editor.querySelector("b").firstChild, ArabicTwo.length);
testRight(editor.querySelector("b").firstChild, 0);
testRight(editor.querySelector("span").firstChild, 0);
testLeft(editor.querySelector("span").firstChild, ArabicOne.length);
testLeft(editor.querySelector("b").nextSibling, 0); // FIXME: Should stop at end of ArabicTwo.
}
// And also the bidi cases which LRT frames are at line edge if ignoring the
// out-of-flow things.
// XXX Although these tests are behave as expected if I test them manually.
// I don't know the reason why the behavior changes in this test file.
for (const floatValue of ["left", "right"]) {
editor.innerHTML = `<div><b>${ArabicOne}</b> <i dir="ltr">Two</i><spanstyle=float:${floatValue}>${ArabicThree}</span></div>`;
sel.collapse(editor.querySelector("i").firstChild, "Two".length);
testLeft(editor.querySelector("i").firstChild, 0, true);
testLeft(editor.querySelector("span").firstChild, 0, true);
testLeft(editor.querySelector("span").firstChild, ArabicThree.length);
testRight(editor.querySelector("span").firstChild, 0);
testRight(editor.querySelector("i").previousSibling, " ".length); // FIXME: Should stop at end of "Two"
editor.innerHTML = `<div><spanstyle=float:${floatValue}>${ArabicOne}</span><b dir="ltr">Two</b> <i>${ArabicThree}</i></div>`;
sel.collapse(editor.querySelector("b").firstChild, 0);
testRight(editor.querySelector("b").firstChild, "Two".length, true);
testRight(editor.querySelector("span").firstChild, ArabicOne.length, true);
testRight(editor.querySelector("span").firstChild, 0);
testLeft(editor.querySelector("span").firstChild, ArabicOne.length);
testLeft(editor.querySelector("b").nextSibling, 0); // FIXME: Should stop at start of "Two".
}
editor.removeAttribute("dir");
}
async function test2() {
// test basic word movement with eat_space_next_to_word true.
await setPrefs(true, true);
¤ 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.0.31Bemerkung:
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 und die Messung sind noch experimentell.