| OLD | NEW |
| (Empty) | |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 /* Counter accessor for Name Node. */ |
| 6 function getCounterNameFromCounterNode(node) { |
| 7 return node.childNodes[1]; |
| 8 } |
| 9 |
| 10 /* Counter accessor for Value Node. */ |
| 11 function getCounterValueFromCounterNode(node) { |
| 12 return node.childNodes[3]; |
| 13 } |
| 14 |
| 15 /* Counter accessor for Delta Node. */ |
| 16 function getCounterDeltaFromCounterNode(node) { |
| 17 return node.childNodes[5]; |
| 18 } |
| 19 |
| 20 /* Timer accessor for Name Node. */ |
| 21 function getTimerNameFromTimerNode(node) { |
| 22 return node.childNodes[1]; |
| 23 } |
| 24 |
| 25 /* Timer accessor for Value Node. */ |
| 26 function getTimerValueFromTimerNode(node) { |
| 27 return node.childNodes[3]; |
| 28 } |
| 29 |
| 30 /* Timer accessor for Time Node. */ |
| 31 function getTimerTimeFromTimerNode(node) { |
| 32 return node.childNodes[5]; |
| 33 } |
| 34 |
| 35 /* Timer accessor for Average Time Node. */ |
| 36 function getTimerAvgTimeFromTimerNode(node) { |
| 37 return node.childNodes[7]; |
| 38 } |
| 39 |
| 40 /* Do the filter work. Hide all nodes matching node.*/ |
| 41 function filterMatching(text, nodelist, functionToGetNameNode) { |
| 42 var showAll = text.length == 0; |
| 43 for (var i = 0, node; node = nodelist[i]; i++) { |
| 44 var name = functionToGetNameNode(node).innerHTML.toLowerCase(); |
| 45 if (showAll || name.indexOf(text) >= 0) { |
| 46 node.style.display = "table-row"; |
| 47 } else { |
| 48 node.style.display = "none"; |
| 49 } |
| 50 } |
| 51 } |
| 52 |
| 53 /* Hides or shows counters based on the user's current filter selection. */ |
| 54 function doFilter() { |
| 55 var filter = document.getElementById("filter"); |
| 56 var text = filter.value.toLowerCase(); |
| 57 var nodes = document.getElementsByName("counter"); |
| 58 filterMatching(text, nodes, getCounterNameFromCounterNode); |
| 59 var nodes = document.getElementsByName("timer"); |
| 60 filterMatching(text, nodes, getTimerNameFromTimerNode); |
| 61 } |
| 62 |
| 63 /* Colors the counters based on increasing or decreasing value. */ |
| 64 function doColor() { |
| 65 var nodes = document.getElementsByName("counter"); |
| 66 for (var i = 0, node; node = nodes[i]; i++) { |
| 67 var child = getCounterDeltaFromCounterNode(node); |
| 68 var delta = child.innerHTML; |
| 69 if (delta > 0) { |
| 70 child.style.color = "Green"; |
| 71 } else if (delta == 0) { |
| 72 child.style.color = "Black"; |
| 73 } else { |
| 74 child.style.color = "Red"; |
| 75 } |
| 76 } |
| 77 } |
| 78 |
| 79 /* Counters with no values are null. Remove them. */ |
| 80 function removeNullValues() { |
| 81 var nodes = document.getElementsByName("counter"); |
| 82 for (var i = nodes.length - 1; i >= 0; i--) { |
| 83 var node = nodes[i]; |
| 84 var value = getCounterValueFromCounterNode(node).innerHTML; |
| 85 if (value == "null") { |
| 86 node.parentNode.removeChild(node); |
| 87 } |
| 88 } |
| 89 var nodes = document.getElementsByName("timer"); |
| 90 for (var i = 0, node; node = nodes[i]; i++) { |
| 91 var value_node = getTimerValueFromTimerNode(node); |
| 92 if (value_node.innerHTML == "null") { |
| 93 value_node.innerHTML = ""; |
| 94 } |
| 95 } |
| 96 } |
| 97 |
| 98 /* Compute the average time for timers */ |
| 99 function computeTimes() { |
| 100 var nodes = document.getElementsByName("timer"); |
| 101 for (var i = 0, node; node = nodes[i]; i++) { |
| 102 var count = getTimerValueFromTimerNode(node).innerHTML; |
| 103 if (count.length > 0) { |
| 104 var time = getTimerTimeFromTimerNode(node).innerHTML; |
| 105 var avg = getTimerAvgTimeFromTimerNode(node); |
| 106 avg.innerHTML = Math.round(time / count * 100) / 100; |
| 107 } |
| 108 } |
| 109 } |
| 110 |
| 111 /* All the work we do onload. */ |
| 112 function onLoadWork() { |
| 113 // This is the javascript code that processes the template: |
| 114 var input = new JsEvalContext(templateData); |
| 115 var output = document.getElementById('t'); |
| 116 jstProcess(input, output); |
| 117 |
| 118 // Add handlers to dynamically created HTML elements. |
| 119 var elements = document.getElementsByName("string-sort"); |
| 120 for (var i = 0; i < elements.length; ++i) |
| 121 elements[i].onclick = function () { sort_table("string"); }; |
| 122 |
| 123 elements = document.getElementsByName("number-sort"); |
| 124 for (i = 0; i < elements.length; ++i) |
| 125 elements[i].onclick = function () { sort_table("number"); }; |
| 126 |
| 127 doColor(); |
| 128 removeNullValues(); |
| 129 computeTimes(); |
| 130 document.getElementById("filter").focus(); |
| 131 } |
| 132 |
| 133 // The function should only be used as the event handler |
| 134 // on a table cell element. To use it, put it in a <td> element: |
| 135 // <td onclick="sort('string')" ...> |
| 136 // |
| 137 // The function sorts rows after the row with onclick event handler. |
| 138 // |
| 139 // type: the data type, 'string', 'number' |
| 140 function sort_table(type){ |
| 141 var cell = event.target; |
| 142 var cnum = cell.cellIndex; |
| 143 |
| 144 var row = cell.parentNode; |
| 145 var start_index = row.rowIndex + 1; |
| 146 |
| 147 var tbody = row.parentNode; |
| 148 var table = tbody.parentNode; |
| 149 |
| 150 var rows = new Array(); |
| 151 |
| 152 var indexes = new Array(); |
| 153 // skip the first row |
| 154 for (var i = start_index; i < table.rows.length; i++) |
| 155 rows.push(table.rows[i]); |
| 156 |
| 157 // a, b are strings |
| 158 function compare_strings(a,b) { |
| 159 if (a == b) return 0; |
| 160 if (a < b) return -1; |
| 161 return 1; |
| 162 } |
| 163 |
| 164 // a, b are numbers |
| 165 function compare_numbers(a,b) { |
| 166 var x = isNaN(a) ? 0 : a; |
| 167 var y = isNaN(b) ? 0 : b; |
| 168 return x - y; |
| 169 } |
| 170 |
| 171 var sort_func = undefined; |
| 172 if (type === 'string') { |
| 173 sort_func = function(a, b) { |
| 174 var x = a.cells[cnum].innerText; |
| 175 var y = b.cells[cnum].innerText; |
| 176 return compare_strings(x, y); |
| 177 } ; |
| 178 |
| 179 } else if (type === 'number') { |
| 180 sort_func = function(a, b) { |
| 181 var x = parseFloat(a.cells[cnum].innerText); |
| 182 var y = parseFloat(b.cells[cnum].innerText); |
| 183 return compare_numbers(x, y); |
| 184 } |
| 185 } |
| 186 |
| 187 rows.sort(sort_func); |
| 188 |
| 189 // change tables |
| 190 if (cell._reverse) { |
| 191 for (var i = rows.length - 1; i >= 0; i--) |
| 192 tbody.appendChild(rows[i]); |
| 193 cell._reverse = false; |
| 194 } else { |
| 195 for (var i = 0; i < rows.length; i++) |
| 196 tbody.appendChild(rows[i]); |
| 197 cell._reverse = true; |
| 198 } |
| 199 } |
| 200 |
| 201 document.addEventListener('DOMContentLoaded', onLoadWork); |
| 202 |
| OLD | NEW |