about_stats.js revision 2a99a7e74a7f215066514fe81d2bfa6639d9eddd
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counter accessor for Name Node. */ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterNameFromCounterNode(node) { 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[1]; 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counter accessor for Value Node. */ 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterValueFromCounterNode(node) { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[3]; 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counter accessor for Delta Node. */ 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getCounterDeltaFromCounterNode(node) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[5]; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Name Node. */ 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerNameFromTimerNode(node) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[1]; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Value Node. */ 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerValueFromTimerNode(node) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[3]; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Time Node. */ 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerTimeFromTimerNode(node) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[5]; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Timer accessor for Average Time Node. */ 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function getTimerAvgTimeFromTimerNode(node) { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return node.childNodes[7]; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Do the filter work. Hide all nodes matching node.*/ 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function filterMatching(text, nodelist, functionToGetNameNode) { 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var showAll = text.length == 0; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0, node; node = nodelist[i]; i++) { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var name = functionToGetNameNode(node).innerHTML.toLowerCase(); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (showAll || name.indexOf(text) >= 0) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.style.display = 'table-row'; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.style.display = 'none'; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Hides or shows counters based on the user's current filter selection. */ 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function doFilter() { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var filter = $('filter'); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var text = filter.value.toLowerCase(); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('counter'); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filterMatching(text, nodes, getCounterNameFromCounterNode); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('timer'); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filterMatching(text, nodes, getTimerNameFromTimerNode); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Colors the counters based on increasing or decreasing value. */ 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function doColor() { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('counter'); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0, node; node = nodes[i]; i++) { 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var child = getCounterDeltaFromCounterNode(node); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var delta = child.innerHTML; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (delta > 0) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.style.color = 'Green'; 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else if (delta == 0) 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.style.color = 'Black'; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) child.style.color = 'Red'; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Counters with no values are null. Remove them. */ 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function removeNullValues() { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('counter'); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = nodes.length - 1; i >= 0; i--) { 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var node = nodes[i]; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var value = getCounterValueFromCounterNode(node).innerHTML; 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (value == 'null') 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) node.parentNode.removeChild(node); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('timer'); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0, node; node = nodes[i]; i++) { 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var valueNode = getTimerValueFromTimerNode(node); 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (valueNode.innerHTML == 'null') 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) valueNode.innerHTML = ''; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Compute the average time for timers */ 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function computeTimes() { 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var nodes = document.getElementsByName('timer'); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0, node; node = nodes[i]; i++) { 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var count = getTimerValueFromTimerNode(node).innerHTML; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (count.length > 0) { 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var time = getTimerTimeFromTimerNode(node).innerHTML; 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var avg = getTimerAvgTimeFromTimerNode(node); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) avg.innerHTML = Math.round(time / count * 100) / 100; 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* All the work we do onload. */ 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)function onLoadWork() { 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is the javascript code that processes the template: 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var input = new JsEvalContext(templateData); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var output = $('t'); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) jstProcess(input, output); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add handlers to dynamically created HTML elements. 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var elements = document.getElementsByName('string-sort'); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < elements.length; ++i) 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements[i].onclick = function() { sortTable('string'); }; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) elements = document.getElementsByName('number-sort'); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (i = 0; i < elements.length; ++i) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) elements[i].onclick = function() { sortTable('number'); }; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) doColor(); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) removeNullValues(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) computeTimes(); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var filter = $('filter'); 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.onkeyup = doFilter; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) filter.focus(); 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The function should only be used as the event handler 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// on a table cell element. To use it, put it in a <td> element: 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// <td onclick="sort('string')" ...> 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The function sorts rows after the row with onclick event handler. 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// type: the data type, 'string', 'number' 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)function sortTable(type) { 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var cell = event.target; 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var cnum = cell.cellIndex; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var row = cell.parentNode; 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var startIndex = row.rowIndex + 1; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var tbody = row.parentNode; 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var table = tbody.parentNode; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var rows = new Array(); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var indexes = new Array(); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // skip the first row 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (var i = startIndex; i < table.rows.length; i++) 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rows.push(table.rows[i]); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a, b are strings 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function compareStrings(a, b) { 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (a == b) return 0; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (a < b) return -1; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return 1; 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // a, b are numbers 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) function compareNumbers(a, b) { 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var x = isNaN(a) ? 0 : a; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var y = isNaN(b) ? 0 : b; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return x - y; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) var sortFunc; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (type === 'string') { 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sortFunc = function(a, b) { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var x = a.cells[cnum].innerText; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var y = b.cells[cnum].innerText; 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return compareStrings(x, y); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (type === 'number') { 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) sortFunc = function(a, b) { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var x = parseFloat(a.cells[cnum].innerText); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) var y = parseFloat(b.cells[cnum].innerText); 1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return compareNumbers(x, y); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rows.sort(sortFunc); 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change tables 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (cell._reverse) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = rows.length - 1; i >= 0; i--) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tbody.appendChild(rows[i]); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell._reverse = false; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (var i = 0; i < rows.length; i++) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tbody.appendChild(rows[i]); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) cell._reverse = true; 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)document.addEventListener('DOMContentLoaded', onLoadWork); 201