Index: LayoutTests/svg/hittest/svg-isPointInFill.xhtml |
diff --git a/LayoutTests/svg/hittest/svg-isPointInFill.xhtml b/LayoutTests/svg/hittest/svg-isPointInFill.xhtml |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f708f16c4bf73ca6ab876942ecdc8355a3790a41 |
--- /dev/null |
+++ b/LayoutTests/svg/hittest/svg-isPointInFill.xhtml |
@@ -0,0 +1,168 @@ |
+<html xmlns='http://www.w3.org/1999/xhtml'> |
+ <head> |
+ <style> |
+ #svgRoot { |
+ margin: 0px; |
+ padding: 0px; |
+ position: absolute; |
+ top: 0px; |
+ left: 0px; |
+ } |
+ |
+ #ellipse { |
+ fill: green; |
+ fill-opacity: 0.1; |
+ stroke-width: 100px; |
+ stroke: green; |
+ stroke-opacity: 0.2; |
+ } |
+ </style> |
+ </head> |
+ <body> |
+ <p>Tests for WK80423 - Make sure hit testing works properly on stroked ellipses.</p> |
+ <p>On success, you will see a series of "PASS" messages and no "FAIL" messages.</p> |
+ <pre id="console"></pre> |
+ |
+ <svg onload="runTest()" id="svgRoot" width="400px" height="400px" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg"> |
+ <ellipse id="ellipse" cx="150" cy="150" rx="200" ry="100"/> |
+ </svg> |
+ |
+ <script><![CDATA[ |
+ if (window.testRunner) |
+ testRunner.dumpAsText(); |
+ |
+ var pointsInEllipse = [ |
+ {x: 150, y: 150}, |
+ {x: 275, y: 150}, |
+ {x: 250, y: 225} |
+ ]; |
+ |
+ var pointsNotInEllipse = [ |
+ {x: 0, y: 0}, |
+ {x: 275, y: 250} |
+ ]; |
+ |
+ var pointsOnEllipseStroke = [ |
+ {x: 275, y: 250}, // outer stroke |
+ {x: 300, y: 200} // inner stroke |
+ ]; |
+ |
+ var pointsNotOnEllipseStroke = [ |
+ {x: 375, y: 375}, // outside ellipse |
+ {x: 0, y: 0}, // outside ellipse |
+ {x: 150, y: 150} // inside ellipse |
+ ]; |
+ |
+ var resultString = ""; |
+ |
+ function testFill(ellipseElement, pointerEvents, visibility, expectedResultInEllipse, expectedResultNotInEllipse) { |
+ var mySVGPoint = ellipseElement.ownerSVGElement.createSVGPoint(); |
+ ellipseElement.setAttribute("visibility", visibility); |
+ resultString += "Testing fill with pointer event " + pointerEvents + " and visibility=" + visibility + "\n"; |
+ ellipseElement.setAttribute("pointer-events", pointerEvents); |
+ var count = 0; |
+ pointsInEllipse.forEach( function(point) { |
+ mySVGPoint.x = point.x; |
+ mySVGPoint.y = point.y; |
+ var found = ellipseElement.isPointInFill(mySVGPoint); |
+ var pass = found == expectedResultInEllipse[count++]; |
+ resultString += ((pass) ? "PASS, as expected" : "FAIL") + " ellipse " + (found ? "contains" : "does not contain") + " point at (" + point.x + ", " + point.y + ")\n"; |
+ }); |
+ count = 0; |
+ pointsNotInEllipse.forEach( function(point) { |
+ mySVGPoint.x = point.x; |
+ mySVGPoint.y = point.y; |
+ var found = ellipseElement.isPointInFill(mySVGPoint); |
+ var pass = found == expectedResultNotInEllipse[count++]; |
+ resultString += ((pass) ? "PASS, as expected" : "FAIL") + " ellipse " + (!found ? "does not contain" : "contains") + " point at (" + point.x + ", " + point.y + ")\n"; |
+ }); |
+ resultString += "\n"; |
+ } |
+ function testStroke(ellipseElement, pointerEvents, visibility, expectedResultInEllipse, expectedResultNotInEllipse) { |
+ var mySVGPoint = ellipseElement.ownerSVGElement.createSVGPoint(); |
+ ellipseElement.setAttribute("visibility", visibility); |
+ resultString += "Testing stroke with pointer event " + pointerEvents + " and visibility=" + visibility + "\n"; |
+ ellipseElement.setAttribute("pointer-events", pointerEvents); |
+ var count = 0; |
+ pointsOnEllipseStroke.forEach( function(point) { |
+ mySVGPoint.x = point.x; |
+ mySVGPoint.y = point.y; |
+ var found = ellipseElement.isPointInStroke(mySVGPoint); |
+ var pass = found == expectedResultInEllipse[count++]; |
+ resultString += ((pass) ? "PASS, as expected" : "FAIL") + " ellipse stroke " + (found ? "contains" : "does not contain") + " point at (" + point.x + ", " + point.y + ")\n"; |
+ }); |
+ count = 0; |
+ pointsNotOnEllipseStroke.forEach( function(point) { |
+ mySVGPoint.x = point.x; |
+ mySVGPoint.y = point.y; |
+ var found = ellipseElement.isPointInStroke(mySVGPoint); |
+ var pass = found == expectedResultNotInEllipse[count++]; |
+ resultString += ((pass) ? "PASS, as expected" : "FAIL") + " ellipse stroke " + (!found ? "does not contain" : "contains") + " point at (" + point.x + ", " + point.y + ")\n"; |
+ }); |
+ resultString += "\n"; |
+ } |
+ |
+function runTest() { |
+ |
+ var ellipseElement = document.getElementById("ellipse"); |
+ var mySVGPoint = ellipseElement.ownerSVGElement.createSVGPoint(); |
+ |
+ resultString += "Testing isPointInFill/isPointInStroke\n"; |
+ try { |
+ ellipseElement.isPointInFill(); |
+ resultString += "isPointInFill() throws no exception\n"; |
+ } catch(ex) { |
+ resultString += "isPointInFill() throws exception\n"; |
+ } |
+ try { |
+ ellipseElement.isPointInStroke(); |
+ resultString += "isPointInStroke() throws no exception\n"; |
+ } catch(ex) { |
+ resultString += "isPointInStroke() throws exception\n"; |
+ } |
+ testFill(ellipseElement, "visibleFill", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "visibleStroke", "visible", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "visiblePainted", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "fill", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "stroke", "visible", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "painted", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "visible", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "all", "visible", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "none", "visible", [false, false, false], [false, false]); |
+ |
+ testFill(ellipseElement, "visibleFill", "hidden", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "visibleStroke", "hidden", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "visiblePainted", "hidden", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "fill", "hidden", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "stroke", "hidden", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "painted", "hidden", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "visible", "hidden", [false, false, false], [false, false]); |
+ testFill(ellipseElement, "all", "hidden", [true, true, true], [false, false]); |
+ testFill(ellipseElement, "none", "hidden", [false, false, false], [false, false]); |
+ |
+ |
+ testStroke(ellipseElement, "visibleFill", "visible", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "visibleStroke", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "visiblePainted", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "fill", "visible", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "stroke", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "painted", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "visible", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "all", "visible", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "none", "visible", [false, false], [false, false, false]); |
+ |
+ testStroke(ellipseElement, "visibleFill", "hidden", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "visibleStroke", "hidden", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "visiblePainted", "hidden", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "fill", "hidden", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "stroke", "hidden", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "painted", "hidden", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "visible", "hidden", [false, false], [false, false, false]); |
+ testStroke(ellipseElement, "all", "hidden", [true, true], [false, false, false]); |
+ testStroke(ellipseElement, "none", "hidden", [false, false], [false, false, false]); |
+ |
+ document.getElementById("console").innerHTML = resultString; |
+} |
+ ]]></script> |
+ </body> |
+</html> |