blob: 3d0208d332ed94774219d0e7b5ceec94cceaf4ae [file]
<!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>