<title>html5lib test runner</title>
<script>
</script>
<script src=../resources/dump-as-markup.js></script>
<style>
.overview:hover {
background: #ccc;
}
iframe {
display: none;
}
</style>
<p>Script did not run</p>
<iframe></iframe>
<script>
if (window.testRunner)
testRunner.waitUntilDone();
Markup.noAutoDump();
Markup.useHTML5libOutputFormat();
var test_files = [
'resources/webkit01.dat',
],
tests = [],
iframe = document.getElementsByTagName("iframe")[0],
stat = document.getElementsByTagName("p")[0].firstChild,
file = "",
test_number = 1,
subtest_number = 0,
fail_list = [],
log = "";
iframe.contentWindow.document.open()
iframe.contentWindow.document.write("Test");
iframe.contentWindow.document.close();
var write = iframe.contentWindow.document.lastChild.lastChild.lastChild !== null;
var ignoreTitle = iframe.contentWindow.document.getElementsByTagName("title")[0] !== undefined;
window.onload = function()
{
stat.data = "Running";
run();
}
function run()
{
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
if (file = test_files.shift())
{
stat.data = "Retriving " + file;
test_number = 1;
fail_list = [];
log = "";
xhr.open("GET", file);
xhr.onreadystatechange = function()
{
if (xhr.readyState === 4)
{
tests = xhr.responseText.split(/(?:^|\n\n)#data\n/);
tests.shift();
test();
}
}
xhr.send(null);
} else {
if (window.testRunner)
testRunner.notifyDone();
}
}
function test()
{
var input, errorsStart, fragmentStart, contextElement, domStart, dom;
if (data = tests.shift())
{
subtest_number = 0;
stat.data = "Running test " + test_number + " of " + (test_number + tests.length) + " in " + file;
errorsStart = data.indexOf("\n#errors\n");
if (errorsStart !== -1)
{
input = data.substring(0, errorsStart);
fragmentStart = data.indexOf("\n#document-fragment\n")
domStart = data.indexOf("\n#document\n")
if (fragmentStart !== -1)
{
contextElement = data.substring(fragmentStart + 20, domStart);
}
if (domStart !== -1)
{
dom = data.substring(domStart + 11);
if (dom.substring(dom.length - 1) === "\n")
{
dom = dom.substring(0, dom.length - 1);
}
run_test(input, contextElement, dom);
return;
}
}
alert("Invalid test: " + data);
test();
return;
}
else
{
stat.data = "Finished running " + file;
var overview = document.createElement("p");
if (fail_list.length)
{
overview.innerHTML = file + ":<br>" + fail_list.join("<br>");
overview.className = "overview";
overview.title = "Click for more details";
overview.onclick = function()
{
this.nextSibling.style.display = this.nextSibling.style.display == "none" ? "block" : "none";
}
var detail = document.createElement("pre");
detail.appendChild(document.createTextNode(log.substring(2)));
detail.style.display = "none";
document.body.appendChild(overview);
document.body.appendChild(detail);
}
else
{
overview.innerHTML = file + ": PASS";
document.body.appendChild(overview);
}
stat.data = "";
run();
}
}
function run_test(input, contextElement, expected)
{
while (++subtest_number < input.length) {
lower_input = input.substring(0, subtest_number);
upper_input = input.substring(subtest_number, input.length);
if (contextElement)
{
var element = document.createElement(contextElement);
try
{
element.innerHTML = input;
}
catch(e) {}
process_result(input, element, expected);
}
else if (write)
{
iframe.contentWindow.document.open();
try
{
iframe.contentWindow.document.write(lower_input);
iframe.contentWindow.document.write(upper_input);
}
catch(e) {}
iframe.contentWindow.document.close();
if (ignoreTitle)
{
var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
if (!title.innerHTML)
{
title.parentElement.removeChild(title);
}
}
process_result(input, iframe.contentWindow.document, expected);
}
else
{
iframe.onload = function()
{
if (ignoreTitle)
{
var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
if (!title.innerHTML)
{
title.parentElement.removeChild(title);
}
}
process_result(input, iframe.contentWindow.document, expected, true);
}
iframe.src = "data:text/html," + encodeURIComponent(input);
break;
}
}
test();
}
function process_result(input, result, expected, async)
{
result = Markup.get(result);
if (result !== expected)
{
fail_list.push(test_number + "." + subtest_number);
log += "\n\nTest " + (test_number) + " of " + (test_number + tests.length) + " in " + file + " failed. Input:\n" + input + "\nGot:\n" + result + "\nExpected:\n" + expected;
}
test_number++;
if (async)
test();
}
</script>