<!DOCTYPE html>
<html>
<body onload="onPageLoad()">
Check that hit testing on a <rect> with various miterlimits around sqrt(2) works properly. If the test passes, you will see "PASS" below.
<p id="result">Running test...</p>
<svg id="svg" width="100" height="100" version="1.1">
<rect id="rect" fill="none" stroke="black" stroke-width="20" x="10" y="10" width="80" height="80"/>
</svg>
<script type="text/javascript">
if (window.testRunner) {
testRunner.dumpAsText();
testRunner.waitUntilDone();
}
var result = document.getElementById("result"),
svg = document.getElementById("svg"),
rect = document.getElementById("rect");
function onPageLoad() {
// sqrt(2) = 1.414213562373095...
var intervals = [
["1.4", "1.5"],
["1.41", "1.42"],
["1.414", "1.415"],
["1.4142", "1.4143"],
["1.41421", "1.41422"],
["1.414213", "1.414220"]
//,["1.4142135", "1.4142136"]
];
var bcr = svg.getBoundingClientRect(),
x0 = bcr.left,
y0 = bcr.top;
var i = 0;
requestAnimationFrame(function nextInterval() {
if (i >= intervals.length) {
if (result.textContent == "Running test...")
result.textContent = "PASS";
if (window.testRunner)
testRunner.notifyDone();
return;
}
var interval = intervals[i++];
if (!(interval[0] < Math.SQRT2))
result.textContent += " FAIL - Expecting " + interval[0] + " to be strictly less than sqrt(2).";
rect.setAttribute("stroke-miterlimit", interval[0]);
var actualMiterlimit = getComputedStyle(rect, null).strokeMiterlimit;
if (!(actualMiterlimit < Math.SQRT2))
result.textContent += " FAIL - After setting the miterlimit to " + interval[0] + ", expecting the computed miterlimit " + actualMiterlimit + " to be strictly less than sqrt(2).";
// Because the miterlimit is less than sqrt(2), the join style should
// switch to "bevel".
// i.e. if we get the element near the bottom right corner, it should be
// the <svg> and not the <rect>.
if (document.elementFromPoint(x0 + 97, y0 + 97) !== svg) {
result.textContent += " FAIL - The element at point (97, 97) should be the <svg> element (miterlimit is actually " + actualMiterlimit + " after setting it to " + interval[0] + ").";
// If this check fails, stop the test early so we can examine the
// <rect> visually.
if (window.testRunner)
testRunner.notifyDone();
return;
}
requestAnimationFrame(function () {
if (!(interval[1] >= Math.SQRT2))
result.textContent += " FAIL - Expecting " + interval[1] + " to be greater than or equal to sqrt(2).";
rect.setAttribute("stroke-miterlimit", interval[1]);
var actualMiterlimit = getComputedStyle(rect, null).strokeMiterlimit;
if (!(actualMiterlimit >= Math.SQRT2))
result.textContent += " FAIL - After setting the miterlimit to " + interval[1] + ", expecting the computed miterlimit " + actualMiterlimit + " to be greater than or equal to sqrt(2).";
// The join style should still be "bevel".
if (document.elementFromPoint(x0 + 97, y0 + 97) !== rect) {
result.textContent += " FAIL - The element at point (97, 97) should be the <rect> element (miterlimit is actually " + actualMiterlimit + " after setting it to " + interval[1] + ").";
// If this check fails, stop the test early so we can examine the
// <rect> visually.
if (window.testRunner)
testRunner.notifyDone();
return;
}
requestAnimationFrame(nextInterval);
});
});
}
</script>
</body>
</html>