/* -*- Mode: Java; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- * ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Mozilla Foundation. * * Portions created by the Initial Developer are Copyright (C) 2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Robert Sayre * Henri Sivonen * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK *****/ /** * Runs html5lib-formatted test cases in the browser. Requires SimpleTest. * * Define an array named parserDatFiles before loading this script, * and it will load each of those dat files into an array, then run * the test parser on each and run the tests by assigning the input * data to an iframe's url. * * Your test document should have an element with id "display" and * an iframe with id "testframe". */ var functionsToRunAsync = []; window.addEventListener("message", function(event) { if (event.source == window && event.data == "async-run") { event.stopPropagation(); var fn = functionsToRunAsync.shift(); fn(); } }, true); function asyncRun(fn) { functionsToRunAsync.push(fn); window.postMessage("async-run", "*"); } function writeErrorSummary(input, expected, got, isTodo) { if (isTodo) { $("display").appendChild(createEl('h2', null, "Unexpected Success:")); } else { $("display").appendChild(createEl('h2', null, "Unexpected Failure:")); } $("display").appendChild(createEl('br')); $("display").appendChild(createEl('span', null, "Matched: ")); $("display").appendChild(document.createTextNode("" + (expected == got))); var pre = createEl('pre'); pre.appendChild(createTextNode("Input: \n" + input, "\n-\n")); pre.appendChild(createTextNode("Expected:\n" + expected, "\n-\n")); pre.appendChild(createTextNode("Output:\n" + got + "\n-\n")); $("display").appendChild(pre); $("display").appendChild(createEl('hr')); } /** * Control will bounce back and forth between nextTest() and the * event handler returned by makeTestChecker() or the callback returned by * makeFragmentTestChecker() until the 'testcases' iterator is spent. */ function makeTestChecker(input, expected, errors) { return function (e) { var domAsString = docToTestOutput(e.target.contentDocument); if (html5Exceptions[input]) { todo_is(domAsString, expected, "HTML5 expected success."); if (domAsString == expected) { writeErrorSummary(input, expected, domAsString, true); } } else { is(domAsString, expected, "HTML5 expected success."); if (domAsString != expected) { writeErrorSummary(input, expected, domAsString, false); } } nextTest(e.target); } } function makeFragmentTestChecker(input, expected, errors, fragment, testframe) { return function () { var context = document.createElementNS("http://www.w3.org/1999/xhtml", fragment); context.innerHTML = input; var domAsString = fragmentToTestOutput(context); is(domAsString, expected, "HTML5 expected success. " + new Date()); if (domAsString != expected) { writeErrorSummary(input, expected, domAsString, false); } nextTest(testframe); } } var testcases; function nextTest(testframe) { var test = 0; try { var [input, output, errors, fragment] = testcases.next(); if (fragment) { asyncRun(makeFragmentTestChecker(input, output, errors, fragment, testframe)); } else { dataURL = "data:text/html;charset=utf-8," + encodeURIComponent(input); testframe.onload = makeTestChecker(input, output, errors); testframe.src = dataURL; } } catch (err if err instanceof StopIteration) { SimpleTest.finish(); } } var testFileContents = []; function loadNextTestFile() { var datFile = parserDatFiles.shift(); if (datFile) { var xhr = new XMLHttpRequest(); xhr.onreadystatechange = function () { if (this.readyState == 4) { testFileContents.push(this.responseText); loadNextTestFile(); } }; xhr.open("GET", "html5lib_tree_construction/" + datFile); xhr.send(); } else { testcases = test_parser(testFileContents); nextTest($("testframe")); } } addLoadEvent(loadNextTestFile); SimpleTest.waitForExplicitFinish();