Changeset 90822 in webkit


Ignore:
Timestamp:
Jul 12, 2011 10:46:16 AM (13 years ago)
Author:
abarth@webkit.org
Message:

Re-work garden-o-matic UI to begin to look like the mocks
https://bugs.webkit.org/show_bug.cgi?id=64334

Reviewed by Dimitri Glazkov.

This patch changes how we display failures to be more like the mock the
dglazkov made. We now can display the same information much more
compactly.

  • Scripts/webkitpy/tool/servers/data/gardeningserver/base.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/base_unittests.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/index.html:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/main.css: Added.
  • Scripts/webkitpy/tool/servers/data/gardeningserver/main.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/results.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/results_unittests.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js:
  • Scripts/webkitpy/tool/servers/data/gardeningserver/ui_unittests.js:
  • Scripts/webkitpy/tool/servers/gardeningserver.py:
Location:
trunk/Tools
Files:
1 added
10 edited

Legend:

Unmodified
Added
Removed
  • trunk/Tools/ChangeLog

    r90814 r90822  
     12011-07-12  Adam Barth  <abarth@webkit.org>
     2
     3        Re-work garden-o-matic UI to begin to look like the mocks
     4        https://bugs.webkit.org/show_bug.cgi?id=64334
     5
     6        Reviewed by Dimitri Glazkov.
     7
     8        This patch changes how we display failures to be more like the mock the
     9        dglazkov made. We now can display the same information much more
     10        compactly.
     11
     12        * Scripts/webkitpy/tool/servers/data/gardeningserver/base.js:
     13        * Scripts/webkitpy/tool/servers/data/gardeningserver/base_unittests.js:
     14        * Scripts/webkitpy/tool/servers/data/gardeningserver/index.html:
     15        * Scripts/webkitpy/tool/servers/data/gardeningserver/main.css: Added.
     16        * Scripts/webkitpy/tool/servers/data/gardeningserver/main.js:
     17        * Scripts/webkitpy/tool/servers/data/gardeningserver/results.js:
     18        * Scripts/webkitpy/tool/servers/data/gardeningserver/results_unittests.js:
     19        * Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js:
     20        * Scripts/webkitpy/tool/servers/data/gardeningserver/ui_unittests.js:
     21        * Scripts/webkitpy/tool/servers/gardeningserver.py:
     22
    1232011-07-11  Adam Roben  <aroben@apple.com>
    224
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base.js

    r90771 r90822  
    2525    return url.substr(0, index);
    2626}
     27
     28base.uniquifyArray = function(array)
     29{
     30    var seen = {};
     31    var result = [];
     32    $.each(array, function(index, value) {
     33        if (seen[value])
     34            return;
     35        seen[value] = true;
     36        result.push(value);
     37    });
     38    return result;
     39};
    2740
    2841base.filterTree = function(tree, isLeaf, predicate)
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base_unittests.js

    r90652 r90822  
    3030    var value = base.joinPath("", "test.html");
    3131    equals(value, "test.html");
     32});
     33
     34test("uniquifyArray", 5, function() {
     35    deepEqual(base.uniquifyArray([]), []);
     36    deepEqual(base.uniquifyArray(["a"]), ["a"]);
     37    deepEqual(base.uniquifyArray(["a", "b"]), ["a", "b"]);
     38    deepEqual(base.uniquifyArray(["a", "b", "b"]), ["a", "b"]);
     39    deepEqual(base.uniquifyArray(["a", "b", "b", "a"]), ["a", "b"]);
    3240});
    3341
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/index.html

    r90652 r90822  
    77<head>
    88<title>Garden-O-Matic</title>
    9 <style>
    10 body {
    11   margin: 0;
    12   padding: 0px;
    13 }
    14 h1 {
    15   margin: 0px;
    16   padding: 3px;
    17 }
    18 .butterbar {
    19   width: 500px;
    20   margin-left: -250px;
    21   position: fixed;
    22   border-radius: 5px;
    23   top: 1px;
    24   left: 50%;
    25   padding: 3px;
    26   background-color: #F5F6CE;
    27 }
    28 .butterbar .hide {
    29   float: right;
    30 }
    31 .toolbar {
    32   float: right;
    33 }
    34 .failures {
    35   padding: 3px;
    36 }
    37 .failures .test {
    38   margin: 6px 3px;
    39 }
    40 .failures .builders {
    41   color: #888;
    42 }
    43 .builder .builderName, .builder .actual {
    44   float: left;
    45   width: 200px;
    46 }
    47 .results iframe, .results img {
    48   width: 400px;
    49   height: 300px;
    50 }
    51 </style>
     9<link rel="stylesheet" href="main.css">
    5210<link rel="icon" id="favicon" type="image/png" href="favicon-green.png">
    5311</head>
    5412<body>
    55 <div class="butterbar"><span class="status">Loading...</span> <a class="hide" href="#">Dismiss</a></div>
    56 <div class="toolbar">
    57   <button class="quit">Quit</button>
    58 </div>
    59 <h1>Garden-O-Matic</h1>
    60 <div class="failures"></div>
     13<div class="butterbar"><span class="status">Loading...</span> <a class="dismiss" href="#">Dismiss</a></div>
     14<div class="results"></div>
    6115<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
    6216<script src="config.js"></script>
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/main.js

    r90772 r90822  
    11(function() {
    22
    3 function quit()
     3function dismissButterbar()
    44{
    5     $.post('/quitquitquit', function(data){
    6         $('.butterbar .status').html(data)
    7         $('.butterbar').fadeIn();
    8     });
    9 }
    10 
    11 function hide()
    12 {
    13     $(this).parent().fadeOut();
     5    $('.butterbar').fadeOut();
    146}
    157
     
    2315{
    2416    results.fetchResultsByBuilder(config.builders, function(resultsByBuilder) {
    25         var unexpectedFailures = ui.summarizeResultsByTest(results.unexpectedFailuresByTest(resultsByBuilder));
    26         $('.failures').append(unexpectedFailures);
     17        var unexpectedFailures = results.unexpectedFailuresByTest(resultsByBuilder);
     18        var hasFailures = !$.isEmptyObject(unexpectedFailures)
     19        if (!hasFailures) {
     20            $('.results').text('No failures. Party time!');
     21        } else {
     22            var resultsSummary = ui.summarizeResultsByTest(unexpectedFailures);
     23            $('.results').append($(resultsSummary).addClass('regression'));
     24        }
     25        setIconState(hasFailures);
    2726        onsuccess();
    28     });
    29     setIconState($('.failures').length);
    30 }
    31 
    32 function showResults()
    33 {
    34     // FIXME: This is fragile.
    35     var resultsSummary = $(this).parent().parent().parent();
    36     var testName = $('.testName', resultsSummary).text();
    37     $('.builderName', resultsSummary).each(function() {
    38         var builderName = $(this).text();
    39         results.fetchResultsURLs(builderName, testName, function(resultURLs) {
    40             resultsSummary.append(ui.results(resultURLs));
    41         });
    4227    });
    4328}
    4429
    45 function findRegressionRange()
    46 {
    47     // FIXME: This is fragile!
    48     var builderName = $('.builderName', $(this).parent()).text();
    49     var testName = $('.testName', $(this).parent().parent().parent()).text();
    50     results.regressionRangeForFailure(builderName, testName, function(oldestFailingRevision, newestPassingRevision) {
    51         var tracURLs = [];
    52         for (var i = newestPassingRevision + 1; i <= oldestFailingRevision; ++i) {
    53             tracURLs.push('<a href="http://trac.webkit.org/changeset/' + i + '">' + i + '</a>');
    54         }
    55         $('.butterbar .status').html('Regression range: ' + tracURLs.join(' '));
    56         $('.butterbar').fadeIn();
    57     });
    58 }
    59 
    60 $('.hide').live('click', hide);
    61 $('.quit').live('click', quit);
    62 $('.show-results').live('click', showResults);
    63 $('.regression-range').live('click', findRegressionRange);
     30$('.butterbar .dismiss').live('click', dismissButterbar);
    6431
    6532$(document).ready(function() {
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/results.js

    r90772 r90822  
    171171
    172172    return unexpectedFailures;
     173};
     174
     175results.collectUnexpectedResults = function(dictionaryOfResultNodes)
     176{
     177    var collectedResults = {};
     178    var results = [];
     179    $.each(dictionaryOfResultNodes, function(key, resultNode) {
     180        results = results.concat(unexpectedResults(resultNode));
     181    });
     182    return base.uniquifyArray(results);
    173183};
    174184
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/results_unittests.js

    r90772 r90822  
    88                "actual": "IMAGE"
    99            },
    10             "flaky-scrollbarhtml": {
     10            "flaky-scrollbar.html": {
    1111                "expected": "PASS",
    1212                "actual": "PASS TEXT"
     
    3636    "has_wdiff": true,
    3737    "revision": "90430"
    38 }
     38};
    3939
    4040test("BuilderResults.unexpectedFailures", 1, function() {
     
    219219});
    220220
     221test("collectUnexpectedResults", 1, function() {
     222    var dictionaryOfResultNodes = {
     223        "foo": {
     224            "expected": "IMAGE",
     225            "actual": "IMAGE"
     226        },
     227        "bar": {
     228            "expected": "PASS",
     229            "actual": "PASS TEXT"
     230        },
     231        "baz": {
     232            "expected": "TEXT",
     233            "actual": "IMAGE"
     234        },
     235        "qux": {
     236            "expected": "PASS",
     237            "actual": "TEXT"
     238        },
     239        "taco": {
     240            "expected": "PASS",
     241            "actual": "TEXT"
     242        },
     243    };
     244
     245    var collectedResults = results.collectUnexpectedResults(dictionaryOfResultNodes);
     246    deepEqual(collectedResults, ["TEXT", "IMAGE"]);
     247});
     248
    221249test("fetchResultsURLs", 3, function() {
    222250    var simulator = new NetworkSimulator();
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js

    r90772 r90822  
    22
    33(function () {
     4
     5function displayNameForBuilder(builderName)
     6{
     7    return builderName.replace(/Webkit /, '');
     8}
     9
     10ui.urlForTest = function(testName)
     11{
     12    return 'http://trac.webkit.org/browser/trunk/LayoutTests/' + testName;
     13}
     14
     15ui.summarizeTest = function(testName, resultNodesByBuilder)
     16{
     17    var unexpectedResults = results.collectUnexpectedResults(resultNodesByBuilder);
     18    var block = $(
     19        '<div class="test">' +
     20          '<span class="what"><a draggable></a></span>' +
     21          '<span>fails on</span>' +
     22          '<ul class="where"></ul>' +
     23        '</div>');
     24    $('.what a', block).text(testName).attr('href', ui.urlForTest(testName)).attr('class', unexpectedResults.join(' '));
     25
     26    var where = $('.where', block);
     27    $.each(resultNodesByBuilder, function(builderName, resultNode) {
     28        where.append($('<li></li>').text(displayNameForBuilder(builderName)));
     29    });
     30
     31    return block;
     32};
    433
    534ui.summarizeResultsByTest = function(resultsByTest)
     
    736    var block = $('<div class="results-summary"></div>');
    837    $.each(resultsByTest, function(testName, resultNodesByBuilder) {
    9         var testBlock = $('<div class="test"><div class="testName"></div><div class="builders"></div></div>');
    10         block.append(testBlock);
    11         $('.testName', testBlock).text(testName);
    12         $.each(resultNodesByBuilder, function(builderName, resultNode) {
    13             var builderBlock = $('<div class="builder"><div class="builderName"></div><div class="actual"></div><div class="expected"></div><button class="show-results">Show Results</button><button class="regression-range">Regression Range</button></div>');
    14             $('.builders', testBlock).append(builderBlock);
    15             $('.builderName', builderBlock).text(builderName);
    16             $('.actual', builderBlock).text(resultNode.actual);
    17             $('.expected', builderBlock).text(resultNode.expected);
    18         });
     38        block.append(ui.summarizeTest(testName, resultNodesByBuilder));
    1939    });
    20 
    2140    return block;
    2241};
  • trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/ui_unittests.js

    r90772 r90822  
    2020}
    2121
    22 test("summarizeResultsByTest", 1, function() {
     22test("summarizeResultsByTest", 3, function() {
    2323    var resultsSummary = ui.summarizeResultsByTest(kExampleResultsByTest);
    24     equal(resultsSummary.html(),
    25         '<div class="test">' +
    26             '<div class="testName">scrollbars/custom-scrollbar-with-incomplete-style.html</div>' +
    27              '<div class="builders">' +
    28                  '<div class="builder"><div class="builderName">Mock Builder</div><div class="actual">CRASH</div><div class="expected">IMAGE</div>' +
    29                      '<button class="show-results">Show Results</button><button class="regression-range">Regression Range</button></div>' +
    30                  '<div class="builder"><div class="builderName">Mock Linux</div><div class="actual">CRASH</div><div class="expected">TEXT</div>' +
    31                      '<button class="show-results">Show Results</button><button class="regression-range">Regression Range</button></div>' +
    32              '</div>' +
    33         '</div>' +
    34         '<div class="test">' +
    35             '<div class="testName">userscripts/another-test.html</div>' +
    36             '<div class="builders">' +
    37                 '<div class="builder"><div class="builderName">Mock Builder</div><div class="actual">TEXT</div><div class="expected">PASS</div>' +
    38                     '<button class="show-results">Show Results</button><button class="regression-range">Regression Range</button></div>' +
    39             '</div>' +
    40         '</div>');
     24    var resultsSummaryHTML = resultsSummary.html();
     25    ok(resultsSummaryHTML.indexOf('scrollbars/custom-scrollbar-with-incomplete-style.html') != -1);
     26    ok(resultsSummaryHTML.indexOf('userscripts/another-test.html') != -1);
     27    ok(resultsSummaryHTML.indexOf('Mock Builder') != -1);
    4128});
    4229
  • trunk/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py

    r90774 r90822  
    3939    STATIC_FILE_NAMES = frozenset([
    4040        "index.html",
     41        "main.css",
    4142        "base.js",
    4243        "config.js",
Note: See TracChangeset for help on using the changeset viewer.