blob: d1b3e0ef343b34dd3181daf9821b9952566f9a17 [file]
// Copyright 2020 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
const main = document.querySelector('main');
const mainContainer = document.querySelector('.main-container');
const goldenImageContainer = mainContainer.querySelector('.golden .image-container');
const generatedImageContainer = mainContainer.querySelector('.generated .image-container');
const status = document.querySelector('.status');
const file = document.querySelector('.file');
const percentage = document.querySelector('.percentage');
const diffImageContainer = document.querySelector('.diff');
const testSkip = document.querySelector('.test-skip');
const testConfirm = document.querySelector('.test-confirm');
const choiceMarker = document.createElement('div');
choiceMarker.classList.add('choice');
const leftImage = new Image();
const rightImage = new Image();
const diffImage = new Image();
let listening = false;
function setState({type, msg, left, right, diff, rawMisMatchPercentage, fileName}) {
switch (type) {
case 'status':
listening = false;
document.body.appendChild(status);
status.textContent = msg;
mainContainer.remove();
disableButtons();
break;
case 'outcome':
main.appendChild(mainContainer);
status.remove();
choiceMarker.remove();
file.textContent = fileName;
percentage.textContent = `${rawMisMatchPercentage}%`;
// Golden.
leftImage.src = left;
goldenImageContainer.appendChild(leftImage);
// Generated.
rightImage.src = right;
generatedImageContainer.appendChild(rightImage);
// Diff.
diffImage.src = diff;
diffImageContainer.appendChild(diffImage);
diffImage.onerror = () => {
diffImage.src = './no-diff-available.png';
diffImage.onerror = null;
};
listening = true;
enableSkipButton();
break;
}
}
function makeChoice(which) {
choiceMarker.dataset.choice = which;
leftImage.classList.toggle('selected', which === 'golden');
rightImage.classList.toggle('selected', which === 'generated');
enableConfirmButton();
}
function commitChoice() {
document.body.appendChild(choiceMarker);
setWaiting();
}
function setWaiting() {
setState({type: 'status', msg: 'Waiting...'});
}
function enableSkipButton() {
testSkip.disabled = false;
}
function enableConfirmButton() {
testConfirm.disabled = false;
}
function disableButtons() {
testSkip.disabled = true;
testConfirm.disabled = true;
}
function commitSkip() {
makeChoice('skip');
commitChoice();
}
function commitChoiceIfPossible() {
if (!choiceMarker.dataset.choice) {
return;
}
commitChoice();
}
window.addEventListener('keyup', evt => {
if (!listening) {
return;
}
switch (evt.key) {
case 'ArrowLeft':
makeChoice('golden');
return;
case 'ArrowRight':
makeChoice('generated');
return;
case 'd':
diffImageContainer.classList.toggle('visible');
return;
case 's':
commitSkip();
return;
case 'Enter':
commitChoiceIfPossible();
return;
}
});
leftImage.addEventListener('click', () => makeChoice('golden'));
rightImage.addEventListener('click', () => makeChoice('generated'));
testSkip.addEventListener('click', () => commitSkip());
testConfirm.addEventListener('click', () => commitChoiceIfPossible());
setWaiting();