OLD | NEW |
1 <!-- | 1 <!-- |
2 The fuzzer/res/fuzzer.js file must be included before this file. | 2 The fuzzer/res/fuzzer.js file must be included before this file. |
3 | 3 |
4 This in an HTML Import-able file that contains the definition | 4 This in an HTML Import-able file that contains the definition |
5 of the following elements: | 5 of the following elements: |
6 | 6 |
7 <fuzzer-collapse-details-sk> | 7 <fuzzer-collapse-details-sk> |
8 | 8 |
9 To use this file import it: | 9 To use this file import it: |
10 | 10 |
11 <link href="/res/imp/fuzzer-collapse-details-sk.html" rel="import" /> | 11 <link href="/res/imp/fuzzer-collapse-details-sk.html" rel="import" /> |
12 | 12 |
13 Usage: | 13 Usage: |
14 | 14 |
15 <fuzzer-collapse-details-sk></fuzzer-collapse-details-sk> | 15 <fuzzer-collapse-details-sk></fuzzer-collapse-details-sk> |
16 | 16 |
17 Properties: | 17 Properties: |
18 details - The details object. Expected to have the following attributes: | 18 details - The details object. Expected to have the following attributes: |
19 lineNumber: Number, | 19 lineNumber: Number, |
20 count: Number, | 20 count: Number, The full number of reports. |
21 reports: Array of Reports. If non-empty, | 21 reports: Array of Reports. If non-empty, |
22 an expandable details panel will be created containing representations o
f the reports. | 22 an expandable details panel will be created containing representations o
f the reports. |
23 If empty, just the summary will be shown. | 23 If empty, just the summary will be shown. |
24 Reports are objects and have the following attributes: | 24 Reports are objects and have the following attributes: |
25 - name: String, The name of the binary, likely an md5 hash | 25 - name: String, The name of the binary, likely an md5 hash |
26 - type: String, The type of the binary | 26 - type: String, The type of the binary |
27 - flags: Array of String, The flags associated with the run (e.g. DebugD
umped) | 27 - debugFlags: Array of String, Flags associated with the debug run (e.g.
FailedGracefully) |
| 28 - releaseFlags: Array of String, Flags associated with the release run (
e.g. ASANCrashed) |
28 - debugStackTrace: Object (see fuzzer-stacktrace-sk.html for schema) | 29 - debugStackTrace: Object (see fuzzer-stacktrace-sk.html for schema) |
29 - releaseStackTrace: Object (see fuzzer-stacktrace-sk.html for schema) | 30 - releaseStackTrace: Object (see fuzzer-stacktrace-sk.html for schema) |
| 31 - category: String. |
30 detailsBase: String, the base url for details (should include file and funct
ion name) | 32 detailsBase: String, the base url for details (should include file and funct
ion name) |
31 expand: Boolean, if this element should be auto expanded. | 33 expand: Boolean, if this element should be auto expanded. |
| 34 exclude: Array of String, all fuzzes that have one or more of these strings
as a flag will not |
| 35 be shown. This array must be sorted lexographically. |
| 36 include: Array of String, all fuzzes must have one or more of these strings
as a flag to be |
| 37 shown. This array must be sorted lexographically. |
32 | 38 |
33 Methods: | 39 Methods: |
34 setDetails(details) - Programmatically set the details object. | 40 setDetails(details) - Programmatically set the details object. |
35 showMore() - Programmatically show up to 6 more details panels. | 41 showMore() - Programmatically show up to 6 more details panels. |
36 showFewer() - Programmatically show up to 6 fewer details panels. | 42 showFewer() - Programmatically show up to 6 fewer details panels. |
37 toggleDetails() - Programmticaly hide/show the details panels. | |
38 | 43 |
39 Events: | 44 Events: |
40 None. | 45 None. |
41 --> | 46 --> |
42 <link rel="import" href="/res/common/imp/9/details-summary.html"> | 47 <link rel="import" href="/res/common/imp/9/details-summary.html"> |
43 <link rel="import" href="/res/imp/bower_components/iron-flex-layout/iron-flex-la
yout.html"> | 48 <link rel="import" href="/res/imp/bower_components/iron-flex-layout/iron-flex-la
yout.html"> |
44 <link rel="import" href="/res/imp/bower_components/iron-collapse/iron-collapse.h
tml"> | 49 <link rel="import" href="/res/imp/bower_components/iron-collapse/iron-collapse.h
tml"> |
45 <link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html"> | 50 <link rel="import" href="/res/imp/bower_components/iron-icons/iron-icons.html"> |
46 <link rel="import" href="/res/imp/bower_components/paper-button/paper-button.htm
l"> | 51 <link rel="import" href="/res/imp/bower_components/paper-button/paper-button.htm
l"> |
47 <link rel="import" href="fuzzer-stacktrace-sk.html"> | 52 <link rel="import" href="fuzzer-stacktrace-sk.html"> |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 .show-more-less-bar .status { | 97 .show-more-less-bar .status { |
93 @apply(--layout-horizontal); | 98 @apply(--layout-horizontal); |
94 @apply(--layout-flex); | 99 @apply(--layout-flex); |
95 } | 100 } |
96 | 101 |
97 .center { | 102 .center { |
98 margin: auto; | 103 margin: auto; |
99 } | 104 } |
100 </style> | 105 </style> |
101 <div id="wrapper"> | 106 <div id="wrapper"> |
102 <template is="dom-if" if="{{!_hasDetails(details)}}"> | 107 <li> |
103 <li> | 108 <details-sk open="[[expand]]"> |
104 <a href$="{{_getDetailsLink(detailsBase, details)}}">Line {{details.li
neNumber}}</a> | 109 <summary-sk> |
105 -- {{details.count}} crash-causing fuzzes | 110 <a href$="{{_getDetailsLink(detailsBase, details)}}">Line {{details.
lineNumber}}</a> |
106 </li> | 111 -- {{numReports}} crash-causing fuzzes |
107 </template> | 112 </summary-sk> |
108 <template is="dom-if" if="{{_hasDetails(details)}}"> | 113 <div class="panel-container"> |
109 <li> | 114 <template is="dom-repeat" items="{{_getSomeReports(filteredReports,
toShow)}}" as="report"> |
110 <details-sk open="[[expand]]"> | 115 <div class="panel"> |
111 <summary-sk> | 116 <div class="title"> |
112 <a href$="{{_getDetailsLink(detailsBase, details)}}">Line {{detail
s.lineNumber}}</a> | 117 File: |
113 -- {{details.count}} crash-causing fuzzes | 118 <a href$="{{_getDownloadLink(report)}}">{{report.fuzzName}}</a> |
114 </summary-sk> | 119 |
115 <div class="panel-container"> | 120 <a href$="{{_getPermaLink(report)}}"><iron-icon icon="icons:link
" title="permalink"></iron-icon></a> |
116 <template is="dom-repeat" items="{{reports}}" as="report"> | 121 |
117 <div class="panel"> | 122 <a href$="{{_getNewBugLink(report)}}" target="_blank"><iron-icon
icon="icons:bug-report" title="file a bug about this fuzz"></iron-icon></a> |
118 <div class="title"> | |
119 File: | |
120 <a href$="{{_getDownloadLink(report)}}">{{report.fuzzName}}</a
> | |
121 | |
122 <a href$="{{_getPermaLink(report)}}"><iron-icon icon="icons:li
nk" title="permalink"></iron-icon></a> | |
123 | |
124 <a href$="{{_getNewBugLink(report)}}" target="_blank"><iron-ic
on icon="icons:bug-report" title="file a bug about this fuzz"></iron-icon></a> | |
125 </div> | |
126 <div class="raw"> | |
127 <a href$="{{_getMetaLink(report,'debug','err')}}">debug_err<
/a> | |
128 <a href$="{{_getMetaLink(report,'release','err')}}">release_
err</a> | |
129 <a href$="{{_getMetaLink(report,'debug','dump')}}">debug_dum
p</a> | |
130 <a href$="{{_getMetaLink(report,'release','dump')}}">release
_dump</a> | |
131 </div> | |
132 <div>{{_getFlags(report)}}</div> | |
133 <h4>Debug Stack Trace</h4> | |
134 <fuzzer-stacktrace-sk trace="{{report.debugStackTrace}}"></fuz
zer-stacktrace-sk> | |
135 <h4>Release Stack Trace</h4> | |
136 <fuzzer-stacktrace-sk trace="{{report.releaseStackTrace}}"></f
uzzer-stacktrace-sk> | |
137 </div> | 123 </div> |
138 </template> | 124 <div class="raw"> |
139 <div class="show-more-less-bar"> | 125 <a href$="{{_getMetaLink(report,'debug','asan')}}">debug_asan<
/a> |
140 <paper-button disabled$="{{!hasFewer}}" on-click="showFewer">Sho
w Fewer</paper-button> | 126 <a href$="{{_getMetaLink(report,'release','asan')}}">release_a
san</a> |
141 <span class="status"> | 127 <a href$="{{_getMetaLink(report,'debug','err')}}">debug_err</a
> |
142 <span class="center">Showing {{toShow}}/{{details.count}}</spa
n> | 128 <a href$="{{_getMetaLink(report,'release','err')}}">release_er
r</a> |
143 </span> | 129 <a href$="{{_getMetaLink(report,'debug','dump')}}">debug_dump<
/a> |
144 <paper-button disabled$="{{!hasMore}}" on-click="showMore">Show
More</paper-button> | 130 <a href$="{{_getMetaLink(report,'release','dump')}}">release_d
ump</a> |
| 131 </div> |
| 132 <div>{{_getFlags(report)}}</div> |
| 133 <h4>Debug Stack Trace</h4> |
| 134 <fuzzer-stacktrace-sk trace="{{report.debugStackTrace}}"></fuzze
r-stacktrace-sk> |
| 135 <h4>Release Stack Trace</h4> |
| 136 <fuzzer-stacktrace-sk trace="{{report.releaseStackTrace}}"></fuz
zer-stacktrace-sk> |
145 </div> | 137 </div> |
| 138 </template> |
| 139 <div class="show-more-less-bar"> |
| 140 <paper-button disabled$="{{!hasFewer}}" on-click="showFewer">Show
Fewer</paper-button> |
| 141 <span class="status"> |
| 142 <span class="center">Showing {{_min(toShow, numReports)}}/{{numR
eports}}</span> |
| 143 </span> |
| 144 <paper-button disabled$="{{!hasMore}}" on-click="showMore">Show Mo
re</paper-button> |
146 </div> | 145 </div> |
147 </details-sk> | 146 </div> |
148 </li> | 147 </details-sk> |
149 </template> | 148 </li> |
150 </div> | 149 </div> |
151 </template> | 150 </template> |
152 <script> | 151 <script> |
153 Polymer({ | 152 Polymer({ |
154 is: 'fuzzer-collapse-details-sk', | 153 is: 'fuzzer-collapse-details-sk', |
155 | 154 |
156 properties: { | 155 properties: { |
157 details: { // expected to be provided | 156 details: { // expected to be provided |
158 type: Object, | 157 type: Object, |
159 value: function() { | 158 value: function() { |
160 return {}; | 159 return {}; |
161 } | 160 } |
162 }, | 161 }, |
163 expand: { | 162 expand: { |
164 type: Boolean, | 163 type: Boolean, |
165 value: false, | 164 value: false, |
166 }, | 165 }, |
167 // detailsBase is the base url to the details page for the parent element. | 166 // detailsBase is the base url to the details page for the parent element. |
168 // We will use fuzzer.getLinkToDetails() to append the line information to
the link. | 167 // We will use fuzzer.getLinkToDetails() to append the line information to
the link. |
169 detailsBase: { // expected to be provided | 168 detailsBase: { |
170 type: String, | 169 type: String, |
171 value: "" | 170 value: "" |
172 }, | 171 }, |
173 // The number of detail panels to show | 172 // The number of detail panels to show |
174 toShow: { | 173 toShow: { |
175 type: Number, | 174 type: Number, |
176 value: 0, | 175 value: 0, |
177 readOnly: true, | 176 readOnly: true, |
178 }, | 177 }, |
179 // Returns true if there are more detail panels to show | 178 // Returns true if there are more detail panels to show |
180 hasMore: { | 179 hasMore: { |
181 type: Boolean, | 180 type: Boolean, |
182 computed: "_hasMore(details, toShow)" | 181 computed: "_hasMore(details, toShow)" |
183 }, | 182 }, |
184 // Returns true if there are not 0 detail panels currently displayed. | 183 // Returns true if there are not 0 detail panels currently displayed. |
185 hasFewer: { | 184 hasFewer: { |
186 type: Boolean, | 185 type: Boolean, |
187 computed: "_hasFewer(toShow)" | 186 computed: "_hasFewer(toShow)" |
188 }, | 187 }, |
189 // Returns the amount of detail panels equal to 'toShow' | 188 // Returns the amount of detail panels equal to 'toShow' |
190 reports: { | 189 filteredReports: { |
191 type: Array, | 190 type: Array, |
192 computed: "_getSomeReports(details, toShow)", | 191 computed: "_filterReports(details, exclude, include)", |
193 }, | 192 }, |
| 193 exclude: { |
| 194 type: Array, |
| 195 value: [], |
| 196 }, |
| 197 include: { |
| 198 type: Array, |
| 199 value: [], |
| 200 }, |
| 201 numReports: { |
| 202 type: Number, |
| 203 computed: "_getNumFiltered(filteredReports)", |
| 204 reflectToAttribute: true, |
| 205 notify: true, |
| 206 } |
194 }, | 207 }, |
195 | 208 |
196 ready: function() { | 209 ready: function() { |
197 if (this.details.reports) { | 210 if (this.details.reports) { |
198 this._setToShow(Math.min(6, this.details.reports.length)); | 211 this._setToShow(Math.min(6, this.details.reports.length)); |
199 } | 212 } |
200 }, | 213 }, |
201 | 214 |
202 setDetails: function(details) { | 215 setDetails: function(details) { |
203 this.details = details; | 216 this.details = details; |
204 this._setToShow(Math.min(6, this.details.reports.length)); | 217 this._setToShow(Math.min(6, this.details.reports.length)); |
205 }, | 218 }, |
206 | 219 |
207 _hasDetails: function(details) { | |
208 return this.details.reports && this.details.reports.length > 0; | |
209 }, | |
210 | |
211 _getFlags: function(report) { | 220 _getFlags: function(report) { |
212 return report.flags.join(" | "); | 221 if (!report.debugFlags) { |
| 222 report.debugFlags = ["<none>"]; |
| 223 } |
| 224 if (!report.releaseFlags) { |
| 225 report.releaseFlags = ["<none>"]; |
| 226 } |
| 227 return "[Debug] " + report.debugFlags.join(" | ") + " [Release] " + |
| 228 report.releaseFlags.join(" | "); |
213 }, | 229 }, |
214 | 230 |
215 showMore: function() { | 231 showMore: function() { |
216 this._setToShow(Math.min(this.toShow + 6, this.details.reports.length)); | 232 this._setToShow(Math.min(this.toShow + 6, this.details.reports.length)); |
217 }, | 233 }, |
218 | 234 |
219 showFewer: function() { | 235 showFewer: function() { |
220 this._setToShow(Math.max(this.toShow - 6, 0)); | 236 this._setToShow(Math.max(this.toShow - 6, 0)); |
221 }, | 237 }, |
222 | 238 |
223 _hasMore: function(details, toShow) { | 239 _hasMore: function(details, toShow) { |
224 return details.reports && toShow < details.reports.length; | 240 return details.reports && toShow < details.reports.length; |
225 }, | 241 }, |
226 | 242 |
227 _hasFewer: function(toShow) { | 243 _hasFewer: function(toShow) { |
228 return toShow > 0; | 244 return toShow > 0; |
229 }, | 245 }, |
230 | 246 |
| 247 _min: function(a, b) { |
| 248 return Math.min(a, b); |
| 249 }, |
| 250 |
| 251 _filterReports: function(details, exclude, include) { |
| 252 exclude = exclude || []; |
| 253 include = include || []; |
| 254 if (exclude.length === 0 && include.length === 0) { |
| 255 return details.reports; |
| 256 } |
| 257 |
| 258 return details.reports.filter(function(report){ |
| 259 if (sk.sharesElement(exclude, report.debugFlags) || |
| 260 sk.sharesElement(exclude, report.releaseFlags)) { |
| 261 return false; |
| 262 } |
| 263 if (include.length === 0) { |
| 264 return true; |
| 265 } |
| 266 if (!sk.sharesElement(include, report.debugFlags) && |
| 267 !sk.sharesElement(include, report.releaseFlags)) { |
| 268 return false; |
| 269 } |
| 270 return true; |
| 271 }); |
| 272 }, |
| 273 |
231 // _getSomeReports returns up to {{toShow}} reports from details | 274 // _getSomeReports returns up to {{toShow}} reports from details |
232 _getSomeReports: function(details, toShow) { | 275 _getSomeReports: function(filteredReports, toShow) { |
233 if (!details.reports) { | 276 if (!filteredReports) { |
234 return []; | 277 return []; |
235 } | 278 } |
236 if (toShow > details.reports.length) { | 279 if (toShow > filteredReports.length) { |
237 return details.reports; | 280 return filteredReports; |
238 } | 281 } |
239 return details.reports.slice(0, toShow); | 282 return filteredReports.slice(0, toShow); |
240 }, | 283 }, |
241 | 284 |
242 _getDownloadLink: function(report) { | 285 _getDownloadLink: function(report) { |
243 return "/fuzz/"+report.category+"/" + report.fuzzName; | 286 return "/fuzz/"+report.category+"/" + report.fuzzName; |
244 }, | 287 }, |
245 | 288 |
246 _getMetaLink: function(report, build, extension) { | 289 _getMetaLink: function(report, build, extension) { |
247 var name = report.fuzzName +"_" + build +"." + extension; | 290 var name = report.fuzzName +"_" + build +"." + extension; |
248 return "/metadata/" + report.category +"/" + name; | 291 return "/metadata/" + report.category +"/" + name; |
249 }, | 292 }, |
250 | 293 |
251 _getDetailsLink: function(detailsBase, details) { | 294 _getDetailsLink: function(detailsBase, details) { |
252 return fuzzer.getLinkToDetails(detailsBase, 'line', details.lineNumber); | 295 return fuzzer.getLinkToDetails(detailsBase, 'line', details.lineNumber); |
253 }, | 296 }, |
254 | 297 |
255 _getPermaLink: function(report) { | 298 _getPermaLink: function(report) { |
256 return "/category/"+report.category + "/name/" + report.fuzzName; | 299 return "/category/"+report.category + "/name/" + report.fuzzName; |
257 }, | 300 }, |
258 | 301 |
259 _getNewBugLink: function(report) { | 302 _getNewBugLink: function(report) { |
260 return "/newBug?name=" + report.fuzzName + "&category="+report.category; | 303 return "/newBug?name=" + report.fuzzName + "&category="+report.category; |
261 }, | 304 }, |
| 305 _getNumFiltered: function(filteredReports) { |
| 306 if (!filteredReports) { |
| 307 return 0; |
| 308 } |
| 309 return filteredReports.length; |
| 310 }, |
262 }); | 311 }); |
263 </script> | 312 </script> |
264 </dom-module> | 313 </dom-module> |
OLD | NEW |