| {% if table_entry_type == "Component" %} | |
| <p> | |
|  Filter: <input type="text" id="filter" size="30" /> (e.g. "crypto,VR") | |
| </p> | |
| {% endif %} | |
| <table> | |
| <thead> | |
| <tr> | |
| <th class="column-entry-bold">{{ table_entry_type }}</th> | |
| <th class="column-entry-bold" title= | |
| "Line coverage is the percentage of code lines which have been executed at least once. Only executable lines within function bodies are considered to be code lines."> | |
| Line Coverage</th> | |
| <th class="column-entry-bold" title= | |
| "Function coverage is the percentage of functions which have been executed at least once. A function is considered to be executed if any of its instantiations are executed."> | |
| Function Coverage</th> | |
| <th class="column-entry-bold" title= | |
| "Region coverage is the percentage of code regions which have been executed at least once. A code region may span multiple lines (e.g in a large function body with no control flow). However, it's also possible for a single line to contain multiple code regions (e.g in 'return x || y && z')."> | |
| Region Coverage</th> | |
| </tr> | |
| </thead> | |
| <tbody> | |
| {% for entry in entries %} | |
| <tr class="light-row"> | |
| <td> | |
| {% if entry["is_dir"] == True %} | |
| <pre><a href='{{ entry["href"] }}'>{{ entry["name"] }}/</a></pre> | |
| {% else %} | |
| <pre><a href='{{ entry["href"] }}'>{{ entry["name"] }}</a></pre> | |
| {% endif %} | |
| </td> | |
| {% for feature in ("lines", "functions", "regions") %} | |
| <td class='column-entry-{{ entry[feature]["color_class"] }}'> | |
| <pre>{{ entry[feature]["percentage"] }}% ({{ entry[feature]["covered"] }}/{{ entry[feature]["total"] }})</pre> | |
| </td> | |
| {% endfor %} | |
| </tr> | |
| {% endfor %} | |
| </tbody> | |
| {% if total_entry %} | |
| <tfoot> | |
| <tr class="light-row-bold"> | |
| <td> | |
| <pre>Totals</pre> | |
| </td> | |
| {% for feature in ("lines", "functions", "regions") %} | |
| <td class='column-entry-{{ total_entry[feature]["color_class"] }}'> | |
| <pre>{{ total_entry[feature]["percentage"] }}% ({{ total_entry[feature]["covered"] }}/{{ total_entry[feature]["total"] }})</pre> | |
| </td> | |
| {% endfor %} | |
| </tr> | |
| </tfoot> | |
| {% endif %} | |
| </table> | |
| {% if table_entry_type == "Component" %} | |
| <script> | |
| function filterInputChanged() { | |
| let filter = document.getElementById("filter"); | |
| let filterString = filter.value; | |
| // Update query paramater in URL. | |
| let queryParams = new URLSearchParams(window.location.search); | |
| queryParams.set('filter', filterString); | |
| let newPath = window.location.pathname; | |
| if (filterString) | |
| newPath += '?' + queryParams.toString(); | |
| history.pushState(null, '', newPath); | |
| filterRowsIfNeeded(); | |
| } | |
| function filterRowsIfNeeded() { | |
| let queryParams = new URLSearchParams(window.location.search); | |
| let filterString = queryParams.get('filter') || ""; | |
| let filterValuesLower = filterString.toLowerCase().split(','); | |
| let tbody = document.getElementsByTagName("tbody")[0]; | |
| let rows = tbody.getElementsByTagName("tr"); | |
| for (let row of rows) { | |
| let td = row.getElementsByTagName("td"); | |
| let tdContent = row.innerText.toLowerCase(); | |
| // |match| should be true on empty search (show everything). | |
| let match = !filterValuesLower; | |
| for (let filterValueLower of filterValuesLower) { | |
| if (tdContent.includes(filterValueLower)) { | |
| match = true; | |
| break | |
| } | |
| } | |
| if (match && row.style.display == 'none') | |
| row.style.display = 'table-row'; | |
| else if (!match) | |
| row.style.display = 'none'; | |
| } | |
| // Update filter value in input box (for cases when filter is provided | |
| // as part of page load URL). | |
| let filter = document.getElementById("filter"); | |
| if (filter.value != filterString) | |
| filter.value = filterString; | |
| } | |
| window.onload = filterRowsIfNeeded; | |
| var filter = document.getElementById("filter"); | |
| filter.onchange = filter.onkeyup = filterInputChanged; | |
| </script> | |
| {% endif %} |