| <!DOCTYPE html> |
| <html> |
| <head> |
| <title>Skia Correctness Server</title> |
| |
| {{template "header.html" .}} |
| |
| <style type="text/css" media="screen"> |
| test-summary-sk { |
| display: block; |
| margin-top: 0.5em; |
| } |
| html /deep/ .header { |
| width: 25em; |
| } |
| html /deep/ .header.short { |
| width: 5em; |
| } |
| corpus-chooser-sk { |
| display: block; |
| } |
| #search { |
| display: block; |
| } |
| .headToggle { |
| font-size: 20px; |
| } |
| .headToggle paper-toggle-button { |
| margin-right: 2em; |
| } |
| #commitdialog { |
| right: 1em; |
| bottom: 1em; |
| } |
| #core { |
| margin-top: 2em; |
| } |
| |
| .blameHeader { |
| padding-top: 0.7em; |
| padding-right: 0.57em; |
| padding-bottom: 0.7em; |
| padding-left: 0.57em; |
| color: #1F78B4; |
| text-transform: uppercase; |
| } |
| |
| #help { |
| position: absolute; |
| top: 9px; |
| right: 10px; |
| } |
| |
| #help.hidden { |
| display: none; |
| } |
| |
| </style> |
| </head> |
| <body> |
| <scaffold-sk responsiveWidth="700px"> |
| {{template "titlebar.html" .}} |
| <div id=help class=hidden> |
| <table> |
| <tr><th colspan=2>Keyboard Shortcuts</th></tr> |
| <tr><th>J</th><td>Next</td></tr> |
| <tr><th>K</th><td>Prev</td></tr> |
| <tr><th>W</th><td>Zoom</td></tr> |
| <tr><th>A</th><td>Postive</td></tr> |
| <tr><th>S</th><td>Negative</td></tr> |
| <tr><th>D</th><td>Untriaged</td></tr> |
| </table> |
| </div> |
| <div vertical layout id=core> |
| <div horizontal layout center> |
| <paper-button id=search> |
| <core-icon icon=search></core-icon> |
| </paper-button> |
| <div class=headToggle> |
| Head <paper-toggle-button id=head checked></paper-toggle-button> |
| Unt Only <paper-toggle-button id=untonly checked></paper-toggle-button> |
| Details <paper-toggle-button id=details></paper-toggle-button> |
| </div> |
| </div> |
| <query-dialog-sk id=query src="_/paramset"></query-dialog-sk> |
| |
| <sort-sk target=summaries> |
| <paper-button class=header data-key="name" data-alpha=true>Name</paper-button> |
| <!-- <paper-button class="header short" data-key="diameter">Diam</paper-button> --> |
| <paper-button class="header short" >Grid</paper-button> |
| <paper-button class="header short" data-key="pos">Pos</paper-button> |
| <paper-button class="header short" data-key="neg">Neg</paper-button> |
| <paper-button class="header short" data-key="untriaged">Unt</paper-button> |
| <paper-button class="header short" data-key="num">Total</paper-button> |
| <span class="blameHeader"> |
| Blame |
| </span> |
| </sort-sk> |
| <div id="summaries"></div> |
| <paper-spinner active></paper-spinner> |
| <paper-toast duration=10000></paper-toast> |
| <paper-action-dialog id=commitdialog core-transition-bottom heading="Commit(s)" autoCloseDisabled layered=false> |
| <commits-sk id=commitinfo></commits-sk> |
| <paper-button affirmative>Close</paper-button> |
| </paper-action-dialog> |
| <zoom-sk id=zoomer llabel="Closest Triaged" rlabel="Untriaged"></zoom-sk> |
| </div> |
| |
| </scaffold-sk> |
| |
| <script type="text/javascript" charset="utf-8"> |
| (function() { |
| var summaries = []; |
| var page = {}; |
| |
| // The current state of the page. |
| page.state = { |
| query: "source_type=gm", |
| include: false, |
| head: true, |
| untonly: true, |
| details: false, |
| limit: 7, |
| triage: false, |
| } |
| |
| // Is the zoom dialog displayed? |
| var zooming = false; |
| |
| $$$('#zoomer').addEventListener('zoom-closed', function() { |
| zooming = false; |
| }); |
| |
| function displaySummaries(corpus) { |
| $$$('paper-toast').dismiss(); |
| var container = $$$('#summaries'); |
| sk.clearChildren(container); |
| var n = 0; |
| var limitExceeded = false; |
| summaries.forEach(function(c, i) { |
| if (page.state.untonly && c.untriaged == 0) { |
| return |
| } |
| |
| var s = document.createElement('test-summary-sk'); |
| s.query = encodeURIComponent(page.state.query); |
| s.include = page.state.include; |
| s.head = page.state.head; |
| if (i<page.state.limit) { |
| s.details = page.state.details; |
| } else { |
| s.details = false; |
| limitExceeded = true; |
| } |
| s.limit = page.state.limit; |
| s.triage = page.state.triage; |
| s.summary = c; |
| container.appendChild(s); |
| n+=1; |
| }); |
| if (n==0) { |
| $$$('paper-toast').text = "No tests matched your query."; |
| $$$('paper-toast').show(); |
| } |
| if (limitExceeded && page.state.details) { |
| $$$('paper-toast').text = "Too many tests to expand all of them. Try filtering down the number of tests."; |
| $$$('paper-toast').show(); |
| } |
| $$$('paper-spinner').active = false; |
| } |
| |
| |
| function loadList() { |
| $$$('paper-toast').dismiss(); |
| sk.clearChildren($$$('#summaries')); |
| $$$('paper-spinner').active = true; |
| $$$('#head').checked = page.state.head; |
| $$$('#details').checked = page.state.details; |
| sk.get('_/list?'+sk.query.fromObject(page.state)).then(JSON.parse).then(function(json) { |
| summaries = json; |
| displaySummaries(); |
| }).catch(function(e) { |
| $$$('paper-toast').text = e; |
| $$$('paper-toast').show(); |
| }); |
| } |
| |
| // Open up the zoom dialog on the focused digest. |
| // |
| // ele (optional) - The test-summary-details-sk that should |
| // be zoomed. If ele isn't provided then the one with keyboard |
| // focus is used. |
| function zoom(ele) { |
| if (!ele) { |
| var summary = $$$('test-summary-sk'); |
| ele = summary.findFocus(); |
| if (ele == null) { |
| return |
| } |
| } |
| details = { |
| topImgUrl: "/img/images/" + ele.digest + ".png", |
| leftImgUrl: "/img/images/" + ele.dataset.closest + ".png", |
| diffImgUrl: "/img/diffs/" + ele.dataset.diffdigests + ".png", |
| }; |
| $$$('#zoomer', this.shadowRoot).setDetails(details); |
| $$$('#zoomer', this.shadowRoot).open(); |
| zooming = true; |
| } |
| |
| function enableKeyboardShortcuts() { |
| // Allow keyboard navigation for fast triaging. |
| document.body.addEventListener('keydown', function(e){ |
| if (!page.state.triage || zooming) { |
| return |
| } |
| var details = $$$('test-summary-sk'); |
| var c = String.fromCharCode(e.keyCode); |
| switch (c) { |
| case "J": |
| details.focusNext(); |
| break; |
| case "K": |
| details.focusPrev(); |
| break; |
| case "A": |
| details.markFocus("positive"); |
| break; |
| case "S": |
| details.markFocus("negative"); |
| break; |
| case "D": |
| details.markFocus("untriaged"); |
| break; |
| case "W": |
| zoom(); |
| break; |
| } |
| }); |
| } |
| |
| // Map state to/from the URL. |
| sk.stateReflector(page, loadList); |
| |
| sk.WebComponentsReady.then(function(){ |
| enableKeyboardShortcuts(); |
| |
| $$$('#search').addEventListener('click', function() { |
| $$$('#query').query = page.state.query; |
| $$$('#query').include = page.state.include; |
| $$$('#query').open(); |
| }); |
| |
| $$$('#query').addEventListener('closed', function(e) { |
| page.state.query = e.detail.query; |
| page.state.include = e.detail.useIgnored; |
| loadList(); |
| }); |
| |
| $$$('#head').addEventListener('change', function() { |
| page.state.head = $$$('#head').checked; |
| loadList(); |
| }); |
| |
| $$$('#untonly').addEventListener('change', function() { |
| page.state.untonly = $$$('#untonly').checked; |
| displaySummaries(); |
| }); |
| |
| $$$('#details').addEventListener('change', function() { |
| page.state.details = $$$('#details').checked; |
| displaySummaries(); |
| }); |
| |
| $$$('#summaries').addEventListener('commit-selected', function(e) { |
| $$$('#commitinfo').setCommitInfo(e.detail); |
| $$$('#commitdialog').open(); |
| }); |
| |
| $$$('#summaries').addEventListener('triage', function(e) { |
| sk.post('_/triage', JSON.stringify(e.detail)).then(function() { |
| }).catch(function(e) { |
| $$$('paper-toast').text = e; |
| $$$('paper-toast').show(); |
| }); |
| }); |
| |
| $$$('#summaries').addEventListener('zoom-clicked', function(e) { |
| zoom(e.detail); |
| }); |
| |
| $$$('#help').classList.toggle('hidden', !page.state.triage); |
| }); |
| })(); |
| </script> |
| </body> |
| </html> |