blob: 0af4cfeb6d48f44ed5dd0f09138de476214134d1 [file] [log] [blame]
<!--
The fuzzer/res/fuzzer.js file must be included before this file.
This in an HTML Import-able file that contains the definition
of the following elements:
<fuzzer-collapse-details-sk>
To use this file import it:
<link href="/res/imp/fuzzer-collapse-details-sk.html" rel="import" />
Usage:
<fuzzer-collapse-details-sk></fuzzer-collapse-details-sk>
Properties:
details - The details object. Expected to have the following attributes:
lineNumber: Number,
count: Number, The full number of reports.
reports: Array of Reports. If non-empty,
an expandable details panel will be created containing representations of the reports.
If empty, just the summary will be shown.
Reports are objects and have the following attributes:
- name: String, The name of the binary, likely an md5 hash
- type: String, The type of the binary
- flags: map of String -> Array<String>, Flags associated with a given config
(e.g. TerminatedGracefully)
- stacktraces map of String -> Object, Stacktrace associated with config
(see fuzzer-stacktrace-sk.html for schema)
- category: String.
detailsBase: String, the base url for details (should include file and function name)
expand: Boolean, if this element should be auto expanded.
Methods:
setDetails(details) - Programmatically set the details object.
showMore() - Programmatically show up to 6 more details panels.
showFewer() - Programmatically show up to 6 fewer details panels.
Events:
None.
-->
<link rel="import" href="/res/common/imp/details-summary.html">
<link rel="import" href="/res/imp/bower_components/iron-flex-layout/iron-flex-layout-classes.html">
<link rel="import" href="/res/imp/bower_components/iron-collapse/iron-collapse.html">
<link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html">
<link rel="import" href="/res/imp/bower_components/paper-button/paper-button.html">
<link rel="import" href="fuzzer-stacktrace-sk.html">
<dom-module id="fuzzer-collapse-details-sk">
<template>
<style include="iron-flex iron-flex-alignment">
#wrapper {
padding: 16px;
border-radius: 8px;
background-color: #DEDEDE;
color: #000000;
}
.panel-container .title {
margin-top: .5em;
font-weight: bold;
font-size: 1.1em;
}
.panel {
min-width: 100px;
background-color: lightblue;
border-radius: 6px;
margin: 4px;
padding: 5px;
}
.flags {
max-width: 600px;
}
.raw {
font-size: 0.7em;
display: inline-block;
}
.show-more-less-bar {
width: 100%;
background-color: white;
border-radius: 8px;
}
.center {
margin: auto;
}
</style>
<div id="wrapper">
<li>
<details-sk open="[[expand]]">
<summary-sk>
<a href$="[[_getDetailsLink(detailsBase, details)]]">Line [[details.lineNumber]]</a>
-- [[details.count]] crash-causing fuzzes
</summary-sk>
<div class="panel-container horizontal layout wrap start">
<template is="dom-repeat" items="[[reports]]" as="report">
<div class="panel">
<div class="title">
File:
<a href$="[[_getDownloadLink(report)]]">[[report.fuzzName]]</a>
&nbsp;
<a href$="[[_getPermaLink(report)]]"><iron-icon icon="icons:link" title="permalink"></iron-icon></a>
&nbsp;
<a href$="[[_getNewBugLink(report)]]" target="_blank"><iron-icon icon="icons:bug-report" title="file a bug about this fuzz"></iron-icon></a>
</div>
<div class="raw">
<a href$="[[_getMetaLink(report,'debug','asan')]]">debug_asan</a>
<a href$="[[_getMetaLink(report,'release','asan')]]">release_asan</a>
<a href$="[[_getMetaLink(report,'debug','err')]]">debug_err</a>
<a href$="[[_getMetaLink(report,'release','err')]]">release_err</a>
<a href$="[[_getMetaLink(report,'debug','dump')]]">debug_dump</a>
<a href$="[[_getMetaLink(report,'release','dump')]]">release_dump</a>
</div>
<div class="flags">[[_getFlags(report)]]</div>
<div><b>OS/Architecture:</b> [[report.architecture]]</div>
<h4>Debug Stack Trace</h4>
<fuzzer-stacktrace-sk trace="[[_stacktrace(report, 'ASAN_DEBUG', 'CLANG_DEBUG')]]"></fuzzer-stacktrace-sk>
<h4>Release Stack Trace</h4>
<fuzzer-stacktrace-sk trace="[[_stacktrace(report, 'ASAN_RELEASE', 'CLANG_RELEASE')]]"></fuzzer-stacktrace-sk>
</div>
</template>
<div class="show-more-less-bar horizontal layout">
<paper-button disabled$="[[!hasFewer]]" on-click="showFewer">Show Fewer</paper-button>
<span class="status horizontal layout flex">
<span class="center">Showing [[toShow]]/
[[details.count]]</span>
</span>
<paper-button disabled$="[[!hasMore]]" on-click="showMore">Show More</paper-button>
</div>
</div>
</details-sk>
</li>
</div>
</template>
<script>
(function(){
var FLAG_ORDER=["ASAN_DEBUG", "CLANG_DEBUG", "ASAN_RELEASE", "CLANG_RELEASE"];
Polymer({
is: 'fuzzer-collapse-details-sk',
properties: {
details: { // expected to be provided
type: Object,
value: function() {
return {};
}
},
expand: {
type: Boolean,
value: false,
},
// detailsBase is the base url to the details page for the parent element.
// We will use fuzzer.getLinkToDetails() to append the line information to the link.
detailsBase: {
type: String,
value: ""
},
// The number of detail panels to show
toShow: {
type: Number,
value: 0,
readOnly: true,
},
// Returns true if there are more detail panels to show
hasMore: {
type: Boolean,
computed: "_hasMore(details, toShow)"
},
// Returns true if there are not 0 detail panels currently displayed.
hasFewer: {
type: Boolean,
computed: "_hasFewer(toShow)"
},
// Returns the amount of detail panels equal to 'toShow'
reports: {
type: Array,
computed: "_getSomeReports(details, toShow)",
},
},
ready: function() {
if (this.details.reports) {
this._setToShow(Math.min(6, this.details.reports.length));
}
},
setDetails: function(details) {
this.details = details;
this._setToShow(Math.min(6, this.details.reports.length));
},
_getFlags: function(report) {
let s = "";
for (let c of FLAG_ORDER) {
let flags = report.flags[c] || ["<none>"];
s += `${c} -> (${flags.join(" | ")}) `;
}
return s;
},
showMore: function() {
this._setToShow(Math.min(this.toShow + 6, this.details.reports.length));
},
showFewer: function() {
this._setToShow(Math.max(this.toShow - 6, 0));
},
_hasMore: function(details, toShow) {
return details.reports && toShow < details.reports.length;
},
_hasFewer: function(toShow) {
return toShow > 0;
},
// _getSomeReports returns up to {{toShow}} reports from details
_getSomeReports: function(details, toShow) {
if (!details.reports) {
return [];
}
if (toShow > details.reports.length) {
return details.reports;
}
return details.reports.slice(0, toShow);
},
_getDownloadLink: function(report) {
return "/fuzz/" + report.fuzzName;
},
_getMetaLink: function(report, build, extension) {
var name = report.fuzzName +"_" + build +"." + extension;
return "/metadata/" + name;
},
_getDetailsLink: function(detailsBase, details) {
return fuzzer.getLinkToDetails(detailsBase, 'line', details.lineNumber);
},
_getPermaLink: function(report) {
return "/category/"+report.category + "/name/" + report.fuzzName;
},
_getNewBugLink: function(report) {
return "/newBug?name=" + report.fuzzName + "&category="+report.category;
},
_stacktrace: function(report, stackA, stackB) {
if (report.stacktraces[stackA].frames) {
return report.stacktraces[stackA];
}
return report.stacktraces[stackB];
}
});
})()
</script>
</dom-module>