+<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>