blob: 89059857ef30ae9c6881287b742291c93924cd5c [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
- debugFlags: Array of String, Flags associated with the debug run (e.g. FailedGracefully)
- releaseFlags: Array of String, Flags associated with the release run (e.g. ASANCrashed)
- debugStackTrace: Object (see fuzzer-stacktrace-sk.html for schema)
- releaseStackTrace: Object (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="{{report.debugStackTrace}}"></fuzzer-stacktrace-sk>
<h4>Release Stack Trace</h4>
<fuzzer-stacktrace-sk trace="{{report.releaseStackTrace}}"></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>
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) {
if (!report.debugFlags) {
report.debugFlags = ["<none>"];
}
if (!report.releaseFlags) {
report.releaseFlags = ["<none>"];
}
return "[Debug] " + report.debugFlags.join(" | ") + " [Release] " +
report.releaseFlags.join(" | ");
},
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;
},
});
</script>
</dom-module>