| <html> |
| <head> |
| <style> |
| body { |
| font-family: sans-serif; |
| } |
| div#output { |
| cursor: pointer; |
| } |
| div#switcher { |
| cursor: pointer; |
| } |
| div#switcher a { |
| border-top: 1px solid black; |
| border-left: 1px solid black; |
| padding-left: 0.5em; |
| padding-right: 0.5em; |
| } |
| canvas.plot { |
| border: 1px solid black; |
| } |
| div.plot-coordinates { |
| font-family: monospace; |
| } |
| iframe { |
| display: none; |
| width: 100%; |
| height: 100%; |
| border: none; |
| } |
| div.selector { |
| border: solid 1px black; |
| cursor: pointer; |
| padding-left: 0.3em; |
| background-color: white; |
| } |
| div.selector:hover { |
| background-color: rgb(200,200,250); |
| } |
| div.selected { |
| border-left: none; |
| } |
| div#selectors { |
| width: 80px; |
| display: none; |
| } |
| </style> |
| <script src="js/common.js"></script> |
| <script src="js/coordinates.js"></script> |
| <script src="js/plotter.js"></script> |
| <script src="config.js"></script> |
| <script> |
| document.title = Config.title; |
| |
| var params = ParseParams(); |
| if (!('history' in params)) { |
| params.history = 150; |
| window.location.href = MakeURL(params); |
| } |
| if (!('trace' in params)) { |
| params.trace = 'summary'; |
| window.location.href = MakeURL(params); |
| } |
| |
| function goTo(trace) { |
| params.trace = trace; |
| if (params.trace == '' && params.trace != '0') |
| params.trace = 'summary'; |
| window.location.href = MakeURL(params); |
| } |
| |
| function goToClosure(trace) { |
| return function(){goTo(trace)}; |
| } |
| |
| var didUpdatePositionDetails = false; |
| |
| function unitsForTrace() { |
| return 'msec'; |
| } |
| |
| function timing(dict) { |
| return parseFloat(dict['time']); |
| } |
| |
| function deviation(absoluteValue, dict) { |
| deviationPercentage = parseFloat(dict['stdd']); |
| return absoluteValue / 100 * deviationPercentage; |
| } |
| |
| function testCategoryDetails(dict) { |
| return dict['details']; |
| } |
| |
| function jsonToJs(data) { |
| return eval('(' + data + ')') |
| } |
| |
| function addSelectionTabs(rows) { |
| if (rows.length > 0 && rows[0].length > 0) { |
| data = jsonToJs(rows[0]); |
| tabs = ['summary']; |
| for (var clNumber in data) |
| for (var testType in data[clNumber]) |
| for (test_name in testCategoryDetails(data[clNumber][testType])) |
| tabs.push(test_name); |
| |
| initPlotSwitcher(tabs); |
| } |
| } |
| |
| function onSummaryReceived(data) { |
| var rows = data.split('\n'); |
| addSelectionTabs(rows); |
| clNumbers = []; |
| dataRows = {}; |
| |
| for(var i = 0; i < rows.length; i++) { |
| if (rows[i].length < 1) |
| break; |
| if (i > params.history) // limit by history |
| break; |
| |
| clData = jsonToJs(rows[i]); |
| |
| if (params.trace == 'summary') { |
| for (var clNumber in clData) { |
| clNumbers.push(clNumber) |
| |
| for(testType in clData[clNumber]){ |
| if(!dataRows[testType]) |
| dataRows[testType] = [] |
| |
| time = timing(clData[clNumber][testType]); |
| stdd = deviation(time, clData[clNumber][testType]); |
| dataRows[testType].push([time, stdd]) |
| } |
| } |
| } else { |
| // specific selection that is defined in params.trace |
| for (var clNumber in clData) { |
| clNumbers.push(clNumber) |
| currentData = clData[clNumber] |
| for(testType in currentData){ |
| if(!dataRows[params.trace]) |
| dataRows[params.trace] = [] |
| |
| details = testCategoryDetails(currentData[testType]); |
| if (details[params.trace]) { |
| testData = details[params.trace]; |
| time = timing(testData); |
| stdd = deviation(time, testData); |
| dataRows[params.trace].push([time, stdd]) |
| break; |
| } |
| } |
| } |
| } |
| } |
| |
| dataGrid = [] |
| for(key in dataRows) { |
| dataGrid.push(dataRows[key].reverse()) |
| } |
| clNumbers.reverse(); |
| var plotter = new Plotter(clNumbers, dataGrid, Config.dataDescription, |
| unitsForTrace(), document.getElementById("output")); |
| plotter.onclick = handlePlotClicked; |
| plotter.plot(); |
| |
| return; |
| } |
| |
| function handlePlotClicked(cl, value, fuzz, e) { |
| document.getElementById('view-change'). |
| setAttribute('src', Config.changeLinkPrefix + cl); |
| |
| if (!didUpdatePositionDetails) { |
| updatePositionDetails(); |
| didUpdatePositionDetails = true; |
| } |
| } |
| |
| function updatePositionDetails() { |
| var output = document.getElementById("output"); |
| var win_height = window.innerHeight; |
| var details = document.getElementById("views"); |
| var views = document.getElementById("views"); |
| var selectors = document.getElementById("selectors"); |
| selectors.style.display = "block"; |
| |
| var views_width = output.offsetWidth - selectors.offsetWidth; |
| |
| views.style.border = "1px solid black"; |
| views.style.width = views_width + "px"; |
| views.style.height = (win_height - output.offsetHeight - |
| output.offsetTop - 30) + "px"; |
| |
| selectors.style.position = "absolute"; |
| selectors.style.left = (views.offsetLeft + views_width + 1) + "px"; |
| selectors.style.top = views.offsetTop + "px"; |
| |
| viewCl(); |
| } |
| |
| function viewCl(target) { |
| document.getElementById("view-change").style.display = "block"; |
| } |
| |
| function initPlotSwitcher(tabs) { |
| for(var i = 0; i < tabs.length; i++) { |
| var anchor = document.createElement("a"); |
| anchor.appendChild(document.createTextNode(tabs[i])); |
| anchor.addEventListener("click", goToClosure(tabs[i]), false); |
| document.getElementById("switcher").appendChild(anchor); |
| } |
| |
| if ('lookout' in params) { |
| switcher.style.display = "none"; |
| details.style.display = "none"; |
| header_text.style.display = "none"; |
| explain.style.display = "none"; |
| selection.style.display = "none"; |
| } else { |
| document.getElementById("header_lookout").style.display = "none"; |
| } |
| } |
| |
| function log(data) { |
| document.getElementById('log').appendChild( |
| document.createTextNode(data + '\n')); |
| } |
| |
| function init() { |
| Fetch("summary.dat", onSummaryReceived); |
| } |
| |
| window.addEventListener("load", init, false); |
| </script> |
| </head> |
| <body> |
| <p> |
| <div id="header_lookout" align="center"> |
| <font style='color: #0066FF; font-family: Arial, serif;font-size: 20pt; font-weight: bold;'> |
| <script>document.write(Config.title);</script> |
| </font> |
| </div> |
| <div id="header_text"> |
| Builds generated by the <a href="http://build.chromium.org/">BUILD TYPE</a> build |
| slave are run through the |
| <script> |
| document.write('<a href="' + Config.sourceLink + '">' + Config.title + '</a>'); |
| </script> |
| and the results of that test are charted here. |
| </div> |
| </p> |
| <p style="font-size: 0.75em; font-style: italic; color: rgb(100,100,100)"> |
| <div id="explain"> |
| The vertical axis is the time in milliseconds for the build to complete the |
| test, and the horizontal axis is the change-list for the build being |
| tested |
| </div> |
| </p> |
| <div id="switcher"> |
| |
| </div> |
| <div id="output"></div> |
| <div id="details"> |
| <div id="views"> |
| <iframe id="view-change"></iframe> |
| <iframe id="view-pages"></iframe> |
| </div> |
| <div id="selectors"> |
| <div class="selector" onclick="viewCl()">CL</div> |
| </div> |
| </div> |
| <pre id="log"></pre> |
| </body> |
| </html> |