Reverted erroneously committed changes from the previous commit.
[WebKit-https.git] / Websites / test-results / index.html
index d41c7ec..66fd109 100644 (file)
@@ -26,6 +26,7 @@
     placeholder="Type in a test name, or copy and paste test names on results.html or NRWT stdout (including junks)"></form>
 <div id="testView"></div>
 
+<div id="buildersView">
 <form>
 Show
 <label>tests <select id="builderFailureTypeView"><option>failing</option><option>flaky</option><option value="wrongexpectations">has wrong expectations</option></select></label>
@@ -33,6 +34,7 @@ Show
 <label for="builderDaysView">in the last <select id="builderDaysView"><option>5</option><option>15</option><option>30</option></select> days</label>
 </form>
 <div id="builderFailingTestsView"></div>
+</div>
 
 <div id="tooltipContainer"></div>
 
@@ -154,7 +156,6 @@ TestResultsView._createResultCell = function (master, builder, result, previousR
 TestResultsView._populateTestPane = function(testName, results, section) {
     var test = {name: testName, category: 'LayoutTest'}; // FIXME: Use the real test object.
     var table = element('table', {'class': 'resultsTable tablesorter'}, [element('caption', [this._linkifiedTestName(test)])]);
-    table.appendChild(this._createTestResultHeader('Builder'));
 
     var resultsByBuilder = results['builders'];
     var buildTimes = new Array();
@@ -169,31 +170,43 @@ TestResultsView._populateTestPane = function(testName, results, section) {
     }
     buildTimes.sort(function (a, b) { return b - a; });
 
+    var repositories = [];
+    for (var repositoryId in this._repositories)
+        repositories.push(this._repositories[repositoryId]);
+
+    table.appendChild(this._createTestResultHeader('Builder', repositories));
+
     var tbody = element('tbody');
     for (var builderId in resultsByBuilder) {
         var builder = this._builders[builderId];
         // FIXME: Add a master name if there is more than one.
-        tbody.appendChild(this._createTestResultRow(builder.name, resultsByBuilder[builderId], builder, buildTimes));
+        tbody.appendChild(this._createTestResultRow(builder.name, resultsByBuilder[builderId], builder, buildTimes, repositories));
     }
     table.appendChild(tbody);
     section.appendChild(table);
     $(table).tablesorter();
 }
 
-TestResultsView._linkifiedTestName = function (test) {
+TestResultsView._urlFromTest = function (test) {
     var category = this._testCategories[test.category];
     if (!category)
-        return test.name;
+        return null;
+    return category.url.replace(/\$testName/g, test.name);
+}
 
-    return element('a', {'href': category.url.replace(/\$testName/g, test.name)}, [test.name]);
+TestResultsView._linkifiedTestName = function (test) {
+    var url = this._urlFromTest(test);
+    return url ? element('a', {'href': url}, [test.name]) : test.name;
 }
 
-TestResultsView._createTestResultHeader = function (labelForFirstColumn) {
+TestResultsView._createTestResultHeader = function (labelForFirstColumn, repositories) {
     return element('thead', [element('tr', [
         element('th', [labelForFirstColumn]),
         element('th', ['Bug']),
         element('th', ['Expectations']),
-        element('th', ['Slowest'])])]);
+        element('th', ['Slowest'])]
+        .concat(repositories ? repositories.map(function (repository) { return element('th', [repository.name]); }) : [])
+        .concat([element('th')]))]);
 }
 
 TestResultsView._createBuildsAndComputeSlownessOfResults = function (builderId, results) {
@@ -206,7 +219,7 @@ TestResultsView._createBuildsAndComputeSlownessOfResults = function (builderId,
     }
 }
 
-TestResultsView._createTestResultRow = function (title, results, builder, buildTimes) {
+TestResultsView._createTestResultRow = function (title, results, builder, buildTimes, repositories) {
     var sortedResults = results.sort(function (result1, result2) { return result2.build.time() - result1.build.time(); });
     var cells = new Array();
 
@@ -232,24 +245,47 @@ TestResultsView._createTestResultRow = function (title, results, builder, buildT
         }
     }
 
+    var seenBugLink = false;
     var formattedModifiers = sortedResults[0].modifiers.split(' ').map(function (modifier) {
-        if (modifier.indexOf('/') > 0)
+        if (modifier.indexOf('/') > 0) {
+            seenBugLink = true;
             return element('a', {'href': (modifier.indexOf('http') == 0 ? '' : 'http://') + modifier}, [modifier]);
+        }
         return modifier;
     });
 
+    if (!seenBugLink) {
+        // FIXME: Make bug tracker configurable.
+        formattedModifiers.push(element('a',
+            {'href': 'https://bugs.webkit.org/enter_bug.cgi?product=WebKit&component=Tools%20/%20Tests&form_name=enter_bug&keywords=LayoutTestFailure'},
+            ['File a bug']));
+    }
+
     var slowestTime = Math.max.apply(Math, results.map(function (result) { return result.roundedTime; }));
     if (slowestTime >= 1)
         slowestTime += 's';
     else
         slowestTime = '';
 
+    var formattedRevisionCells = [];
+    if (repositories) {
+        var build = sortedResults[0].build;
+        for (var i = 0; i < repositories.length; i++) {
+            var revisionInfo = build.formattedRevision(repositories[i].id);
+            if (revisionInfo.url)
+                formattedRevisionCells.push(element('a', {'href': revisionInfo.url}, [revisionInfo.label]));
+            else
+                formattedRevisionCells.push(revisionInfo.label);
+        }
+    }
+
     return element('tr', [
         element('th', [title]),
         element('td', {'class': 'modifiers'}, formattedModifiers),
         element('td', {'class': 'expected'}, [sortedResults[0].expected]),
-        element('td', {'class': 'slowestTime'}, [slowestTime]),
-        element('td', cells)]);
+        element('td', {'class': 'slowestTime'}, [slowestTime])]
+        .concat(formattedRevisionCells)
+        .concat([element('td', cells)]));
 }
 
 TestResultsView.fetchTest = function (testName) {
@@ -348,12 +384,21 @@ TestResultsView._populateBuilderPane = function(builderName, failureType, result
 
     var tbody = element('tbody');
     var builder = this._builders[builderId];
+    var self = this;
     for (var testId in resultsByTests) {
         var results = resultsByTests[testId];
         if (!results.length || !this._matchesFailureType(results, failureType, this._availableTests[testId].name))
             continue;
         this._createBuildsAndComputeSlownessOfResults(builderId, resultsByTests[testId]);
-        tbody.appendChild(this._createTestResultRow(this._linkifiedTestName(this._availableTests[testId]), resultsByTests[testId], builder));
+        var test = this._availableTests[testId];
+        var externalTestLink = element('a', {'class': 'externalTestLink', 'href': this._urlFromTest(test)});
+        var testName = element('a', {'href':'#'}, [test.name]);
+        testName.onclick = function (event) {
+            self.fetchTests([this.textContent]);
+            event.preventDefault();
+            return false;
+        }
+        tbody.appendChild(this._createTestResultRow(element('span', [testName, externalTestLink]), resultsByTests[testId], builder));
     }
 
     table.appendChild(tbody);
@@ -390,9 +435,9 @@ TestResultsView.fetchFailingTestsForBuilder = function (builderName, numberOfDay
     xhr.send();
 }
 
-TestResultsView.updateLocationHash = function () {
+TestResultsView._createLocationHash = function (tests) {
     var params = {
-        'tests': this._tests.join(','),
+        'tests': tests.join(','),
         'builder': this._currentBuilder,
         'builderFailureType': this._currentBuilderFailureType,
         'builderDays': this._currentBuilderDays,
@@ -404,7 +449,11 @@ TestResultsView.updateLocationHash = function () {
             continue;
         hash += '&' + decodeURIComponent(key) + '=' + decodeURIComponent(value);
     }
-    location.hash = hash;
+    return hash;
+}
+
+TestResultsView.updateLocationHash = function () {
+    location.hash = this._createLocationHash(this._tests);
     this._oldHash = location.hash;
 }