20ca6a11ec71da58cdea982859fb362bbce771c2
[WebKit-https.git] / Websites / browserbench.org / Speedometer2.0 / InteractiveRunner.html
1 <!DOCTYPE html>
2 <html>
3 <head>
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>
7 <style>
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; }
12 .ran { color: grey; }
13 nav { position: absolute; right: 10px; height: 600px; }
14 nav > ol { height: 100%; overflow-y: scroll; }
15 </style>
16 </head>
17 <body>
18 <script>
19
20 function formatTestName(suiteName, testName) {
21     return suiteName + (testName ? '/' + testName : '');
22 }
23
24 function createUIForSuites(suites, onstep, onrun) {
25     var control = document.createElement('nav');
26     var ol = document.createElement('ol');
27     var checkboxes = [];
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);
36         checkbox.onchange();
37         checkboxes.push(checkbox);
38
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;
44
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;
51             test.anchor = anchor;
52             anchor.appendChild(document.createTextNode(formatTestName(suite.name, test.name)));
53             testItem.appendChild(anchor);
54             testList.appendChild(testItem);
55         }
56         li.appendChild(testList);
57
58         ol.appendChild(li);
59     }
60
61     control.appendChild(ol);
62
63     var button = document.createElement('button');
64     button.textContent = 'Step';
65     button.onclick = onstep;
66     control.appendChild(button);
67
68     var button = document.createElement('button');
69     button.textContent = 'Run';
70     button.id = 'runSuites';
71     button.onclick = onrun;
72     control.appendChild(button);
73
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;
80         }
81     };
82     control.appendChild(button);
83
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;
90         }
91
92     };
93     control.appendChild(button);
94
95     return control;
96 }
97
98 var parseQueryString = (function (pairList) {
99     var pairs = {};
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]] = '';
104         else
105             pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
106     }
107     return pairs;
108 })(window.location.search.substr(1).split('&'));
109
110 function disableAllSuitesExcept(suiteName) {
111     Suites.forEach(function(element) {
112         if (element.name !== suiteName)
113             element.disabled = true;
114     });
115 }
116
117 function startTest() {
118     var queryParam = parseQueryString['suite'];
119     if (queryParam !== undefined)
120         disableAllSuitesExcept(queryParam);
121
122     var runner = new BenchmarkRunner(Suites, {
123         willRunTest: function (suite, test) {
124             test.anchor.classList.add('running');
125         },
126         didRunTest: function (suite, test) {
127             var classList = test.anchor.classList;
128             classList.remove('running');
129             classList.add('ran');
130         },
131         didRunSuites: function (measuredValues) {
132             var results = '';
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';
140                     }
141                 }
142                 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
143             }
144             results += 'Total : ' + measuredValues.total + ' ms\n';
145
146             if (!results)
147                 return;
148
149             var pre = document.createElement('pre');
150             document.body.appendChild(pre);
151             pre.textContent = results;
152         }
153     });
154
155     var currentState = null;
156
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; }));
161
162     if (parseQueryString['startAutomatically'] !== undefined)
163         document.getElementById('runSuites').click();
164 }
165
166 window.addEventListener('load', startTest);
167
168 </script>
169 </body>
170 </html>