mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-09-03 22:38:41 +09:00
182 lines
6.9 KiB
HTML
182 lines
6.9 KiB
HTML
|
|
<!doctype html>
|
|||
|
|
<title>Range.compareBoundaryPoints() tests</title>
|
|||
|
|
<link rel="author" title="Aryeh Gregor" href=ayg@aryeh.name>
|
|||
|
|
<meta name=timeout content=long>
|
|||
|
|
|
|||
|
|
<div id=log></div>
|
|||
|
|
<script src=/resources/testharness.js></script>
|
|||
|
|
<script src=/resources/testharnessreport.js></script>
|
|||
|
|
<script src=../common.js></script>
|
|||
|
|
<script>
|
|||
|
|
"use strict";
|
|||
|
|
|
|||
|
|
var testRangesCached = [];
|
|||
|
|
testRangesCached.push(document.createRange());
|
|||
|
|
testRangesCached[0].detach();
|
|||
|
|
for (var i = 0; i < testRangesShort.length; i++) {
|
|||
|
|
try {
|
|||
|
|
testRangesCached.push(rangeFromEndpoints(eval(testRangesShort[i])));
|
|||
|
|
} catch(e) {
|
|||
|
|
testRangesCached.push(null);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var testRangesCachedClones = [];
|
|||
|
|
testRangesCachedClones.push(document.createRange());
|
|||
|
|
testRangesCachedClones[0].detach();
|
|||
|
|
for (var i = 1; i < testRangesCached.length; i++) {
|
|||
|
|
if (testRangesCached[i]) {
|
|||
|
|
testRangesCachedClones.push(testRangesCached[i].cloneRange());
|
|||
|
|
} else {
|
|||
|
|
testRangesCachedClones.push(null);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// We want to run a whole bunch of extra tests with invalid "how" values (not
|
|||
|
|
// 0-3), but it's excessive to run them for every single pair of ranges --
|
|||
|
|
// there are too many of them. So just run them for a handful of the tests.
|
|||
|
|
var extraTests = [0, // detached
|
|||
|
|
1 + testRanges.indexOf("[paras[0].firstChild, 2, paras[0].firstChild, 8]"),
|
|||
|
|
1 + testRanges.indexOf("[paras[0].firstChild, 3, paras[3], 1]"),
|
|||
|
|
1 + testRanges.indexOf("[testDiv, 0, comment, 5]"),
|
|||
|
|
1 + testRanges.indexOf("[foreignDoc.documentElement, 0, foreignDoc.documentElement, 1]")];
|
|||
|
|
|
|||
|
|
for (var i = 0; i < testRangesCached.length; i++) {
|
|||
|
|
var range1 = testRangesCached[i];
|
|||
|
|
var range1Desc = i + " " + (i == 0 ? "[detached]" : testRanges[i - 1]);
|
|||
|
|
for (var j = 0; j <= testRangesCachedClones.length; j++) {
|
|||
|
|
var range2;
|
|||
|
|
var range2Desc;
|
|||
|
|
if (j == testRangesCachedClones.length) {
|
|||
|
|
range2 = range1;
|
|||
|
|
range2Desc = "same as first range";
|
|||
|
|
} else {
|
|||
|
|
range2 = testRangesCachedClones[j];
|
|||
|
|
range2Desc = j + " " + (j == 0 ? "[detached]" : testRanges[j - 1]);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var hows = [Range.START_TO_START, Range.START_TO_END, Range.END_TO_END,
|
|||
|
|
Range.END_TO_START];
|
|||
|
|
if (extraTests.indexOf(i) != -1 && extraTests.indexOf(j) != -1) {
|
|||
|
|
// TODO: Make some type of reusable utility function to do this
|
|||
|
|
// work.
|
|||
|
|
hows.push(-1, 4, 5, NaN, -0, +Infinity, -Infinity);
|
|||
|
|
[65536, -65536, 65536*65536, 0.5, -0.5, -72.5].forEach(function(addend) {
|
|||
|
|
hows.push(-1 + addend, 0 + addend, 1 + addend,
|
|||
|
|
2 + addend, 3 + addend, 4 + addend);
|
|||
|
|
});
|
|||
|
|
hows.forEach(function(how) { hows.push(String(how)) });
|
|||
|
|
hows.push("6.5536e4", null, undefined, true, false, "", "quasit");
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
for (var k = 0; k < hows.length; k++) {
|
|||
|
|
var how = hows[k];
|
|||
|
|
test(function() {
|
|||
|
|
assert_not_equals(range1, null,
|
|||
|
|
"Creating context range threw an exception");
|
|||
|
|
assert_not_equals(range2, null,
|
|||
|
|
"Creating argument range threw an exception");
|
|||
|
|
|
|||
|
|
// Convert how per WebIDL. TODO: Make some type of reusable
|
|||
|
|
// utility function to do this work.
|
|||
|
|
// "Let number be the result of calling ToNumber on the input
|
|||
|
|
// argument."
|
|||
|
|
var convertedHow = Number(how);
|
|||
|
|
|
|||
|
|
// "If number is NaN, +0, −0, +∞, or −∞, return +0."
|
|||
|
|
if (isNaN(convertedHow)
|
|||
|
|
|| convertedHow == 0
|
|||
|
|
|| convertedHow == Infinity
|
|||
|
|
|| convertedHow == -Infinity) {
|
|||
|
|
convertedHow = 0;
|
|||
|
|
} else {
|
|||
|
|
// "Let posInt be sign(number) * floor(abs(number))."
|
|||
|
|
var posInt = (convertedHow < 0 ? -1 : 1) * Math.floor(Math.abs(convertedHow));
|
|||
|
|
|
|||
|
|
// "Let int16bit be posInt modulo 2^16; that is, a finite
|
|||
|
|
// integer value k of Number type with positive sign and
|
|||
|
|
// less than 2^16 in magnitude such that the mathematical
|
|||
|
|
// difference of posInt and k is mathematically an integer
|
|||
|
|
// multiple of 2^16."
|
|||
|
|
//
|
|||
|
|
// "Return int16bit."
|
|||
|
|
convertedHow = posInt % 65536;
|
|||
|
|
if (convertedHow < 0) {
|
|||
|
|
convertedHow += 65536;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Now to the actual algorithm.
|
|||
|
|
// "If how is not one of
|
|||
|
|
// START_TO_START,
|
|||
|
|
// START_TO_END,
|
|||
|
|
// END_TO_END, and
|
|||
|
|
// END_TO_START,
|
|||
|
|
// throw a "NotSupportedError" exception and terminate these
|
|||
|
|
// steps."
|
|||
|
|
if (convertedHow != Range.START_TO_START
|
|||
|
|
&& convertedHow != Range.START_TO_END
|
|||
|
|
&& convertedHow != Range.END_TO_END
|
|||
|
|
&& convertedHow != Range.END_TO_START) {
|
|||
|
|
assert_throws("NOT_SUPPORTED_ERR", function() {
|
|||
|
|
range1.compareBoundaryPoints(how, range2);
|
|||
|
|
}, "NotSupportedError required if first parameter doesn't convert to 0-3 per WebIDL");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// "If context object's root is not the same as sourceRange's
|
|||
|
|
// root, throw a "WrongDocumentError" exception and terminate
|
|||
|
|
// these steps."
|
|||
|
|
if (furthestAncestor(range1.startContainer) != furthestAncestor(range2.startContainer)) {
|
|||
|
|
assert_throws("WRONG_DOCUMENT_ERR", function() {
|
|||
|
|
range1.compareBoundaryPoints(how, range2);
|
|||
|
|
}, "WrongDocumentError required if the ranges don't share a root");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// "If how is:
|
|||
|
|
// START_TO_START:
|
|||
|
|
// Let this point be the context object's start.
|
|||
|
|
// Let other point be sourceRange's start.
|
|||
|
|
// START_TO_END:
|
|||
|
|
// Let this point be the context object's end.
|
|||
|
|
// Let other point be sourceRange's start.
|
|||
|
|
// END_TO_END:
|
|||
|
|
// Let this point be the context object's end.
|
|||
|
|
// Let other point be sourceRange's end.
|
|||
|
|
// END_TO_START:
|
|||
|
|
// Let this point be the context object's start.
|
|||
|
|
// Let other point be sourceRange's end."
|
|||
|
|
var thisPoint = convertedHow == Range.START_TO_START || convertedHow == Range.END_TO_START
|
|||
|
|
? [range1.startContainer, range1.startOffset]
|
|||
|
|
: [range1.endContainer, range1.endOffset];
|
|||
|
|
var otherPoint = convertedHow == Range.START_TO_START || convertedHow == Range.START_TO_END
|
|||
|
|
? [range2.startContainer, range2.startOffset]
|
|||
|
|
: [range2.endContainer, range2.endOffset];
|
|||
|
|
|
|||
|
|
// "If the position of this point relative to other point is
|
|||
|
|
// before
|
|||
|
|
// Return −1.
|
|||
|
|
// equal
|
|||
|
|
// Return 0.
|
|||
|
|
// after
|
|||
|
|
// Return 1."
|
|||
|
|
var position = getPosition(thisPoint[0], thisPoint[1], otherPoint[0], otherPoint[1]);
|
|||
|
|
var expected;
|
|||
|
|
if (position == "before") {
|
|||
|
|
expected = -1;
|
|||
|
|
} else if (position == "equal") {
|
|||
|
|
expected = 0;
|
|||
|
|
} else if (position == "after") {
|
|||
|
|
expected = 1;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
assert_equals(range1.compareBoundaryPoints(how, range2), expected,
|
|||
|
|
"Wrong return value");
|
|||
|
|
}, i + "," + j + "," + k + ": context range " + range1Desc + ", argument range " + range2Desc + ", how " + format_value(how));
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
testDiv.style.display = "none";
|
|||
|
|
</script>
|