6cc761e5bbe362ef5b6cd8c8f224f9ee46020996
[WebKit-https.git] / PerformanceTests / Speedometer / 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     return control;
75 }
76
77 var parseQueryString = (function (pairList) {
78     var pairs = {};
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]] = '';
83         else
84             pairs[keyValue[0]] = decodeURIComponent(keyValue[1].replace(/\+/g, ' '));
85     }
86     return pairs;
87 })(window.location.search.substr(1).split('&'));
88
89 function disableAllSuitesExcept(suiteName) {
90     Suites.forEach(function(element) {
91         if (element.name !== suiteName)
92             element.disabled = true;
93     });
94 }
95
96 function startTest() {
97     var queryParam = parseQueryString['suite'];
98     if (queryParam !== undefined)
99         disableAllSuitesExcept(queryParam);
100
101     var runner = new BenchmarkRunner(Suites, {
102         willRunTest: function (suite, test) {
103             test.anchor.classList.add('running');
104         },
105         didRunTest: function (suite, test) {
106             var classList = test.anchor.classList;
107             classList.remove('running');
108             classList.add('ran');
109         },
110         didRunSuites: function (measuredValues) {
111             var results = '';
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';
119                     }
120                 }
121                 results += suiteName + ' : ' + suiteResults.total + ' ms\n';
122             }
123             results += 'Total : ' + measuredValues.total + ' ms\n';
124
125             if (!results)
126                 return;
127
128             var pre = document.createElement('pre');
129             document.body.appendChild(pre);
130             pre.textContent = results;
131         }
132     });
133
134     var currentState = null;
135
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; }));
140
141     if (parseQueryString['startAutomatically'] !== undefined)
142         document.getElementById('runSuites').click();
143 }
144
145 window.addEventListener('load', startTest);
146
147 </script>
148 </body>
149 </html>