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);
77 var parseQueryString = (function (pairList) {
79 for (var i = 0; i < pairList.length; ++i) {
80 var keyValue = pairList[i].split('=', 2);
81 if (keyValue.length == 1)
82 pairs[keyValue[0]] = '';
84 pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
87 })(window.location.search.substr(1).split('&'));
89 function disableAllSuitesExcept(suiteName) {
90 Suites.forEach(function(element) {
91 if (element.name !== suiteName)
92 element.disabled = true;
96 function startTest() {
97 var queryParam = parseQueryString['suite'];
98 if (queryParam !== undefined)
99 disableAllSuitesExcept(queryParam);
101 var runner = new BenchmarkRunner(Suites, {
102 willRunTest: function (suite, test) {
103 test.anchor.classList.add('running');
105 didRunTest: function (suite, test) {
106 var classList = test.anchor.classList;
107 classList.remove('running');
108 classList.add('ran');
110 didRunSuites: function (measuredValues) {
112 for (var suiteName in measuredValues.tests) {
113 var suiteResults = measuredValues.tests[suiteName];
114 for (var testName in suiteResults.tests) {
115 var testResults = suiteResults.tests[testName];
116 for (var subtestName in testResults.tests) {
117 results += suiteName + ' : ' + testName + ' : ' + subtestName
118 + ': ' + testResults.tests[subtestName] + ' ms\n';
121 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
123 results += 'Total : ' + measuredValues.total + ' ms\n';
128 var pre = document.createElement('pre');
129 document.body.appendChild(pre);
130 pre.textContent = results;
134 var currentState = null;
136 // Don't call step while step is already executing.
137 document.body.appendChild(createUIForSuites(Suites,
138 function () { runner.step(currentState).then(function (state) { currentState = state; }); },
139 function () { runner.runAllSteps(currentState); currentState = null; }));
141 if (parseQueryString['startAutomatically'] !== undefined)
142 document.getElementById('runSuites').click();
145 window.addEventListener('load', startTest);