| <html> |
| <head> |
| <link rel="stylesheet" href="../../fast/js/resources/js-test-style.css"> |
| <script src="../../fast/js/resources/js-test-pre.js"></script> |
| <script src="resources/scripted-random.js"></script> |
| </head> |
| <body> |
| <p id="description"></p> |
| <div id="console"></div> |
| <script> |
| description("This test fuzzes the transform parser with semi-random attribute values and dumps the results of any values that parse successfully."); |
| |
| var attributes = { // maps a viewspec attribute to its minimum argument count |
| viewBox: 6, |
| preserveAspectRatio: 1, |
| transform: 1, |
| zoomAndPan: 1, |
| viewTarget: 1 |
| }; |
| |
| var preserveAspectRatioValues = [ "Min", "Max", "Mid" ]; |
| |
| var testsToRun = [ |
| "svgView", |
| "svgView(", |
| "svgView()", |
| "svgView(" + String.fromCharCode(0), |
| "svgView(" + String.fromCharCode(0) + ")", |
| "svgView(transform(scale(2));;)", |
| "svgView(transform(scale(2));x", // used to hang |
| "svgView(transform(scale(.5)))", |
| "svgView(;transform(scale(.5)))", |
| "svgView(;;transform(scale(.5)))", |
| "svgView(transform(scale(.5));transform(scale(2));transform(scale(2)))", |
| ]; |
| |
| |
| var characters = [ |
| "0", |
| "1", |
| "2", |
| "3", |
| "4", |
| "5", |
| "6", |
| "7", |
| "8", |
| "9", |
| ".", |
| "e", |
| "+", |
| "-", |
| "e", |
| "(", |
| ")", |
| " ", // not a valid fragment char |
| "\t", // not a valid fragment char |
| "," |
| ]; |
| |
| function buildTestsToRun() { |
| for (var attribute in attributes) { |
| |
| // Too few / too many arguments |
| for (var i = 0; i < 20; i++) { //> |
| var attributeString = "svgView(" + attribute + "("; |
| for (var j = 0; j < i; j++) { //> |
| attributeString += "0"; |
| if (j < i - 1) //> |
| attributeString += ","; |
| } |
| attributeString += "))"; |
| testsToRun.push(attributeString); |
| } |
| |
| // Random assortments of valid characters |
| for (var i = 0; i < 100; i++) { //> |
| var attributeString = "svgView(" + attribute + "("; |
| var count = Math.scriptedRandomInt(20); |
| for (var j = 0; j < count; j++) { //> |
| attributeString += characters[Math.scriptedRandomInt(characters.length)]; |
| } |
| testsToRun.push(attributeString); |
| } |
| |
| // attribute names that are "off by one" |
| var extraChar = attribute.charAt(attribute.length - 1); |
| testsToRun.push("svgView(" + attribute + extraChar + "(0, 0)"); |
| testsToRun.push("svgView(" + attribute.substring(0, attribute.length - 1) + "(0, 0)"); |
| |
| // Empty-ish attributes |
| testsToRun.push("svgView(" + attribute); |
| testsToRun.push("svgView(" + attribute + String.fromCharCode(0)); |
| testsToRun.push("svgView(" + attribute + "(" + String.fromCharCode(0) + ")"); |
| } |
| |
| } |
| |
| function viewSpecToString(viewSpec) |
| { |
| if (!viewSpec) |
| return viewSpec; |
| |
| var attributes = []; |
| if (viewSpec.transform) |
| attributes.push("transform(" + viewSpec.transform + ")"); |
| if (viewSpec.viewBox) |
| attributes.push("viewBox(" + viewSpec.viewBox + ")"); |
| if (viewSpec.preserveAspectRatio) |
| attributes.push("preserveAspectRatio(" + viewSpec.preserveAspectRatio + ")"); |
| if (viewSpec.zoomAndPan) |
| attributes.push("zoomAndPan(" + viewSpec.zoomAndPan + ")"); |
| if (viewSpec.viewTarget) |
| attributes.push("viewTarget(" + viewSpac.viewTarget + ")"); |
| |
| return "svgView(" + attributes.join(";") + ")"; |
| } |
| |
| var testNumber = 0; |
| var testString = "[initial view]" |
| |
| function makeURLRelative(url) { |
| return url.slice(url.indexOf("resources")); |
| } |
| |
| function testFragment(string) { |
| var oldEmbed = document.getElementById("object"); |
| if (oldEmbed) { |
| oldEmbed.parentNode.removeChild(oldEmbed); |
| } |
| var embedElement = document.createElement("iframe"); |
| embedElement.setAttribute("id", "object"); |
| embedElement.setAttribute("width", "100"); |
| embedElement.setAttribute("height", "100"); |
| embedElement.setAttribute("onload", "continueFuzzing(event)"); |
| var newURL = "resources/viewspec-parser.svg#" + string; |
| embedElement.src = newURL; |
| debug("Starting: " + makeURLRelative(embedElement.src)); |
| document.body.appendChild(embedElement); |
| } |
| |
| function startNextTest() |
| { |
| testFragment(testString); |
| } |
| |
| function continueFuzzing(event) |
| { |
| var embedElement = document.getElementById("object"); |
| if (embedElement.contentDocument) { |
| debug("Loaded: " + makeURLRelative(embedElement.contentDocument.URL)); |
| debug("Parsed: " + viewSpecToString(embedElement.contentDocument.currentView) + " from: " + testString); |
| } else |
| debug("no svgdocument"); |
| |
| if (testNumber < testsToRun.length) |
| testString = testsToRun[testNumber]; |
| else { |
| var scriptTag = document.createElement("script"); |
| scriptTag.src = "../../fast/js/resources/js-test-post.js"; |
| document.body.appendChild(scriptTag); |
| if (window.layoutTestController) |
| layoutTestController.notifyDone(); |
| return; |
| } |
| testNumber++; |
| |
| // this lets us out of the onload handler so we don't overrun the stack |
| window.setTimeout(startNextTest, 0); |
| } |
| if (window.layoutTestController) |
| layoutTestController.waitUntilDone(); |
| |
| buildTestsToRun(); |
| testFragment(""); |
| successfullyParsed = true; |
| </script> |
| </html> |