1 window.benchmarkRunnerClient = {
8 _resultsDashboard: null,
11 initialize: function(suites, options)
13 this.testsCount = this.iterationCount * suites.reduce(function (count, suite) { return count + suite.tests.length; }, 0);
14 this.options = options;
17 willAddTestFrame: function (frame)
19 var main = document.querySelector("main");
20 var style = getComputedStyle(main);
21 frame.style.left = main.offsetLeft + parseInt(style.borderLeftWidth) + parseInt(style.paddingLeft) + "px";
22 frame.style.top = main.offsetTop + parseInt(style.borderTopWidth) + parseInt(style.paddingTop) + "px";
25 didRunTest: function ()
27 this.progressBar.incRange();
30 willStartFirstIteration: function ()
32 this._resultsDashboard = new ResultsDashboard();
33 this._resultsTable = new ResultsTable(document.querySelector("section#results > data > table"), Headers);
35 this.progressBar = new ProgressBar(document.getElementById("progress-completed"), this.testsCount);
36 this.recordTable = new ResultsTable(document.querySelector("section#running > #record > table"), Headers);
39 didRunSuites: function (suitesSamplers)
41 this._resultsDashboard.push(suitesSamplers);
44 didFinishLastIteration: function ()
46 var json = this._resultsDashboard.toJSON(true, true);
47 this.score = json[Strings["JSON_SCORE"]];
48 this._resultsTable.showIterations(json[Strings["JSON_RESULTS"][0]], this.options);
49 sectionsManager.showJSON("json", json[Strings["JSON_RESULTS"][0]][0]);
50 suitesManager.updateLocalStorageFromJSON(json[Strings["JSON_RESULTS"][0]][0]);
51 benchmarkController.showResults();
55 window.sectionsManager =
57 _sectionHeaderH1Element: function(sectionIdentifier)
59 return document.querySelector("#" + sectionIdentifier + " > header > h1");
62 _sectionDataDivElement: function(sectionIdentifier)
64 return document.querySelector("#" + sectionIdentifier + " > data > div");
67 showScore: function(sectionIdentifier, title)
69 var element = this._sectionHeaderH1Element(sectionIdentifier);
70 element.textContent = title + ":";
72 var score = benchmarkRunnerClient.score.toFixed(2);
73 element.textContent += " [Score = " + score + "]";
76 showTestName: function(sectionIdentifier, title, testName)
78 var element = this._sectionHeaderH1Element(sectionIdentifier);
79 element.textContent = title + ":";
84 element.textContent += " [test = " + testName + "]";
87 showJSON: function(sectionIdentifier, json)
89 var element = this._sectionDataDivElement(sectionIdentifier);
90 element.textContent = JSON.stringify(json, function(key, value) {
91 if (typeof value == "number")
92 return value.toFixed(2);
97 showSection: function(sectionIdentifier, pushState)
99 var currentSectionElement = document.querySelector("section.selected");
100 console.assert(currentSectionElement);
102 var newSectionElement = document.getElementById(sectionIdentifier);
103 console.assert(newSectionElement);
105 currentSectionElement.classList.remove("selected");
106 newSectionElement.classList.add("selected");
109 history.pushState({section: sectionIdentifier}, document.title);
112 setupRunningSectionStyle: function(options)
114 if (!options["show-running-results"])
115 document.getElementById("record").style.display = "none";
119 window.optionsManager =
121 _optionsElements : function()
123 return document.querySelectorAll("section#home > options input");;
126 _adaptiveTestElement: function()
128 return document.querySelector("section#home > options #adaptive-test");;
131 updateUIFromLocalStorage: function()
133 var optionsElements = this._optionsElements();
135 for (var i = 0; i < optionsElements.length; ++i) {
136 var optionElement = optionsElements[i];
138 var value = localStorage.getItem(optionElement.id);
142 if (optionElement.getAttribute("type") == "number")
143 optionElement.value = +value;
144 else if (optionElement.getAttribute("type") == "checkbox")
145 optionElement.checked = value == "true";
149 updateLocalStorageFromUI: function()
151 var optionsElements = this._optionsElements();
154 for (var i = 0; i < optionsElements.length; ++i) {
155 var optionElement = optionsElements[i];
157 if (optionElement.getAttribute("type") == "number")
158 options[optionElement.id] = optionElement.value;
159 else if (optionElement.getAttribute("type") == "checkbox")
160 options[optionElement.id] = optionElement.checked;
162 localStorage.setItem(optionElement.id, options[optionElement.id]);
169 window.suitesManager =
171 _treeElement : function()
173 return document.querySelector("suites > .tree");
176 _suitesElements : function()
178 return document.querySelectorAll("#home > suites > ul > li");
181 _checkboxElement: function(element)
183 return element.querySelector("input[type='checkbox']:not(.expand-button)");
186 _editElement: function(element)
188 return element.querySelector("input[type='number']");
191 _editsElements: function()
193 return document.querySelectorAll("section#home > suites input[type='number']");
196 _localStorageNameForTest: function(suiteName, testName)
198 return suiteName + "/" + testName;
201 _updateSuiteCheckboxState: function(suiteCheckbox)
203 var numberEnabledTests = 0;
204 suiteCheckbox.testsElements.forEach(function(testElement) {
205 var testCheckbox = this._checkboxElement(testElement);
206 if (testCheckbox.checked)
207 ++numberEnabledTests;
209 suiteCheckbox.checked = numberEnabledTests > 0;
210 suiteCheckbox.indeterminate = numberEnabledTests > 0 && numberEnabledTests < suiteCheckbox.testsElements.length;
213 _updateStartButtonState: function()
215 var suitesElements = this._suitesElements();
216 var startButton = document.querySelector("#home > footer > button");
218 for (var i = 0; i < suitesElements.length; ++i) {
219 var suiteElement = suitesElements[i];
220 var suiteCheckbox = this._checkboxElement(suiteElement);
222 if (suiteCheckbox.checked) {
223 startButton.disabled = false;
228 startButton.disabled = true;
231 _onChangeSuiteCheckbox: function(event)
233 var selected = event.target.checked;
234 event.target.testsElements.forEach(function(testElement) {
235 var testCheckbox = this._checkboxElement(testElement);
236 testCheckbox.checked = selected;
238 this._updateStartButtonState();
241 _onChangeTestCheckbox: function(event)
243 var suiteCheckbox = event.target.suiteCheckbox;
244 this._updateSuiteCheckboxState(suiteCheckbox);
245 this._updateStartButtonState();
248 _createSuiteElement: function(treeElement, suite, id)
250 var suiteElement = DocumentExtension.createElement("li", {}, treeElement);
251 var expand = DocumentExtension.createElement("input", { type: "checkbox", class: "expand-button", id: id }, suiteElement);
252 var label = DocumentExtension.createElement("label", { class: "tree-label", for: id }, suiteElement);
254 var suiteCheckbox = DocumentExtension.createElement("input", { type: "checkbox" }, label);
255 suiteCheckbox.suite = suite;
256 suiteCheckbox.onchange = this._onChangeSuiteCheckbox.bind(this);
257 suiteCheckbox.testsElements = [];
259 label.appendChild(document.createTextNode(" " + suite.name));
263 _createTestElement: function(listElement, test, suiteCheckbox)
265 var testElement = DocumentExtension.createElement("li", {}, listElement);
266 var span = DocumentExtension.createElement("span", { class: "tree-label" }, testElement);
268 var testCheckbox = DocumentExtension.createElement("input", { type: "checkbox" }, span);
269 testCheckbox.test = test;
270 testCheckbox.onchange = this._onChangeTestCheckbox.bind(this);
271 testCheckbox.suiteCheckbox = suiteCheckbox;
273 suiteCheckbox.testsElements.push(testElement);
274 span.appendChild(document.createTextNode(" " + test.name));
275 DocumentExtension.createElement("input", { type: "number" }, testElement);
279 createElements: function()
281 var treeElement = this._treeElement();
283 Suites.forEach(function(suite, index) {
284 var suiteElement = this._createSuiteElement(treeElement, suite, "suite-" + index);
285 var listElement = DocumentExtension.createElement("ul", {}, suiteElement);
286 var suiteCheckbox = this._checkboxElement(suiteElement);
288 suite.tests.forEach(function(test) {
289 var testElement = this._createTestElement(listElement, test, suiteCheckbox);
294 updateEditsElementsState: function()
296 var editsElements = this._editsElements();
297 var show = !optionsManager._adaptiveTestElement().checked;
299 for (var i = 0; i < editsElements.length; ++i) {
300 var editElement = editsElements[i];
302 editElement.classList.add("selected");
304 editElement.classList.remove("selected");
308 updateUIFromLocalStorage: function()
310 var suitesElements = this._suitesElements();
312 for (var i = 0; i < suitesElements.length; ++i) {
313 var suiteElement = suitesElements[i];
314 var suiteCheckbox = this._checkboxElement(suiteElement);
315 var suite = suiteCheckbox.suite;
317 suiteCheckbox.testsElements.forEach(function(testElement) {
318 var testCheckbox = this._checkboxElement(testElement);
319 var testEdit = this._editElement(testElement);
320 var test = testCheckbox.test;
322 var str = localStorage.getItem(this._localStorageNameForTest(suite.name, test.name));
326 var value = JSON.parse(str);
327 testCheckbox.checked = value.checked;
328 testEdit.value = value.complexity;
331 this._updateSuiteCheckboxState(suiteCheckbox);
334 this._updateStartButtonState();
337 updateLocalStorageFromUI: function()
339 var suitesElements = this._suitesElements();
342 for (var i = 0; i < suitesElements.length; ++i) {
343 var suiteElement = suitesElements[i];
344 var suiteCheckbox = this._checkboxElement(suiteElement);
345 var suite = suiteCheckbox.suite;
348 suiteCheckbox.testsElements.forEach(function(testElement) {
349 var testCheckbox = this._checkboxElement(testElement);
350 var testEdit = this._editElement(testElement);
351 var test = testCheckbox.test;
353 if (testCheckbox.checked) {
354 test.complexity = testEdit.value;
358 var value = { checked: testCheckbox.checked, complexity: testEdit.value };
359 localStorage.setItem(this._localStorageNameForTest(suite.name, test.name), JSON.stringify(value));
363 suites.push(new Suite(suiteCheckbox.suite.name, tests));
369 updateLocalStorageFromJSON: function(iterationResults)
371 for (var suiteName in iterationResults[Strings["JSON_RESULTS"][1]]) {
372 var suiteResults = iterationResults[Strings["JSON_RESULTS"][1]][suiteName];
374 for (var testName in suiteResults[Strings["JSON_RESULTS"][2]]) {
375 var testResults = suiteResults[Strings["JSON_RESULTS"][2]][testName];
376 var data = testResults[Strings["JSON_EXPERIMENTS"][0]]
377 var complexity = Math.round(data[Strings["JSON_MEASUREMENTS"][0]]);
379 var value = { checked: true, complexity: complexity };
380 localStorage.setItem(this._localStorageNameForTest(suiteName, testName), JSON.stringify(value));
386 window.benchmarkController =
388 initialize: function()
390 optionsManager.updateUIFromLocalStorage();
391 suitesManager.createElements();
392 suitesManager.updateUIFromLocalStorage();
393 suitesManager.updateEditsElementsState();
396 onChangeAdaptiveTestCheckbox: function()
398 suitesManager.updateEditsElementsState();
401 _runBenchmark: function(suites, options)
403 benchmarkRunnerClient.initialize(suites, options);
404 var frameContainer = document.querySelector("#running > #running-test");
405 var runner = new BenchmarkRunner(suites, frameContainer || document.body, benchmarkRunnerClient);
406 runner.runMultipleIterations();
409 startTest: function()
411 var options = optionsManager.updateLocalStorageFromUI();
412 var suites = suitesManager.updateLocalStorageFromUI();
413 sectionsManager.setupRunningSectionStyle(options);
414 this._runBenchmark(suites, options);
415 sectionsManager.showSection("running");
418 showResults: function()
420 sectionsManager.showScore("results", Strings["TEXT_RESULTS"][0]);
421 sectionsManager.showSection("results", true);
426 sectionsManager.showScore("json", Strings["TEXT_RESULTS"][0]);
427 sectionsManager.showSection("json", true);
430 showTestGraph: function(testName, axes, samples, samplingTimeOffset)
432 sectionsManager.showTestName("test-graph", Strings["TEXT_RESULTS"][1], testName);
433 sectionsManager.showSection("test-graph", true);
434 graph("section#test-graph > data", new Insets(20, 50, 20, 50), axes, samples, samplingTimeOffset);
437 showTestJSON: function(testName, json)
439 sectionsManager.showTestName("test-json", Strings["TEXT_RESULTS"][1], testName);
440 sectionsManager.showJSON("test-json", json);
441 sectionsManager.showSection("test-json", true);
445 window.addEventListener("load", benchmarkController.initialize);