Changeset 90822 in webkit
- Timestamp:
- Jul 12, 2011 10:46:16 AM (13 years ago)
- Location:
- trunk/Tools
- Files:
-
- 1 added
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Tools/ChangeLog
r90814 r90822 1 2011-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 1 23 2011-07-11 Adam Roben <aroben@apple.com> 2 24 -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base.js
r90771 r90822 25 25 return url.substr(0, index); 26 26 } 27 28 base.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 }; 27 40 28 41 base.filterTree = function(tree, isLeaf, predicate) -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/base_unittests.js
r90652 r90822 30 30 var value = base.joinPath("", "test.html"); 31 31 equals(value, "test.html"); 32 }); 33 34 test("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"]); 32 40 }); 33 41 -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/index.html
r90652 r90822 7 7 <head> 8 8 <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"> 52 10 <link rel="icon" id="favicon" type="image/png" href="favicon-green.png"> 53 11 </head> 54 12 <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> 61 15 <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script> 62 16 <script src="config.js"></script> -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/main.js
r90772 r90822 1 1 (function() { 2 2 3 function quit()3 function dismissButterbar() 4 4 { 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(); 14 6 } 15 7 … … 23 15 { 24 16 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); 27 26 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 });42 27 }); 43 28 } 44 29 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); 64 31 65 32 $(document).ready(function() { -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/results.js
r90772 r90822 171 171 172 172 return unexpectedFailures; 173 }; 174 175 results.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); 173 183 }; 174 184 -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/results_unittests.js
r90772 r90822 8 8 "actual": "IMAGE" 9 9 }, 10 "flaky-scrollbar html": {10 "flaky-scrollbar.html": { 11 11 "expected": "PASS", 12 12 "actual": "PASS TEXT" … … 36 36 "has_wdiff": true, 37 37 "revision": "90430" 38 } 38 }; 39 39 40 40 test("BuilderResults.unexpectedFailures", 1, function() { … … 219 219 }); 220 220 221 test("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 221 249 test("fetchResultsURLs", 3, function() { 222 250 var simulator = new NetworkSimulator(); -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/ui.js
r90772 r90822 2 2 3 3 (function () { 4 5 function displayNameForBuilder(builderName) 6 { 7 return builderName.replace(/Webkit /, ''); 8 } 9 10 ui.urlForTest = function(testName) 11 { 12 return 'http://trac.webkit.org/browser/trunk/LayoutTests/' + testName; 13 } 14 15 ui.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 }; 4 33 5 34 ui.summarizeResultsByTest = function(resultsByTest) … … 7 36 var block = $('<div class="results-summary"></div>'); 8 37 $.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)); 19 39 }); 20 21 40 return block; 22 41 }; -
trunk/Tools/Scripts/webkitpy/tool/servers/data/gardeningserver/ui_unittests.js
r90772 r90822 20 20 } 21 21 22 test("summarizeResultsByTest", 1, function() {22 test("summarizeResultsByTest", 3, function() { 23 23 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); 41 28 }); 42 29 -
trunk/Tools/Scripts/webkitpy/tool/servers/gardeningserver.py
r90774 r90822 39 39 STATIC_FILE_NAMES = frozenset([ 40 40 "index.html", 41 "main.css", 41 42 "base.js", 42 43 "config.js",
Note: See TracChangeset
for help on using the changeset viewer.