Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1566)

Unified Diff: Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js

Issue 13712005: Move GardeningServer out of BuildSlaveSupport (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
deleted file mode 100644
index 05e597eb493ec4d21c59f4d4b16faf174224404c..0000000000000000000000000000000000000000
--- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ui/results.js
+++ /dev/null
@@ -1,474 +0,0 @@
-/*
- * Copyright (C) 2011 Google Inc. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
- * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
- * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
- * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
- * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
- * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
- * THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-var ui = ui || {};
-ui.results = ui.results || {};
-
-(function(){
-
-var kResultsPrefetchDelayMS = 500;
-
-// FIXME: Rather than using table, should we be using something fancier?
-ui.results.Comparison = base.extends('table', {
- init: function()
- {
- this.className = 'comparison';
- this.innerHTML = '<thead><tr><th>Expected</th><th>Actual</th><th>Diff</th></tr></thead>' +
- '<tbody><tr><td class="expected result-container"></td><td class="actual result-container"></td><td class="diff result-container"></td></tr></tbody>';
- },
- _selectorForKind: function(kind)
- {
- switch (kind) {
- case results.kExpectedKind:
- return '.expected';
- case results.kActualKind:
- return '.actual';
- case results.kDiffKind:
- return '.diff';
- }
- return '.unknown';
- },
- update: function(kind, result)
- {
- var selector = this._selectorForKind(kind);
- $(selector, this).empty().append(result);
- return result;
- },
-});
-
-// We'd really like TextResult and ImageResult to extend a common Result base
-// class, but we can't seem to do that because they inherit from different
-// HTMLElements. We could have them inherit from <div>, but that seems lame.
-
-ui.results.TextResult = base.extends('iframe', {
- init: function(url)
- {
- this.className = 'text-result';
- this.src = url;
- }
-});
-
-ui.results.ImageResult = base.extends('img', {
- init: function(url)
- {
- this.className = 'image-result';
- this.src = url;
- }
-});
-
-ui.results.AudioResult = base.extends('audio', {
- init: function(url)
- {
- this.className = 'audio-result';
- this.src = url;
- this.controls = 'controls';
- }
-});
-
-function constructorForResultType(type)
-{
- if (type == results.kImageType)
- return ui.results.ImageResult;
- if (type == results.kAudioType)
- return ui.results.AudioResult;
- return ui.results.TextResult;
-}
-
-ui.results.ResultsGrid = base.extends('div', {
- init: function()
- {
- this.className = 'results-grid';
- },
- _addResult: function(comparison, constructor, resultsURLsByKind, kind)
- {
- var url = resultsURLsByKind[kind];
- if (!url)
- return;
- comparison.update(kind, new constructor(url));
- },
- addComparison: function(resultType, resultsURLsByKind)
- {
- var comparison = new ui.results.Comparison();
- var constructor = constructorForResultType(resultType);
-
- this._addResult(comparison, constructor, resultsURLsByKind, results.kExpectedKind);
- this._addResult(comparison, constructor, resultsURLsByKind, results.kActualKind);
- this._addResult(comparison, constructor, resultsURLsByKind, results.kDiffKind);
-
- this.appendChild(comparison);
- return comparison;
- },
- addRow: function(resultType, url)
- {
- var constructor = constructorForResultType(resultType);
- var view = new constructor(url);
- this.appendChild(view);
- return view;
- },
- addResults: function(resultsURLs)
- {
- var resultsURLsByTypeAndKind = {};
-
- resultsURLsByTypeAndKind[results.kImageType] = {};
- resultsURLsByTypeAndKind[results.kAudioType] = {};
- resultsURLsByTypeAndKind[results.kTextType] = {};
-
- resultsURLs.forEach(function(url) {
- resultsURLsByTypeAndKind[results.resultType(url)][results.resultKind(url)] = url;
- });
-
- $.each(resultsURLsByTypeAndKind, function(resultType, resultsURLsByKind) {
- if ($.isEmptyObject(resultsURLsByKind))
- return;
- if (results.kUnknownKind in resultsURLsByKind) {
- // This is something like "crash" that isn't a comparison.
- this.addRow(resultType, resultsURLsByKind[results.kUnknownKind]);
- return;
- }
- this.addComparison(resultType, resultsURLsByKind);
- }.bind(this));
-
- if (!this.children.length)
- this.textContent = 'No results to display.'
- }
-});
-
-ui.results.ResultsDetails = base.extends('div', {
- init: function(delegate, failureInfo)
- {
- this.className = 'results-detail';
- this._delegate = delegate;
- this._failureInfo = failureInfo;
- this._haveShownOnce = false;
- },
- 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(
- new ui.actions.List([
- new ui.actions.Previous(),
- new ui.actions.Next()
- ])).append(resultsGrid);
-
-
- }.bind(this));
- },
-});
-
-function isAnyReftest(testName, resultsByTest)
-{
- return Object.keys(resultsByTest[testName]).map(function(builder) {
- return resultsByTest[testName][builder];
- }).some(function(resultNode) {
- return resultNode.reftest_type && resultNode.reftest_type.length;
- });
-}
-
-ui.results.FlakinessData = base.extends('iframe', {
- init: function()
- {
- this.className = 'flakiness-iframe';
- this.src = ui.urlForEmbeddedFlakinessDashboard();
- this.addEventListener('load', function() {
- window.addEventListener('message', this._handleMessage.bind(this));
- });
- },
- _handleMessage: function(event) {
- if (!this.contentWindow)
- return;
-
- // Check for null event.origin so that the unittests can get past this point.
- // FIXME: Is this safe? In practice, there's no meaningful harm that can come from
- // a malicious page sending us heightChanged commands, so it doesn't really matter.
- if (event.origin !== 'null' && event.origin != 'http://test-results.appspot.com') {
- console.log('Invalid origin: ' + event.origin);
- return;
- }
-
- if (event.data.command != 'heightChanged') {
- console.log('Unknown postMessage command: ' + event.data);
- return;
- }
-
- this.style.height = event.data.height + 'px';
- }
-});
-
-ui.results.TestSelector = base.extends('div', {
- init: function(delegate, resultsByTest)
- {
- this.className = 'test-selector';
- this._delegate = delegate;
-
- var topPanel = document.createElement('div');
- topPanel.className = 'top-panel';
- this.appendChild(topPanel);
-
- this._appendResizeHandle();
-
- var bottomPanel = document.createElement('div');
- bottomPanel.className = 'bottom-panel';
- this.appendChild(bottomPanel);
-
- this._flakinessData = new ui.results.FlakinessData();
- this.appendChild(this._flakinessData);
-
- var testNames = Object.keys(resultsByTest);
- testNames.sort().forEach(function(testName) {
- var nonLinkTitle = document.createElement('a');
- nonLinkTitle.classList.add('non-link-title');
- nonLinkTitle.textContent = testName;
-
- var linkTitle = document.createElement('a');
- linkTitle.classList.add('link-title');
- linkTitle.setAttribute('href', ui.urlForFlakinessDashboard([testName]))
- linkTitle.textContent = testName;
-
- var header = document.createElement('h3');
- header.appendChild(nonLinkTitle);
- header.appendChild(linkTitle);
- header.addEventListener('click', this._showResults.bind(this, header, false));
- topPanel.appendChild(header);
- }, this);
-
- // If we have a small amount of content, don't show the resize handler.
- // Otherwise, set the minHeight so that the percentage height of the
- // topPanel is not too small.
- if (testNames.length <= 4)
- this.removeChild(this.querySelector('.resize-handle'));
- else
- topPanel.style.minHeight = '100px';
- },
- _appendResizeHandle: function()
- {
- var resizeHandle = document.createElement('div');
- resizeHandle.className = 'resize-handle';
- this.appendChild(resizeHandle);
-
- resizeHandle.addEventListener('mousedown', function(event) {
- this._is_resizing = true;
- event.preventDefault();
- }.bind(this));
-
- var cancelResize = function(event) { this._is_resizing = false; }.bind(this);
- this.addEventListener('mouseup', cancelResize);
- // FIXME: Use addEventListener once WebKit adds support for mouseleave/mouseenter.
- $(window).bind('mouseleave', cancelResize);
-
- this.addEventListener('mousemove', function(event) {
- if (!this._is_resizing)
- return;
- var mouseY = event.clientY + document.body.scrollTop - this.offsetTop;
- var percentage = 100 * mouseY / this.offsetHeight;
- document.querySelector('.top-panel').style.maxHeight = percentage + '%';
- }.bind(this))
- },
- _showResults: function(header, scrollInfoView)
- {
- if (!header)
- return false;
-
- var activeHeader = this.querySelector('.active')
- if (activeHeader)
- activeHeader.classList.remove('active');
- header.classList.add('active');
-
- var testName = this.currentTestName();
- this._flakinessData.src = ui.urlForEmbeddedFlakinessDashboard([testName]);
-
- var bottomPanel = this.querySelector('.bottom-panel')
- bottomPanel.innerHTML = '';
- bottomPanel.appendChild(this._delegate.contentForTest(testName));
-
- var topPanel = this.querySelector('.top-panel');
- if (scrollInfoView) {
- topPanel.scrollTop = header.offsetTop;
- if (header.offsetTop - topPanel.scrollTop < header.offsetHeight)
- topPanel.scrollTop = topPanel.scrollTop - header.offsetHeight;
- }
-
- var resultsDetails = this.querySelectorAll('.results-detail');
- if (resultsDetails.length)
- resultsDetails[0].show();
- setTimeout(function() {
- Array.prototype.forEach.call(resultsDetails, function(resultsDetail) {
- resultsDetail.show();
- });
- }, kResultsPrefetchDelayMS);
-
- return true;
- },
- nextResult: function()
- {
- if (this.querySelector('.builder-selector').nextResult())
- return true;
- return this.nextTest();
- },
- previousResult: function()
- {
- if (this.querySelector('.builder-selector').previousResult())
- return true;
- return this.previousTest();
- },
- nextTest: function()
- {
- return this._showResults(this.querySelector('.active').nextSibling, true);
- },
- previousTest: function()
- {
- var succeeded = this._showResults(this.querySelector('.active').previousSibling, true);
- if (succeeded)
- this.querySelector('.builder-selector').lastResult();
- return succeeded;
- },
- firstResult: function()
- {
- this._showResults(this.querySelector('h3'), true);
- },
- currentTestName: function()
- {
- return this.querySelector('.active .non-link-title').textContent;
- }
-});
-
-ui.results.BuilderSelector = base.extends('div', {
- init: function(delegate, testName, resultsByBuilder)
- {
- this.className = 'builder-selector';
- this._delegate = delegate;
-
- var tabStrip = this.appendChild(document.createElement('ul'));
-
- Object.keys(resultsByBuilder).sort().forEach(function(builderName) {
- var builderHash = base.underscoredBuilderName(builderName);
-
- var link = document.createElement('a');
- $(link).attr('href', "#" + builderHash).text(ui.displayNameForBuilder(builderName));
- tabStrip.appendChild(document.createElement('li')).appendChild(link);
-
- var content = this._delegate.contentForTestAndBuilder(testName, builderName);
- content.id = builderHash;
- this.appendChild(content);
- }, this);
-
- $(this).tabs();
- },
- nextResult: function()
- {
- var nextIndex = $(this).tabs('option', 'selected') + 1;
- if (nextIndex >= $(this).tabs('length'))
- return false
- $(this).tabs('option', 'selected', nextIndex);
- return true;
- },
- previousResult: function()
- {
- var previousIndex = $(this).tabs('option', 'selected') - 1;
- if (previousIndex < 0)
- return false;
- $(this).tabs('option', 'selected', previousIndex);
- return true;
- },
- firstResult: function()
- {
- $(this).tabs('option', 'selected', 0);
- },
- lastResult: function()
- {
- $(this).tabs('option', 'selected', $(this).tabs('length') - 1);
- }
-});
-
-ui.results.View = base.extends('div', {
- init: function(delegate)
- {
- this.className = 'results-view';
- this._delegate = delegate;
- },
- contentForTest: function(testName)
- {
- var rebaselineAction;
- if (isAnyReftest(testName, this._resultsByTest))
- rebaselineAction = $('<div class="non-action-button">Reftests cannot be rebaselined. Email webkit-gardening@chromium.org if unsure how to fix this.</div>');
- else
- rebaselineAction = new ui.actions.List([new ui.actions.Rebaseline().makeDefault()]);
- $(rebaselineAction).addClass('rebaseline-action');
-
- var builderSelector = new ui.results.BuilderSelector(this, testName, this._resultsByTest[testName]);
- $(builderSelector).append(rebaselineAction).append($('<br style="clear:both">'));
- $(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;
- },
- contentForTestAndBuilder: function(testName, builderName)
- {
- var failureInfo = results.failureInfoForTestAndBuilder(this._resultsByTest, testName, builderName);
- return new ui.results.ResultsDetails(this, failureInfo);
- },
- setResultsByTest: function(resultsByTest)
- {
- $(this).empty();
- this._resultsByTest = resultsByTest;
- this._testSelector = new ui.results.TestSelector(this, resultsByTest);
- this.appendChild(this._testSelector);
- },
- fetchResultsURLs: function(failureInfo, callback)
- {
- this._delegate.fetchResultsURLs(failureInfo, callback)
- },
- nextResult: function()
- {
- return this._testSelector.nextResult();
- },
- previousResult: function()
- {
- return this._testSelector.previousResult();
- },
- nextTest: function()
- {
- return this._testSelector.nextTest();
- },
- previousTest: function()
- {
- return this._testSelector.previousTest();
- },
- firstResult: function()
- {
- this._testSelector.firstResult()
- },
- currentTestName: function()
- {
- return this._testSelector.currentTestName()
- }
-});
-
-})();

Powered by Google App Engine
This is Rietveld 408576698