| Index: Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
|
| diff --git a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js b/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
|
| deleted file mode 100644
|
| index c7740fbafa665cb8cd7c3fe4716cca57b36efbd9..0000000000000000000000000000000000000000
|
| --- a/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/TestFailures/scripts/ViewController.js
|
| +++ /dev/null
|
| @@ -1,432 +0,0 @@
|
| -/*
|
| - * Copyright (C) 2011 Apple 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.
|
| - */
|
| -
|
| -function ViewController(buildbot) {
|
| - this._buildbot = buildbot;
|
| - this._navigationID = 0;
|
| -
|
| - var self = this;
|
| - addEventListener('load', function() { self.loaded() }, false);
|
| - addEventListener('hashchange', function() { self.parseHash(location.hash) }, false);
|
| -}
|
| -
|
| -ViewController.prototype = {
|
| - loaded: function() {
|
| - this._header = document.createElement('h1');
|
| - document.body.appendChild(this._header);
|
| - this._mainContentElement = document.createElement('div');
|
| - document.body.appendChild(this._mainContentElement);
|
| - document.body.appendChild(this._domForAuxiliaryUIElements());
|
| -
|
| - this.parseHash(location.hash);
|
| - },
|
| -
|
| - parseHash: function(hash) {
|
| - ++this._navigationID;
|
| -
|
| - var match = /#\/(.*)/.exec(hash);
|
| - if (match)
|
| - this._displayBuilder(this._buildbot.builderNamed(decodeURIComponent(match[1])));
|
| - else
|
| - this._displayTesters();
|
| - },
|
| -
|
| - _displayBuilder: function(builder) {
|
| - this._setTitle(builder.name);
|
| - this._mainContentElement.removeAllChildren();
|
| -
|
| - var navigationID = this._navigationID;
|
| -
|
| - var self = this;
|
| - (new LayoutTestHistoryAnalyzer(builder)).start(function(data, stillFetchingData) {
|
| - if (self._navigationID !== navigationID) {
|
| - // The user has navigated somewhere else. Stop loading data about this tester.
|
| - return false;
|
| - }
|
| -
|
| - var list = document.createElement('ol');
|
| - list.id = 'failure-history';
|
| -
|
| - var buildNames = Object.keys(data.history)
|
| - buildNames.forEach(function(buildName, buildIndex, buildNameArray) {
|
| - var failingTestNames = Object.keys(data.history[buildName].tests);
|
| - if (!failingTestNames.length)
|
| - return;
|
| -
|
| - var item = document.createElement('li');
|
| - list.appendChild(item);
|
| -
|
| - var testList = document.createElement('ol');
|
| - item.appendChild(testList);
|
| -
|
| - testList.className = 'test-list';
|
| - for (var testName in data.history[buildName].tests) {
|
| - var testItem = document.createElement('li');
|
| - testItem.appendChild(self._domForFailedTest(builder, buildName, testName, data.history[buildName].tests[testName]));
|
| - testList.appendChild(testItem);
|
| - }
|
| -
|
| - if (data.history[buildName].tooManyFailures) {
|
| - var p = document.createElement('p');
|
| - p.className = 'info';
|
| - p.appendChild(document.createTextNode('run-webkit-tests exited early due to too many failures/crashes/timeouts'));
|
| - item.appendChild(p);
|
| - }
|
| -
|
| - var passingBuildName;
|
| - if (buildIndex + 1 < buildNameArray.length)
|
| - passingBuildName = buildNameArray[buildIndex + 1];
|
| -
|
| - item.appendChild(self._domForRegressionRange(builder, buildName, passingBuildName, failingTestNames));
|
| -
|
| - if (passingBuildName || !stillFetchingData) {
|
| - var bugForm = new FailingTestsBugForm(builder, buildName, passingBuildName, failingTestNames);
|
| - item.appendChild(self._domForNewAndExistingBugs(builder, failingTestNames, bugForm))
|
| - }
|
| - });
|
| -
|
| - self._mainContentElement.removeAllChildren();
|
| - self._mainContentElement.appendChild(list);
|
| - self._mainContentElement.appendChild(self._domForPossiblyFlakyTests(builder, data.possiblyFlaky, buildNames));
|
| -
|
| - if (!stillFetchingData)
|
| - PersistentCache.prune();
|
| -
|
| - return true;
|
| - });
|
| - },
|
| -
|
| - _displayTesters: function() {
|
| - this._setTitle('Testers');
|
| - this._mainContentElement.removeAllChildren();
|
| -
|
| - var list = document.createElement('ul');
|
| - this._mainContentElement.appendChild(list);
|
| -
|
| - var latestBuildInfos = [];
|
| - var navigationID = this._navigationID;
|
| -
|
| - function updateList() {
|
| - latestBuildInfos.sort(function(a, b) { return a.tester.name.localeCompare(b.tester.name) });
|
| - list.removeAllChildren();
|
| - latestBuildInfos.forEach(function(buildInfo) {
|
| - var link = base.createLinkNode('#/' + buildInfo.tester.name, buildInfo.tester.name)
|
| - var item = document.createElement('li');
|
| - item.appendChild(link);
|
| - if (buildInfo.tooManyFailures)
|
| - item.appendChild(document.createTextNode(' (too many failures/crashes/timeouts)'));
|
| - else
|
| - item.appendChild(document.createTextNode(' (' + buildInfo.failureCount + ' failing test' + (buildInfo.failureCount > 1 ? 's' : '') + ')'));
|
| - list.appendChild(item);
|
| - });
|
| - }
|
| -
|
| - var self = this;
|
| - this._buildbot.getTesters(function(testers) {
|
| - if (self._navigationID !== navigationID) {
|
| - // The user has navigated somewhere else.
|
| - return;
|
| - }
|
| - testers.forEach(function(tester) {
|
| - tester.getMostRecentCompletedBuildNumber(function(buildNumber) {
|
| - if (self._navigationID !== navigationID)
|
| - return;
|
| - if (buildNumber < 0)
|
| - return;
|
| - tester.getNumberOfFailingTests(buildNumber, function(failureCount, tooManyFailures) {
|
| - if (self._navigationID !== navigationID)
|
| - return;
|
| - if (failureCount <= 0)
|
| - return;
|
| - latestBuildInfos.push({ tester: tester, failureCount: failureCount, tooManyFailures: tooManyFailures });
|
| - updateList();
|
| - });
|
| - });
|
| - });
|
| - });
|
| - },
|
| -
|
| - _domForRegressionRange: function(builder, failingBuildName, passingBuildName, failingTestNames) {
|
| - var result = document.createDocumentFragment();
|
| -
|
| - var dlItems = [
|
| - [document.createTextNode('Failed'), this._domForBuildName(builder, failingBuildName)],
|
| - ];
|
| - if (passingBuildName)
|
| - dlItems.push([document.createTextNode('Passed'), this._domForBuildName(builder, passingBuildName)]);
|
| - result.appendChild(createDescriptionList(dlItems));
|
| -
|
| - if (!passingBuildName)
|
| - return result;
|
| -
|
| - var firstSuspectRevision = this._buildbot.parseBuildName(passingBuildName).revision + 1;
|
| - var lastSuspectRevision = this._buildbot.parseBuildName(failingBuildName).revision;
|
| -
|
| - if (firstSuspectRevision === lastSuspectRevision)
|
| - return result;
|
| -
|
| - var suspectsContainer = document.createElement('div');
|
| - result.appendChild(suspectsContainer);
|
| -
|
| - var link = base.createLinkNode(trac.logURL('trunk', firstSuspectRevision, lastSuspectRevision, true), 'View regression range in Trac');
|
| - result.appendChild(link);
|
| -
|
| - suspectsContainer.appendChild(document.createTextNode('Searching for suspect revisions\u2026'));
|
| -
|
| - // FIXME: Maybe some of this code should go in LayoutTestHistoryAnalyzer, or some other class?
|
| - var self = this;
|
| - trac.commitDataForRevisionRange('trunk', firstSuspectRevision, lastSuspectRevision, function(commits) {
|
| - var failingTestNamesWithoutExtensions = failingTestNames.map(removePathExtension);
|
| - var suspectCommits = commits.filter(function(commit) {
|
| - return failingTestNamesWithoutExtensions.some(function(testName) {
|
| - return commit.message.contains(testName);
|
| - });
|
| - });
|
| -
|
| - suspectsContainer.removeAllChildren();
|
| -
|
| - if (!suspectCommits.length)
|
| - return;
|
| -
|
| - var title = 'Suspect revision' + (suspectCommits.length > 1 ? 's' : '') + ':';
|
| - suspectsContainer.appendChild(document.createTextNode(title));
|
| -
|
| - var list = document.createElement('ul');
|
| - suspectsContainer.appendChild(list);
|
| - list.className = 'suspect-revisions-list';
|
| -
|
| - function compareCommits(a, b) {
|
| - return b.revision - a.revision;
|
| - }
|
| -
|
| - list.appendChildren(sorted(suspectCommits, compareCommits).map(function(commit) {
|
| - var item = document.createElement('li');
|
| - item.appendChild(base.createLinkNode(trac.changesetURL(commit.revision), commit.title));
|
| - return item;
|
| - }));
|
| - });
|
| -
|
| - return result;
|
| - },
|
| -
|
| - _domForAuxiliaryUIElements: function() {
|
| - var aside = document.createElement('aside');
|
| - aside.appendChild(document.createTextNode('Something not working? Have an idea to improve this page? '));
|
| - var queryParameters = {
|
| - product: 'WebKit',
|
| - component: 'Tools / Tests',
|
| - version: '528+ (Nightly build)',
|
| - bug_file_loc: location.href,
|
| - cc: 'aroben@apple.com',
|
| - short_desc: 'TestFailures page needs more unicorns!',
|
| - };
|
| - aside.appendChild(base.createLinkNode(addQueryParametersToURL(config.kBugzillaURL + '/enter_bug.cgi', queryParameters), 'File a bug!', '_blank'));
|
| - return aside;
|
| - },
|
| -
|
| - _domForBuildName: function(builder, buildName) {
|
| - var parsed = this._buildbot.parseBuildName(buildName);
|
| -
|
| - var sourceLink = base.createLinkNode('http://trac.webkit.org/changeset/' + parsed.revision, 'r' + parsed.revision);
|
| - var buildLink = base.createLinkNode(builder.buildURL(parsed.buildNumber), parsed.buildNumber);
|
| - var resultsLink = base.createLinkNode(builder.resultsPageURL(buildName), 'results.html');
|
| -
|
| - var result = document.createDocumentFragment();
|
| - result.appendChild(sourceLink);
|
| - result.appendChild(document.createTextNode(' ('));
|
| - result.appendChild(buildLink);
|
| - result.appendChild(document.createTextNode(') ('));
|
| - result.appendChild(resultsLink);
|
| - result.appendChild(document.createTextNode(')'));
|
| -
|
| - return result;
|
| - },
|
| -
|
| - _domForFailedTest: function(builder, buildName, testName, testResult) {
|
| - var result = document.createDocumentFragment();
|
| - result.appendChild(document.createTextNode(testName + ': '));
|
| - result.appendChild(this._domForFailureDiagnosis(builder, buildName, testName, testResult));
|
| - return result;
|
| - },
|
| -
|
| - _domForFailureDiagnosis: function(builder, buildName, testName, testResult) {
|
| - var diagnosticInfo = builder.failureDiagnosisTextAndURL(buildName, testName, testResult);
|
| - if (!diagnosticInfo)
|
| - return document.createTextNode(testResult.failureType);
|
| -
|
| - var textAndCrashingSymbol = document.createDocumentFragment();
|
| - textAndCrashingSymbol.appendChild(document.createTextNode(diagnosticInfo.text));
|
| - if (testResult.crashingSymbol) {
|
| - var code = document.createElement('code');
|
| - code.appendChild(document.createTextNode(testResult.crashingSymbol));
|
| - textAndCrashingSymbol.appendChild(document.createTextNode(' ('));
|
| - textAndCrashingSymbol.appendChild(code);
|
| - textAndCrashingSymbol.appendChild(document.createTextNode(')'));
|
| - }
|
| -
|
| - if (!('url' in diagnosticInfo))
|
| - return textAndCrashingSymbol;
|
| -
|
| - return base.createLinkNode(diagnosticInfo.url, textAndCrashingSymbol);
|
| - },
|
| -
|
| - _domForNewAndExistingBugs: function(tester, failingTests, bugForm) {
|
| - var result = document.createDocumentFragment();
|
| -
|
| - var container = document.createElement('p');
|
| - result.appendChild(container);
|
| -
|
| - container.className = 'existing-and-new-bugs';
|
| -
|
| - var bugsContainer = document.createElement('div');
|
| - container.appendChild(bugsContainer);
|
| -
|
| - bugsContainer.appendChild(document.createTextNode('Searching for bugs related to ' + (failingTests.length > 1 ? 'these tests' : 'this test') + '\u2026'));
|
| -
|
| - bugzilla.quickSearch('ALL ' + failingTests.join('|'), function(bugs) {
|
| - if (!bugs.length) {
|
| - bugsContainer.parentNode.removeChild(bugsContainer);
|
| - return;
|
| - }
|
| -
|
| - while (bugsContainer.firstChild)
|
| - bugsContainer.removeChild(bugsContainer.firstChild);
|
| -
|
| - bugsContainer.appendChild(document.createTextNode('Existing bugs related to ' + (failingTests.length > 1 ? 'these tests' : 'this test') + ':'));
|
| -
|
| - var list = document.createElement('ul');
|
| - bugsContainer.appendChild(list);
|
| -
|
| - list.className = 'existing-bugs-list';
|
| -
|
| - function bugToListItem(bug) {
|
| - var link = base.createLinkNode(bug.url, bug.title);
|
| - var item = document.createElement('li');
|
| - item.appendChild(link);
|
| -
|
| - return item;
|
| - }
|
| -
|
| - var openBugs = bugs.filter(function(bug) { return bugzilla.isOpenStatus(bug.status) });
|
| - var closedBugs = bugs.filter(function(bug) { return !bugzilla.isOpenStatus(bug.status) });
|
| -
|
| - list.appendChildren(openBugs.map(bugToListItem));
|
| -
|
| - if (!closedBugs.length)
|
| - return;
|
| -
|
| - var item = document.createElement('li');
|
| - list.appendChild(item);
|
| -
|
| - item.appendChild(document.createTextNode('Closed bugs:'));
|
| -
|
| - var closedList = document.createElement('ul');
|
| - item.appendChild(closedList);
|
| -
|
| - closedList.appendChildren(closedBugs.map(bugToListItem));
|
| - });
|
| -
|
| - var form = bugForm.domElement();
|
| - result.appendChild(form);
|
| -
|
| - var linkText = 'File bug for ' + (failingTests.length > 1 ? 'these failures' : 'this failure');
|
| - var link = base.createLinkNode('#', linkText);
|
| - link.addEventListener('click', function(event) { form.submit(); event.preventDefault(); });
|
| -
|
| - container.appendChild(link);
|
| - return result;
|
| - },
|
| -
|
| - _domForPossiblyFlakyTests: function(builder, possiblyFlakyTestData, allBuilds) {
|
| - var result = document.createDocumentFragment();
|
| - var flakyTests = Object.keys(possiblyFlakyTestData);
|
| - if (!flakyTests.length)
|
| - return result;
|
| -
|
| - var flakyHeader = document.createElement('h2');
|
| - result.appendChild(flakyHeader);
|
| - flakyHeader.appendChild(document.createTextNode('Possibly Flaky Tests'));
|
| -
|
| - var flakyList = document.createElement('ol');
|
| - result.appendChild(flakyList);
|
| -
|
| - flakyList.id = 'possibly-flaky-tests';
|
| -
|
| - var self = this;
|
| - flakyList.appendChildren(sorted(flakyTests).map(function(testName) {
|
| - var item = document.createElement('li');
|
| -
|
| - var disclosureTriangle = document.createElement('span');
|
| - item.appendChild(disclosureTriangle);
|
| -
|
| - disclosureTriangle.className = 'disclosure-triangle';
|
| - const blackRightPointingSmallTriangle = '\u25b8';
|
| - disclosureTriangle.appendChild(document.createTextNode(blackRightPointingSmallTriangle));
|
| -
|
| - var failures = possiblyFlakyTestData[testName];
|
| -
|
| - item.appendChild(document.createTextNode(testName + ' (failed ' + failures.length + ' out of ' + allBuilds.length + ' times)'));
|
| -
|
| - var container = document.createElement('div');
|
| - item.appendChild(container);
|
| -
|
| - container.className = 'expandable';
|
| -
|
| - disclosureTriangle.addEventListener('click', function() {
|
| - item.toggleStyleClass('expanded');
|
| - if (!item.hasStyleClass('expanded'))
|
| - return;
|
| -
|
| - if (!container.firstChild) {
|
| - var failureList = document.createElement('ol');
|
| - container.appendChild(failureList);
|
| -
|
| - failureList.className = 'flakiness-examples-list';
|
| -
|
| - failureList.appendChildren(failures.map(function(historyItem) {
|
| - var item = document.createElement('li');
|
| - item.appendChild(self._domForBuildName(builder, historyItem.build));
|
| - item.appendChild(document.createTextNode(': '));
|
| - item.appendChild(self._domForFailureDiagnosis(builder, historyItem.build, testName, historyItem.result));
|
| - return item;
|
| - }));
|
| -
|
| - var failingBuildNames = failures.map(function(historyItem) { return historyItem.build });
|
| - var bugForm = new FlakyTestBugForm(builder, failingBuildNames, testName, allBuilds.last(), allBuilds[0], allBuilds.length);
|
| - container.appendChild(self._domForNewAndExistingBugs(builder, [testName], bugForm));
|
| - }
|
| - });
|
| -
|
| - return item;
|
| - }));
|
| -
|
| - return result;
|
| - },
|
| -
|
| - _setTitle: function(title) {
|
| - document.title = title;
|
| - this._header.textContent = title;
|
| - },
|
| -};
|
|
|