// These are defined by the test: // errors (boolean) // encoder (function) // ranges (array) // separator (string) // expect (function) var tests = []; var cplist = []; var numTests = null; var numFrames = 2; var chunkSize = 400; var numChunks = null; var frames = null; var frames = null; var forms = null; var encodedSeparator = encodeURIComponent(separator); var currentChunkIndex = 0; var pageCharset = document.querySelector("meta[charset]").getAttribute("charset"); setup(function() { // create a simple list of just those code points for which there is an encoding possible codepoints = []; for (var range of ranges) { for (var i = range[0]; i < range[1]; i++) { result = encoder(String.fromCodePoint(i)); var success = !!result; if (errors) { success = !success; } if (success) { var item = {}; codepoints.push(item); item.cp = i; item.expected = expect(result, i); item.desc = range[2]; } } } // convert the information into a simple array of objects that can be easily traversed var currentChunk = []; var currentTests = []; cplist = [currentChunk]; tests = [currentTests]; for (i = 0; i < codepoints.length; i++) { if (currentChunk.length == chunkSize) { currentChunk = []; cplist.push(currentChunk); currentTests = []; tests.push(currentTests); } var item = {}; currentChunk.push(item); item.cp = codepoints[i].cp; item.expected = codepoints[i].expected; item.desc = codepoints[i].desc; currentTests.push(subsetTest(async_test, (item.desc ? item.desc + " " : "") + "U+" + item.cp.toString(16).toUpperCase() + " " + String.fromCodePoint(item.cp) + " " + item.expected )); } numChunks = cplist.length; for (var i = 0; i < numFrames; i++) { var frame = document.createElement("iframe"); frame.id = frame.name = "frame-" + i; document.body.appendChild(frame); var form = document.createElement("form"); form.id = "form-" + i; form.method = "GET"; form.action = "/common/blank.html"; form.acceptCharset = pageCharset; form.target = frame.id; var input = document.createElement("input"); input.id = input.name = "input-" + i; form.appendChild(input); document.body.appendChild(form); } addEventListener("load", function() { frames = Array.prototype.slice.call( document.getElementsByTagName("iframe") ); forms = Array.prototype.slice.call( document.getElementsByTagName("form") ); inputs = Array.prototype.slice.call( document.getElementsByTagName("input") ); for (var i = 0; i < Math.min(numFrames, numChunks); i++) { runNext(i); } }); }); function runNext(id) { var i = currentChunkIndex; currentChunkIndex += 1; var iframe = frames[id]; var form = forms[id]; var input = inputs[id]; input.value = cplist[i] .map(function(x) { return String.fromCodePoint(x.cp); }) .join(separator); form.submit(); iframe.onload = function() { var url = iframe.contentWindow.location; var query = url.search; var result_string = query.substr(query.indexOf("=") + 1); var results = result_string.split(encodedSeparator); for (var j = 0; j < cplist[i].length; j++) { var t = tests[i][j]; if (t) { t.step(function() { assert_equals( normalizeStr(results[j]), normalizeStr(cplist[i][j].expected) ); }); t.done(); } } if (currentChunkIndex < numChunks) { runNext(id); } }; }