<!DOCTYPE html>
<html id="add-form">
<head>
    <title>Rebaseline Queue: Edit</title>
    <script src="http://test-results.appspot.com/dashboards/builders.js"></script>
    <link rel="stylesheet" href="/static/styles.css" type="text/css">
</head>
<body">

<div id="loading-indicator" class="status">Loading...</div>

<form method="POST" id="form-template" style="display: none">
    <table class="test-table">
        <caption></caption>
        <thead>
            <th>Test</th>
            <th>Expected</th>
            <th>Actual</th>
            <th>Results</th>
        </thead>
        <tbody></tbody>
        <tbody>
            <tr>
              <td colspan="4" class="submit-row">
                <input type="submit" value="">
              </td>
            </tr>
        </tbody>
    </table>
</form>

<script>
var TEST_RESULTS_SERVER = 'http://test-results.appspot.com/';
var BUILDER_TO_GROUP = {};
for (var builderGroupName in LAYOUT_TESTS_BUILDER_GROUPS) {
    for (var builderName in LAYOUT_TESTS_BUILDER_GROUPS[builderGroupName]) {
        BUILDER_TO_GROUP[builderName] = builderGroupName;
    }
}

// Extract template parameters
var builderName = '{{ builder_name|escapejs }}';
var queuedTestNames = {{ queued_test_names|safe }};

function init()
{
  var builderMaster = BUILDER_TO_MASTER[builderName] || CHROMIUM_GPU_BUILDER_MASTER;
  var resultsUrl = TEST_RESULTS_SERVER + 'testfile?builder=' + builderName +
      '&master=' + builderMaster.name +
      '&testtype=layout-tests&name=full_results.json';

  var script = document.createElement('script');
  script.src = resultsUrl;
  document.getElementsByTagName('head')[0].appendChild(script);
}

function ADD_RESULTS(results)
{
    var builderGroupName = BUILDER_TO_GROUP[builderName];

    var failingTests = [];
    var queuedTests = [];
    function processTestResult(test, results) {
        var actual = results.actual;
        var expected = results.expected;
        if (actual == expected ||
            expected.split(' ').indexOf(actual) != -1 ||
            actual == 'SKIP' ||
            actual.indexOf('PASS') != -1 ||
            (expected.indexOf('FAIL') != -1 && actual.indexOf('TIMEOUT') == -1)) {
            continue;
        }

        results.name = test;

        if (queuedTestNames.indexOf(test) != -1) {
            queuedTests.push(results);
            queuedTestNames.splice(queuedTestNames.indexOf(test), 1);
        } else {
            failingTests.push(results);
        }
    }

    function gatherTests(path, testTree) {
        if ('actual' in testTree) {
            processTestResult(path, testTree);
        } else {
            if (path) {
              path += '/';
            }
            for (var key in testTree) {
                gatherTests(path + key, testTree[key]);
            }
        }
    }
    gatherTests('', results.tests);

    // If we have remaining queued tests that are currently not failing,
    // synthesize results for them.
    queuedTestNames.forEach(function(queuedTestName) {
        queuedTests.push({
          name: queuedTestName,
          actual: 'UNKNOWN',
          expected: 'UNKNOWN'
        });
    });

    document.getElementById('loading-indicator').style.display = 'none';

    renderTestResults(
        failingTests,
        'add',
        'Failing tests',
        'Add to rebaseline queue',
        'No failing tests.');
    renderTestResults(
        queuedTests,
        'remove',
        'Queued tests',
        'Remove from rebaseline queue',
        'No queued tests.');
}

function renderTestResults(testResults, formAction, title, submitLabel, emptyMessage)
{
    if (testResults.length == 0) {
        var emptyNode = document.createElement('div');
        emptyNode.className = 'status';
        emptyNode.textContent = emptyMessage;
        document.body.appendChild(emptyNode);
        return;
    }

    var form = document.getElementById('form-template').cloneNode(true);
    form.action = '/builder/' + builderName + '/queue/' + formAction;
    form.style.display = '';
    document.body.appendChild(form);

    var testsTable = form.querySelector('.test-table');
    testsTable.querySelector('caption').textContent = title;
    testsTable.querySelector('input[type=submit]').value = submitLabel;

    testResults.sort(function(a, b) {
        return a.name < b.name ? -1 : (a.name > b.name ? 1 : 0);
    });

    testResults.forEach(function(result) {
        var testRow = document.createElement('tr');

        var testCell = document.createElement('td');
        testRow.appendChild(testCell);
        var testCheckbox = document.createElement('input');
        testCheckbox.type = 'checkbox';
        testCheckbox.name = 'test';
        testCheckbox.value = result.name;
        testCheckbox.id = result.name;
        testCell.appendChild(testCheckbox);

        var testName = document.createElement('label');
        testName.textContent = result.name;
        testName.setAttribute('for', result.name);
        testCell.appendChild(testName);

        var expectedCell = document.createElement('td');
        testRow.appendChild(expectedCell);
        expectedCell.textContent = result.expected;

        var actualCell = document.createElement('td');
        testRow.appendChild(actualCell);
        actualCell.textContent = result.actual;

        var resultsCell = document.createElement('td');
        testRow.appendChild(resultsCell);
        var resultsLink = document.createElement('a');
        resultsLink.target = '_blank';
        resultsLink.href = TEST_RESULTS_SERVER +
            'dashboards/flakiness_dashboard.html#tests=' + result.name +
            '&group=' + builderGroupName;
        resultsLink.textContent = 'Flakiness dashboard';
        resultsCell.appendChild(resultsLink);

        testsTable.tBodies[0].appendChild(testRow);
    });
}

init();
</script>

</body>
</html>
