OLD | NEW |
1 <!-- | 1 <!-- |
2 | 2 |
3 /* | 3 /* |
4 ** Copyright (c) 2012 The Khronos Group Inc. | 4 ** Copyright (c) 2012 The Khronos Group Inc. |
5 ** | 5 ** |
6 ** Permission is hereby granted, free of charge, to any person obtaining a | 6 ** Permission is hereby granted, free of charge, to any person obtaining a |
7 ** copy of this software and/or associated documentation files (the | 7 ** copy of this software and/or associated documentation files (the |
8 ** "Materials"), to deal in the Materials without restriction, including | 8 ** "Materials"), to deal in the Materials without restriction, including |
9 ** without limitation the rights to use, copy, modify, merge, publish, | 9 ** without limitation the rights to use, copy, modify, merge, publish, |
10 ** distribute, sublicense, and/or sell copies of the Materials, and to | 10 ** distribute, sublicense, and/or sell copies of the Materials, and to |
(...skipping 10 matching lines...) Expand all Loading... |
21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, | 21 ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE | 22 ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
23 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. | 23 ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. |
24 */ | 24 */ |
25 | 25 |
26 --> | 26 --> |
27 <!DOCTYPE html> | 27 <!DOCTYPE html> |
28 <html> | 28 <html> |
29 <head> | 29 <head> |
30 <meta charset="utf-8"> | 30 <meta charset="utf-8"> |
| 31 <!-- Prevents Chrome from offering to translate tests which generate |
| 32 random characters for things like attribute names --> |
| 33 <meta name="google" value="notranslate"> |
31 <title>WebGL Conformance Tests</title> | 34 <title>WebGL Conformance Tests</title> |
32 <style> | 35 <style> |
33 html, body { | 36 body { |
34 border: 0; | 37 border: 0; |
35 margin: 0; | 38 margin: 0; |
| 39 padding: 0; |
36 height: 100%; | 40 height: 100%; |
37 height: 100%; | 41 max-height:100%; |
38 text-align: center; | |
39 font-family: monospace; | 42 font-family: monospace; |
| 43 overflow: hidden; |
40 } | 44 } |
| 45 |
| 46 #testlist { |
| 47 position:fixed; |
| 48 top:310px; |
| 49 left:0; |
| 50 right:0; |
| 51 bottom:0px; |
| 52 overflow:auto; |
| 53 padding:1em; |
| 54 } |
| 55 |
| 56 #header { |
| 57 position:absolute; |
| 58 top:0; |
| 59 left:0; |
| 60 width:100%; |
| 61 height:310px; |
| 62 overflow:auto; |
| 63 } |
| 64 |
| 65 #info { |
| 66 text-align: center; |
| 67 min-width: 300px; |
| 68 } |
| 69 |
41 table { | 70 table { |
42 width: 100%; | 71 width: 100%; |
43 height: 100%; | 72 height: 100%; |
44 } | 73 } |
| 74 #frames td { |
| 75 border: 1px solid black; |
| 76 min-height: 1px; |
| 77 min-width: 1px; |
| 78 } |
| 79 #frames t |
45 .timeout { } | 80 .timeout { } |
46 .success { } | 81 .success { } |
47 .fail { } | 82 .fail { } |
48 .testpage { border: 1px solid black; background-color: #ccc; } | 83 .testpage { border: 1px solid black; background-color: #ccc; } |
49 .testpagesuccess { border: 1px solid black; background-color: #8F8; } | 84 .testpagesuccess { border: 1px solid black; background-color: #8F8; } |
50 .testpagefail { border: 1px solid black; background-color: #F88; } | 85 .testpagefail { border: 1px solid black; background-color: #F88; } |
| 86 .testpageskipped { border: 1px solid black; background-color: #888; } |
51 .testpagetimeout { border: 1px solid black; background-color: #FC8; } | 87 .testpagetimeout { border: 1px solid black; background-color: #FC8; } |
52 .nowebgl { font-weight: bold; color: red; } | 88 .nowebgl { font-weight: bold; color: red; } |
53 #error-wrap { | 89 #error-wrap { |
54 float: left; | 90 float: left; |
55 position: relative; | 91 position: relative; |
56 left: 50%; | 92 left: 50%; |
57 } | 93 } |
58 #error { | 94 #error { |
59 color: red; | 95 color: red; |
60 float: left; | 96 float: left; |
61 position: relative; | 97 position: relative; |
62 left: -50%; | 98 left: -50%; |
63 text-align: left; | 99 text-align: left; |
64 } | 100 } |
65 ul { | 101 ul { |
66 list-style: none; | 102 list-style: none; |
67 padding-left: 1em; | 103 padding-left: 1em; |
68 } | 104 } |
69 </style> | 105 </style> |
70 <script type="text/javascript" src="resources/webgl-test-harness.js"></script> | 106 <script type="text/javascript" src="resources/webgl-test-harness.js"></script> |
71 <script> | 107 <script> |
72 var CONFORMANCE_TEST_VERSION = "1.0.2 (beta)"; | 108 "use strict"; |
| 109 var CONFORMANCE_TEST_VERSION = "1.0.3 (beta)"; |
73 | 110 |
74 var OPTIONS = { | 111 var OPTIONS = { |
75 version: CONFORMANCE_TEST_VERSION | 112 version: CONFORMANCE_TEST_VERSION, |
| 113 frames: 1, |
| 114 allowSkip: 0 |
76 }; | 115 }; |
77 | 116 |
78 function start() { | 117 function start() { |
79 | 118 |
80 function log(msg) { | 119 function log(msg) { |
81 if (window.console && window.console.log) { | 120 if (window.console && window.console.log) { |
82 window.console.log(msg); | 121 window.console.log(msg); |
83 } | 122 } |
84 } | 123 } |
85 | 124 |
(...skipping 10 matching lines...) Expand all Loading... |
96 } catch (e) { | 135 } catch (e) { |
97 } | 136 } |
98 if (context) { | 137 if (context) { |
99 break; | 138 break; |
100 } | 139 } |
101 } | 140 } |
102 return context; | 141 return context; |
103 } | 142 } |
104 | 143 |
105 var reportType = WebGLTestHarnessModule.TestHarness.reportType; | 144 var reportType = WebGLTestHarnessModule.TestHarness.reportType; |
| 145 var pageCount = 0; |
| 146 var folderCount = 0; |
| 147 var autoScrollEnabled = true; // Whether the user prefers to auto scroll |
| 148 var autoScroll = true; // Whether auto scroll is actually performed |
106 | 149 |
107 var Page = function(reporter, folder, testIndex, url) { | 150 var Page = function(reporter, folder, testIndex, url) { |
108 this.reporter = reporter; | 151 this.reporter = reporter; |
109 this.folder = folder; | 152 this.folder = folder; |
110 this.url = url; | 153 this.url = url; |
111 this.totalTests = 0; | 154 this.totalTests = 0; |
112 this.totalSuccessful = 0; | 155 this.totalSuccessful = 0; |
113 this.totalTimeouts = 0; | 156 this.totalTimeouts = 0; |
| 157 this.totalSkipped = 0; |
114 this.testIndex = testIndex; | 158 this.testIndex = testIndex; |
115 | 159 |
| 160 this.elementId = "page" + pageCount++; |
116 var li = reporter.localDoc.createElement('li'); | 161 var li = reporter.localDoc.createElement('li'); |
| 162 li.id = this.elementId; |
117 var div = reporter.localDoc.createElement('div'); | 163 var div = reporter.localDoc.createElement('div'); |
118 var check = reporter.localDoc.createElement('input'); | 164 var check = reporter.localDoc.createElement('input'); |
119 check.type = 'checkbox'; | 165 check.type = 'checkbox'; |
120 check.checked = true; | 166 check.checked = true; |
121 div.appendChild(check); | 167 div.appendChild(check); |
122 var button = reporter.localDoc.createElement('input'); | 168 var button = reporter.localDoc.createElement('input'); |
123 button.type = 'button'; | 169 button.type = 'button'; |
124 button.value = 'run'; | 170 button.value = 'run'; |
125 button.onclick = function() { | 171 button.onclick = function() { |
| 172 autoScroll = false; |
126 reporter.runTest(url); | 173 reporter.runTest(url); |
127 }; | 174 }; |
128 if (reporter.noWebGL) { | 175 if (reporter.noWebGL) { |
129 button.disabled = true; | 176 button.disabled = true; |
130 } | 177 } |
131 div.appendChild(button); | 178 div.appendChild(button); |
132 var a = reporter.localDoc.createElement('a'); | 179 var a = reporter.localDoc.createElement('a'); |
133 a.href = url; | 180 a.href = url; |
134 a.target = "_blank"; | 181 a.target = "_blank"; |
135 var node = reporter.localDoc.createTextNode(url); | 182 var node = reporter.localDoc.createTextNode(url); |
136 a.appendChild(node); | 183 a.appendChild(node); |
137 div.appendChild(a); | 184 div.appendChild(a); |
138 li.setAttribute('class', 'testpage'); | 185 li.setAttribute('class', 'testpage'); |
139 li.appendChild(div); | 186 li.appendChild(div); |
140 var ul = reporter.localDoc.createElement('ul'); | 187 var ul = reporter.localDoc.createElement('ul'); |
141 var node = reporter.localDoc.createTextNode(''); | 188 var node = reporter.localDoc.createTextNode(''); |
142 li.appendChild(ul); | 189 li.appendChild(ul); |
143 div.appendChild(node); | 190 div.appendChild(node); |
144 this.totalsElem = node; | 191 this.totalsElem = node; |
145 this.resultElem = ul; | 192 this.resultElem = ul; |
146 this.elem = li; | 193 this.elem = li; |
147 this.check = check; | 194 this.check = check; |
148 }; | 195 }; |
149 | 196 |
150 Page.prototype.addResult = function(msg, success) { | 197 Page.prototype.addResult = function(msg, success, skipped) { |
151 ++this.totalTests; | 198 ++this.totalTests; |
152 if (success === undefined) { | 199 if (success === undefined) { |
153 ++this.totalTimeouts; | 200 ++this.totalTimeouts; |
154 var result = "timeout"; | 201 var result = "timeout"; |
155 var css = "timeout"; | 202 var css = "timeout"; |
156 } else if (success) { | 203 } else if (success) { |
157 ++this.totalSuccessful; | 204 if(skipped) { |
158 var result = "success"; | 205 ++this.totalSkipped; |
159 var css = "success"; | 206 } else { |
| 207 ++this.totalSuccessful; |
| 208 } |
160 // don't report success. | 209 // don't report success. |
161 return; | 210 return; |
162 } else { | 211 } else { |
163 var result = "failed"; | 212 var result = "failed"; |
164 var css = "fail"; | 213 var css = "fail"; |
165 } | 214 } |
166 | 215 |
167 var node = this.reporter.localDoc.createTextNode(result + ': ' + msg); | 216 var node = this.reporter.localDoc.createTextNode(result + ': ' + msg); |
168 var li = this.reporter.localDoc.createElement('li'); | 217 var li = this.reporter.localDoc.createElement('li'); |
169 li.appendChild(node); | 218 li.appendChild(node); |
170 li.setAttribute('class', css); | 219 li.setAttribute('class', css); |
171 this.resultElem.appendChild(li); | 220 this.resultElem.appendChild(li); |
172 }; | 221 }; |
173 | 222 |
174 Page.prototype.startPage = function() { | 223 Page.prototype.startPage = function() { |
| 224 if (autoScroll && this.elem.scrollIntoView) { |
| 225 this.elem.scrollIntoView(false); |
| 226 } |
175 this.totalTests = 0; | 227 this.totalTests = 0; |
176 this.totalSuccessful = 0; | 228 this.totalSuccessful = 0; |
177 this.totalTimeouts = 0; | 229 this.totalTimeouts = 0; |
178 // remove previous results. | 230 // remove previous results. |
179 while (this.resultElem.hasChildNodes()) { | 231 while (this.resultElem.hasChildNodes()) { |
180 this.resultElem.removeChild(this.resultElem.childNodes[0]); | 232 this.resultElem.removeChild(this.resultElem.childNodes[0]); |
181 } | 233 } |
182 this.totalsElem.textContent = ''; | 234 this.totalsElem.textContent = ''; |
183 return this.check.checked && this.folder.checked(); | 235 return this.check.checked && this.folder.checked(); |
184 }; | 236 }; |
185 | 237 |
186 Page.prototype.firstTestIndex = function() { | 238 Page.prototype.firstTestIndex = function() { |
187 return this.testIndex; | 239 return this.testIndex; |
188 }; | 240 }; |
189 | 241 |
190 Page.prototype.finishPage = function(success) { | 242 Page.prototype.finishPage = function(success) { |
191 var msg = ' (' + this.totalSuccessful + ' of ' + | 243 if(this.totalSkipped) { |
192 this.totalTests + ' passed)'; | 244 var msg = ' (' + this.totalSkipped + ' of ' + this.totalTests + ' skipped)
'; |
| 245 } else { |
| 246 var msg = ' (' + this.totalSuccessful + ' of ' + this.totalTests + ' passe
d)'; |
| 247 } |
| 248 |
193 if (success === undefined) { | 249 if (success === undefined) { |
194 var css = 'testpagetimeout'; | 250 var css = 'testpagetimeout'; |
195 msg = '(*timeout*)'; | 251 msg = '(*timeout*)'; |
196 ++this.totalTests; | 252 ++this.totalTests; |
197 ++this.totalTimeouts; | 253 ++this.totalTimeouts; |
| 254 } else if (this.totalSkipped) { |
| 255 var css = 'testpageskipped'; |
198 } else if (this.totalSuccessful != this.totalTests) { | 256 } else if (this.totalSuccessful != this.totalTests) { |
199 var css = 'testpagefail'; | 257 var css = 'testpagefail'; |
200 } else { | 258 } else { |
201 var css = 'testpagesuccess'; | 259 var css = 'testpagesuccess'; |
202 } | 260 } |
203 this.elem.setAttribute('class', css); | 261 this.elem.setAttribute('class', css); |
204 this.totalsElem.textContent = msg; | 262 this.totalsElem.textContent = msg; |
205 }; | 263 }; |
206 | 264 |
207 Page.prototype.enableTest = function(re) { | 265 Page.prototype.enableTest = function(re) { |
(...skipping 13 matching lines...) Expand all Loading... |
221 this.reporter = reporter; | 279 this.reporter = reporter; |
222 this.depth = depth; | 280 this.depth = depth; |
223 this.name = opt_name || ""; | 281 this.name = opt_name || ""; |
224 this.subFolders = {}; | 282 this.subFolders = {}; |
225 this.pages = []; | 283 this.pages = []; |
226 this.items = []; | 284 this.items = []; |
227 this.folder = folder; | 285 this.folder = folder; |
228 var that = this; | 286 var that = this; |
229 | 287 |
230 var doc = reporter.localDoc; | 288 var doc = reporter.localDoc; |
| 289 this.elementId = "folder" + folderCount++; |
231 var li = doc.createElement('li'); | 290 var li = doc.createElement('li'); |
| 291 li.id = this.elementId; |
232 var div = doc.createElement('div'); | 292 var div = doc.createElement('div'); |
233 var check = doc.createElement('input'); | 293 var check = doc.createElement('input'); |
234 check.type = 'checkbox'; | 294 check.type = 'checkbox'; |
235 check.checked = true; | 295 check.checked = true; |
236 div.appendChild(check); | 296 div.appendChild(check); |
237 var button = doc.createElement('input'); | 297 var button = doc.createElement('input'); |
238 button.type = 'button'; | 298 button.type = 'button'; |
239 button.value = 'run'; | 299 button.value = 'run'; |
240 button.onclick = function() { | 300 button.onclick = function() { |
| 301 autoScroll = autoScrollEnabled; |
241 that.run(); | 302 that.run(); |
242 }; | 303 }; |
243 if (reporter.noWebGL) { | 304 if (reporter.noWebGL) { |
244 button.disabled = true; | 305 button.disabled = true; |
245 } | 306 } |
246 div.appendChild(button); | 307 div.appendChild(button); |
247 var h = doc.createElement('span'); | 308 var h = doc.createElement('span'); |
248 h.appendChild(doc.createTextNode(this.name)); | 309 h.appendChild(doc.createTextNode(this.name)); |
249 div.appendChild(h); | 310 div.appendChild(h); |
250 var ul = doc.createElement('ul'); | 311 var ul = doc.createElement('ul'); |
(...skipping 18 matching lines...) Expand all Loading... |
269 for (var name in this.subFolders) { | 330 for (var name in this.subFolders) { |
270 numChildren += this.subFolders[name].numChildren(); | 331 numChildren += this.subFolders[name].numChildren(); |
271 } | 332 } |
272 return numChildren + this.pages.length; | 333 return numChildren + this.pages.length; |
273 }; | 334 }; |
274 | 335 |
275 Folder.prototype.run = function() { | 336 Folder.prototype.run = function() { |
276 var firstTestIndex = this.firstTestIndex(); | 337 var firstTestIndex = this.firstTestIndex(); |
277 var count = this.numChildren(); | 338 var count = this.numChildren(); |
278 log("run tests: " + firstTestIndex + " to " + (firstTestIndex + count - 1)) | 339 log("run tests: " + firstTestIndex + " to " + (firstTestIndex + count - 1)) |
279 testHarness.runTests(firstTestIndex, count); | 340 testHarness.runTests({start: firstTestIndex, count: count}); |
280 }; | 341 }; |
281 | 342 |
282 Folder.prototype.getSubFolder = function(name) { | 343 Folder.prototype.getSubFolder = function(name) { |
283 var subFolder = this.subFolders[name]; | 344 var subFolder = this.subFolders[name]; |
284 if (subFolder === undefined) { | 345 if (subFolder === undefined) { |
285 subFolder = new Folder(this.reporter, this, this.depth + 1, name); | 346 subFolder = new Folder(this.reporter, this, this.depth + 1, name); |
286 this.subFolders[name] = subFolder; | 347 this.subFolders[name] = subFolder; |
287 this.items.push(subFolder); | 348 this.items.push(subFolder); |
288 this.childUL.appendChild(subFolder.elem); | 349 this.childUL.appendChild(subFolder.elem); |
289 } | 350 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
334 this.enableUp_(); | 395 this.enableUp_(); |
335 } | 396 } |
336 for (var name in this.subFolders) { | 397 for (var name in this.subFolders) { |
337 this.subFolders[name].enableTest(re); | 398 this.subFolders[name].enableTest(re); |
338 } | 399 } |
339 for (var ii = 0; ii < this.pages.length; ++ii) { | 400 for (var ii = 0; ii < this.pages.length; ++ii) { |
340 this.pages[ii].enableTest(re); | 401 this.pages[ii].enableTest(re); |
341 } | 402 } |
342 }; | 403 }; |
343 | 404 |
344 var Reporter = function() { | 405 var Reporter = function(iframes) { |
345 this.localDoc = document; | 406 this.localDoc = document; |
346 this.resultElem = document.getElementById("results"); | 407 this.resultElem = document.getElementById("results"); |
347 this.fullResultsElem = document.getElementById("fullresults"); | 408 this.fullResultsElem = document.getElementById("fullresults"); |
348 var node = this.localDoc.createTextNode(''); | 409 var node = this.localDoc.createTextNode(''); |
349 this.fullResultsElem.appendChild(node); | 410 this.fullResultsElem.appendChild(node); |
350 this.fullResultsNode = node; | 411 this.fullResultsNode = node; |
351 this.iframe = document.getElementById("testframe"); | 412 this.iframes = iframes; |
352 this.currentPageElem = null; | 413 this.currentPageElem = null; |
353 this.totalPages = 0; | 414 this.totalPages = 0; |
354 this.pagesByURL = {}; | 415 this.pagesByURL = {}; |
355 var canvas = document.getElementById("webglcheck"); | 416 var canvas = document.getElementById("webglcheck"); |
356 var ctx = create3DContext(canvas); | 417 var ctx = create3DContext(canvas); |
357 this.noWebGL = !ctx; | 418 this.noWebGL = !ctx; |
358 this.contextInfo = {}; | 419 this.contextInfo = {}; |
359 this.root = new Folder(this, null, 0, "all"); | 420 this.root = new Folder(this, null, 0, "all"); |
360 this.resultElem.appendChild(this.root.elem); | 421 this.resultElem.appendChild(this.root.elem); |
361 this.callbacks = { }; | 422 this.callbacks = { }; |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
400 | 461 |
401 Reporter.prototype.executeListenerEvents_ = function(type) { | 462 Reporter.prototype.executeListenerEvents_ = function(type) { |
402 var callbacks = this.callbacks[type].slice(0); | 463 var callbacks = this.callbacks[type].slice(0); |
403 for (var ii = 0; ii < callbacks.length; ++ii) { | 464 for (var ii = 0; ii < callbacks.length; ++ii) { |
404 setTimeout(callbacks[ii], 0); | 465 setTimeout(callbacks[ii], 0); |
405 } | 466 } |
406 }; | 467 }; |
407 | 468 |
408 Reporter.prototype.runTest = function(url) { | 469 Reporter.prototype.runTest = function(url) { |
409 var page = this.pagesByURL[url]; | 470 var page = this.pagesByURL[url]; |
410 page.startPage(); | 471 testHarness.runTests({start: page.firstTestIndex(), count: 1}); |
411 this.currentPage = page; | |
412 this.iframe.src = url; | |
413 }; | 472 }; |
414 | 473 |
415 Reporter.prototype.getFolder = function(url) { | 474 Reporter.prototype.getFolder = function(url) { |
416 return this.root.getOrCreateFolder(url); | 475 return this.root.getOrCreateFolder(url); |
417 }; | 476 }; |
418 | 477 |
419 Reporter.prototype.addPage = function(url) { | 478 Reporter.prototype.addPage = function(url) { |
420 var folder = this.getFolder(url); | 479 var folder = this.getFolder(url); |
421 var page = new Page(this, folder, this.totalPages, url); | 480 var page = new Page(this, folder, this.totalPages, url); |
422 folder.addPage(page); | 481 folder.addPage(page); |
423 ++this.totalPages; | 482 ++this.totalPages; |
424 this.pagesByURL[url] = page; | 483 this.pagesByURL[url] = page; |
425 }; | 484 }; |
426 | 485 |
427 Reporter.prototype.startPage = function(url) { | 486 Reporter.prototype.startPage = function(url) { |
428 var page = this.pagesByURL[url]; | 487 var page = this.pagesByURL[url]; |
429 this.currentPage = page; | |
430 return page.startPage(); | 488 return page.startPage(); |
431 }; | 489 }; |
432 | 490 |
433 Reporter.prototype.addResult = function(msg, success) { | 491 Reporter.prototype.addResult = function(url, msg, success, skipped) { |
434 if (this.currentPage != null) { | 492 var page = this.pagesByURL[url]; |
435 this.currentPage.addResult(msg, success); | 493 page.addResult(msg, success, skipped); |
436 } | |
437 }; | 494 }; |
438 | 495 |
439 Reporter.prototype.finishPage = function(success) { | 496 Reporter.prototype.finishPage = function(url, success) { |
440 if (this.currentPage != null) { | 497 var page = this.pagesByURL[url]; |
441 this.currentPage.finishPage(success); | 498 page.finishPage(success); |
442 this.currentPage = null; | |
443 } | |
444 }; | 499 }; |
445 | 500 |
446 Reporter.prototype.displayFinalResults = function(msg, success) { | 501 Reporter.prototype.displayFinalResults = function(msg, success) { |
447 if (success) { | 502 if (success) { |
448 var totalTests = 0; | 503 var totalTests = 0; |
449 var totalSuccessful = 0; | 504 var totalSuccessful = 0; |
450 var totalTimeouts = 0; | 505 var totalTimeouts = 0; |
| 506 var totalSkipped = 0; |
451 for (var url in this.pagesByURL) { | 507 for (var url in this.pagesByURL) { |
452 var page = this.pagesByURL[url]; | 508 var page = this.pagesByURL[url]; |
453 totalTests += page.totalTests; | 509 totalTests += page.totalTests; |
454 totalSuccessful += page.totalSuccessful; | 510 totalSuccessful += page.totalSuccessful; |
455 totalTimeouts += page.totalTimeouts; | 511 totalTimeouts += page.totalTimeouts; |
| 512 totalSkipped += page.totalSkipped; |
456 } | 513 } |
457 var timeout = ''; | 514 var timeout = ''; |
458 if (totalTimeouts > 0) { | 515 if (totalTimeouts > 0) { |
459 timeout = ', ' + totalTimeouts + ' timed out'; | 516 timeout = ', ' + totalTimeouts + ' timed out'; |
460 } | 517 } |
461 var msg = ' (' + totalSuccessful + ' of ' + | 518 var msg = ' (' + totalSuccessful + ' of ' + |
462 totalTests + ' passed' + timeout + ')'; | 519 totalTests + ' passed' + timeout + ')'; |
463 this.fullResultsNode.textContent = msg; | 520 this.fullResultsNode.textContent = msg; |
464 | 521 |
465 // generate a text summary | 522 // generate a text summary |
466 var tx = ""; | 523 var tx = ""; |
467 tx += "WebGL Conformance Test Results\n"; | 524 tx += "WebGL Conformance Test Results\n"; |
468 tx += "Version " + OPTIONS.version + "\n"; | 525 tx += "Version " + OPTIONS.version + "\n"; |
469 tx += "\n"; | 526 tx += "\n"; |
470 tx += "-------------------\n\n"; | 527 tx += "-------------------\n\n"; |
471 tx += "User Agent: " + (navigator.userAgent ? navigator.userAgent : "(navi
gator.userAgent is null)") + "\n"; | 528 tx += "User Agent: " + (navigator.userAgent ? navigator.userAgent : "(navi
gator.userAgent is null)") + "\n"; |
472 tx += "WebGL VENDOR: " + this.contextInfo["VENDOR"] + "\n"; | 529 tx += "WebGL VENDOR: " + this.contextInfo["VENDOR"] + "\n"; |
473 tx += "WebGL VERSION: " + this.contextInfo["VERSION"] + "\n"; | 530 tx += "WebGL VERSION: " + this.contextInfo["VERSION"] + "\n"; |
474 tx += "WebGL RENDERER: " + this.contextInfo["RENDERER"] + "\n"; | 531 tx += "WebGL RENDERER: " + this.contextInfo["RENDERER"] + "\n"; |
475 tx += "Unmasked VENDOR: " + this.contextInfo["UNMASKED_VENDOR"] + "\n"; | 532 tx += "Unmasked VENDOR: " + this.contextInfo["UNMASKED_VENDOR"] + "\n"; |
476 tx += "Unmasked RENDERER: " + this.contextInfo["UNMASKED_RENDERER"] + "\n"
; | 533 tx += "Unmasked RENDERER: " + this.contextInfo["UNMASKED_RENDERER"] + "\n"
; |
477 tx += "WebGL R/G/B/A/Depth/Stencil bits (default config): " + this.context
Info["RED_BITS"] + "/" + this.contextInfo["GREEN_BITS"] + "/" + this.contextInfo
["BLUE_BITS"] + "/" + this.contextInfo["ALPHA_BITS"] + "/" + this.contextInfo["D
EPTH_BITS"] + "/" + this.contextInfo["STENCIL_BITS"] + "\n"; | 534 tx += "WebGL R/G/B/A/Depth/Stencil bits (default config): " + this.context
Info["RED_BITS"] + "/" + this.contextInfo["GREEN_BITS"] + "/" + this.contextInfo
["BLUE_BITS"] + "/" + this.contextInfo["ALPHA_BITS"] + "/" + this.contextInfo["D
EPTH_BITS"] + "/" + this.contextInfo["STENCIL_BITS"] + "\n"; |
478 tx += "\n"; | 535 tx += "\n"; |
479 tx += "-------------------\n\n"; | 536 tx += "-------------------\n\n"; |
480 tx += "Test Summary (" + totalTests + " total tests):\n"; | 537 tx += "Test Summary (" + totalTests + " total tests):\n"; |
481 tx += "Tests PASSED: " + totalSuccessful + "\n"; | 538 tx += "Tests PASSED: " + totalSuccessful + "\n"; |
482 tx += "Tests FAILED: " + (totalTests - totalSuccessful) + "\n"; | 539 tx += "Tests FAILED: " + (totalTests - totalSuccessful - totalSkipped) + "
\n"; |
483 tx += "Tests TIMED OUT: " + totalTimeouts + "\n"; | 540 tx += "Tests TIMED OUT: " + totalTimeouts + "\n"; |
| 541 tx += "Tests SKIPPED: " + totalSkipped + "\n"; |
484 tx += "\n"; | 542 tx += "\n"; |
485 tx += "-------------------\n\n"; | 543 tx += "-------------------\n\n"; |
486 if (totalSuccessful < totalTests) { | 544 if (totalSuccessful < totalTests) { |
487 tx += "Failures:\n\n"; | 545 tx += "Failures:\n\n"; |
488 for (var url in this.pagesByURL) { | 546 for (var url in this.pagesByURL) { |
489 var page = this.pagesByURL[url]; | 547 var page = this.pagesByURL[url]; |
490 var pageTotalFail = page.totalTests - page.totalSuccessful; | 548 var pageTotalFail = page.totalTests - page.totalSuccessful - page.to
talSkipped; |
491 if (!(page.totalTests == 0 && page.totalTimeouts == 0) && | 549 if (!(page.totalTests == 0 && page.totalTimeouts == 0) && |
492 pageTotalFail > 0) | 550 pageTotalFail > 0) |
493 { | 551 { |
494 tx += url + ": " + pageTotalFail + " tests failed"; | 552 tx += url + ": " + pageTotalFail + " tests failed"; |
495 if (page.totalTimeouts) | 553 if (page.totalTimeouts) |
496 tx += " (" + page.totalTimeouts + " timed out)"; | 554 tx += " (" + page.totalTimeouts + " timed out)"; |
497 tx += "\n"; | 555 tx += "\n"; |
498 } | 556 } |
499 } | 557 } |
500 } else { | 558 } else { |
501 tx += "All tests PASSED\n\n"; | 559 tx += "All tests PASSED\n\n"; |
502 } | 560 } |
503 tx += "\n"; | 561 tx += "\n"; |
504 tx += "-------------------\n\n"; | 562 tx += "-------------------\n\n"; |
505 tx += "Complete Test Results (total / pass / fail / timeout):\n\n"; | 563 tx += "Complete Test Results (total / pass / fail / timeout / skipped):\n\
n"; |
506 for (var url in this.pagesByURL) { | 564 for (var url in this.pagesByURL) { |
507 var page = this.pagesByURL[url]; | 565 var page = this.pagesByURL[url]; |
508 var pageTotalFail = page.totalTests - page.totalSuccessful; | 566 var pageTotalFail = page.totalTests - page.totalSuccessful - page.totalS
kipped; |
509 if (!(page.totalTests == 0 && page.totalTimeouts == 0)) { | 567 if (!(page.totalTests == 0 && page.totalTimeouts == 0)) { |
510 tx += url + ": " + page.totalTests + " / " + | 568 tx += url + ": " + page.totalTests + " / " + |
511 page.totalSuccessful + " / " + pageTotalFail + " / " + page.totalT
imeouts + "\n"; | 569 page.totalSuccessful + " / " + pageTotalFail + " / " + page.totalT
imeouts + " / " + page.totalSkipped + "\n"; |
512 } | 570 } |
513 } | 571 } |
514 tx += "\n"; | 572 tx += "\n"; |
515 tx += "-------------------\n\n"; | 573 tx += "-------------------\n\n"; |
516 tx += "Generated on: " + (new Date()).toString() + "\n"; | 574 tx += "Generated on: " + (new Date()).toString() + "\n"; |
517 | 575 |
518 var r = document.getElementById("testResultsAsText"); | 576 var r = document.getElementById("testResultsAsText"); |
519 while (r.firstChild) r.removeChild(r.firstChild); | 577 while (r.firstChild) r.removeChild(r.firstChild); |
520 r.appendChild(document.createTextNode(tx)); | 578 r.appendChild(document.createTextNode(tx)); |
521 document.getElementById("showTextSummary").style.visibility = "visible"; | 579 document.getElementById("showTextSummary").style.visibility = "visible"; |
| 580 |
| 581 this.postResultsToServer(tx); |
522 } else { | 582 } else { |
523 var e = document.getElementById("error"); | 583 var e = document.getElementById("error"); |
524 e.innerHTML = msg; | 584 e.innerHTML = msg; |
| 585 this.postResultsToServer(msg); |
525 } | 586 } |
526 }; | 587 }; |
527 | 588 |
| 589 Reporter.prototype.postTestStartToServer = function(resultText) { |
| 590 if(OPTIONS.postResults == undefined || OPTIONS.postResults == 0) { |
| 591 return; |
| 592 } |
| 593 |
| 594 var xhr = new XMLHttpRequest(); |
| 595 xhr.open('POST', "/start", true); |
| 596 xhr.send(null); |
| 597 }; |
| 598 |
| 599 Reporter.prototype.postResultsToServer = function(resultText) { |
| 600 if(OPTIONS.postResults == undefined || OPTIONS.postResults == 0) { |
| 601 return; |
| 602 } |
| 603 |
| 604 var xhr = new XMLHttpRequest(); |
| 605 xhr.open('POST', "/finish", true); |
| 606 xhr.setRequestHeader("Content-Type", "text/plain"); |
| 607 xhr.send(resultText); |
| 608 }; |
| 609 |
528 Reporter.prototype.ready = function() { | 610 Reporter.prototype.ready = function() { |
529 var loading = document.getElementById("loading"); | 611 var loading = document.getElementById("loading"); |
530 loading.style.display = "none"; | 612 loading.style.display = "none"; |
531 if (!this.noWebGL) { | 613 if (!this.noWebGL) { |
532 var button = document.getElementById("runTestsButton"); | 614 var button = document.getElementById("runTestsButton"); |
533 button.disabled = false; | 615 button.disabled = false; |
534 this.executeListenerEvents_("ready"); | 616 this.executeListenerEvents_("ready"); |
535 } | 617 } |
536 }; | 618 }; |
537 | 619 |
538 Reporter.prototype.reportFunc = function(type, msg, success) { | 620 Reporter.prototype.reportFunc = function(type, url, msg, success, skipped) { |
539 switch (type) { | 621 switch (type) { |
540 case reportType.ADD_PAGE: | 622 case reportType.ADD_PAGE: |
541 return this.addPage(msg); | 623 return this.addPage(msg); |
542 case reportType.READY: | 624 case reportType.READY: |
543 return this.ready(); | 625 return this.ready(); |
544 case reportType.START_PAGE: | 626 case reportType.START_PAGE: |
545 return this.startPage(msg); | 627 return this.startPage(url); |
546 case reportType.TEST_RESULT: | 628 case reportType.TEST_RESULT: |
547 return this.addResult(msg, success); | 629 return this.addResult(url, msg, success, skipped); |
548 case reportType.FINISH_PAGE: | 630 case reportType.FINISH_PAGE: |
549 return this.finishPage(success); | 631 return this.finishPage(url, success); |
550 case reportType.FINISHED_ALL_TESTS: | 632 case reportType.FINISHED_ALL_TESTS: |
551 return this.displayFinalResults(msg, success); | 633 return this.displayFinalResults(msg, success); |
552 default: | 634 default: |
553 throw 'unhandled'; | 635 throw 'unhandled'; |
554 break; | 636 break; |
555 }; | 637 }; |
556 }; | 638 }; |
557 | 639 |
558 var getURLOptions = function(obj) { | 640 var getURLOptions = function(obj) { |
559 var s = window.location.href; | 641 var s = window.location.href; |
560 var q = s.indexOf("?"); | 642 var q = s.indexOf("?"); |
561 var e = s.indexOf("#"); | 643 var e = s.indexOf("#"); |
562 if (e < 0) { | 644 if (e < 0) { |
563 e = s.length; | 645 e = s.length; |
564 } | 646 } |
565 var query = s.substring(q + 1, e); | 647 var query = s.substring(q + 1, e); |
566 var pairs = query.split("&"); | 648 var pairs = query.split("&"); |
567 for (var ii = 0; ii < pairs.length; ++ii) { | 649 for (var ii = 0; ii < pairs.length; ++ii) { |
568 var keyValue = pairs[ii].split("="); | 650 var keyValue = pairs[ii].split("="); |
569 var key = keyValue[0]; | 651 var key = keyValue[0]; |
570 var value = decodeURIComponent(keyValue[1]); | 652 var value = decodeURIComponent(keyValue[1]); |
571 obj[key] = value; | 653 obj[key] = value; |
572 } | 654 } |
573 }; | 655 }; |
574 | 656 |
575 getURLOptions(OPTIONS); | 657 getURLOptions(OPTIONS); |
576 | 658 |
577 document.getElementById("testVersion").innerHTML = OPTIONS.version; | 659 document.getElementById("testVersion").innerHTML = OPTIONS.version; |
578 | 660 |
579 var reporter = new Reporter(); | 661 // Make iframes |
580 var iframe = document.getElementById("testframe"); | 662 var makeIFrames = function() { |
| 663 var toparea = document.getElementById("toparea"); |
| 664 var frame = document.getElementById("frames"); |
| 665 var areaWidth = Math.max(100, toparea.clientWidth - 300); |
| 666 var areaHeight = Math.max(100, frame.clientHeight); |
| 667 |
| 668 var numCells = OPTIONS.frames; |
| 669 |
| 670 var gridWidth = Math.max(1, Math.ceil(Math.sqrt(numCells))); |
| 671 var gridHeight = gridWidth; |
| 672 var bestAspect = 99999; |
| 673 var bestNumEmptyCells = 99999; |
| 674 var bestNumEmptyCellsColumns = 0; |
| 675 var bestNumEmptyCellsAspect = 99999; |
| 676 var minGoodAspect = 1 / 3; |
| 677 var maxGoodAspect = 3 / 1; |
| 678 |
| 679 for (var columns = 1; columns <= numCells; ++columns) { |
| 680 var rows = Math.ceil(numCells / columns); |
| 681 var cellWidth = areaWidth / columns; |
| 682 var cellHeight = areaHeight / rows; |
| 683 var cellAspect = cellWidth / cellHeight; |
| 684 if (cellAspect >= minGoodAspect && cellAspect <= maxGoodAspect) { |
| 685 var numEmptyCells = columns * rows - numCells; |
| 686 // Keep the one with the least number of empty cells. |
| 687 if (numEmptyCells < bestNumEmptyCells) { |
| 688 bestNumEmptyCells = numEmptyCells; |
| 689 bestNumEmptyCellsColumns = columns; |
| 690 bestNumEmptyCellsAspect = cellAspect; |
| 691 // If it's the same number of empty cells keep the one |
| 692 // with the best aspect. |
| 693 } else if (numEmptyCells == bestNumEmptyCells && |
| 694 Math.abs(cellAspect - 1) < |
| 695 Math.abs(bestNumEmptyCellsAspect - 1)) { |
| 696 bestNumEmptyCellsColumns = columns; |
| 697 bestNumEmptyCellsAspect = cellAspect; |
| 698 } |
| 699 } |
| 700 if (Math.abs(cellAspect - 1) < Math.abs(bestAspect - 1)) { |
| 701 gridWidth = columns; |
| 702 gridHeight = rows; |
| 703 bestAspect = cellAspect; |
| 704 } |
| 705 } |
| 706 |
| 707 // if we found an aspect with few empty cells use that. |
| 708 var numEmptyCells = gridWidth * gridHeight - numCells; |
| 709 if (bestNumEmptyCellsColumns && bestNumEmptyCells < numEmptyCells) { |
| 710 gridWidth = bestNumEmptyCellsColumns; |
| 711 gridHeight = Math.ceil(numCells / gridWidth); |
| 712 } |
| 713 |
| 714 var table = document.createElement("table"); |
| 715 table.style.height = areaHeight + "px"; |
| 716 var tbody = document.createElement("tbody"); |
| 717 var iframes = []; |
| 718 for (var row = 0; row < gridHeight; ++row) { |
| 719 var tr = document.createElement("tr"); |
| 720 for (var column = 0; column < gridWidth; ++column) { |
| 721 var td = document.createElement("td"); |
| 722 if (numCells > 0) { |
| 723 --numCells; |
| 724 var iframe = document.createElement("iframe"); |
| 725 iframe.setAttribute("scrolling", "yes"); |
| 726 iframe.style.width = "100%"; |
| 727 iframe.style.height = "100%"; |
| 728 iframes.push(iframe); |
| 729 td.appendChild(iframe); |
| 730 } |
| 731 tr.appendChild(td); |
| 732 } |
| 733 tbody.appendChild(tr); |
| 734 } |
| 735 table.appendChild(tbody); |
| 736 frame.appendChild(table); |
| 737 return iframes; |
| 738 }; |
| 739 var iframes = makeIFrames(); |
| 740 |
| 741 var reporter = new Reporter(iframes); |
581 var testHarness = new WebGLTestHarnessModule.TestHarness( | 742 var testHarness = new WebGLTestHarnessModule.TestHarness( |
582 iframe, | 743 iframes, |
583 '00_test_list.txt', | 744 '00_test_list.txt', |
584 function(type, msg, success) { | 745 function(type, url, msg, success, skipped) { |
585 return reporter.reportFunc(type, msg, success); | 746 return reporter.reportFunc(type, url, msg, success, skipped); |
586 }, | 747 }, |
587 OPTIONS); | 748 OPTIONS); |
588 reporter.addEventListener("ready", function() { | 749 reporter.addEventListener("ready", function() { |
589 // Set which tests to include. | 750 // Set which tests to include. |
590 if (OPTIONS.include) { | 751 if (OPTIONS.include) { |
591 reporter.disableAllTests(); | 752 reporter.disableAllTests(); |
592 var includes = OPTIONS.include.split(",") | 753 var includes = OPTIONS.include.split(",") |
593 for (var ii = 0; ii < includes.length; ++ii) { | 754 for (var ii = 0; ii < includes.length; ++ii) { |
594 reporter.enableTest(new RegExp(includes[ii])); | 755 reporter.enableTest(new RegExp(includes[ii])); |
595 } | 756 } |
596 } | 757 } |
597 // Remove tests based on skip=re1,re2 in URL. | 758 // Remove tests based on skip=re1,re2 in URL. |
598 if (OPTIONS.skip) { | 759 if (OPTIONS.skip) { |
599 var skips = OPTIONS.skip.split(",") | 760 var skips = OPTIONS.skip.split(",") |
600 for (var ii = 0; ii < skips.length; ++ii) { | 761 for (var ii = 0; ii < skips.length; ++ii) { |
601 reporter.disableTest(new RegExp(skips[ii])); | 762 reporter.disableTest(new RegExp(skips[ii])); |
602 } | 763 } |
603 } | 764 } |
604 // Auto run the tests if the run=1 in URL | 765 // Auto run the tests if the run=1 in URL |
605 if (OPTIONS.run != undefined && OPTIONS.run != 0) { | 766 if (OPTIONS.run != undefined && OPTIONS.run != 0) { |
| 767 reporter.postTestStartToServer(); |
606 testHarness.runTests(); | 768 testHarness.runTests(); |
607 } | 769 } |
608 }); | 770 }); |
609 window.webglTestHarness = testHarness; | 771 window.webglTestHarness = testHarness; |
610 var button = document.getElementById("runTestsButton"); | 772 var button = document.getElementById("runTestsButton"); |
611 button.disabled = true; | 773 button.disabled = true; |
612 button.onclick = function() { | 774 button.onclick = function() { |
| 775 autoScroll = autoScrollEnabled; |
| 776 reporter.postTestStartToServer(); |
613 testHarness.runTests(); | 777 testHarness.runTests(); |
614 }; | 778 }; |
| 779 var autoScrollCheckbox = document.getElementById("autoScrollCheckbox"); |
| 780 autoScrollCheckbox.checked = autoScrollEnabled; |
| 781 autoScrollCheckbox.onclick = function() { |
| 782 autoScrollEnabled = autoScrollCheckbox.checked; |
| 783 autoScroll = autoScrollEnabled; |
| 784 }; |
615 var textbutton = document.getElementById("showTextSummary"); | 785 var textbutton = document.getElementById("showTextSummary"); |
616 textbutton.onclick = function() { | 786 textbutton.onclick = function() { |
617 log("click"); | 787 log("click"); |
618 var htmldiv = document.getElementById("testResultsHTML"); | 788 var htmldiv = document.getElementById("testResultsHTML"); |
619 var textdiv = document.getElementById("testResultsText"); | 789 var textdiv = document.getElementById("testResultsText"); |
620 if (textdiv.style.display == "none") { | 790 if (textdiv.style.display == "none") { |
621 textdiv.style.display = "block"; | 791 textdiv.style.display = "block"; |
622 htmldiv.style.display = "none"; | 792 htmldiv.style.display = "none"; |
623 textbutton.setAttribute("value", "display html summary"); | 793 textbutton.setAttribute("value", "display html summary"); |
624 } else { | 794 } else { |
625 textdiv.style.display = "none"; | 795 textdiv.style.display = "none"; |
626 htmldiv.style.display = "block"; | 796 htmldiv.style.display = "block"; |
627 textbutton.setAttribute("value", "display text summary"); | 797 textbutton.setAttribute("value", "display text summary"); |
628 } | 798 } |
629 }; | 799 }; |
630 if (reporter.noWebGL) { | 800 if (reporter.noWebGL) { |
631 button.disabled = true; | 801 button.disabled = true; |
632 var elem = document.getElementById("nowebgl"); | 802 var elem = document.getElementById("nowebgl"); |
633 elem.style.display = ""; | 803 elem.style.display = ""; |
| 804 reporter.postResultsToServer("Browser does not appear to support WebGL"); |
634 } | 805 } |
635 } | 806 } |
636 </script> | 807 </script> |
637 </head> | 808 </head> |
638 <body onload="start()"> | 809 <body onload="start()"> |
| 810 |
| 811 <div id="testlist"> |
| 812 |
| 813 <div id="testResultsHTML"> |
| 814 <ul id="results"> |
| 815 </ul> |
| 816 </div> |
| 817 <div style="display: none;" id="testResultsText"> |
| 818 <pre id="testResultsAsText"></pre> |
| 819 </div> |
| 820 |
| 821 </div> <!-- end of container --> |
| 822 |
| 823 <div id="header"> |
| 824 |
639 <table border="2"> | 825 <table border="2"> |
640 <tr style="height: 300px;"> | 826 <tr style="height: 300px;"> |
641 <td> | 827 <td> |
642 <table> | 828 <table id="toparea"> |
643 <tr><td><img src="resources/webgl-logo.png" /><br />WebGL Conformance Test Runne
r<br/>Version <span id="testVersion"></span><br/><input type="button" value="run
tests" id="runTestsButton"/><br/><input type="button" style="visibility: hidden
;" value="display text summary" id="showTextSummary"/> | 829 <tr> |
644 <div id="nowebgl" class="nowebgl" style="display: none;">This browser does not a
ppear to support WebGL</div></td></tr> | 830 <td style="width: 300px"> |
645 <tr><td><div id="loading">Loading Tests...</div> | 831 <div id="info"> |
646 <div style="border: 1px">Results: <span id="fullresults"></span></div> | 832 <img src="resources/webgl-logo.png" /><br /> |
647 <canvas id="webglcheck" style="display: none;"></canvas></td></tr> | 833 WebGL Conformance Test Runner<br/> |
648 <tr><td><div id="error-wrap"><pre id="error"></pre></div></td></tr> | 834 Version |
| 835 <span id="testVersion"> |
| 836 </span> |
| 837 <br/> |
| 838 <input type="button" value="run tests" id="runTestsButton"/> |
| 839 <br/> |
| 840 <input type="checkbox" id="autoScrollCheckbox"/> |
| 841 <label for="autoScrollCheckbox">auto scroll</label> |
| 842 <br/> |
| 843 <input type="button" style="visibility: hidden;" value="display te
xt summary" id="showTextSummary"/> |
| 844 <div id="nowebgl" class="nowebgl" style="display: none;"> |
| 845 This browser does not appear to support WebGL |
| 846 </div> |
| 847 </div> |
| 848 </td> |
| 849 </tr> |
| 850 <tr> |
| 851 <td> |
| 852 <div id="loading"> |
| 853 Loading Tests... |
| 854 </div> |
| 855 <div style="border: 1px"> |
| 856 Results: |
| 857 <span id="fullresults"> |
| 858 </span> |
| 859 </div> |
| 860 <canvas id="webglcheck" style="display: none;"> |
| 861 </canvas> |
| 862 </td> |
| 863 </tr> |
| 864 <tr> |
| 865 <td> |
| 866 <div id="error-wrap"> |
| 867 <pre id="error"></pre> |
| 868 </div> |
| 869 </td> |
| 870 </tr> |
| 871 </table> |
| 872 </td> |
| 873 <td id="frames"></td> |
| 874 </tr> |
649 </table> | 875 </table> |
650 </td> | 876 </div> <!-- end of header --> |
651 <td> | 877 |
652 <iframe id="testframe" scrolling="yes" width="100%" height="100%"></iframe> | |
653 </td> | |
654 </tr> | |
655 <tr> | |
656 <td colspan="2"> | |
657 <div style="text-align: left; width: 100%; height: 100%; overflow: auto;"> | |
658 <div id="testResultsHTML"><ul id="results"></ul></div> | |
659 <div style="display: none;" id="testResultsText"><pre id="testResultsAsText"></p
re></div> | |
660 </div> | |
661 </td> | |
662 </tr> | |
663 </table> | |
664 </body> | 878 </body> |
665 </html> | 879 </html> |
OLD | NEW |