<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[201475] trunk/Tools</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/201475">201475</a></dd>
<dt>Author</dt> <dd>commit-queue@webkit.org</dd>
<dt>Date</dt> <dd>2016-05-27 17:06:01 -0700 (Fri, 27 May 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Display failing JSC stress tests in buildbot dashboard
https://bugs.webkit.org/show_bug.cgi?id=156595

Patch by Srinivasan Vijayaraghavan &lt;svijayaraghavan@apple.com&gt; on 2016-05-27
Reviewed by Alexey Proskuryakov.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js:
(Buildbot.prototype.javaScriptCoreTestFailuresURLForIteration):
(Buildbot.prototype.javaScriptCoreTestStdioUrlForIteration):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js:
(BuildbotCombinedQueueView.prototype.update):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js:
(BuildbotIteration):
(BuildbotIteration.prototype._parseData):
(BuildbotIteration.prototype.loadLayoutTestResults):
(BuildbotIteration.prototype.):
(BuildbotIteration.prototype.loadJavaScriptCoreTestResults):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:
(BuildbotQueueView.prototype._createLoadingIndicator):
(BuildbotQueueView.prototype.):
(BuildbotQueueView.prototype._onPopoverCopy):
(BuildbotQueueView.prototype._popoverContentForJavaScriptCoreTestRegressions):
(BuildbotQueueView.prototype._presentPopoverForJavaScriptCoreTestRegressions):
(BuildbotQueueView.prototype._addIterationHeadingToPopover):
(BuildbotQueueView.prototype._testStepFailureDescription):
(BuildbotQueueView.prototype._testStepFailureDescriptionWithCount):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js:
(BuildbotTestResults.prototype.addJavaScriptCoreTestFailures):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js:
(BuildbotTesterQueueView.prototype.appendBuilderQueueStatus):
(BuildbotTesterQueueView.prototype.update):
(BuildbotTesterQueueView.prototype._popoverContentForLayoutTestRegressions):
(BuildbotTesterQueueView.prototype._presentPopoverForLayoutTestRegressions):
(BuildbotTesterQueueView.prototype._testStepFailureDescription): Deleted.
(BuildbotTesterQueueView.prototype._testStepFailureDescriptionWithCount): Deleted.
(BuildbotTesterQueueView.prototype.): Deleted.
(BuildbotTesterQueueView.prototype.content.oncopy): Deleted.
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js.
(MockBuildbot):
(MockBuildbot.prototype.buildPageURLForIteration):
(MockBuildbot.prototype.javaScriptCoreTestFailuresURLForIteration):
(MockBuildbot.prototype.javaScriptCoreTestStdioUrlForIteration):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js:
(MockBuildbotQueue):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js.
(MockBuildbotTestResults):
(MockBuildbotTestResults.prototype.addJavaScriptCoreTestFailures):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json: Added.
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js:</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotCombinedQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotIterationjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTestResultsjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTesterQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsindexhtml">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotQueuejs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcestestsjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotTestResultsjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcestestjscresultsjson">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -151,6 +151,16 @@
</span><span class="cx">         return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id;
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    javaScriptCoreTestFailuresURLForIteration: function(iteration, name)
+    {
+        return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id + &quot;/steps/&quot; + name + &quot;/logs/json/text&quot;;
+    },
+
+    javaScriptCoreTestStdioUrlForIteration: function(iteration, name)
+    {
+        return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id + &quot;/steps/&quot; + name + &quot;/logs/stdio&quot;;
+    },
+
</ins><span class="cx">     layoutTestResultsDirectoryURLForIteration: function(iteration)
</span><span class="cx">     {
</span><span class="cx">         var underscoreSeparatedRevisions = &quot;r&quot;;
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotCombinedQueueViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013, 2015 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2015-2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -88,9 +88,9 @@
</span><span class="cx"> 
</span><span class="cx">             var message = this.revisionContentForIteration(slowestQueue.mostRecentSuccessfulIteration);
</span><span class="cx">             var statusMessagePassed = &quot;all &quot; + (queue.builder ? &quot;builds succeeded&quot; : &quot;tests passed&quot;);
</span><del>-            var status = new StatusLineView(message, StatusLineView.Status.Good, statusMessagePassed, null, null);
-            new PopoverTracker(status.statusBubbleElement, this._presentPopoverForCombinedGreenBubble.bind(this));
-            this.element.appendChild(status.element);
</del><ins>+            var statusView = new StatusLineView(message, StatusLineView.Status.Good, statusMessagePassed, null, null);
+            new PopoverTracker(statusView.statusBubbleElement, this._presentPopoverForCombinedGreenBubble.bind(this));
+            this.element.appendChild(statusView.element);
</ins><span class="cx">         } else {
</span><span class="cx">             this.appendBuildStyle.call(this, this.queues, null, function(queue) {
</span><span class="cx">                 if (queue.buildbot.needsAuthentication &amp;&amp; !queue.buildbot.isAuthenticated) {
</span><span class="lines">@@ -107,9 +107,16 @@
</span><span class="cx">                 if (firstRecentUnsuccessfulIteration &amp;&amp; firstRecentUnsuccessfulIteration.loaded &amp;&amp; mostRecentFinishedIteration &amp;&amp; mostRecentFinishedIteration.loaded) {
</span><span class="cx">                     console.assert(!mostRecentFinishedIteration.successful);
</span><span class="cx">                     var message = this.revisionContentForIteration(mostRecentFinishedIteration, mostRecentFinishedIteration.productive ? mostRecentSuccessfulIteration : null);
</span><del>-                    if (!mostRecentFinishedIteration.productive)
</del><ins>+                    if (!mostRecentFinishedIteration.productive) {
</ins><span class="cx">                         var status = StatusLineView.Status.Danger;
</span><del>-                    else {
</del><ins>+                    } else if (mostRecentFinishedIteration.failedTestSteps.length === 1 &amp;&amp; mostRecentFinishedIteration.failedTestSteps[0].name in [&quot;jscore-test&quot;, &quot;webkit-32bit-jsc-test&quot;, &quot;webkit-jsc-cloop-test&quot;]) {
+                        var failedStep = mostRecentFinishedIteration.failedTestSteps[0];
+                        var URL = mostRecentFinishedIteration.queue.buildbot.javaScriptCoreTestStdioUrlForIteration(mostRecentFinishedIteration, failedStep.name);
+                        var statusView = new StatusLineView(message, StatusLineView.Status.Bad, this._testStepFailureDescription(failedStep), failedStep.failureCount, URL);
+                        this.element.appendChild(statusView.element);
+                        new PopoverTracker(statusView.statusBubbleElement, this._presentPopoverForJavaScriptCoreTestRegressions.bind(this, failedStep.name), mostRecentFinishedIteration);
+                        return;
+                    } else {
</ins><span class="cx">                         // Direct links to some common logs.
</span><span class="cx">                         var url = mostRecentFinishedIteration.failureLogURL(&quot;build log&quot;);
</span><span class="cx">                         if (!url)
</span><span class="lines">@@ -123,22 +130,24 @@
</span><span class="cx">                     // Some other step failed, link to main buildbot page for the iteration.
</span><span class="cx">                     if (!url)
</span><span class="cx">                         url = queue.buildbot.buildPageURLForIteration(mostRecentFinishedIteration);
</span><del>-                    var status = new StatusLineView(message, status, mostRecentFinishedIteration.text, null, url);
-                    this.element.appendChild(status.element);
</del><ins>+                    var statusView = new StatusLineView(message, status, mostRecentFinishedIteration.text, null, url);
+                    this.element.appendChild(statusView.element);
</ins><span class="cx"> 
</span><span class="cx">                     if (needsPopover)
</span><del>-                        new PopoverTracker(status.statusBubbleElement, this._presentIndividualQueuePopover.bind(this), mostRecentFinishedIteration);
</del><ins>+                        new PopoverTracker(statusView.statusBubbleElement, this._presentIndividualQueuePopover.bind(this), mostRecentFinishedIteration);
</ins><span class="cx">                 }
</span><span class="cx"> 
</span><span class="cx">                 var statusMessagePassed = &quot;all &quot; + (queue.builder ? &quot;builds succeeded&quot; : &quot;tests passed&quot;);
</span><span class="cx">                 if (mostRecentSuccessfulIteration &amp;&amp; mostRecentSuccessfulIteration.loaded) {
</span><span class="cx">                     var message = this.revisionContentForIteration(mostRecentSuccessfulIteration);
</span><span class="cx">                     var url = queue.buildbot.buildPageURLForIteration(mostRecentSuccessfulIteration);
</span><del>-                    var status = new StatusLineView(message, StatusLineView.Status.Good, firstRecentUnsuccessfulIteration ? &quot;last succeeded&quot; : statusMessagePassed, null, url);
-                    this.element.appendChild(status.element);
</del><ins>+                    var label = firstRecentUnsuccessfulIteration ? &quot;last succeeded&quot; : statusMessagePassed;
+                    var statusView = new StatusLineView(message, StatusLineView.Status.Good, label, null, url);
+                    this.element.appendChild(statusView.element);
</ins><span class="cx">                 } else {
</span><del>-                    var status = new StatusLineView(&quot;unknown&quot;, StatusLineView.Status.Neutral, firstRecentUnsuccessfulIteration ? &quot;last succeeded&quot; : statusMessagePassed);
-                    this.element.appendChild(status.element);
</del><ins>+                    var label = firstRecentUnsuccessfulIteration ? &quot;last succeeded&quot; : statusMessagePassed;
+                    var statusView = new StatusLineView(&quot;unknown&quot;, StatusLineView.Status.Neutral, label);
+                    this.element.appendChild(statusView.element);
</ins><span class="cx"> 
</span><span class="cx">                     if (firstRecentUnsuccessfulIteration) {
</span><span class="cx">                         // We have a failed iteration but no successful. It might be further back in time.
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotIterationjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -46,6 +46,7 @@
</span><span class="cx">     this.revision = {};
</span><span class="cx"> 
</span><span class="cx">     this.layoutTestResults = null; // Layout test results can be needed even if all tests passed, e.g. for the leaks bot.
</span><ins>+    this.javaScriptCoreTestResults = null;
</ins><span class="cx"> 
</span><span class="cx">     this.failedTestSteps = [];
</span><span class="cx"> 
</span><span class="lines">@@ -250,6 +251,8 @@
</span><span class="cx">             var results = new BuildbotTestResults(step);
</span><span class="cx">             if (step.name === &quot;layout-test&quot;)
</span><span class="cx">                 this.layoutTestResults = results;
</span><ins>+            else if (step.name in [&quot;jscore-test&quot;, &quot;webkit-32bit-jsc-test&quot;, &quot;webkit-jsc-cloop-test&quot;])
+                this.javaScriptCoreTestResults = results;
</ins><span class="cx">             if (results.allPassed)
</span><span class="cx">                 return;
</span><span class="cx">             this.failedTestSteps.push(results);
</span><span class="lines">@@ -353,5 +356,25 @@
</span><span class="cx">             console.log(data.error);
</span><span class="cx">             callback();
</span><span class="cx">         }.bind(this), {jsonpCallbackName: &quot;ADD_RESULTS&quot;, withCredentials: this.queue.buildbot.needsAuthentication});
</span><del>-    }
</del><ins>+    },
+
+    loadJavaScriptCoreTestResults: function(testName, callback)
+    {
+        if (this.queue.buildbot.needsAuthentication &amp;&amp; this.queue.buildbot.authenticationStatus === Buildbot.AuthenticationStatus.InvalidCredentials)
+            return;
+
+        JSON.load(this.queue.buildbot.javaScriptCoreTestFailuresURLForIteration(this, testName), function(data) {
+            this.queue.buildbot.isAuthenticated = true;
+            this.javaScriptCoreTestResults.addJavaScriptCoreTestFailures(data);
+            callback();
+        }.bind(this),
+        function(data) {
+            if (data.errorType === JSON.LoadError &amp;&amp; data.errorHTTPCode === 401) {
+                this.queue.buildbot.isAuthenticated = false;
+                this.dispatchEventToListeners(BuildbotIteration.Event.UnauthorizedAccess);
+            }
+            console.log(data.error);
+            callback();
+        }.bind(this), {withCredentials: this.queue.buildbot.needsAuthentication});
+    },
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotQueueViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -73,6 +73,95 @@
</span><span class="cx">         this.element.appendChild(status.element);
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    _createLoadingIndicator: function(iteration, heading) {
+        var content = document.createElement(&quot;div&quot;);
+        content.className = &quot;test-results-popover&quot;;
+
+        this._addIterationHeadingToPopover(iteration, content, heading);
+        this._addDividerToPopover(content);
+
+        var loadingIndicator = document.createElement(&quot;div&quot;);
+        loadingIndicator.className = &quot;loading-indicator&quot;;
+        loadingIndicator.textContent = &quot;Loading\u2026&quot;;
+        content.appendChild(loadingIndicator);
+
+        return content;
+    },
+
+    // Work around bug 80159: -webkit-user-select:none not respected when copying content.
+    // We set clipboard data manually, temporarily making non-selectable content hidden
+    // to easily get accurate selection text.
+    _onPopoverCopy: function(event) {
+        var iterator = document.createNodeIterator(
+            event.currentTarget,
+            NodeFilter.SHOW_ELEMENT,
+            {
+                acceptNode: function(element) {
+                    if (window.getComputedStyle(element).webkitUserSelect !== &quot;none&quot;)
+                        return NodeFilter.FILTER_ACCEPT;
+                    return NodeFilter.FILTER_SKIP;
+                }
+            }
+        );
+
+        while ((node = iterator.nextNode()))
+            node.style.visibility = &quot;visible&quot;;
+
+        event.currentTarget.style.visibility = &quot;hidden&quot;;
+        event.clipboardData.setData('text', window.getSelection());
+        event.currentTarget.style.visibility = &quot;&quot;;
+        return false;
+    },
+
+    _popoverContentForJavaScriptCoreTestRegressions: function(iteration, testName)
+    {
+        var content = document.createElement(&quot;div&quot;);
+        content.className = &quot;test-results-popover&quot;;
+
+        this._addIterationHeadingToPopover(iteration, content, &quot;javascriptcore test failures&quot;, iteration.javaScriptCoreTestStdioUrlForIteration(iteration, testName));
+        this._addDividerToPopover(content);
+
+        if (!iteration.javaScriptCoreTestResults.regressions) {
+            var message = document.createElement(&quot;div&quot;);
+            message.className = &quot;loading-failure&quot;;
+            message.textContent = &quot;Test results couldn\u2019t be loaded&quot;;
+            content.appendChild(message);
+            return content;
+        }
+
+        var regressions = iteration.javaScriptCoreTestResults.regressions;
+
+        for (var i = 0, end = regressions.length; i != end; ++i) {
+            var test = regressions[i];
+            var rowElement = document.createElement(&quot;div&quot;);
+            var testPathElement = document.createElement(&quot;span&quot;);
+            testPathElement.className = &quot;test-path&quot;;
+            testPathElement.textContent = test;
+            rowElement.appendChild(testPathElement);
+            content.appendChild(rowElement);
+        }
+
+        content.oncopy = this._onPopoverCopy;
+        return content;
+    },
+
+    _presentPopoverForJavaScriptCoreTestRegressions: function(testName, element, popover, iteration)
+    {
+        if (iteration.javaScriptCoreTestResults.regressions)
+            var content = this._popoverContentForJavaScriptCoreTestRegressions(iteration);
+        else {
+            var content = this._createLoadingIndicator(iteration, &quot;javascriptcore test failures&quot;);
+            iteration.loadJavaScriptCoreTestResults(testName, function() {
+                popover.content = this._popoverContentForJavaScriptCoreTestRegressions(iteration, testName);
+            }.bind(this));
+        }
+
+        var rect = Dashboard.Rect.rectFromClientRect(element.getBoundingClientRect());
+        popover.content = content;
+        popover.present(rect, [Dashboard.RectEdge.MIN_Y, Dashboard.RectEdge.MAX_Y, Dashboard.RectEdge.MAX_X, Dashboard.RectEdge.MIN_X]);
+        return true;
+    },
+
</ins><span class="cx">     _presentPopoverForRevisionRange: function(element, popover, context)
</span><span class="cx">     {
</span><span class="cx">         var content = document.createElement(&quot;div&quot;);
</span><span class="lines">@@ -147,7 +236,7 @@
</span><span class="cx">         return content;
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _addIterationHeadingToPopover: function(iteration, content, additionalText)
</del><ins>+    _addIterationHeadingToPopover: function(iteration, content, additionalText, additionalTextTarget)
</ins><span class="cx">     {
</span><span class="cx">         var title = document.createElement(&quot;div&quot;);
</span><span class="cx">         title.className = &quot;popover-iteration-heading&quot;;
</span><span class="lines">@@ -165,9 +254,14 @@
</span><span class="cx">         title.appendChild(buildbotLink);
</span><span class="cx"> 
</span><span class="cx">         if (additionalText) {
</span><del>-            var additionalTextElement = document.createElement(&quot;span&quot;);
</del><ins>+            var elementType = additionalTextTarget ? &quot;a&quot; : &quot;span&quot;;
+            var additionalTextElement = document.createElement(elementType);
</ins><span class="cx">             additionalTextElement.className = &quot;additional-text&quot;;
</span><span class="cx">             additionalTextElement.textContent = additionalText;
</span><ins>+            if (additionalTextTarget) {
+                additionalTextElement.href = additionalTextTarget;
+                additionalTextElement.target = &quot;_blank&quot;;
+            }
</ins><span class="cx">             title.appendChild(additionalTextElement);
</span><span class="cx">         }
</span><span class="cx"> 
</span><span class="lines">@@ -192,6 +286,27 @@
</span><span class="cx">         return fragment;
</span><span class="cx">     },
</span><span class="cx"> 
</span><ins>+    _testStepFailureDescription: function(failedStep)
+    {
+        if (!failedStep.failureCount)
+            return BuildbotIteration.TestSteps[failedStep.name] + &quot; failed&quot;;
+        if (failedStep.failureCount === 1)
+            return BuildbotIteration.TestSteps[failedStep.name] + &quot; failure&quot;;
+        return BuildbotIteration.TestSteps[failedStep.name] + &quot; failures&quot;;
+    },
+
+    _testStepFailureDescriptionWithCount: function(failedStep)
+    {
+        if (!failedStep.failureCount)
+            return this._testStepFailureDescription(failedStep);
+        if (failedStep.tooManyFailures) {
+            // E.g. &quot;50+ layout test failures&quot;, preventing line breaks around the &quot;+&quot;.
+            return failedStep.failureCount + &quot;\ufeff\uff0b\u00a0&quot; + this._testStepFailureDescription(failedStep);
+        }
+        // E.g. &quot;1 layout test failure&quot;, preventing line break after the number.
+        return failedStep.failureCount + &quot;\u00a0&quot; + this._testStepFailureDescription(failedStep);
+    },
+
</ins><span class="cx">     appendBuildStyle: function(queues, defaultLabel, appendFunction)
</span><span class="cx">     {
</span><span class="cx">         queues.forEach(function(queue) {
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTestResultsjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -184,4 +184,9 @@
</span><span class="cx">         // because buildbot counts regressions that had missing pixel results on retry (e.g. &quot;TEXT MISSING&quot;).
</span><span class="cx">         console.assert(data.num_missing &gt;= this.testsWithMissingResults.length);
</span><span class="cx">     },
</span><ins>+
+    addJavaScriptCoreTestFailures: function(data)
+    {
+        this.regressions = data.stressTestFailures;
+    },
</ins><span class="cx"> };
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBuildbotTesterQueueViewjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2013, 2014 Apple Inc. All rights reserved.
</del><ins>+ * Copyright (C) 2013, 2014, 2016 Apple Inc. All rights reserved.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -105,6 +105,9 @@
</span><span class="cx">                     if (failedStep.name === &quot;layout-test&quot;) {
</span><span class="cx">                         var status = new StatusLineView(messageElement, StatusLineView.Status.Bad, this._testStepFailureDescription(failedStep), failedStep.tooManyFailures ? failedStep.failureCount + &quot;\uff0b&quot; : failedStep.failureCount, iteration.queue.buildbot.layoutTestResultsURLForIteration(iteration));
</span><span class="cx">                         new PopoverTracker(status.statusBubbleElement, this._presentPopoverForLayoutTestRegressions.bind(this), iteration);
</span><ins>+                    } else if (failedStep.name in [&quot;jscore-test&quot;, &quot;webkit-32bit-jsc-test&quot;, &quot;webkit-jsc-cloop-test&quot;]) {
+                        var status = new StatusLineView(messageElement, StatusLineView.Status.Bad, this._testStepFailureDescription(failedStep), failedStep.failureCount, iteration.queue.buildbot.javaScriptCoreTestStdioUrlForIteration(iteration, failedStep.name));
+                        new PopoverTracker(status.statusBubbleElement, this._presentPopoverForJavaScriptCoreTestRegressions.bind(this, failedStep.name), iteration);
</ins><span class="cx">                     } else {
</span><span class="cx">                         var status = new StatusLineView(messageElement, StatusLineView.Status.Bad, this._testStepFailureDescription(failedStep), failedStep.failureCount ? failedStep.failureCount : undefined, failedStep.URL);
</span><span class="cx">                         new PopoverTracker(status.statusBubbleElement, this._presentPopoverForGenericTestFailures.bind(this), iteration);
</span><span class="lines">@@ -130,27 +133,6 @@
</span><span class="cx">         this.appendBuildStyle.call(this, this.debugQueues, &quot;Debug&quot;, appendBuilderQueueStatus);
</span><span class="cx">     },
</span><span class="cx"> 
</span><del>-    _testStepFailureDescription: function(failedStep)
-    {
-        if (!failedStep.failureCount)
-            return BuildbotIteration.TestSteps[failedStep.name] + &quot; failed&quot;;
-        if (failedStep.failureCount === 1)
-            return BuildbotIteration.TestSteps[failedStep.name] + &quot; failure&quot;;
-        return BuildbotIteration.TestSteps[failedStep.name] + &quot; failures&quot;;
-    },
-
-    _testStepFailureDescriptionWithCount: function(failedStep)
-    {
-        if (!failedStep.failureCount)
-            return this._testStepFailureDescription(failedStep);
-        if (failedStep.tooManyFailures) {
-            // E.g. &quot;50+ layout test failures&quot;, preventing line breaks around the &quot;+&quot;.
-            return failedStep.failureCount + &quot;\ufeff\uff0b\u00a0&quot; + this._testStepFailureDescription(failedStep);
-        }
-        // E.g. &quot;1 layout test failure&quot;, preventing line break after the number.
-        return failedStep.failureCount + &quot;\u00a0&quot; + this._testStepFailureDescription(failedStep);
-    },
-
</del><span class="cx">     _popoverContentForLayoutTestRegressions: function(iteration)
</span><span class="cx">     {
</span><span class="cx">         var hasTestHistory = typeof testHistory !== &quot;undefined&quot;;
</span><span class="lines">@@ -229,31 +211,7 @@
</span><span class="cx">             content.appendChild(rowElement);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        // Work around bug 80159: -webkit-user-select:none not respected when copying content.
-        // We set clipboard data manually, temporarily making non-selectable content hidden
-        // to easily get accurate selection text.
-        content.oncopy = function(event) {
-            var iterator = document.createNodeIterator(
-                event.currentTarget,
-                NodeFilter.SHOW_ELEMENT,
-                {
-                    acceptNode: function(element) {
-                        if (window.getComputedStyle(element).webkitUserSelect !== &quot;none&quot;)
-                            return NodeFilter.FILTER_ACCEPT;
-                        return NodeFilter.FILTER_SKIP;
-                    }
-                }
-            );
-
-            while ((node = iterator.nextNode()))
-                node.style.visibility = &quot;visible&quot;;
-
-            event.currentTarget.style.visibility = &quot;hidden&quot;;
-            event.clipboardData.setData('text', window.getSelection());
-            event.currentTarget.style.visibility = &quot;&quot;;
-            return false;
-        }
-
</del><ins>+        content.oncopy = this._onPopoverCopy;
</ins><span class="cx">         return content;
</span><span class="cx">     },
</span><span class="cx"> 
</span><span class="lines">@@ -262,17 +220,8 @@
</span><span class="cx">         if (iteration.layoutTestResults.regressions)
</span><span class="cx">             var content = this._popoverContentForLayoutTestRegressions(iteration);
</span><span class="cx">         else {
</span><del>-            var content = document.createElement(&quot;div&quot;);
-            content.className = &quot;test-results-popover&quot;;
</del><ins>+            var content = this._createLoadingIndicator(iteration, &quot;layout test failures&quot;);
</ins><span class="cx"> 
</span><del>-            this._addIterationHeadingToPopover(iteration, content, &quot;layout test failures&quot;);
-            this._addDividerToPopover(content);
-
-            var loadingIndicator = document.createElement(&quot;div&quot;);
-            loadingIndicator.className = &quot;loading-indicator&quot;;
-            loadingIndicator.textContent = &quot;Loading\u2026&quot;;
-            content.appendChild(loadingIndicator);
-
</del><span class="cx">             iteration.loadLayoutTestResults(function() {
</span><span class="cx">                 popover.content = this._popoverContentForLayoutTestRegressions(iteration);
</span><span class="cx">             }.bind(this));
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsindexhtml"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -63,8 +63,10 @@
</span><span class="cx">     &lt;script src=&quot;../Trac.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;../../../../../../../Source/ThirdParty/qunit/qunit/qunit.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/MockTrac.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;resources/MockBuildbot.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;resources/MockBuildbotQueue.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;resources/MockBuildbotQueueView.js&quot;&gt;&lt;/script&gt;
</span><ins>+    &lt;script src=&quot;resources/MockBuildbotTestResults.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;resources/tests.js&quot;&gt;&lt;/script&gt;
</span><span class="cx"> 
</span><span class="cx"> &lt;/head&gt;
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotjsfromrev201474trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotQueuejs"></a>
<div class="copfile"><h4>Copied: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js (from rev 201474, trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js) (0 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -0,0 +1,46 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ */
+
+MockBuildbot = function() {};
+
+MockBuildbot.prototype = {
+    constructor: MockBuildbot,
+
+    buildPageURLForIteration: function(iteration)
+    {
+        return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id;
+    },
+
+    javaScriptCoreTestFailuresURLForIteration: function(iteration, name)
+    {
+        return &quot;resources/test-jsc-results.json&quot;;
+    },
+
+    javaScriptCoreTestStdioUrlForIteration: function(iteration, name)
+    {
+        return this.baseURL + &quot;builders/&quot; + encodeURIComponent(iteration.queue.id) + &quot;/builds/&quot; + iteration.id + &quot;/steps/&quot; + name + &quot;/logs/stdio&quot;;
+
+    },
+}
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotQueuejs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -39,7 +39,7 @@
</span><span class="cx">         heading: &quot;&quot;,
</span><span class="cx">         crashesOnly: &quot;&quot;
</span><span class="cx">     };
</span><del>-    BuildbotQueue.call(this, &quot;Mock BuildBot&quot;, &quot;id&quot;, info);
</del><ins>+    BuildbotQueue.call(this, new MockBuildbot(), &quot;id&quot;, info);
</ins><span class="cx"> };
</span><span class="cx"> 
</span><span class="cx"> BaseObject.addConstructorFunctions(MockBuildbotQueue);
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotTestResultsjsfromrev201474trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcesMockBuildbotQueuejs"></a>
<div class="copfile"><h4>Copied: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js (from rev 201474, trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js) (0 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -0,0 +1,35 @@
</span><ins>+/*
+ * Copyright (C) 2016 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.
+ */
+
+MockBuildbotTestResults = function() {};
+
+MockBuildbotTestResults.prototype = {
+    constructor: MockBuildbotTestResults,
+
+    addJavaScriptCoreTestFailures: function(data)
+    {
+         this.regressions = data.stressTestFailures;
+    },
+};
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcestestjscresultsjson"></a>
<div class="addfile"><h4>Added: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json (0 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -0,0 +1 @@
</span><ins>+{&quot;stressTestFailures&quot;:[&quot;lorem ipsum dolor sit amet&quot;, &quot;consectetur adipiscing elit&quot;, &quot;sed do eiusmod tempor incididunt ut labore et dolore magna aliqua&quot;], &quot;allApiTestsPassed&quot;: true}
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptstestsresourcestestsjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -263,6 +263,90 @@
</span><span class="cx">     strictEqual(this.view._formatRevisionForDisplay(&quot;0e498db5d8e5b5a342631&quot;, repository), &quot;0e498db&quot;, &quot;Should be 0e498db&quot;);
</span><span class="cx"> });
</span><span class="cx"> 
</span><ins>+test(&quot;_popoverContentForJavaScriptCoreTestRegressions load failure UI test&quot;, function()
+{
+    var finished = false;
+    var iteration = new BuildbotIteration(this.queue, 1, finished);
+    iteration.javaScriptCoreTestResults = new MockBuildbotTestResults();
+
+    var view = new BuildbotQueueView();
+    var content = view._popoverContentForJavaScriptCoreTestRegressions(iteration);
+
+    var numChildrenInEmptyPopoverContent = 2;
+    strictEqual(content.childNodes.length, 1 + numChildrenInEmptyPopoverContent);
+    strictEqual(content.childNodes[numChildrenInEmptyPopoverContent].className, &quot;loading-failure&quot;, &quot;Popover for loading failure must have the appropriate class&quot;);
+    strictEqual(content.childNodes[numChildrenInEmptyPopoverContent].textContent, &quot;Test results couldn\u2019t be loaded&quot;, &quot;Popover for loading failure must use the correct text&quot;);
+});
+
+test(&quot;_presentPopoverForJavaScriptCoreTestRegressions including loading&quot;, function()
+{
+    var finished = false;
+    var element = document.createElement(&quot;div&quot;);
+    var popover = new Dashboard.Popover();
+    var iteration = new BuildbotIteration(this.queue, 1, finished);
+    iteration.javaScriptCoreTestResults = new MockBuildbotTestResults();
+
+    var view = new BuildbotQueueView();
+    view._presentPopoverForJavaScriptCoreTestRegressions(element, popover, iteration, &quot;jscore-test&quot;);
+
+    JSON.load(&quot;resources/test-jsc-results.json&quot;, function(data)
+    {
+        var testRegressions = data.stressTestFailures;
+        var numChildrenInEmptyPopoverContent = 2;
+        strictEqual(popover._content.childNodes.length - numChildrenInEmptyPopoverContent,
+            testRegressions.length,
+            &quot;Number of failures in popover must be equal to number of failed tests&quot;);
+
+        for (var i = 0; i &lt; testRegressions.length; i++)
+        {
+            strictEqual(popover._content.childNodes[i+numChildrenInEmptyPopoverContent].childNodes[0].textContent,
+                testRegressions[i],
+                &quot;Names of failures must match&quot;
+            );
+        }
+    });
+});
+
+test(&quot;_createLoadingIndicator&quot;, function()
+{
+    var finished = false;
+    var iteration = new BuildbotIteration(this.queue, 1, finished);
+
+    var view = new BuildbotQueueView();
+    var heading = &quot;Fair is foul, and foul is fair&quot;;
+    var content = view._createLoadingIndicator(iteration, heading);
+
+    var numChildrenInEmptyPopoverContent = 2;
+    strictEqual(content.childNodes.length, 1 + numChildrenInEmptyPopoverContent);
+    strictEqual(content.childNodes[numChildrenInEmptyPopoverContent].className, &quot;loading-indicator&quot;, &quot;Popover for loading indicator must have the appropriate class&quot;);
+    strictEqual(content.childNodes[numChildrenInEmptyPopoverContent].textContent, &quot;Loading\u2026&quot;, &quot;Popover for loading failure must use the correct text&quot;);
+});
+
+test(&quot;_presentPopoverForJavaScriptCoreTestRegressions already loaded&quot;, function()
+{
+    var finished = false;
+    var element = document.createElement(&quot;div&quot;);
+    var popover = new Dashboard.Popover();
+    var iteration = new BuildbotIteration(this.queue, 1, finished);
+    iteration.javaScriptCoreTestResults = {&quot;regressions&quot;: [&quot;uno&quot;, &quot;dos&quot;, &quot;tres&quot;]};
+
+    var view = new BuildbotQueueView();
+    view._presentPopoverForJavaScriptCoreTestRegressions(element, popover, iteration, &quot;jscore-test&quot;);
+
+    var numChildrenInEmptyPopoverContent = 2;
+    strictEqual(popover._content.childNodes.length - numChildrenInEmptyPopoverContent,
+        iteration.javaScriptCoreTestResults.regressions.length,
+        &quot;Number of failures in popover must be equal to number of failed tests&quot;);
+
+    for (var i = 0; i &lt; iteration.javaScriptCoreTestResults.regressions.length; i++)
+    {
+        strictEqual(popover._content.childNodes[i+numChildrenInEmptyPopoverContent].childNodes[0].textContent,
+            iteration.javaScriptCoreTestResults.regressions[i],
+            &quot;Names of failures must match&quot;
+        );
+    }
+});
+
</ins><span class="cx"> module(&quot;BuildBotQueue&quot;, {
</span><span class="cx">     setup: function() {
</span><span class="cx">         Dashboard.Repository.OpenSource.trac = new MockTrac();
</span><span class="lines">@@ -355,4 +439,4 @@
</span><span class="cx">     ok(this.queue.compareIterationsByRevisions(iteration2, iteration1) &lt; 0, &quot;compareIterationsByRevisions: less than&quot;);
</span><span class="cx">     ok(this.queue.compareIterationsByRevisions(iteration1, iteration2) &gt; 0, &quot;compareIterationsByRevisions: greater than&quot;);
</span><span class="cx">     strictEqual(this.queue.compareIterationsByRevisions(iteration2, iteration2), 0, &quot;compareIterationsByRevisions: equal&quot;);
</span><del>-});
</del><span class="cx">\ No newline at end of file
</span><ins>+});
</ins></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (201474 => 201475)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-05-27 23:58:28 UTC (rev 201474)
+++ trunk/Tools/ChangeLog        2016-05-28 00:06:01 UTC (rev 201475)
</span><span class="lines">@@ -1,3 +1,108 @@
</span><ins>+2016-05-27  Srinivasan Vijayaraghavan  &lt;svijayaraghavan@apple.com&gt;
+
+        Display failing JSC stress tests in buildbot dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=156595
+
+        Reviewed by Alexey Proskuryakov.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js:
+        (Buildbot.prototype.javaScriptCoreTestFailuresURLForIteration):
+        (Buildbot.prototype.javaScriptCoreTestStdioUrlForIteration):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js:
+        (BuildbotCombinedQueueView.prototype.update):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js:
+        (BuildbotIteration):
+        (BuildbotIteration.prototype._parseData):
+        (BuildbotIteration.prototype.loadLayoutTestResults):
+        (BuildbotIteration.prototype.):
+        (BuildbotIteration.prototype.loadJavaScriptCoreTestResults):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:
+        (BuildbotQueueView.prototype._createLoadingIndicator):
+        (BuildbotQueueView.prototype.):
+        (BuildbotQueueView.prototype._onPopoverCopy):
+        (BuildbotQueueView.prototype._popoverContentForJavaScriptCoreTestRegressions):
+        (BuildbotQueueView.prototype._presentPopoverForJavaScriptCoreTestRegressions):
+        (BuildbotQueueView.prototype._addIterationHeadingToPopover):
+        (BuildbotQueueView.prototype._testStepFailureDescription):
+        (BuildbotQueueView.prototype._testStepFailureDescriptionWithCount):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js:
+        (BuildbotTestResults.prototype.addJavaScriptCoreTestFailures):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js:
+        (BuildbotTesterQueueView.prototype.appendBuilderQueueStatus):
+        (BuildbotTesterQueueView.prototype.update):
+        (BuildbotTesterQueueView.prototype._popoverContentForLayoutTestRegressions):
+        (BuildbotTesterQueueView.prototype._presentPopoverForLayoutTestRegressions):
+        (BuildbotTesterQueueView.prototype._testStepFailureDescription): Deleted.
+        (BuildbotTesterQueueView.prototype._testStepFailureDescriptionWithCount): Deleted.
+        (BuildbotTesterQueueView.prototype.): Deleted.
+        (BuildbotTesterQueueView.prototype.content.oncopy): Deleted.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js.
+        (MockBuildbot):
+        (MockBuildbot.prototype.buildPageURLForIteration):
+        (MockBuildbot.prototype.javaScriptCoreTestFailuresURLForIteration):
+        (MockBuildbot.prototype.javaScriptCoreTestStdioUrlForIteration):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js:
+        (MockBuildbotQueue):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js.
+        (MockBuildbotTestResults):
+        (MockBuildbotTestResults.prototype.addJavaScriptCoreTestFailures):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json: Added.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js:
+
+2016-05-27  Srinivasan Vijayaraghavan  &lt;svijayaraghavan@apple.com&gt;
+
+        Display failing JSC stress tests in buildbot dashboard
+        https://bugs.webkit.org/show_bug.cgi?id=156595
+
+        Reviewed by Alexey Proskuryakov.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Buildbot.js:
+        (Buildbot.prototype.javaScriptCoreTestFailuresURLForIteration): Generate the URL for raw JSON output of
+        JSC tests.
+        (Buildbot.prototype.javaScriptCoreTestStdioURLForIteration): Generate the URL for human-readable stdio output
+        of JSC tests.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotCombinedQueueView.js:
+        (BuildbotCombinedQueueView.prototype.update): Display JSC test results in popover.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotIteration.js:
+        (BuildbotIteration): Add javaScriptCoreTestResults variable.
+        (BuildbotIteration.prototype.): Check for javascriptcore tests step.
+        (BuildbotIteration.prototype.loadLayoutTestResults): Add comma at closing brace.
+        (BuildbotIteration.prototype.loadJavaScriptCoreTestResults): Fetch JSON from Buildbot server.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotQueueView.js:
+        (BuildbotQueueView.prototype._createLoadingIndicator): Reusable function.
+        (BuildbotQueueView.prototype._onPopoverCopy): Reusable copy event handler to allow accurate copying of text
+        from popovers.
+        (BuildbotQueueView.prototype._popoverContentForJavaScriptCoreTestRegressions): Generates the popover bubble's
+        inner HTML from the JSC failure data.
+        (BuildbotQueueView.prototype._presentPopoverForJavaScriptCoreTestRegressions): Generate the popover bubble
+        for JSC results and handle request failures.
+        (BuildbotQueueView.prototype._testStepFailureDescription): Moved from subclass.
+        (BuildbotQueueView.prototype._testStepFailureDescriptionWithCount): Moved from subclass.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTestResults.js:
+        (BuildbotTestResults.prototype.addJavaScriptCoreTestFailures): Parse JSON into a list of failing tests.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BuildbotTesterQueueView.js:
+        (BuildbotTesterQueueView.prototype.appendBuilderQueueStatus): Instantiate PopoverTrackers for builds whose 
+        only failures are JSC tests.
+        (BuildbotTesterQueueView.prototype._popoverContentForLayoutTestRegressions): Use _onPopoverCopy.
+        (BuildbotTesterQueueView.prototype._presentPopoverForLayoutTestRegressions): Use _createLoadingIndicator.
+        (BuildbotTesterQueueView.prototype._testStepFailureDescription): Deleted. Moved to superclass.
+        (BuildbotTesterQueueView.prototype._testStepFailureDescriptionWithCount): Deleted. Moved to superclass.
+        (BuildbotTesterQueueView.prototype.content.oncopy): Deleted. Using superclass's reusable function as copy handler instead.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/index.html: Add new script files.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbot.js: Added.
+        (MockBuildbot): Mocked version of Buildbot, only containing URL methods.
+        (MockBuildbot.prototype.buildPageURLForIteration): Same as real Buildbot.js
+        (MockBuildbot.prototype.javaScriptCoreTestFailuresURLForIteration): Points to local file containing JSON for test.
+        (MockBuildbot.prototype.javaScriptCoreTestStdioURLForIteration): Same as real Buildbot.js
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotQueue.js:
+        (MockBuildbotQueue): Use a MockBuildbot() instead of a string.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/MockBuildbotTestResults.js: Added.
+        (MockBuildbotTestResults): Mocked version of BuildbotTestResults.
+        (MockBuildbotTestResults.prototype.addJavaScriptCoreTestFailures): Sets the 'regressions' variable.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/test-jsc-results.json: Added.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/tests/resources/tests.js: Add four groups of tests.
+
</ins><span class="cx"> 2016-05-27  Chris Dumez  &lt;cdumez@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         WorkQueue::dispatch() / RunLoop::dispatch() should not copy captured lambda variables
</span></span></pre>
</div>
</div>

</body>
</html>