// Format: [start html, start pos, expected html, expected pos, command]
// Positions are a sequence of offsets starting from div, e.g., "1,2,0"
// translates to node = div.childNodes[1].childNodes[2], offset = 0. For a
// non-collapsed selection, use a hyphen, like "0,0-1,0". The selections are
// created with collapse() followed by extend() to allow reverse selections, so
// order is significant.
//
// Expected values can be arrays, in which case any is acceptable. var tests = [
["
", "1,0", "
", "0,0", "delete"],
["
", "0,0", "
", "0,0", "forwarddelete"],
// Range
["
", "0,0-1,0", "
", "0,0", "delete"],
["
", "0,0-1,0", "
", "0,0", "forwarddelete"],
["
", "1,0-0,0", "
", "0,0", "delete"],
["
", "1,0-0,0", "
", "0,0", "forwarddelete"],
// Different start values
["
x
", "1,0",
// WebKit/Blink like to get rid of the extra <br>
["
x
", "
x
"],
// The selection should really be collapsed inside the text node, but in the
// parent is close enough.
["0,0,1", "0,1"], "delete"],
["
", "1,0", "
", "0,1", "delete"],
["
", "1,1", "
", "1,0", "delete"],
["
", "0,2", "
", "0,1", "delete"],
["
", "1,2", "
", "1,1", "delete"],
["
", "1,1", "
", "1,0", "delete"],
["
", "1", "
", "0,0", "delete"],
// The trailing \n in these cases is actually significant, because it was
// necessary to trigger an actual Gecko bug (somehow!).
["
\n", "1,0", "
\n", "0,0", "delete"],
["
\n", "0,0", "
\n", "0,0", "forwarddelete"],
["\n
x
\n", "3,0,0", "\n
x
\n", "2,0,0", "delete"],
];
div.focus();
for (var i = 0; i < tests.length; i++) {
test(function() { var test = tests[i]; div.innerHTML = test[0];
setSelection(test[1]);
function setSelection(selstr) { var parts = selstr.split("-"); var collapsePoint = getPointFromArray(parts[0].split(","));
getSelection().collapse(collapsePoint[0], collapsePoint[1]);
if (parts[1]) { var extendPoint = getPointFromArray(parts[1].split(","));
getSelection().extend(extendPoint[0], extendPoint[1]);
}
}
function getPointFromArray(offsets) { var retNode = div, retOffset; var offset;
while (offset = offsets.shift()) {
if (!offsets.length) {
retOffset = offset;
} else {
retNode = retNode.childNodes[offset];
}
}
return [retNode, retOffset];
}
function recordSelection() {
return [getSelection().anchorNode, getSelection().anchorOffset,
getSelection().focusNode, getSelection().focusOffset];
}
function assertSelectionEquals(actual, expected, html) {
if (typeof expected == "string") {
expected = [expected];
} var pass = false;
for (var i = 0; i < expected.length; i++) {
if (expected[i][0] === actual[0] &&
expected[i][1] === actual[1] &&
expected[i][2] === actual[2] &&
expected[i][3] === actual[3]) {
pass = true;
break;
}
}
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.