4 <title>Speedometer 2.0 Interactive Runner</title>
5 <script src="resources/benchmark-runner.js" defer></script>
6 <script src="resources/tests.js" defer></script>
8 iframe { border: 1px solid black; }
9 ol { list-style: none; margin: 0; padding: 0; }
10 ol ol { margin-left: 2em; list-position: outside; }
11 .running { text-decoration: underline; }
13 nav { position: absolute; right: 10px; height: 600px; }
14 nav > ol { height: 100%; overflow-y: scroll; }
20 function formatTestName(suiteName, testName) {
21 return suiteName + (testName ? '/' + testName : '');
24 function createUIForSuites(suites, onstep, onrun) {
25 var control = document.createElement('nav');
26 var ol = document.createElement('ol');
28 for (var suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) {
29 var suite = suites[suiteIndex];
30 var li = document.createElement('li');
31 var checkbox = document.createElement('input');
32 checkbox.id = suite.name;
33 checkbox.type = 'checkbox';
34 checkbox.checked = !suite.disabled;
35 checkbox.onchange = (function (suite, checkbox) { return function () { suite.disabled = !checkbox.checked; } })(suite, checkbox);
37 checkboxes.push(checkbox);
39 li.appendChild(checkbox);
40 var label = document.createElement('label');
41 label.appendChild(document.createTextNode(formatTestName(suite.name)));
42 li.appendChild(label);
43 label.htmlFor = checkbox.id;
45 var testList = document.createElement('ol');
46 for (var testIndex = 0; testIndex < suite.tests.length; testIndex++) {
47 var testItem = document.createElement('li');
48 var test = suite.tests[testIndex];
49 var anchor = document.createElement('a');
50 anchor.id = suite.name + '-' + test.name;
52 anchor.appendChild(document.createTextNode(formatTestName(suite.name, test.name)));
53 testItem.appendChild(anchor);
54 testList.appendChild(testItem);
56 li.appendChild(testList);
61 control.appendChild(ol);
63 var button = document.createElement('button');
64 button.textContent = 'Step';
65 button.onclick = onstep;
66 control.appendChild(button);
68 var button = document.createElement('button');
69 button.textContent = 'Run';
70 button.id = 'runSuites';
71 button.onclick = onrun;
72 control.appendChild(button);
74 var button = document.createElement('button');
75 button.textContent = 'Select all';
76 button.onclick = function () {
77 for (var suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) {
78 suites[suiteIndex].disabled = false;
79 checkboxes[suiteIndex].checked = true;
82 control.appendChild(button);
84 var button = document.createElement('button');
85 button.textContent = 'Unselect all';
86 button.onclick = function () {
87 for (var suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) {
88 suites[suiteIndex].disabled = true;
89 checkboxes[suiteIndex].checked = false;
93 control.appendChild(button);
98 var parseQueryString = (function (pairList) {
100 for (var i = 0; i < pairList.length; ++i) {
101 var keyValue = pairList[i].split('=', 2);
102 if (keyValue.length == 1)
103 pairs[keyValue[0]] = '';
105 pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
108 })(window.location.search.substr(1).split('&'));
110 function disableAllSuitesExcept(suiteName) {
111 Suites.forEach(function(element) {
112 if (element.name !== suiteName)
113 element.disabled = true;
117 function startTest() {
118 var queryParam = parseQueryString['suite'];
119 if (queryParam !== undefined)
120 disableAllSuitesExcept(queryParam);
122 var runner = new BenchmarkRunner(Suites, {
123 willRunTest: function (suite, test) {
124 test.anchor.classList.add('running');
126 didRunTest: function (suite, test) {
127 var classList = test.anchor.classList;
128 classList.remove('running');
129 classList.add('ran');
131 didRunSuites: function (measuredValues) {
133 for (var suiteName in measuredValues.tests) {
134 var suiteResults = measuredValues.tests[suiteName];
135 for (var testName in suiteResults.tests) {
136 var testResults = suiteResults.tests[testName];
137 for (var subtestName in testResults.tests) {
138 results += suiteName + ' : ' + testName + ' : ' + subtestName
139 + ': ' + testResults.tests[subtestName] + ' ms\n';
142 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
144 results += 'Total : ' + measuredValues.total + ' ms\n';
149 var pre = document.createElement('pre');
150 document.body.appendChild(pre);
151 pre.textContent = results;
155 var currentState = null;
157 // Don't call step while step is already executing.
158 document.body.appendChild(createUIForSuites(Suites,
159 function () { runner.step(currentState).then(function (state) { currentState = state; }); },
160 function () { runner.runAllSteps(currentState); currentState = null; }));
162 if (parseQueryString['startAutomatically'] !== undefined)
163 document.getElementById('runSuites').click();
166 window.addEventListener('load', startTest);