Source code
Revision control
Copy as Markdown
Other Tools
// 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);
}
};
}