7e5fe2adc1b43060191e70a32c2588b23ee8847d
[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; }
14 </style>
15 </head>
16 <body>
17 <script>
18
19 function formatTestName(suiteName, testName) {
20     return suiteName + (testName ? '/' + testName : '');
21 }
22
23 function createUIForSuites(suites, onstep, onrun) {
24     var control = document.createElement('nav');
25     var ol = document.createElement('ol');
26     var checkboxes = [];
27     for (var suiteIndex = 0; suiteIndex < suites.length; suiteIndex++) {
28         var suite = suites[suiteIndex];
29         var li = document.createElement('li');
30         var checkbox = document.createElement('input');
31         checkbox.id = suite.name;
32         checkbox.type = 'checkbox';
33         checkbox.checked = !suite.disabled;
34         checkbox.onchange = (function (suite, checkbox) { return function () { suite.disabled = !checkbox.checked; } })(suite, checkbox);
35         checkbox.onchange();
36         checkboxes.push(checkbox);
37
38         li.appendChild(checkbox);
39         var label = document.createElement('label');
40         label.appendChild(document.createTextNode(formatTestName(suite.name)));
41         li.appendChild(label);
42         label.htmlFor = checkbox.id;
43
44         var testList = document.createElement('ol');
45         for (var testIndex = 0; testIndex < suite.tests.length; testIndex++) {
46             var testItem = document.createElement('li');
47             var test = suite.tests[testIndex];
48             var anchor = document.createElement('a');
49             anchor.id = suite.name + '-' + test.name;
50             test.anchor = anchor;
51             anchor.appendChild(document.createTextNode(formatTestName(suite.name, test.name)));
52             testItem.appendChild(anchor);
53             testList.appendChild(testItem);
54         }
55         li.appendChild(testList);
56
57         ol.appendChild(li);
58     }
59
60     control.appendChild(ol);
61
62     var button = document.createElement('button');
63     button.textContent = 'Step';
64     button.onclick = onstep;
65     control.appendChild(button);
66
67     var button = document.createElement('button');
68     button.textContent = 'Run';
69     button.id = 'runSuites';
70     button.onclick = onrun;
71     control.appendChild(button);
72
73     return control;
74 }
75
76 var parseQueryString = (function (pairList) {
77     var pairs = {};
78     for (var i = 0; i < pairList.length; ++i) {
79         var keyValue = pairList[i].split('=', 2);
80         if (keyValue.length == 1)
81             pairs[keyValue[0]] = '';
82         else
83             pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
84     }
85     return pairs;
86 })(window.location.search.substr(1).split('&'));
87
88 function disableAllSuitesExcept(suiteName) {
89     Suites.forEach(function(element) {
90         if (element.name !== suiteName)
91             element.disabled = true;
92     });
93 }
94
95 function startTest() {
96     var queryParam = parseQueryString['suite'];
97     if (queryParam !== undefined)
98         disableAllSuitesExcept(queryParam);
99
100     var runner = new BenchmarkRunner(Suites, {
101         willRunTest: function (suite, test) {
102             test.anchor.classList.add('running');
103         },
104         didRunTest: function (suite, test) {
105             var classList = test.anchor.classList;
106             classList.remove('running');
107             classList.add('ran');
108         },
109         didRunSuites: function (measuredValues) {
110             var results = '';
111             for (var suiteName in measuredValues.tests) {
112                 var suiteResults = measuredValues.tests[suiteName];
113                 for (var testName in suiteResults.tests) {
114                     var testResults = suiteResults.tests[testName];
115                     for (var subtestName in testResults.tests) {
116                         results += suiteName + ' : ' + testName + ' : ' + subtestName
117                             + ': ' + testResults.tests[subtestName] + ' ms\n';
118                     }
119                 }
120                 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
121             }
122             results += 'Total : ' + measuredValues.total + ' ms\n';
123
124             if (!results)
125                 return;
126
127             var pre = document.createElement('pre');
128             document.body.appendChild(pre);
129             pre.textContent = results;
130         }
131     });
132
133     var currentState = null;
134
135     // Don't call step while step is already executing.
136     document.body.appendChild(createUIForSuites(Suites,
137         function () { runner.step(currentState).then(function (state) { currentState = state; }); },
138         function () { runner.runAllSteps(currentState); currentState = null; }));
139
140     if (parseQueryString['startAutomatically'] !== undefined)
141         document.getElementById('runSuites').click();
142 }
143
144 window.addEventListener('load', startTest);
145
146 </script>
147 </body>
148 </html>