blob: 5ad4fdaf5642e9ab6da703f8430a8506322c1d46 [file] [log] [blame]
<!--
This in an HTML Import-able file that contains the definition
of the following elements:
<fuzzer-stacktrace-sk>
<fuzzer-stacktrace-sk> displays a strack trace showing the first 8 frames and can be expanded with a click.
To use this file import it:
<link href="/res/imp/fuzzer-stacktrace-sk.html" rel="import" />
Usage:
<fuzzer-stacktrace-sk></fuzzer-stacktrace-sk>
Properties:
trace - The stack trace object. Expected to be provided. Expected to have the following attributes:
- frames: An array of elements with the following attributes:
- packageName : String
- fileName : String
- lineNumber : Number
- functionName [optional]
Methods:
None.
Events:
None.
-->
<link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html">
<link rel="import" href="/res/imp/bower_components/paper-icon-button/paper-icon-button.html">
<dom-module id="fuzzer-stacktrace-sk">
<template>
<style>
.stacktrace{
padding:4px 8px;
display:table;
}
.frame {
display:table-row;
}
.frame:nth-child(odd) {
background-color:#EEE;
}
.frame:nth-child(even) {
background-color:#FFF;
}
/*<tr> cells cannot have rounded corners. Neither can cells with display:table-row;
A workaround is to use display:table, table-row, table-cell and put
a border radius on the left parts of the left-most cell and a border radius on
the right parts of the right most cell. Also note that the table-row's padding
and such is determined by its children's styles.*/
.line {
display:table-cell;
padding:4px 8px;
border-radius: 8px 0 0 8px;
}
.function-name {
display:table-cell;
padding:4px 8px 4px 50px;
border-radius: 0 8px 8px 0;
}
#expand{
cursor:pointer;
/*Make this a bit bigger than normal (24px) */
--iron-icon-height: 30px;
--iron-icon-width: 30px;
}
.hidden{
display:none;
}
/* style the iron-icon inside of the paper-icon-button */
#expand ::content > iron-icon:hover {
fill: #f09300;
}
</style>
<div class="stacktrace">
<template is="dom-repeat" items="{{frames}}" as="frame">
<div class="frame" >
<span class="line">
<a target="_blank" href$="{{_computeCSLink(frame)}}">{{frame.packageName}}{{frame.fileName}}:{{frame.lineNumber}}
</a>
</span>
<span class="function-name">
<span>{{frame.functionName}}</span>
</span>
</div>
</template>
<paper-icon-button id="expand" icon="icons:more-horiz" on-click="showMore" title="expand stacktrace" class$="{{icon_classes}}"></paper-icon-button>
</div>
</template>
<script>
Polymer({
is: 'fuzzer-stacktrace-sk',
properties: {
trace: {
type: Object,
value: function() { return {}; },
},
expanded: {
type: Boolean,
value: false
},
frames: {
type: Array,
computed: "_getStackFrames(trace, expanded)"
},
icon_classes: {
type: String,
computed: "_getIconClasses(trace, expanded)"
}
},
setStackTrace: function(trace) {
this.trace = trace;
},
_getStackFrames: function(trace, expanded) {
if (!trace || !trace.frames) {
return [];
}
if (expanded || trace.frames.length < 8) {
return trace.frames;
}
return trace.frames.slice(0, 8);
},
_getIconClasses: function(trace, expanded) {
if (expanded || !trace.frames || trace.frames.length <= 8) {
return "hidden";
}
return "";
},
_computeCSLink: function(frame) {
return "https://code.google.com/p/chromium/codesearch#chromium/src/third_party/skia/" + frame.packageName + frame.fileName +"&l="+frame.lineNumber;
},
showMore: function() {
this.expanded = true;
}
});
</script>
</dom-module>