| Index: webgl-conformance-tests.html
|
| ===================================================================
|
| --- webgl-conformance-tests.html (revision 230753)
|
| +++ webgl-conformance-tests.html (working copy)
|
| @@ -28,26 +28,62 @@
|
| <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>
|
| - html, body {
|
| + body {
|
| border: 0;
|
| margin: 0;
|
| + padding: 0;
|
| height: 100%;
|
| - height: 100%;
|
| - text-align: center;
|
| + 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 {
|
| @@ -69,10 +105,13 @@
|
| </style>
|
| <script type="text/javascript" src="resources/webgl-test-harness.js"></script>
|
| <script>
|
| -var CONFORMANCE_TEST_VERSION = "1.0.2 (beta)";
|
| +"use strict";
|
| +var CONFORMANCE_TEST_VERSION = "1.0.3 (beta)";
|
|
|
| var OPTIONS = {
|
| - version: CONFORMANCE_TEST_VERSION
|
| + version: CONFORMANCE_TEST_VERSION,
|
| + frames: 1,
|
| + allowSkip: 0
|
| };
|
|
|
| function start() {
|
| @@ -103,6 +142,10 @@
|
| }
|
|
|
| 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;
|
| @@ -111,9 +154,12 @@
|
| 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';
|
| @@ -123,6 +169,7 @@
|
| button.type = 'button';
|
| button.value = 'run';
|
| button.onclick = function() {
|
| + autoScroll = false;
|
| reporter.runTest(url);
|
| };
|
| if (reporter.noWebGL) {
|
| @@ -147,16 +194,18 @@
|
| this.check = check;
|
| };
|
|
|
| - Page.prototype.addResult = function(msg, success) {
|
| + Page.prototype.addResult = function(msg, success, skipped) {
|
| ++this.totalTests;
|
| if (success === undefined) {
|
| ++this.totalTimeouts;
|
| var result = "timeout";
|
| var css = "timeout";
|
| } else if (success) {
|
| - ++this.totalSuccessful;
|
| - var result = "success";
|
| - var css = "success";
|
| + if(skipped) {
|
| + ++this.totalSkipped;
|
| + } else {
|
| + ++this.totalSuccessful;
|
| + }
|
| // don't report success.
|
| return;
|
| } else {
|
| @@ -172,6 +221,9 @@
|
| };
|
|
|
| Page.prototype.startPage = function() {
|
| + if (autoScroll && this.elem.scrollIntoView) {
|
| + this.elem.scrollIntoView(false);
|
| + }
|
| this.totalTests = 0;
|
| this.totalSuccessful = 0;
|
| this.totalTimeouts = 0;
|
| @@ -188,13 +240,19 @@
|
| };
|
|
|
| Page.prototype.finishPage = function(success) {
|
| - var msg = ' (' + this.totalSuccessful + ' of ' +
|
| - this.totalTests + ' passed)';
|
| + 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 {
|
| @@ -228,7 +286,9 @@
|
| 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';
|
| @@ -238,6 +298,7 @@
|
| button.type = 'button';
|
| button.value = 'run';
|
| button.onclick = function() {
|
| + autoScroll = autoScrollEnabled;
|
| that.run();
|
| };
|
| if (reporter.noWebGL) {
|
| @@ -276,7 +337,7 @@
|
| var firstTestIndex = this.firstTestIndex();
|
| var count = this.numChildren();
|
| log("run tests: " + firstTestIndex + " to " + (firstTestIndex + count - 1))
|
| - testHarness.runTests(firstTestIndex, count);
|
| + testHarness.runTests({start: firstTestIndex, count: count});
|
| };
|
|
|
| Folder.prototype.getSubFolder = function(name) {
|
| @@ -341,14 +402,14 @@
|
| }
|
| };
|
|
|
| - var Reporter = function() {
|
| + 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.iframe = document.getElementById("testframe");
|
| + this.iframes = iframes;
|
| this.currentPageElem = null;
|
| this.totalPages = 0;
|
| this.pagesByURL = {};
|
| @@ -407,9 +468,7 @@
|
|
|
| Reporter.prototype.runTest = function(url) {
|
| var page = this.pagesByURL[url];
|
| - page.startPage();
|
| - this.currentPage = page;
|
| - this.iframe.src = url;
|
| + testHarness.runTests({start: page.firstTestIndex(), count: 1});
|
| };
|
|
|
| Reporter.prototype.getFolder = function(url) {
|
| @@ -426,21 +485,17 @@
|
|
|
| Reporter.prototype.startPage = function(url) {
|
| var page = this.pagesByURL[url];
|
| - this.currentPage = page;
|
| return page.startPage();
|
| };
|
|
|
| - Reporter.prototype.addResult = function(msg, success) {
|
| - if (this.currentPage != null) {
|
| - this.currentPage.addResult(msg, success);
|
| - }
|
| + Reporter.prototype.addResult = function(url, msg, success, skipped) {
|
| + var page = this.pagesByURL[url];
|
| + page.addResult(msg, success, skipped);
|
| };
|
|
|
| - Reporter.prototype.finishPage = function(success) {
|
| - if (this.currentPage != null) {
|
| - this.currentPage.finishPage(success);
|
| - this.currentPage = null;
|
| - }
|
| + Reporter.prototype.finishPage = function(url, success) {
|
| + var page = this.pagesByURL[url];
|
| + page.finishPage(success);
|
| };
|
|
|
| Reporter.prototype.displayFinalResults = function(msg, success) {
|
| @@ -448,11 +503,13 @@
|
| 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) {
|
| @@ -479,15 +536,16 @@
|
| tx += "-------------------\n\n";
|
| tx += "Test Summary (" + totalTests + " total tests):\n";
|
| tx += "Tests PASSED: " + totalSuccessful + "\n";
|
| - tx += "Tests FAILED: " + (totalTests - 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;
|
| + var pageTotalFail = page.totalTests - page.totalSuccessful - page.totalSkipped;
|
| if (!(page.totalTests == 0 && page.totalTimeouts == 0) &&
|
| pageTotalFail > 0)
|
| {
|
| @@ -502,13 +560,13 @@
|
| }
|
| tx += "\n";
|
| tx += "-------------------\n\n";
|
| - tx += "Complete Test Results (total / pass / fail / timeout):\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;
|
| + var pageTotalFail = page.totalTests - page.totalSuccessful - page.totalSkipped;
|
| if (!(page.totalTests == 0 && page.totalTimeouts == 0)) {
|
| tx += url + ": " + page.totalTests + " / " +
|
| - page.totalSuccessful + " / " + pageTotalFail + " / " + page.totalTimeouts + "\n";
|
| + page.totalSuccessful + " / " + pageTotalFail + " / " + page.totalTimeouts + " / " + page.totalSkipped + "\n";
|
| }
|
| }
|
| tx += "\n";
|
| @@ -519,12 +577,36 @@
|
| 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";
|
| @@ -535,18 +617,18 @@
|
| }
|
| };
|
|
|
| - Reporter.prototype.reportFunc = function(type, msg, success) {
|
| + 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(msg);
|
| + return this.startPage(url);
|
| case reportType.TEST_RESULT:
|
| - return this.addResult(msg, success);
|
| + return this.addResult(url, msg, success, skipped);
|
| case reportType.FINISH_PAGE:
|
| - return this.finishPage(success);
|
| + return this.finishPage(url, success);
|
| case reportType.FINISHED_ALL_TESTS:
|
| return this.displayFinalResults(msg, success);
|
| default:
|
| @@ -576,13 +658,92 @@
|
|
|
| document.getElementById("testVersion").innerHTML = OPTIONS.version;
|
|
|
| - var reporter = new Reporter();
|
| - var iframe = document.getElementById("testframe");
|
| + // 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(
|
| - iframe,
|
| + iframes,
|
| '00_test_list.txt',
|
| - function(type, msg, success) {
|
| - return reporter.reportFunc(type, msg, success);
|
| + function(type, url, msg, success, skipped) {
|
| + return reporter.reportFunc(type, url, msg, success, skipped);
|
| },
|
| OPTIONS);
|
| reporter.addEventListener("ready", function() {
|
| @@ -603,6 +764,7 @@
|
| }
|
| // Auto run the tests if the run=1 in URL
|
| if (OPTIONS.run != undefined && OPTIONS.run != 0) {
|
| + reporter.postTestStartToServer();
|
| testHarness.runTests();
|
| }
|
| });
|
| @@ -610,8 +772,16 @@
|
| 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");
|
| @@ -631,35 +801,79 @@
|
| 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>
|
| -<tr><td><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="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></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>
|
| + <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>
|
| -</td>
|
| -<td>
|
| -<iframe id="testframe" scrolling="yes" width="100%" height="100%"></iframe>
|
| -</td>
|
| -</tr>
|
| -<tr>
|
| -<td colspan="2">
|
| -<div style="text-align: left; width: 100%; height: 100%; overflow: auto;">
|
| -<div id="testResultsHTML"><ul id="results"></ul></div>
|
| -<div style="display: none;" id="testResultsText"><pre id="testResultsAsText"></pre></div>
|
| -</div>
|
| -</td>
|
| -</tr>
|
| -</table>
|
| +</div> <!-- end of header -->
|
| +
|
| </body>
|
| </html>
|
|
|