blob: c8c40e00db03c43752ac732f80d2b2c31bcd2e5d [file] [log] [blame]
<!--
/*
** Copyright (c) 2012 The Khronos Group Inc.
**
** Permission is hereby granted, free of charge, to any person obtaining a
** copy of this software and/or associated documentation files (the
** "Materials"), to deal in the Materials without restriction, including
** without limitation the rights to use, copy, modify, merge, publish,
** distribute, sublicense, and/or sell copies of the Materials, and to
** permit persons to whom the Materials are furnished to do so, subject to
** the following conditions:
**
** The above copyright notice and this permission notice shall be included
** in all copies or substantial portions of the Materials.
**
** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS.
*/
-->
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- Prevents Chrome from offering to translate tests which generate
random characters for things like attribute names -->
<meta name="google" value="notranslate">
<title>WebGL Conformance Tests</title>
<style>
body {
border: 0;
margin: 0;
padding: 0;
height: 100%;
max-height:100%;
font-family: monospace;
overflow: hidden;
}
#testlist {
position:fixed;
top:310px;
left:0;
right:0;
bottom:0px;
overflow:auto;
padding:1em;
}
#header {
position:absolute;
top:0;
left:0;
width:100%;
height:310px;
overflow:auto;
}
#info {
text-align: center;
min-width: 300px;
}
table {
width: 100%;
height: 100%;
}
#frames td {
border: 1px solid black;
min-height: 1px;
min-width: 1px;
}
#frames t
.timeout { }
.success { }
.fail { }
.testpage { border: 1px solid black; background-color: #ccc; }
.testpagesuccess { border: 1px solid black; background-color: #8F8; }
.testpagefail { border: 1px solid black; background-color: #F88; }
.testpageskipped { border: 1px solid black; background-color: #888; }
.testpagetimeout { border: 1px solid black; background-color: #FC8; }
.nowebgl { font-weight: bold; color: red; }
#error-wrap {
float: left;
position: relative;
left: 50%;
}
#error {
color: red;
float: left;
position: relative;
left: -50%;
text-align: left;
}
ul {
list-style: none;
padding-left: 1em;
}
</style>
<script type="text/javascript" src="resources/webgl-test-harness.js"></script>
<script>
"use strict";
var CONFORMANCE_TEST_VERSION = "1.0.3 (beta)";
var OPTIONS = {
version: CONFORMANCE_TEST_VERSION,
frames: 1,
allowSkip: 0
};
function start() {
function log(msg) {
if (window.console && window.console.log) {
window.console.log(msg);
}
}
function create3DContext(canvas)
{
if (!canvas) {
canvas = document.createElement("canvas");
}
var context = null;
var names = ["webgl", "experimental-webgl"];
for (var i = 0; i < names.length; ++i) {
try {
context = canvas.getContext(names[i]);
} catch (e) {
}
if (context) {
break;
}
}
return context;
}
var reportType = WebGLTestHarnessModule.TestHarness.reportType;
var pageCount = 0;
var folderCount = 0;
var autoScrollEnabled = true; // Whether the user prefers to auto scroll
var autoScroll = true; // Whether auto scroll is actually performed
var Page = function(reporter, folder, testIndex, url) {
this.reporter = reporter;
this.folder = folder;
this.url = url;
this.totalTests = 0;
this.totalSuccessful = 0;
this.totalTimeouts = 0;
this.totalSkipped = 0;
this.testIndex = testIndex;
this.elementId = "page" + pageCount++;
var li = reporter.localDoc.createElement('li');
li.id = this.elementId;
var div = reporter.localDoc.createElement('div');
var check = reporter.localDoc.createElement('input');
check.type = 'checkbox';
check.checked = true;
div.appendChild(check);
var button = reporter.localDoc.createElement('input');
button.type = 'button';
button.value = 'run';
button.onclick = function() {
autoScroll = false;
reporter.runTest(url);
};
if (reporter.noWebGL) {
button.disabled = true;
}
div.appendChild(button);
var a = reporter.localDoc.createElement('a');
a.href = url;
a.target = "_blank";
var node = reporter.localDoc.createTextNode(url);
a.appendChild(node);
div.appendChild(a);
li.setAttribute('class', 'testpage');
li.appendChild(div);
var ul = reporter.localDoc.createElement('ul');
var node = reporter.localDoc.createTextNode('');
li.appendChild(ul);
div.appendChild(node);
this.totalsElem = node;
this.resultElem = ul;
this.elem = li;
this.check = check;
};
Page.prototype.addResult = function(msg, success, skipped) {
++this.totalTests;
if (success === undefined) {
++this.totalTimeouts;
var result = "timeout";
var css = "timeout";
} else if (success) {
if(skipped) {
++this.totalSkipped;
} else {
++this.totalSuccessful;
}
// don't report success.
return;
} else {
var result = "failed";
var css = "fail";
}
var node = this.reporter.localDoc.createTextNode(result + ': ' + msg);
var li = this.reporter.localDoc.createElement('li');
li.appendChild(node);
li.setAttribute('class', css);
this.resultElem.appendChild(li);
};
Page.prototype.startPage = function() {
if (autoScroll && this.elem.scrollIntoView) {
this.elem.scrollIntoView(false);
}
this.totalTests = 0;
this.totalSuccessful = 0;
this.totalTimeouts = 0;
// remove previous results.
while (this.resultElem.hasChildNodes()) {
this.resultElem.removeChild(this.resultElem.childNodes[0]);
}
this.totalsElem.textContent = '';
return this.check.checked && this.folder.checked();
};
Page.prototype.firstTestIndex = function() {
return this.testIndex;
};
Page.prototype.finishPage = function(success) {
if(this.totalSkipped) {
var msg = ' (' + this.totalSkipped + ' of ' + this.totalTests + ' skipped)';
} else {
var msg = ' (' + this.totalSuccessful + ' of ' + this.totalTests + ' passed)';
}
if (success === undefined) {
var css = 'testpagetimeout';
msg = '(*timeout*)';
++this.totalTests;
++this.totalTimeouts;
} else if (this.totalSkipped) {
var css = 'testpageskipped';
} else if (this.totalSuccessful != this.totalTests) {
var css = 'testpagefail';
} else {
var css = 'testpagesuccess';
}
this.elem.setAttribute('class', css);
this.totalsElem.textContent = msg;
};
Page.prototype.enableTest = function(re) {
if (this.url.match(re)) {
this.check.checked = true;
this.folder.enableUp_();
}
};
Page.prototype.disableTest = function(re) {
if (this.url.match(re)) {
this.check.checked = false;
}
};
var Folder = function(reporter, folder, depth, opt_name) {
this.reporter = reporter;
this.depth = depth;
this.name = opt_name || "";
this.subFolders = {};
this.pages = [];
this.items = [];
this.folder = folder;
var that = this;
var doc = reporter.localDoc;
this.elementId = "folder" + folderCount++;
var li = doc.createElement('li');
li.id = this.elementId;
var div = doc.createElement('div');
var check = doc.createElement('input');
check.type = 'checkbox';
check.checked = true;
div.appendChild(check);
var button = doc.createElement('input');
button.type = 'button';
button.value = 'run';
button.onclick = function() {
autoScroll = autoScrollEnabled;
that.run();
};
if (reporter.noWebGL) {
button.disabled = true;
}
div.appendChild(button);
var h = doc.createElement('span');
h.appendChild(doc.createTextNode(this.name));
div.appendChild(h);
var ul = doc.createElement('ul');
li.appendChild(div);
li.appendChild(ul);
this.childUL = ul;
this.elem = li;
this.check = check;
};
Folder.prototype.checked = function() {
return this.check.checked &&
(this.folder ? this.folder.checked() : true);
};
Folder.prototype.firstTestIndex = function() {
return this.items[0].firstTestIndex();
};
Folder.prototype.numChildren = function() {
var numChildren = 0;
for (var name in this.subFolders) {
numChildren += this.subFolders[name].numChildren();
}
return numChildren + this.pages.length;
};
Folder.prototype.run = function() {
var firstTestIndex = this.firstTestIndex();
var count = this.numChildren();
log("run tests: " + firstTestIndex + " to " + (firstTestIndex + count - 1))
testHarness.runTests({start: firstTestIndex, count: count});
};
Folder.prototype.getSubFolder = function(name) {
var subFolder = this.subFolders[name];
if (subFolder === undefined) {
subFolder = new Folder(this.reporter, this, this.depth + 1, name);
this.subFolders[name] = subFolder;
this.items.push(subFolder);
this.childUL.appendChild(subFolder.elem);
}
return subFolder;
};
Folder.prototype.getOrCreateFolder = function(url) {
var parts = url.split('/');
var folder = this;
for (var pp = 0; pp < parts.length - 1; ++pp) {
folder = folder.getSubFolder(parts[pp]);
}
return folder;
};
Folder.prototype.addPage = function(page) {
this.pages.push(page);
this.items.push(page);
this.childUL.appendChild(page.elem);
};
Folder.prototype.disableTest = function(re, opt_forceRecurse) {
var recurse = true;
if (this.name.match(re)) {
this.check.checked = false;
recurse = opt_forceRecurse;
}
if (recurse) {
for (var name in this.subFolders) {
this.subFolders[name].disableTest(re, opt_forceRecurse);
}
for (var ii = 0; ii < this.pages.length; ++ii) {
this.pages[ii].disableTest(re);
}
}
};
Folder.prototype.enableUp_ = function() {
this.check.checked = true;
var parent = this.folder;
if (parent) {
parent.enableUp_();
}
}
Folder.prototype.enableTest = function(re) {
if (this.name.match(re)) {
this.enableUp_();
}
for (var name in this.subFolders) {
this.subFolders[name].enableTest(re);
}
for (var ii = 0; ii < this.pages.length; ++ii) {
this.pages[ii].enableTest(re);
}
};
var Reporter = function(iframes) {
this.localDoc = document;
this.resultElem = document.getElementById("results");
this.fullResultsElem = document.getElementById("fullresults");
var node = this.localDoc.createTextNode('');
this.fullResultsElem.appendChild(node);
this.fullResultsNode = node;
this.iframes = iframes;
this.currentPageElem = null;
this.totalPages = 0;
this.pagesByURL = {};
var canvas = document.getElementById("webglcheck");
var ctx = create3DContext(canvas);
this.noWebGL = !ctx;
this.contextInfo = {};
this.root = new Folder(this, null, 0, "all");
this.resultElem.appendChild(this.root.elem);
this.callbacks = { };
if (ctx) {
this.contextInfo["VENDOR"] = ctx.getParameter(ctx.VENDOR);
this.contextInfo["VERSION"] = ctx.getParameter(ctx.VERSION);
this.contextInfo["RENDERER"] = ctx.getParameter(ctx.RENDERER);
this.contextInfo["RED_BITS"] = ctx.getParameter(ctx.RED_BITS);
this.contextInfo["GREEN_BITS"] = ctx.getParameter(ctx.GREEN_BITS);
this.contextInfo["BLUE_BITS"] = ctx.getParameter(ctx.BLUE_BITS);
this.contextInfo["ALPHA_BITS"] = ctx.getParameter(ctx.ALPHA_BITS);
this.contextInfo["DEPTH_BITS"] = ctx.getParameter(ctx.DEPTH_BITS);
this.contextInfo["STENCIL_BITS"] = ctx.getParameter(ctx.STENCIL_BITS);
var ext = ctx.getExtension("WEBGL_debug_renderer_info");
if (ext) {
this.contextInfo["UNMASKED_VENDOR"] = ctx.getParameter(ext.UNMASKED_VENDOR_WEBGL);
this.contextInfo["UNMASKED_RENDERER"] = ctx.getParameter(ext.UNMASKED_RENDERER_WEBGL);
}
}
};
Reporter.prototype.enableTest = function(name) {
this.root.enableTest(name);
};
Reporter.prototype.disableTest = function(name) {
this.root.disableTest(name);
};
Reporter.prototype.disableAllTests = function() {
this.root.disableTest(".*", true);
};
Reporter.prototype.addEventListener = function(type, func) {
if (!this.callbacks[type]) {
this.callbacks[type] = [];
}
this.callbacks[type].push(func);
};
Reporter.prototype.executeListenerEvents_ = function(type) {
var callbacks = this.callbacks[type].slice(0);
for (var ii = 0; ii < callbacks.length; ++ii) {
setTimeout(callbacks[ii], 0);
}
};
Reporter.prototype.runTest = function(url) {
var page = this.pagesByURL[url];
testHarness.runTests({start: page.firstTestIndex(), count: 1});
};
Reporter.prototype.getFolder = function(url) {
return this.root.getOrCreateFolder(url);
};
Reporter.prototype.addPage = function(url) {
var folder = this.getFolder(url);
var page = new Page(this, folder, this.totalPages, url);
folder.addPage(page);
++this.totalPages;
this.pagesByURL[url] = page;
};
Reporter.prototype.startPage = function(url) {
var page = this.pagesByURL[url];
return page.startPage();
};
Reporter.prototype.addResult = function(url, msg, success, skipped) {
var page = this.pagesByURL[url];
page.addResult(msg, success, skipped);
};
Reporter.prototype.finishPage = function(url, success) {
var page = this.pagesByURL[url];
page.finishPage(success);
};
Reporter.prototype.displayFinalResults = function(msg, success) {
if (success) {
var totalTests = 0;
var totalSuccessful = 0;
var totalTimeouts = 0;
var totalSkipped = 0;
for (var url in this.pagesByURL) {
var page = this.pagesByURL[url];
totalTests += page.totalTests;
totalSuccessful += page.totalSuccessful;
totalTimeouts += page.totalTimeouts;
totalSkipped += page.totalSkipped;
}
var timeout = '';
if (totalTimeouts > 0) {
timeout = ', ' + totalTimeouts + ' timed out';
}
var msg = ' (' + totalSuccessful + ' of ' +
totalTests + ' passed' + timeout + ')';
this.fullResultsNode.textContent = msg;
// generate a text summary
var tx = "";
tx += "WebGL Conformance Test Results\n";
tx += "Version " + OPTIONS.version + "\n";
tx += "\n";
tx += "-------------------\n\n";
tx += "User Agent: " + (navigator.userAgent ? navigator.userAgent : "(navigator.userAgent is null)") + "\n";
tx += "WebGL VENDOR: " + this.contextInfo["VENDOR"] + "\n";
tx += "WebGL VERSION: " + this.contextInfo["VERSION"] + "\n";
tx += "WebGL RENDERER: " + this.contextInfo["RENDERER"] + "\n";
tx += "Unmasked VENDOR: " + this.contextInfo["UNMASKED_VENDOR"] + "\n";
tx += "Unmasked RENDERER: " + this.contextInfo["UNMASKED_RENDERER"] + "\n";
tx += "WebGL R/G/B/A/Depth/Stencil bits (default config): " + this.contextInfo["RED_BITS"] + "/" + this.contextInfo["GREEN_BITS"] + "/" + this.contextInfo["BLUE_BITS"] + "/" + this.contextInfo["ALPHA_BITS"] + "/" + this.contextInfo["DEPTH_BITS"] + "/" + this.contextInfo["STENCIL_BITS"] + "\n";
tx += "\n";
tx += "-------------------\n\n";
tx += "Test Summary (" + totalTests + " total tests):\n";
tx += "Tests PASSED: " + totalSuccessful + "\n";
tx += "Tests FAILED: " + (totalTests - totalSuccessful - totalSkipped) + "\n";
tx += "Tests TIMED OUT: " + totalTimeouts + "\n";
tx += "Tests SKIPPED: " + totalSkipped + "\n";
tx += "\n";
tx += "-------------------\n\n";
if (totalSuccessful < totalTests) {
tx += "Failures:\n\n";
for (var url in this.pagesByURL) {
var page = this.pagesByURL[url];
var pageTotalFail = page.totalTests - page.totalSuccessful - page.totalSkipped;
if (!(page.totalTests == 0 && page.totalTimeouts == 0) &&
pageTotalFail > 0)
{
tx += url + ": " + pageTotalFail + " tests failed";
if (page.totalTimeouts)
tx += " (" + page.totalTimeouts + " timed out)";
tx += "\n";
}
}
} else {
tx += "All tests PASSED\n\n";
}
tx += "\n";
tx += "-------------------\n\n";
tx += "Complete Test Results (total / pass / fail / timeout / skipped):\n\n";
for (var url in this.pagesByURL) {
var page = this.pagesByURL[url];
var pageTotalFail = page.totalTests - page.totalSuccessful - page.totalSkipped;
if (!(page.totalTests == 0 && page.totalTimeouts == 0)) {
tx += url + ": " + page.totalTests + " / " +
page.totalSuccessful + " / " + pageTotalFail + " / " + page.totalTimeouts + " / " + page.totalSkipped + "\n";
}
}
tx += "\n";
tx += "-------------------\n\n";
tx += "Generated on: " + (new Date()).toString() + "\n";
var r = document.getElementById("testResultsAsText");
while (r.firstChild) r.removeChild(r.firstChild);
r.appendChild(document.createTextNode(tx));
document.getElementById("showTextSummary").style.visibility = "visible";
this.postResultsToServer(tx);
} else {
var e = document.getElementById("error");
e.innerHTML = msg;
this.postResultsToServer(msg);
}
};
Reporter.prototype.postTestStartToServer = function(resultText) {
if(OPTIONS.postResults == undefined || OPTIONS.postResults == 0) {
return;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', "/start", true);
xhr.send(null);
};
Reporter.prototype.postResultsToServer = function(resultText) {
if(OPTIONS.postResults == undefined || OPTIONS.postResults == 0) {
return;
}
var xhr = new XMLHttpRequest();
xhr.open('POST', "/finish", true);
xhr.setRequestHeader("Content-Type", "text/plain");
xhr.send(resultText);
};
Reporter.prototype.ready = function() {
var loading = document.getElementById("loading");
loading.style.display = "none";
if (!this.noWebGL) {
var button = document.getElementById("runTestsButton");
button.disabled = false;
this.executeListenerEvents_("ready");
}
};
Reporter.prototype.reportFunc = function(type, url, msg, success, skipped) {
switch (type) {
case reportType.ADD_PAGE:
return this.addPage(msg);
case reportType.READY:
return this.ready();
case reportType.START_PAGE:
return this.startPage(url);
case reportType.TEST_RESULT:
return this.addResult(url, msg, success, skipped);
case reportType.FINISH_PAGE:
return this.finishPage(url, success);
case reportType.FINISHED_ALL_TESTS:
return this.displayFinalResults(msg, success);
default:
throw 'unhandled';
break;
};
};
var getURLOptions = function(obj) {
var s = window.location.href;
var q = s.indexOf("?");
var e = s.indexOf("#");
if (e < 0) {
e = s.length;
}
var query = s.substring(q + 1, e);
var pairs = query.split("&");
for (var ii = 0; ii < pairs.length; ++ii) {
var keyValue = pairs[ii].split("=");
var key = keyValue[0];
var value = decodeURIComponent(keyValue[1]);
obj[key] = value;
}
};
getURLOptions(OPTIONS);
document.getElementById("testVersion").innerHTML = OPTIONS.version;
// Make iframes
var makeIFrames = function() {
var toparea = document.getElementById("toparea");
var frame = document.getElementById("frames");
var areaWidth = Math.max(100, toparea.clientWidth - 300);
var areaHeight = Math.max(100, frame.clientHeight);
var numCells = OPTIONS.frames;
var gridWidth = Math.max(1, Math.ceil(Math.sqrt(numCells)));
var gridHeight = gridWidth;
var bestAspect = 99999;
var bestNumEmptyCells = 99999;
var bestNumEmptyCellsColumns = 0;
var bestNumEmptyCellsAspect = 99999;
var minGoodAspect = 1 / 3;
var maxGoodAspect = 3 / 1;
for (var columns = 1; columns <= numCells; ++columns) {
var rows = Math.ceil(numCells / columns);
var cellWidth = areaWidth / columns;
var cellHeight = areaHeight / rows;
var cellAspect = cellWidth / cellHeight;
if (cellAspect >= minGoodAspect && cellAspect <= maxGoodAspect) {
var numEmptyCells = columns * rows - numCells;
// Keep the one with the least number of empty cells.
if (numEmptyCells < bestNumEmptyCells) {
bestNumEmptyCells = numEmptyCells;
bestNumEmptyCellsColumns = columns;
bestNumEmptyCellsAspect = cellAspect;
// If it's the same number of empty cells keep the one
// with the best aspect.
} else if (numEmptyCells == bestNumEmptyCells &&
Math.abs(cellAspect - 1) <
Math.abs(bestNumEmptyCellsAspect - 1)) {
bestNumEmptyCellsColumns = columns;
bestNumEmptyCellsAspect = cellAspect;
}
}
if (Math.abs(cellAspect - 1) < Math.abs(bestAspect - 1)) {
gridWidth = columns;
gridHeight = rows;
bestAspect = cellAspect;
}
}
// if we found an aspect with few empty cells use that.
var numEmptyCells = gridWidth * gridHeight - numCells;
if (bestNumEmptyCellsColumns && bestNumEmptyCells < numEmptyCells) {
gridWidth = bestNumEmptyCellsColumns;
gridHeight = Math.ceil(numCells / gridWidth);
}
var table = document.createElement("table");
table.style.height = areaHeight + "px";
var tbody = document.createElement("tbody");
var iframes = [];
for (var row = 0; row < gridHeight; ++row) {
var tr = document.createElement("tr");
for (var column = 0; column < gridWidth; ++column) {
var td = document.createElement("td");
if (numCells > 0) {
--numCells;
var iframe = document.createElement("iframe");
iframe.setAttribute("scrolling", "yes");
iframe.style.width = "100%";
iframe.style.height = "100%";
iframes.push(iframe);
td.appendChild(iframe);
}
tr.appendChild(td);
}
tbody.appendChild(tr);
}
table.appendChild(tbody);
frame.appendChild(table);
return iframes;
};
var iframes = makeIFrames();
var reporter = new Reporter(iframes);
var testHarness = new WebGLTestHarnessModule.TestHarness(
iframes,
'00_test_list.txt',
function(type, url, msg, success, skipped) {
return reporter.reportFunc(type, url, msg, success, skipped);
},
OPTIONS);
reporter.addEventListener("ready", function() {
// Set which tests to include.
if (OPTIONS.include) {
reporter.disableAllTests();
var includes = OPTIONS.include.split(",")
for (var ii = 0; ii < includes.length; ++ii) {
reporter.enableTest(new RegExp(includes[ii]));
}
}
// Remove tests based on skip=re1,re2 in URL.
if (OPTIONS.skip) {
var skips = OPTIONS.skip.split(",")
for (var ii = 0; ii < skips.length; ++ii) {
reporter.disableTest(new RegExp(skips[ii]));
}
}
// Auto run the tests if the run=1 in URL
if (OPTIONS.run != undefined && OPTIONS.run != 0) {
reporter.postTestStartToServer();
testHarness.runTests();
}
});
window.webglTestHarness = testHarness;
var button = document.getElementById("runTestsButton");
button.disabled = true;
button.onclick = function() {
autoScroll = autoScrollEnabled;
reporter.postTestStartToServer();
testHarness.runTests();
};
var autoScrollCheckbox = document.getElementById("autoScrollCheckbox");
autoScrollCheckbox.checked = autoScrollEnabled;
autoScrollCheckbox.onclick = function() {
autoScrollEnabled = autoScrollCheckbox.checked;
autoScroll = autoScrollEnabled;
};
var textbutton = document.getElementById("showTextSummary");
textbutton.onclick = function() {
log("click");
var htmldiv = document.getElementById("testResultsHTML");
var textdiv = document.getElementById("testResultsText");
if (textdiv.style.display == "none") {
textdiv.style.display = "block";
htmldiv.style.display = "none";
textbutton.setAttribute("value", "display html summary");
} else {
textdiv.style.display = "none";
htmldiv.style.display = "block";
textbutton.setAttribute("value", "display text summary");
}
};
if (reporter.noWebGL) {
button.disabled = true;
var elem = document.getElementById("nowebgl");
elem.style.display = "";
reporter.postResultsToServer("Browser does not appear to support WebGL");
}
}
</script>
</head>
<body onload="start()">
<div id="testlist">
<div id="testResultsHTML">
<ul id="results">
</ul>
</div>
<div style="display: none;" id="testResultsText">
<pre id="testResultsAsText"></pre>
</div>
</div> <!-- end of container -->
<div id="header">
<table border="2">
<tr style="height: 300px;">
<td>
<table id="toparea">
<tr>
<td style="width: 300px">
<div id="info">
<img src="resources/webgl-logo.png" /><br />
WebGL Conformance Test Runner<br/>
Version
<span id="testVersion">
</span>
<br/>
<input type="button" value="run tests" id="runTestsButton"/>
<br/>
<input type="checkbox" id="autoScrollCheckbox"/>
<label for="autoScrollCheckbox">auto scroll</label>
<br/>
<input type="button" style="visibility: hidden;" value="display text summary" id="showTextSummary"/>
<div id="nowebgl" class="nowebgl" style="display: none;">
This browser does not appear to support WebGL
</div>
</div>
</td>
</tr>
<tr>
<td>
<div id="loading">
Loading Tests...
</div>
<div style="border: 1px">
Results:
<span id="fullresults">
</span>
</div>
<canvas id="webglcheck" style="display: none;">
</canvas>
</td>
</tr>
<tr>
<td>
<div id="error-wrap">
<pre id="error"></pre>
</div>
</td>
</tr>
</table>
</td>
<td id="frames"></td>
</tr>
</table>
</div> <!-- end of header -->
</body>
</html>