| package html |
| |
| const style = ` |
| #topbar { |
| padding: 5px 10px; |
| background: #E0EBF5; |
| } |
| |
| #topbar a { |
| color: #375EAB; |
| text-decoration: none; |
| } |
| |
| h1, h2, h3, h4 { |
| margin: 0; |
| padding: 0; |
| color: #375EAB; |
| font-weight: bold; |
| } |
| |
| table { |
| border: 1px solid #ccc; |
| margin: 20px 5px; |
| border-collapse: collapse; |
| white-space: nowrap; |
| text-overflow: ellipsis; |
| overflow: hidden; |
| } |
| |
| table caption { |
| font-weight: bold; |
| } |
| |
| table td, table th { |
| vertical-align: top; |
| padding: 2px 8px; |
| text-overflow: ellipsis; |
| overflow: hidden; |
| } |
| |
| .namespace { |
| font-weight: bold; |
| font-size: large; |
| color: #375EAB; |
| } |
| |
| .position_table { |
| border: 0px; |
| margin: 0px; |
| width: 100%; |
| border-collapse: collapse; |
| } |
| |
| .position_table td, .position_table tr { |
| vertical-align: center; |
| padding: 0px; |
| } |
| |
| .position_table .search { |
| text-align: right; |
| } |
| |
| .list_table td, .list_table th { |
| border-left: 1px solid #ccc; |
| } |
| |
| .list_table th { |
| background: #F4F4F4; |
| } |
| |
| .list_table tr:nth-child(2n) { |
| background: #F4F4F4; |
| } |
| |
| .list_table tr:hover { |
| background: #ffff99; |
| } |
| |
| .list_table .namespace { |
| width: 100pt; |
| max-width: 100pt; |
| } |
| |
| .list_table .title { |
| width: 350pt; |
| max-width: 350pt; |
| } |
| |
| .list_table .commit_list { |
| width: 500pt; |
| max-width: 500pt; |
| } |
| |
| .list_table .tag { |
| font-family: monospace; |
| font-size: 8pt; |
| width: 40pt; |
| max-width: 40pt; |
| } |
| |
| .list_table .opts { |
| width: 40pt; |
| max-width: 40pt; |
| } |
| |
| .list_table .status { |
| width: 250pt; |
| max-width: 250pt; |
| } |
| |
| .list_table .patched { |
| width: 60pt; |
| max-width: 60pt; |
| text-align: center; |
| } |
| |
| .list_table .kernel { |
| width: 80pt; |
| max-width: 80pt; |
| } |
| |
| .list_table .maintainers { |
| width: 150pt; |
| max-width: 150pt; |
| } |
| |
| .list_table .result { |
| width: 60pt; |
| max-width: 60pt; |
| } |
| |
| .list_table .stat { |
| width: 55pt; |
| max-width: 55pt; |
| font-family: monospace; |
| text-align: right; |
| } |
| |
| .list_table .date { |
| width: 60pt; |
| max-width: 60pt; |
| font-family: monospace; |
| text-align: right; |
| } |
| |
| .list_table .stat_name { |
| width: 150pt; |
| max-width: 150pt; |
| font-family: monospace; |
| } |
| |
| .list_table .stat_value { |
| width: 120pt; |
| max-width: 120pt; |
| font-family: monospace; |
| } |
| |
| .bad { |
| color: #f00; |
| font-weight: bold; |
| } |
| |
| .inactive { |
| color: #888; |
| } |
| |
| .plain { |
| text-decoration: none; |
| } |
| |
| textarea { |
| width:100%; |
| font-family: monospace; |
| } |
| |
| .mono { |
| font-family: monospace; |
| } |
| ` |
| const js = ` |
| // Copyright 2018 syzkaller project authors. All rights reserved. |
| // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. |
| |
| function sortTable(item, colName, conv, desc = false) { |
| table = item.parentNode.parentNode.parentNode.parentNode; |
| rows = table.rows; |
| col = findColumnByName(rows[0].getElementsByTagName("th"), colName); |
| values = []; |
| for (i = 1; i < rows.length; i++) |
| values.push([conv(rows[i].getElementsByTagName("td")[col].textContent), rows[i]]); |
| if (desc) |
| desc = !isSorted(values.slice().reverse()) |
| else |
| desc = isSorted(values); |
| values.sort(function(a, b) { |
| if (a[0] == b[0]) return 0; |
| if (desc && a[0] > b[0] || !desc && a[0] < b[0]) return -1; |
| return 1; |
| }); |
| for (i = 0; i < values.length; i++) |
| table.tBodies[0].appendChild(values[i][1]); |
| return false; |
| } |
| |
| function findColumnByName(headers, colName) { |
| for (i = 0; i < headers.length; i++) { |
| if (headers[i].textContent == colName) |
| return i; |
| } |
| return 0; |
| } |
| |
| function isSorted(values) { |
| for (i = 0; i < values.length - 1; i++) { |
| if (values[i][0] > values[i + 1][0]) |
| return false; |
| } |
| return true; |
| } |
| |
| function textSort(v) { return v.toLowerCase(); } |
| function numSort(v) { return -parseInt(v); } |
| function floatSort(v) { return -parseFloat(v); } |
| function reproSort(v) { return v == "C" ? 0 : v == "syz" ? 1 : 2; } |
| function patchedSort(v) { return v == "" ? -1 : parseInt(v); } |
| |
| function timeSort(v) { |
| if (v == "now") |
| return 0; |
| m = v.indexOf('m'); |
| h = v.indexOf('h'); |
| d = v.indexOf('d'); |
| if (m > 0 && h < 0) |
| return parseInt(v); |
| if (h > 0 && m > 0) |
| return parseInt(v) * 60 + parseInt(v.substring(h + 1)); |
| if (d > 0 && h > 0) |
| return parseInt(v) * 60 * 24 + parseInt(v.substring(d + 1)) * 60; |
| if (d > 0) |
| return parseInt(v) * 60 * 24; |
| return 1000000000; |
| } |
| ` |