Title: [94580] trunk/Tools
Revision
94580
Author
[email protected]
Date
2011-09-06 11:02:50 -0700 (Tue, 06 Sep 2011)

Log Message

Use a hierarchial structure for the garden-o-matic results view
https://bugs.webkit.org/show_bug.cgi?id=67620

Reviewed by Dimitri Glazkov.

This patch re-organizes the results view to use a hierachial structure
for selection.  At the top-level are sections for each test.  Expanding
the test section shows a tab selector for builders.

This structure prepares us for wiring up various actions to this view.

* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
(.):
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js:
():
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js:
(.):
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/styles/results.css:
(.results-view>.toolbar):
(.results-view>.toolbar ul.actions):
(.results-view>.toolbar ul.actions li):
(.results-grid table):
(.results-grid table td, .results-view table th):
(.results-grid table th):
(.results-grid .text-result):
(.results-grid .image-result):

Modified Paths

Diff

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js (94579 => 94580)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js	2011-09-06 18:02:50 UTC (rev 94580)
@@ -32,39 +32,9 @@
     {
         this._view = view;
         this._resultsByTest = resultsByTest;
-
-        this._view.setTestList(Object.keys(this._resultsByTest));
         this._view.setResultsByTest(resultsByTest);
-
-        this._view.addAction(new ui.actions.Rebaseline().makeDefault());
-        this._view.addAction(new ui.actions.Previous());
-        this._view.addAction(new ui.actions.Next());
-
-        $(this._view).bind('testselected', this.onTestSelected.bind(this));
-        $(this._view).bind('builderselected', this.onBuilderSelected.bind(this));
-        $(this._view).bind('rebaseline', this.onRebaseline.bind(this));
+        // FIXME: Wire up some actions.
     },
-    showTest: function(testName)
-    {
-        var builderNameList = Object.keys(this._resultsByTest[testName]);
-        this._view.setBuilderList(builderNameList)
-        this._view.showResults(results.failureInfoForTestAndBuilder(this._resultsByTest, testName, builderNameList[0]));
-    },
-    onTestSelected: function()
-    {
-        this.showTest(this._view.currentTestName());
-    },
-    onBuilderSelected: function() {
-        this._view.showResults(results.failureInfoForTestAndBuilder(this._resultsByTest, this._view.currentTestName(), this._view.currentBuilderName()));
-    },
-    onRebaseline: function() {
-        var testName = this._view.currentTestName();
-        var builderName = this._view.currentBuilderName();
-        model.queueForRebaseline({
-            'testName': testName,
-            'builderName': builderName
-        });
-    },
 });
 
 var FailureStreamController = base.extends(Object, {
@@ -114,7 +84,6 @@
             });
 
         var controller = new controllers.ResultsDetails(resultsView, failuresByTest);
-        controller.showTest(testNameList[0]);
 
         // FIXME: This doesn't belong here.
         var _onebar_ = $('#onebar')[0];

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js (94579 => 94580)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js	2011-09-06 18:02:50 UTC (rev 94580)
@@ -462,14 +462,14 @@
     return currentNode;
 };
 
-function resultsDirectoryForBuilder(builderName)
+results.directoryForBuilder = function(builderName)
 {
     return builderName.replace(/[ .()]/g, '_');
 }
 
 function resultsDirectoryURL(builderName)
 {
-    return kLayoutTestResultsServer + resultsDirectoryForBuilder(builderName) + kLayoutTestResultsPath;
+    return kLayoutTestResultsServer + results.directoryForBuilder(builderName) + kLayoutTestResultsPath;
 }
 
 results.resultKind = function(url)

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js (94579 => 94580)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js	2011-09-06 18:02:50 UTC (rev 94580)
@@ -28,6 +28,8 @@
 
 (function(){
 
+var kResultsPrefetchDelayMS = 500;
+
 // FIXME: Rather than using table, should we be using something fancier?
 ui.results.Comparison = base.extends('table', {
     init: function()
@@ -137,13 +139,18 @@
 });
 
 ui.results.ResultsDetails = base.extends('div', {
-    init: function(delegate)
+    init: function(delegate, failureInfo)
     {
         this.className = 'results-detail';
         this._delegate = delegate;
+        this._failureInfo = failureInfo;
+        this._haveShownOnce = false;
     },
-    show: function(failureInfo) {
-        this._delegate.fetchResultsURLs(failureInfo, function(resultsURLs) {
+    show: function() {
+        if (this._haveShownOnce)
+            return;
+        this._haveShownOnce = true;
+        this._delegate.fetchResultsURLs(this._failureInfo, function(resultsURLs) {
             var resultsGrid = new ui.results.ResultsGrid();
             resultsGrid.addResults(resultsURLs);
             $(this).empty().append(resultsGrid);
@@ -151,161 +158,94 @@
     },
 });
 
-var Selector = base.extends('select', {
-    init: function()
+ui.results.TestSelector = base.extends('div', {
+    init: function(delegate, resultsByTest)
     {
-        this._eventName = null;
-        $(this).change(function() {
-            if (this._eventName)
-                $(this).trigger(this._eventName);
-        }.bind(this));
-    },
-    setItemList: function(itemList)
-    {
-        $(this).empty();
-        itemList.forEach(function(item) {
-            var element = document.createElement('option');
-            element.textContent = item.displayName;
-            element.value = item.name;
-            this.appendChild(element);
-        }.bind(this));
-        $(this).show();
-    },
-    select: function(itemName) {
-        var index = -1;
-        for (var i = 0; i < this.options.length; ++i) {
-            if (this.options[i].value == itemName) {
-                index = i;
-                break;
-            }
-        }
-        if (index == -1)
-            return;
-        this.selectedIndex = index;
-    },
-    selectedItem: function() {
-        if (this.selectedIndex == -1)
-            return;
-        return this.options[this.selectedIndex].value;
-    }
-});
-
-ui.results.TestSelector = base.extends(Selector, {
-    init: function()
-    {
         this.className = 'test-selector';
-        this._eventName = 'testselected';
-    },
-    setTestList: function(testNameList)
-    {
-        this.setItemList(testNameList.map(function(testName) {
-            return {
-                'displayName': testName,
-                'name': testName
-            };
-        }));
+        this._delegate = delegate;
+
+        Object.keys(resultsByTest).forEach(function (testName) {
+            var link = document.createElement('a');
+            $(link).attr('href', '#').text(testName);
+            this.appendChild(document.createElement('h3')).appendChild(link);
+            this.appendChild(this._delegate.contentForTest(testName));
+        }, this);
+
+        $(this).accordion({
+            collapsible: true,
+            autoHeight: false,
+        });
+        $(this).accordion("activate", false);
     }
 });
 
-ui.results.BuilderSelector = base.extends(Selector, {
-    init: function()
+ui.results.BuilderSelector = base.extends('div', {
+    init: function(delegate, testName, resultsByBuilder)
     {
         this.className = 'builder-selector';
-        this._eventName = 'builderselected';
-    },
-    setBuilderList: function(builderNameList) {
-        this.setItemList(builderNameList.map(function(builderName) {
-            return {
-                'displayName': ui.displayNameForBuilder(builderName),
-                'name': builderName
-            };
-        }));
-    }
-});
+        this._delegate = delegate;
 
-ui.results.ResultsSelector = base.extends('table', {
-    init: function()
-    {
-        this.className = 'results-selector';
-    },
-    setResultsByTest: function(resultsByTest)
-    {
-        var buildersByTest = base.mapDictionary(resultsByTest, Object.keys);
+        var tabStrip = this.appendChild(document.createElement('ul'));
 
-        var testNameList = Object.keys(buildersByTest);
-        var builderNameList = base.uniquifyArray(base.flattenArray(base.values(buildersByTest)));
-        builderNameList.sort();
+        Object.keys(resultsByBuilder).forEach(function(builderName) {
+            var builderDirectory = results.directoryForBuilder(builderName);
 
-        var titles = this.createTHead().insertRow();
-        // Note the reverse iteration because insertCell() inserts at the beginning of the row.
-        for (var i = builderNameList.length - 1; i >= 0; --i) {
-            titles.insertCell().textContent = builderNameList[i];
-        }
-        titles.insertCell(); // For the test names.
+            var link = document.createElement('a');
+            $(link).attr('href', "#" + builderDirectory).text(ui.displayNameForBuilder(builderName));
+            tabStrip.appendChild(document.createElement('li')).appendChild(link);
 
-        this._body = this.appendChild(document.createElement('tbody'));
+            var content = this._delegate.contentForTestAndBuilder(testName, builderName);
+            content.id = builderDirectory;
+            this.appendChild(content);
+        }, this);
 
-        testNameList.forEach(function(testName) {
-            var row = this._body.insertRow();
-            for (var i = builderNameList.length - 1; i >= 0; --i) {
-                var cell = row.insertCell();
-                var builderName = builderNameList[i];
-                if (buildersByTest[testName].indexOf(builderName) != -1) {
-                    cell.className = 'result';
-                    cell.textContent = resultsByTest[testName][builderName].actual;
-                }
-            }
-            var cell = row.insertCell()
-            cell.className = 'test-name';
-            cell.textContent = testName;
-        }.bind(this));
-    },
+        $(this).tabs();
+    }
 });
 
 ui.results.View = base.extends('div', {
     init: function(delegate)
     {
         this.className = 'results-view';
-        this.innerHTML = '<div class="toolbar"></div><div class="content"></div>';
-
-        this._testSelector = new ui.results.TestSelector();
-        this._builderSelector = new ui.results.BuilderSelector();
-        this._resultsSelector = new ui.results.ResultsSelector();
-        this._resultsDetails = new ui.results.ResultsDetails(delegate);
-        this._actionList = new ui.actions.List();
-
-        $('.toolbar', this).append(this._testSelector).append(this._builderSelector).append(this._resultsSelector).append(this._actionList);
-        $('.content', this).append(this._resultsDetails);
+        this._delegate = delegate;
     },
-    addAction: function(action)
+    contentForTest: function(testName)
     {
-        this._actionList.add(action);
+        var builderSelector = new ui.results.BuilderSelector(this, testName, this._resultsByTest[testName]);
+        $(builderSelector).bind('tabsselect', function(event, ui) {
+            // We will probably have pre-fetched the tab already, but we need to make sure.
+            ui.panel.show();
+        });
+        return builderSelector;
     },
-    setTestList: function(testNameList)
+    contentForTestAndBuilder: function(testName, builderName)
     {
-        this._testSelector.setTestList(testNameList);
+        var failureInfo = results.failureInfoForTestAndBuilder(this._resultsByTest, testName, builderName);
+        return new ui.results.ResultsDetails(this, failureInfo);
     },
-    setBuilderList: function(buildNameList)
-    {
-        this._builderSelector.setBuilderList(buildNameList);
-    },
     setResultsByTest: function(resultsByTest)
     {
-        this._resultsSelector.setResultsByTest(resultsByTest);
+        $(this).empty();
+        this._resultsByTest = resultsByTest;
+
+        var testSelector = new ui.results.TestSelector(this, resultsByTest);
+        $(testSelector).bind("accordionchangestart", function(event, ui) {
+            // Prefetch the first results from the network.
+            var resultsDetails = $('.results-detail', ui.newContent);
+            if (resultsDetails.length)
+                resultsDetails[0].show();
+            // Prefetch the rest kResultsPrefetchDelayMS later.
+            setTimeout(function() {
+                resultsDetails.each(function() {
+                    this.show();
+                });
+            }, kResultsPrefetchDelayMS);
+        });
+        this.appendChild(testSelector);
     },
-    currentTestName: function()
+    fetchResultsURLs: function(failureInfo, callback)
     {
-        return this._testSelector.selectedItem();
-    },
-    currentBuilderName: function()
-    {
-        return this._builderSelector.selectedItem();
-    },
-    showResults: function(failureInfo)
-    {
-        this._testSelector.select(failureInfo.testName);
-        this._builderSelector.select(failureInfo.builderName);
-        this._resultsDetails.show(failureInfo);
+        this._delegate.fetchResultsURLs(failureInfo, callback)
     }
 });
 

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js (94579 => 94580)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js	2011-09-06 18:02:50 UTC (rev 94580)
@@ -46,50 +46,6 @@
     }
 }
 
-test("View", 6, function() {
-    var resultsView = new ui.results.View({
-        fetchResultsURLs: $.noop
-    });
-    var controller = new controllers.ResultsDetails(resultsView, kExampleResultsByTest);
-    controller.showTest("scrollbars/custom-scrollbar-with-incomplete-style.html");
-    equal(resultsView.currentTestName(), "scrollbars/custom-scrollbar-with-incomplete-style.html");
-    equal(resultsView.currentBuilderName(), "Mock Builder");
-    resultsView.showResults({
-        "testName": "userscripts/another-test.html",
-        "builderName": "Mock Builder",
-    });
-    equal(resultsView.currentTestName(), "userscripts/another-test.html");
-    equal(resultsView.currentBuilderName(), "Mock Builder");
-    resultsView.showResults({
-        "testName": "scrollbars/custom-scrollbar-with-incomplete-style.html",
-        "builderName": "Mock Linux",
-    });
-    equal(resultsView.currentTestName(), "scrollbars/custom-scrollbar-with-incomplete-style.html");
-    equal(resultsView.currentBuilderName(), "Mock Linux");
-});
+// FIXME: Add some unit tests.
 
-test("ResultsSelector", 1, function() {
-    var resultsSelector = new ui.results.ResultsSelector();
-    resultsSelector.setResultsByTest(kExampleResultsByTest);
-    equal($(resultsSelector).wrap('<div>').parent().html(),
-        '<table class="results-selector">' +
-            '<thead>' +
-                '<tr><td></td><td>Mock Builder</td><td>Mock Linux</td></tr>' +
-            '</thead>' +
-            '<tbody>' +
-                '<tr>' +
-                    '<td class="test-name">userscripts/another-test.html</td>' +
-                    '<td class="result">TEXT</td>' +
-                    '<td></td>' +
-                '</tr>' +
-                '<tr>' +
-                    '<td class="test-name">scrollbars/custom-scrollbar-with-incomplete-style.html</td>' +
-                    '<td class="result">CRASH</td>' +
-                    '<td class="result">CRASH</td>' +
-                '</tr>' +
-            '</tbody>' +
-        '</table>');
-});
-
-
 })();

Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/styles/results.css (94579 => 94580)


--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/styles/results.css	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/styles/results.css	2011-09-06 18:02:50 UTC (rev 94580)
@@ -23,53 +23,45 @@
  * THE POSSIBILITY OF SUCH DAMAGE.
  */
 
-.results-view table {
+.results-view>.toolbar {
+    padding-bottom: 15px;
+}
+
+    .results-view>.toolbar ul.actions {
+        float: right;
+        margin: 0;
+        padding: 0;
+        list-style: none;
+        display: inline-block;
+    }
+
+    .results-view>.toolbar ul.actions li {
+        display: inline-block;
+    }
+
+.results-grid table {
     table-layout: fixed;
     width: 100%;
     border-collapse: collapse;
 }
 
-.results-view table td, .results-view table th {
+.results-grid table td, .results-view table th {
     overflow: hidden;
     vertical-align: top;
 }
 
-.results-view table th {
+.results-grid table th {
     padding: 3px;
     border-bottom: 1px solid #AAA;
 }
 
-.results-view .toolbar {
-    padding-bottom: 15px;
-}
-
-.results-view .test-selector {
-    width: 400px;
-    margin-right: 6px;
-}
-
-.results-view .actions {
-    float: right;
-}
-
-.results-view .toolbar ul.actions {
-    margin: 0;
-    padding: 0;
-    list-style: none;
-    display: inline-block;
-}
-
-.results-view .toolbar ul.actions li {
-    display: inline-block;
-}
-
-.results-view .text-result {
+.results-grid .text-result {
     border: none;
     width: 100%;
     height: 400px; /* FIXME: How do we get a reasonable height here? */
 }
 
-.results-view .image-result {
+.results-grid .image-result {
     width: 100%;
     height: auto;
 }

Modified: trunk/Tools/ChangeLog (94579 => 94580)


--- trunk/Tools/ChangeLog	2011-09-06 18:00:25 UTC (rev 94579)
+++ trunk/Tools/ChangeLog	2011-09-06 18:02:50 UTC (rev 94580)
@@ -1,5 +1,35 @@
 2011-09-06  Adam Barth  <[email protected]>
 
+        Use a hierarchial structure for the garden-o-matic results view
+        https://bugs.webkit.org/show_bug.cgi?id=67620
+
+        Reviewed by Dimitri Glazkov.
+
+        This patch re-organizes the results view to use a hierachial structure
+        for selection.  At the top-level are sections for each test.  Expanding
+        the test section shows a tab selector for builders.
+
+        This structure prepares us for wiring up various actions to this view.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/controllers.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/results.js:
+        ():
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js:
+        (.):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results_unittests.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/styles/results.css:
+        (.results-view>.toolbar):
+        (.results-view>.toolbar ul.actions):
+        (.results-view>.toolbar ul.actions li):
+        (.results-grid table):
+        (.results-grid table td, .results-view table th):
+        (.results-grid table th):
+        (.results-grid .text-result):
+        (.results-grid .image-result):
+
+2011-09-06  Adam Barth  <[email protected]>
+
         garden-o-matic's base.probe generates spam in the _javascript_ console
         https://bugs.webkit.org/show_bug.cgi?id=67622
 
_______________________________________________
webkit-changes mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to