diff options
Diffstat (limited to 'testing/mozbase/mozlog/mozlog/formatters/html/main.js')
-rw-r--r-- | testing/mozbase/mozlog/mozlog/formatters/html/main.js | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/testing/mozbase/mozlog/mozlog/formatters/html/main.js b/testing/mozbase/mozlog/mozlog/formatters/html/main.js new file mode 100644 index 000000000..8b4a40ed4 --- /dev/null +++ b/testing/mozbase/mozlog/mozlog/formatters/html/main.js @@ -0,0 +1,172 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +function toArray(iter) { + if (iter === null) { + return null; + } + return Array.prototype.slice.call(iter); +} + +function find(selector, elem) { + if (!elem) { + elem = document; + } + return elem.querySelector(selector); +} + +function find_all(selector, elem) { + if (!elem) { + elem = document; + } + return toArray(elem.querySelectorAll(selector)); +} + +addEventListener("DOMContentLoaded", function() { + reset_sort_headers(); + + split_debug_onto_two_rows(); + + find_all('.col-links a.screenshot').forEach(function(elem) { + elem.addEventListener("click", + function(event) { + var node = elem; + while (node && !node.classList.contains('results-table-row')) { + node = node.parentNode; + } + if (node != null) { + if (node.nextSibling && + node.nextSibling.classList.contains("debug")) { + var href = find('.screenshot img', node.nextSibling).src; + window.open(href); + } + } + event.preventDefault(); + }, false) + }); + + find_all('.screenshot a').forEach(function(elem) { + elem.addEventListener("click", + function(event) { + window.open(find('img', elem).getAttribute('src')); + event.preventDefault(); + }, false) + }); + + find_all('.sortable').forEach(function(elem) { + elem.addEventListener("click", + function(event) { + toggle_sort_states(elem); + var colIndex = toArray(elem.parentNode.childNodes).indexOf(elem); + var key = elem.classList.contains('numeric') ? key_num : key_alpha; + sort_table(elem, key(colIndex)); + }, false) + }); + +}); + +function sort_table(clicked, key_func) { + one_row_for_data(); + var rows = find_all('.results-table-row'); + var reversed = !clicked.classList.contains('asc'); + + var sorted_rows = sort(rows, key_func, reversed); + + var parent = document.getElementById('results-table-body'); + sorted_rows.forEach(function(elem) { + parent.appendChild(elem); + }); + + split_debug_onto_two_rows(); +} + +function sort(items, key_func, reversed) { + var sort_array = items.map(function(item, i) { + return [key_func(item), i]; + }); + var multiplier = reversed ? -1 : 1; + + sort_array.sort(function(a, b) { + var key_a = a[0]; + var key_b = b[0]; + return multiplier * (key_a >= key_b ? 1 : -1); + }); + + return sort_array.map(function(item) { + var index = item[1]; + return items[index]; + }); +} + +function key_alpha(col_index) { + return function(elem) { + return elem.childNodes[col_index].firstChild.data.toLowerCase(); + }; +} + +function key_num(col_index) { + return function(elem) { + return parseFloat(elem.childNodes[col_index].firstChild.data); + }; +} + +function reset_sort_headers() { + find_all('.sort-icon').forEach(function(elem) { + elem.parentNode.removeChild(elem); + }); + find_all('.sortable').forEach(function(elem) { + var icon = document.createElement("div"); + icon.className = "sort-icon"; + icon.textContent = "vvv"; + elem.insertBefore(icon, elem.firstChild); + elem.classList.remove("desc", "active"); + elem.classList.add("asc", "inactive"); + }); +} + +function toggle_sort_states(elem) { + //if active, toggle between asc and desc + if (elem.classList.contains('active')) { + elem.classList.toggle('asc'); + elem.classList.toggle('desc'); + } + + //if inactive, reset all other functions and add ascending active + if (elem.classList.contains('inactive')) { + reset_sort_headers(); + elem.classList.remove('inactive'); + elem.classList.add('active'); + } +} + +function split_debug_onto_two_rows() { + find_all('tr.results-table-row').forEach(function(elem) { + var new_row = document.createElement("tr") + new_row.className = "debug"; + elem.parentNode.insertBefore(new_row, elem.nextSibling); + find_all(".debug", elem).forEach(function (td_elem) { + if (find(".log", td_elem)) { + new_row.appendChild(td_elem); + td_elem.colSpan=5; + } else { + td_elem.parentNode.removeChild(td_elem); + } + }); + }); +} + +function one_row_for_data() { + find_all('tr.results-table-row').forEach(function(elem) { + if (elem.nextSibling.classList.contains('debug')) { + toArray(elem.nextSibling.childNodes).forEach( + function (td_elem) { + elem.appendChild(td_elem); + }) + } else { + var new_td = document.createElement("td"); + new_td.className = "debug"; + elem.appendChild(new_td); + } + }); +} |