1<!--
2/*
3 * Copyright (C) 2010 Apple Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
15 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
16 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
18 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
24 * THE POSSIBILITY OF SUCH DAMAGE.
25 */
26-->
27
28<!DOCTYPE html>
29<html>
30  <head>
31  <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
32  <title>CSS 2.1 Test Harness</title>
33  <link rel="stylesheet" href="harness.css" type="text/css" media="screen" charset="utf-8">
34
35  <script src="http://code.jquery.com/jquery-1.4.2.min.js" type="text/javascript" charset="utf-8"></script>
36  <script src="harness.js" type="text/javascript" charset="utf-8"></script>
37  
38  <script type="text/javascript" charset="utf-8">
39    var gTestSuite;
40    function setupTests()
41    {
42      gTestSuite = new TestSuite();
43    }
44    
45    window.addEventListener('load', setupTests, false);
46    
47    function skipTest()
48    {
49      gTestSuite.skipTest(document.getElementById('skip-reason').value);
50    }
51    
52    function invalidTest()
53    {
54      gTestSuite.invalidTest();
55    }
56
57    function failTest()
58    {
59      gTestSuite.failTest();
60    }
61
62    function passTest()
63    {
64      gTestSuite.passTest();
65    }
66    
67    function goToNextUntested()
68    {
69      gTestSuite.goToNextIncompleteTest();
70    }
71
72    function goToTest()
73    {
74      var testName = prompt('Go to test:', '');
75      
76      // This accepts any of the following:
77      // at-charset-010
78      // at-charset-010.xht
79      // xhtml1/at-charset-010
80      // xhtml1/at-charset-010.xht
81      // and will choose the format if specified.
82      if (!gTestSuite.goToTestByName(testName))
83        alert('Failed to find test ' + testName);
84    }
85    
86    function formatChanged()
87    {
88      var newFormat;
89      if (document.harness.format.html4.checked)
90        newFormat = 'html4';
91      else
92        newFormat = 'xhtml1';
93      gTestSuite.formatChanged(newFormat);
94    }
95    
96    function testSelected()
97    {
98      var list = document.getElementById('test-list')
99      if (list.selectedIndex >= 0)
100        gTestSuite.goToTestIndex(list.selectedIndex);
101      else
102        gTestSuite.clearTest();
103    }
104
105    function resultsPopupChanged(popup)
106    {
107      gTestSuite.resultsPopupChanged(popup.selectedIndex);
108    }
109    
110    function doExport()
111    {
112      gTestSuite.exportResults(document.getElementById('results-popup').selectedIndex);
113    }
114    
115    function printTestIframe()
116    {
117      var testFrame = document.getElementById('test-frame');
118      testFrame.contentWindow.print();
119    }
120
121    var gOverlayConfirmCallback;
122    function showOverlay(overlayConfirmCallback)
123    {
124      document.getElementById('overlay-data').value = '';
125      gOverlayConfirmCallback = overlayConfirmCallback;
126      $('#overlay').addClass('visible');
127    }
128
129    function overlayCancel()
130    {
131      $('#overlay').removeClass('visible');
132    }
133    
134    function overlayConfirm()
135    {
136      var data = document.getElementById('overlay-data').value;
137      gOverlayConfirmCallback(data);
138      $('#overlay').removeClass('visible');
139    }
140    
141    function doImport()
142    {
143      document.getElementById('overlay-action').innerText = 'Enter results to import (in the same format as the exported results):';
144      showOverlay(function(data) {
145        gTestSuite.importResults(data);
146      });
147    }
148    
149    function doClear()
150    {
151      document.getElementById('overlay-action').innerText = 'Enter list of tests for which to clear results (so they can be re-tested):';
152      showOverlay(function(data) {
153        gTestSuite.clearResults(data);
154      });
155    }
156  </script>
157
158</head>
159<body>
160
161  <div class="controls">
162    <form name="harness" onsubmit="return false;">
163    <select id="chapters">
164      <option>Test category</option>
165    </select>
166    <div class="progress">
167      <div><span id="test-index">1</span> of <span id="chapter-test-count">200</span> unique tests</div>
168    </div>
169    <div class="details">
170      <div class="name">
171        <div class="test-type">
172          <input type="radio" name="format" id="html4" onchange="formatChanged()" checked><label for="html4">HTML4</label><br>
173          <input type="radio" name="format" id="xhtml1" onchange="formatChanged()"><label for="xhtml1">XHTML1</label>
174        </div>
175        <button onclick="goToNextUntested()" accesskey="n"><strong>N</strong>ext Untested</button>
176        <button onclick="goToTest()" accesskey="g">Go to Test...</button>
177      </div>
178    </div>
179    
180    <div>
181      <select id="test-list" size="40" onchange="testSelected()"></select>
182    </div>
183    </form>
184  </div>
185  
186  <div class="actions">
187    <span>Skip reason:</span> <input type="text" id="skip-reason" size="50">
188    <button onclick="skipTest()" accesskey="s"><strong>S</strong>kip</button>
189    <div class="note">Use <i>Control-Option-letter</i> to<br> trigger buttons via the keyboard.</div>
190    <div class="action-buttons">
191      <button onclick="invalidTest()" accesskey="i">Invalid</button>
192      <button onclick="failTest()" accesskey="f"><strong>F</strong>ail</button>
193      <button onclick="passTest()" accesskey="p"><strong>P</strong>ass</button>
194    </div>
195  </div>
196  <div id="test-content">
197    <div class="info">
198      <div class="title">Title: <span id="test-title"></span></div>
199      <div class="url">URL: <span id="test-url"></span></div>
200      <div class="assertion">Assertion: <span id="test-assertion"></span></div>
201      <div class="flags">Flags: <span id="test-flags"></span>
202        <span id="warning">This test must be run over HTTP.</span>
203        <button id="print-button" onclick="printTestIframe()">Print Preview</button>
204      </div>
205    </div>
206    
207    <div id="test-wrapper" class="frame-wrapper">
208      <h2>Test</h2>
209      <iframe id="test-frame"></iframe>
210    </div>
211    <div id="ref-wrapper" class="frame-wrapper">
212      <h2>Reference</h2>
213      <iframe id="ref-frame"></iframe>
214    </div>
215  </div>
216
217  <div class="results">
218
219    <div class="output-options">
220      <p>Show results for:</p>
221      <select id="results-popup" onchange="resultsPopupChanged(this)">
222      </select>
223      <div>
224        <button id="export-button" onclick="doExport()">Export...</button>
225      </div>
226
227      <div class="custom">
228        <button id="import-button" onclick="doImport()">Import...</button>
229        <button id="import-button" onclick="doClear()">Clear Results...</button>
230      </div>
231    </div>
232
233    <div id="output"></div>
234    <div class="summary">
235      <table>
236        <tr>
237          <th></th><th>Passed</th><th>Failed</th><th>Skipped</th><th>Invalid</th><th>Tested</th><th>Total</th><th>% done</th>
238        </tr>
239        <tr>
240          <td class="label">HTML4:</td><td id="h-passed"></td><td id="h-failed"></td><td id="h-skipped"></td><td id="h-invalid"></td><td id="h-tested"></td><td id="h-total"></td><td id="h-percent"></td>
241        </tr>
242        <tr>
243          <td class="label">XHTML1:</td><td id="x-passed"></td><td id="x-failed"></td><td id="x-skipped"></td><td id="x-invalid"></td><td id="x-tested"></td><td id="x-total"></td><td id="x-percent"></td>
244        </tr>
245      </table>
246    </div>
247  </div>
248
249  <div id="overlay">
250    
251    <div class="overlay-contents">
252      <p id="overlay-action"></p>
253      <textarea id="overlay-data"></textarea>
254      <p class="note">Pasting many lines of text here can be very slow in Safari 5. You can quit Safari and use a <a href="http://nightly.webkit.org/" title="WebKit Nightly Builds">WebKit nightly build</a> for importing or clearing.</p>
255      <div class="buttons">
256        <button onclick="overlayCancel()">Cancel</button><button onclick="overlayConfirm()">OK</button>
257      </div>
258    </div>
259    
260  </div>
261</body>
262</html>