1 window.benchmarkRunnerClient = {
6 options: { testInterval: 30000, frameRate: 50, estimatedFrameRate: true, fixTestComplexity : false },
8 _resultsDashboard: null,
11 willAddTestFrame: function (frame)
13 var main = document.querySelector("main");
14 var style = getComputedStyle(main);
15 frame.style.left = main.offsetLeft + parseInt(style.borderLeftWidth) + parseInt(style.paddingLeft) + "px";
16 frame.style.top = main.offsetTop + parseInt(style.borderTopWidth) + parseInt(style.paddingTop) + "px";
19 didRunTest: function ()
21 this.progressBar.incRange();
24 willStartFirstIteration: function ()
26 this._resultsDashboard = new ResultsDashboard();
27 this._resultsTable = new ResultsTable(document.querySelector(".results-table"), Headers);
29 this.progressBar = new ProgressBar(document.getElementById("progress-completed"), this.testsCount);
30 this.recordTable = new ResultsTable(document.querySelector(".record-table"), Headers);
33 didRunSuites: function (suitesSamplers)
35 this._resultsDashboard.push(suitesSamplers);
38 didFinishLastIteration: function ()
40 var json = this._resultsDashboard.toJSON(true, true);
41 this._resultsTable.showIterations(json[Strings["JSON_RESULTS"][0]]);
43 var element = document.querySelector("#json > textarea");
44 element.innerHTML = JSON.stringify(json[Strings["JSON_RESULTS"][0]][0], function(key, value) {
45 if (typeof value == "number")
46 return value.toFixed(2);
50 this.score = json[Strings["JSON_SCORE"]];
55 function showSection(sectionIdentifier, pushState)
57 var currentSectionElement = document.querySelector("section.selected");
58 console.assert(currentSectionElement);
60 var newSectionElement = document.getElementById(sectionIdentifier);
61 console.assert(newSectionElement);
63 currentSectionElement.classList.remove("selected");
64 newSectionElement.classList.add("selected");
67 history.pushState({section: sectionIdentifier}, document.title);
70 function startBenchmark()
72 var enabledSuites = [];
75 var suiteItems = document.querySelectorAll("#suites > ul > li");
76 for (var i = 0; i < suiteItems.length; ++i) {
77 var suiteItem = suiteItems[i];
78 var suiteCheckbox = suiteItem.querySelector("input");
80 if (!suiteCheckbox.checked)
83 var enabledTests = [];
84 var testCheckboxes = suiteItem.querySelector("ul").querySelectorAll("input");
85 for (var j = 0; j < testCheckboxes.length; ++j) {
86 var testCheckbox = testCheckboxes[j];
87 if (!testCheckbox.checked)
90 enabledTests.push(testCheckbox.test);
91 localStorage.setItem(localStorageNameForTest(suiteCheckbox.suite, testCheckbox.test), +testCheckbox.checked);
94 enabledSuites.push(new Suite(suiteCheckbox.suite.name, enabledTests));
97 localStorage.setItem("test-interval", document.getElementById("test-interval").value);
99 var testsCount = enabledSuites.reduce(function (testsCount, suite) { return testsCount + suite.tests.length; }, 0);
100 benchmarkRunnerClient.testsCount = benchmarkRunnerClient.iterationCount * testsCount;
101 benchmarkRunnerClient.options["testInterval"] = parseInt(document.getElementById("test-interval").value) * 1000;
102 benchmarkRunnerClient.options["frameRate"] = parseInt(document.getElementById("frame-rate").value);
103 benchmarkRunnerClient.options["estimatedFrameRate"] = document.getElementById("estimated-frame-rate").checked;
104 benchmarkRunnerClient.options["fixTestComplexity"] = document.getElementById("fix-test-complexity").checked;
105 benchmarkRunnerClient.options["showRunningResults"] = document.getElementById("show-running-results").checked;
107 if (!benchmarkRunnerClient.options["showRunningResults"])
108 document.getElementById("record").style.display = "none";
110 var runner = new BenchmarkRunner(enabledSuites, benchmarkRunnerClient);
111 runner.runMultipleIterations(benchmarkRunnerClient.iterationCount);
116 showSection("running");
120 function showResults()
122 var element = document.querySelector("#results > h1");
123 element.textContent = Strings["TEXT_RESULTS"][0] + ":";
125 var score = benchmarkRunnerClient.score.toFixed(2);
126 element.textContent += " [Score = " + score + "]";
128 showSection("results", true);
133 var element = document.querySelector("#json > h1");
134 element.textContent = Strings["TEXT_RESULTS"][2] + ":";
136 var score = benchmarkRunnerClient.score.toFixed(2);
137 element.textContent += " [Score = " + score + "]";
139 showSection("json", true);
142 function showTestGraph(testName, axes, samples, samplingTimeOffset)
144 var element = document.querySelector("#test-graph > h1");
145 element.textContent = Strings["TEXT_RESULTS"][1] + ":";
148 element.textContent += " [test = " + testName + "]";
150 graph("#graphContainer", new Point(700, 400), new Insets(20, 50, 20, 50), axes, samples, samplingTimeOffset);
151 showSection("test-graph", true);
154 function showTestJSON(testName, testResults)
156 var element = document.querySelector("#test-json > h1");
157 element.textContent = Strings["TEXT_RESULTS"][2] + ":";
160 element.textContent += " [test = " + testName + "]";
162 var element = document.querySelector("#test-json > textarea");
163 element.innerHTML = JSON.stringify(testResults, function(key, value) {
164 if (typeof value == "number")
165 return value.toFixed(2);
169 showSection("test-json", true);
172 function initialize() {
175 var toggleTestsCheckbox = document.getElementById("toggleTests");
176 toggleTestsCheckbox.onchange = function(event) {
177 if (event.target.checked)
178 document.getElementById("suites").classList.add("showTests");
180 document.getElementById("suites").classList.remove("showTests");
184 function updateSuiteSelection(event) {
185 var selected = event.target.checked;
186 var testCheckboxes = event.target.parentNode.parentNode.querySelector("ul").querySelectorAll("input");
187 for (var i = 0; i < testCheckboxes.length; ++i) {
188 testCheckboxes[i].checked = selected;
192 function updateTestSelection(event) {
193 var testsList = event.target.parentNode.parentNode.parentNode;
194 var suiteCheckbox = testsList.parentNode.querySelector("label > input");
196 updateSuiteCheckbox(testsList, suiteCheckbox);
199 function updateSuiteCheckbox(testsList, suiteCheckbox) {
200 var numberEnabledTests = 0;
201 var testCheckboxes = testsList.querySelectorAll("input");
202 var totalCheckboxes = testCheckboxes.length;
203 for (var i = 0; i < totalCheckboxes; ++i) {
204 if (testCheckboxes[i].checked)
205 ++numberEnabledTests;
207 suiteCheckbox.checked = numberEnabledTests > 0;
208 suiteCheckbox.indeterminate = numberEnabledTests > 0 && numberEnabledTests < totalCheckboxes;
211 function localStorageNameForTest(suite, test) {
212 return suite.name + "/" + test.name;
215 function populateSettings() {
216 var suitesDiv = document.getElementById("suites");
218 var suitesList = document.createElement("ul");
219 suitesDiv.appendChild(suitesList);
221 Suites.forEach(function(suite) {
222 var suiteItem = document.createElement("li");
223 suitesList.appendChild(suiteItem);
225 var suiteLabel = document.createElement("label");
226 suiteItem.appendChild(suiteLabel);
228 var suiteCheckbox = document.createElement("input");
229 suiteCheckbox.setAttribute("type", "checkbox");
230 suiteCheckbox.suite = suite;
231 suiteCheckbox.onchange = updateSuiteSelection;
232 suiteLabel.appendChild(suiteCheckbox);
233 suiteLabel.appendChild(document.createTextNode(" " + suite.name));
235 var testsList = document.createElement("ul");
236 suiteItem.appendChild(testsList);
238 suite.tests.forEach(function(test) {
239 var testItem = document.createElement("li");
240 testsList.appendChild(testItem);
242 var testLabel = document.createElement("label");
243 testItem.appendChild(testLabel);
245 var testCheckbox = document.createElement("input");
246 testCheckbox.setAttribute("type", "checkbox");
247 testCheckbox.test = test;
248 testCheckbox.onchange = updateTestSelection;
249 if (+localStorage.getItem(localStorageNameForTest(suite, test)))
250 testCheckbox.checked = true;
251 testLabel.appendChild(testCheckbox);
252 testLabel.appendChild(document.createTextNode(" " + test.name));
255 updateSuiteCheckbox(testsList, suiteCheckbox);
258 var interval = localStorage.getItem("test-interval");
260 document.getElementById("test-interval").value = interval;
263 document.addEventListener("DOMContentLoaded", initialize);