2010-07-13 Eric Seidel <eric@webkit.org>
[WebKit-https.git] / LayoutTests / html5lib / webkit-resumer.html
1 <title>html5lib test runner</title>
2 <script>
3 // Copyright (c) 2008 Geoffrey Sneddon
4 // 
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 // 
12 // The above copyright notice and this permission notice shall be included in
13 // all copies or substantial portions of the Software.
14 // 
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21 // THE SOFTWARE.
22 </script>
23 <script>
24 String.prototype.toAsciiLowerCase = function () {
25   var output = "";
26   for (var i = 0, len = this.length; i < len; ++i) {
27     if (this.charCodeAt(i) >= 0x41 && this.charCodeAt(i) <= 0x5A) {
28       output += String.fromCharCode(this.charCodeAt(i) + 0x20)
29     } else {
30       output += this.charAt(i);
31     }
32   }
33   return output;
34 }
35
36 function indent(ancestors) {
37   var str = "";
38   if (ancestors > 0) {
39     while (ancestors--)
40       str += "  ";
41   }
42   return str;
43 }
44
45 function dom2string(node, ancestors) {
46   var str = "";
47   if (typeof ancestors == "undefined")
48     var ancestors = 0;
49   if (!node.firstChild)
50     return "| ";
51   var parent = node;
52   var current = node.firstChild;
53   var next = null;
54   var misnested = null;
55   for (;;) {
56     str += "\n| " + indent(ancestors);
57     switch (current.nodeType) {
58       case 10:
59         str += '<!DOCTYPE ' + current.nodeName + '>';
60         break;
61       case 8:
62         try {
63           str += '<!-- ' + current.nodeValue + ' -->';
64         } catch (e) {
65           str += '<!--  -->';
66         }
67         if (parent != current.parentNode) {
68           return str += ' (misnested... aborting)';
69         }
70         break;
71       case 7:
72         str += '<?' + current.nodeName + current.nodeValue + '>';
73         break;
74       case 4:
75         str += '<![CDATA[ ' + current.nodeValue + ' ]]>';
76         break;
77       case 3:
78         str += '"' + current.nodeValue + '"';
79         if (parent != current.parentNode) {
80           return str += ' (misnested... aborting)';
81         }
82         break;
83       case 1:
84         str += "<";
85         switch (current.namespaceURI) {
86           case "http://www.w3.org/2000/svg":
87             str += "svg ";
88             break;
89           case "http://www.w3.org/1998/Math/MathML":
90             str += "math ";
91             break;
92         }
93         if (current.localName && current.namespaceURI && current.namespaceURI != null) {
94           str += current.localName;
95         } else {
96           str += current.nodeName.toAsciiLowerCase();
97         }
98         str += '>';
99         if (parent != current.parentNode) {
100           return str += ' (misnested... aborting)';
101         } else {
102           if (current.attributes) {
103             var attrNames = [];
104             var attrPos = {};
105             for (var j = 0; j < current.attributes.length; j += 1) {
106               if (current.attributes[j].specified) {
107                 var name = "";
108                 switch (current.attributes[j].namespaceURI) {
109                   case "http://www.w3.org/XML/1998/namespace":
110                     name += "xml ";
111                     break;
112                   case "http://www.w3.org/2000/xmlns/":
113                     name += "xmlns ";
114                     break;
115                   case "http://www.w3.org/1999/xlink":
116                     name += "xlink ";
117                     break;
118                 }
119                 if (current.attributes[j].localName) {
120                   name += current.attributes[j].localName;
121                 } else {
122                   name += current.attributes[j].nodeName;
123                 }
124                 attrNames.push(name);
125                 attrPos[name] = j;
126               }
127             }
128             if (attrNames.length > 0) {
129               attrNames.sort();
130               for (var j = 0; j < attrNames.length; j += 1) {
131                 str += "\n| " + indent(1 + ancestors) + attrNames[j];
132                 str += '="' + current.attributes[attrPos[attrNames[j]]].nodeValue + '"';
133               }
134             }
135           }
136           if (next = current.firstChild) {
137             parent = current;
138             current = next;
139             ancestors++;
140             continue;
141           }
142         }
143         break;
144     }
145     for (;;) {
146       if (next = current.nextSibling) {
147         current = next;
148         break;
149       }
150       current = current.parentNode;
151       parent = parent.parentNode;
152       ancestors--;
153       if (current == node) {
154         return str.substring(1);
155       }
156     }
157   }
158 }
159 </script>
160 <script>
161 if (window.layoutTestController)
162     layoutTestController.dumpAsText();
163 </script>
164 <style>
165 .overview:hover {
166 background: #ccc;
167 }
168 iframe {
169 display: none;
170 }
171 </style>
172 <p>Script did not run</p>
173 <iframe></iframe>
174 <script>
175 var test_files = [
176         // 'resources/tests1.dat',
177         // 'resources/tests2.dat',
178         // 'resources/tests3.dat',
179         // 'resources/tests4.dat',
180         // 'resources/tests5.dat',
181         // 'resources/tests6.dat',
182         // 'resources/tests7.dat',
183         // 'resources/tests8.dat',
184         // 'resources/tests9.dat',
185         // 'resources/tests10.dat',
186         // 'resources/tests11.dat',
187         // 'resources/tests12.dat',
188         // 'resources/tests14.dat',
189         // 'resources/tests15.dat',
190         // 'resources/tests16.dat',
191         'resources/webkit01.dat',
192         // 'resources/doctype01.dat',
193         // 'resources/scriptdata01.dat',
194         // 'resources/entities01.dat',
195         // 'resources/comments01.dat'
196     ],
197     tests = [],
198     iframe = document.getElementsByTagName("iframe")[0],
199     stat = document.getElementsByTagName("p")[0].firstChild,
200     file = "",
201     test_number = 1,
202     subtest_number = 0,
203     fail_list = [],
204     log = "";
205
206 iframe.contentWindow.document.open()
207 iframe.contentWindow.document.write("Test");
208 iframe.contentWindow.document.close();
209 var write = iframe.contentWindow.document.lastChild.lastChild.lastChild !== null;
210 var ignoreTitle = iframe.contentWindow.document.getElementsByTagName("title")[0] !== undefined;
211
212 window.onload = function()
213 {
214     stat.data = "Running";
215     run();
216 }
217
218 function run()
219 {
220     var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
221     if (file = test_files.shift())
222     {
223         stat.data = "Retriving " + file;
224         test_number = 1;
225         fail_list = [];
226         log = "";
227         xhr.open("GET", file);
228         xhr.onreadystatechange = function()
229         {
230             if (xhr.readyState === 4)
231             {
232                 tests = xhr.responseText.split(/(?:^|\n\n)#data\n/);
233                 tests.shift();
234                 test();
235             }
236         }
237         xhr.send(null);
238     }
239 }
240
241 function test()
242 {
243     var input, errorsStart, fragmentStart, contextElement, domStart, dom;
244     if (data = tests.shift())
245     {
246         subtest_number = 0;
247         stat.data = "Running test " + test_number + " of " + (test_number + tests.length) + " in " + file;
248         errorsStart = data.indexOf("\n#errors\n");
249         if (errorsStart !== -1)
250         {
251             input = data.substring(0, errorsStart);
252             fragmentStart = data.indexOf("\n#document-fragment\n")
253             domStart = data.indexOf("\n#document\n")
254             if (fragmentStart !== -1)
255             {
256                 contextElement = data.substring(fragmentStart + 20, domStart);
257             }
258             if (domStart !== -1)
259             {
260                 dom = data.substring(domStart + 11);
261                 if (dom.substring(dom.length - 1) === "\n")
262                 {
263                     dom = dom.substring(0, dom.length - 1);
264                 }
265                 run_test(input, contextElement, dom);
266                 return;
267             }
268         }
269         alert("Invalid test: " + data);
270         test();
271         return;
272     }
273     else
274     {
275         stat.data = "Finished running " + file;
276         var overview = document.createElement("p");
277         if (fail_list.length)
278         {
279             overview.innerHTML = file + ":<br>" + fail_list.join("<br>");
280             overview.className = "overview";
281             overview.title = "Click for more details";
282             overview.onclick = function()
283             {
284                 this.nextSibling.style.display = this.nextSibling.style.display == "none" ? "block" : "none";
285             }
286             var detail = document.createElement("pre");
287             detail.appendChild(document.createTextNode(log.substring(2)));
288             detail.style.display = "none";
289             document.body.appendChild(overview);
290             document.body.appendChild(detail);
291         }
292         else
293         {
294             overview.innerHTML = file + ": PASS";
295             document.body.appendChild(overview);
296         }
297         stat.data = "";
298         run();
299     }
300 }
301
302 function run_test(input, contextElement, expected)
303 {
304     while (++subtest_number < input.length) {
305         lower_input = input.substring(0, subtest_number);
306         upper_input = input.substring(subtest_number, input.length);
307         if (contextElement)
308         {
309             var element = document.createElement(contextElement);
310             try
311             {
312                 element.innerHTML = input;
313             }
314             catch(e) {}
315             process_result(input, element, expected);
316         }
317         else if (write)
318         {
319             iframe.contentWindow.document.open();
320             try
321             {
322                 iframe.contentWindow.document.write(lower_input);
323                 iframe.contentWindow.document.write(upper_input);
324             }
325             catch(e) {}
326             iframe.contentWindow.document.close();
327             if (ignoreTitle)
328             {
329                 var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
330                 if (!title.innerHTML)
331                 {
332                     title.parentElement.removeChild(title);
333                 }
334             }
335             process_result(input, iframe.contentWindow.document, expected);
336         }
337         else
338         {
339             iframe.onload = function()
340             {
341                 if (ignoreTitle)
342                 {
343                     var title = iframe.contentWindow.document.getElementsByTagName("title")[0];
344                     if (!title.innerHTML)
345                     {
346                         title.parentElement.removeChild(title);
347                     }
348                 }
349                 process_result(input, iframe.contentWindow.document, expected, true);
350             }
351             iframe.src = "data:text/html," + encodeURIComponent(input);
352             break;
353         }
354     }
355     test();
356 }
357
358 function process_result(input, result, expected, async)
359 {
360     result = dom2string(result);
361     if (result !== expected)
362     {
363         fail_list.push(test_number + "." + subtest_number);
364         log += "\n\nTest " + (test_number) + " of " + (test_number + tests.length) + " in " + file + " failed. Input:\n" + input + "\nGot:\n" + result + "\nExpected:\n" + expected;
365     }
366     test_number++;
367     if (async)
368         test();
369 }
370 </script>