<!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>[174366] 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/174366">174366</a></dd>
<dt>Author</dt> <dd>ap@apple.com</dd>
<dt>Date</dt> <dd>2014-10-06 14:37:28 -0700 (Mon, 06 Oct 2014)</dd>
</dl>

<h3>Log Message</h3>
<pre>build.webkit.org/dashboard: Add commit queue
https://bugs.webkit.org/show_bug.cgi?id=137462

Reviewed by Tim Horton.

Generalizes EWS into &quot;bubble queue&quot;, which also includes commit queue and style queue.
Style queue is still invisible, as it doesn't have an associated platform, and also
we never have problems with it anyway, so it's not worth watching.

The UI now allows for adding more bots to the Other column (such as leaks bot).
To make that actually happen, we'll need to refactor QueueView, allowing for multiple
sources of data in a cell.

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js.
(BubbleQueue):
(BubbleQueue.prototype.get statusPageURL):
(BubbleQueue.prototype.update):
(BubbleQueue.prototype.loadDetailedStatus):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js.
(BubbleQueueServer):
(BubbleQueueServer.prototype.jsonQueueLengthURL):
(BubbleQueueServer.prototype.jsonQueueStatusURL):
(BubbleQueueServer.prototype.queueStatusURL):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js.
(BubbleQueueView):
(BubbleQueueView.prototype.update.appendQueue):
(BubbleQueueView.prototype.update):
(BubbleQueueView.prototype._addQueueHeadingToPopover):
(BubbleQueueView.prototype._popoverContentForBubbleQueue):
(BubbleQueueView.prototype._presentPopoverForBubbleQueue):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js: Removed.
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js: Removed.
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js: Removed.
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js:
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css:
(.bubble-server-popover .popover-queue-heading .queue-charts-link):
(.bubble-server-popover .latest-status-no-link):
(.bubble-server-popover .bot-status-description):
* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html:

* BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js:
(buildAggregateTable):
(buildQueuesTable):
Removed dysfunctional support for EWS for now. It will be different.</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsInitializationjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsMainjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsMetricsMainjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardStylesQueueViewcss">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardindexhtml">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
</ul>

<h3>Added Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueuejs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueueServerjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js</a></li>
</ul>

<h3>Removed Paths</h3>
<ul>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueuejs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js</a></li>
<li><a href="#trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueueViewjs">trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueuejsfromrev174343trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueuejs"></a>
<div class="copfile"><h4>Copied: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js (from rev 174343, trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js) (0 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -0,0 +1,142 @@
</span><ins>+/*
+ * Copyright (C) 2013, 2014 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.
+ */
+
+BubbleQueue = function(queueServer, id, info)
+{
+    BaseObject.call(this);
+
+    console.assert(queueServer);
+    console.assert(id);
+
+    this.queueServer = queueServer;
+    this.id = id;
+    this.title = info.title || &quot;\xa0&quot;;
+
+    this.platform = info.platform ? info.platform.name : &quot;unknown&quot;;
+};
+
+BaseObject.addConstructorFunctions(BubbleQueue);
+
+BubbleQueue.Event = {
+    Updated: &quot;updated&quot;
+};
+
+BubbleQueue.prototype = {
+    constructor: BubbleQueue,
+    __proto__: BaseObject.prototype,
+
+    get statusPageURL()
+    {
+        return this.queueServer.queueStatusURL(this.id);
+    },
+
+    get chartsPageURL()
+    {
+        return this._chartsPageURL;
+    },
+
+    get patchCount()
+    {
+        return this._patchCount;
+    },
+
+    get loadedDetailedStatus()
+    {
+        return this._loadedDetailedStatus;
+    },
+
+    get patches()
+    {
+        console.assert(this._loadedDetailedStatus);
+        return this._queue;
+    },
+
+    get bots()
+    {
+        console.assert(this._loadedDetailedStatus);
+        return this._bots;
+    },
+
+    update: function()
+    {
+        this._loadedDetailedStatus = false;
+
+        JSON.load(this.queueServer.jsonQueueLengthURL(this.id), function(data) {
+            var newPatchCount = data.queue_length;
+            if (this._patchCount == newPatchCount)
+                return;
+            this._patchCount = newPatchCount;
+            this.dispatchEventToListeners(BubbleQueue.Event.Updated, null);
+        }.bind(this));
+    },
+
+    loadDetailedStatus: function(callback)
+    {
+        JSON.load(this.queueServer.jsonQueueStatusURL(this.id), function(data) {
+            this._queue = [];
+            for (var i = 0, end = data.queue.length; i &lt; end; ++i) {
+                var patch = data.queue[i];
+                var activeSinceTime = patch.active_since ? Date.parse(patch.active_since) : 0;
+                this._queue.push({
+                    attachmentID: patch.attachment_id,
+                    statusPageURL: patch.status_page,
+                    latestMessage: patch.latest_message,
+                    latestMessageTime: patch.latest_message_time ? new Date(patch.latest_message_time) : null,
+                    detailedResultsURLForLatestMessage: patch.latest_results,
+                    retryCount: patch.retry_count,
+                    active: patch.active,
+                    activeSince: new Date(activeSinceTime),
+                });
+            }
+
+            this._bots = [];
+            for (var i = 0, end = data.bots.length; i &lt; end; ++i) {
+                var bot = data.bots[i];
+                var latestMessageTime = bot.latest_message_time ? Date.parse(bot.latest_message_time) : 0;
+
+                var oneDayInMilliseconds = 24 * 60 * 60 * 1000;
+                var botIsCurrentlyActive = Date.now() &lt; latestMessageTime + oneDayInMilliseconds;
+                if (!botIsCurrentlyActive)
+                    continue;
+
+                // Sometimes (rarely), there are status messages with an empty bot name added to the database.
+                if (!bot.bot_id.length)
+                    bot.bot_id = &quot;&lt;empty name&gt;&quot;;
+
+                this._bots.push({
+                    id: bot.bot_id,
+                    statusPageURL: bot.status_page,
+                    latestMessageTime: new Date(latestMessageTime),
+                });
+            }
+
+            console.assert(this.statusPageURL === data.status_page);
+            this._chartsPageURL = data.charts_page;
+
+            this._loadedDetailedStatus = true;
+            callback();
+        }.bind(this));
+    },
+};
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueueServerjsfromrev174343trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSjs"></a>
<div class="copfile"><h4>Copied: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js (from rev 174343, trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js) (0 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -0,0 +1,67 @@
</span><ins>+/*
+ * Copyright (C) 2013, 2014 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.
+ */
+
+BubbleQueueServer = function()
+{
+    const queueInfo = {
+        &quot;commit-queue&quot;: {platform: Dashboard.Platform.MacOSXMountainLion, shortName: &quot;commit&quot;, title: &quot;Commit Queue&quot;},
+        &quot;style-queue&quot;: {shortName: &quot;style&quot;, title: &quot;Style Checker Queue&quot;},
+        &quot;mac-ews&quot;: {platform: Dashboard.Platform.MacOSXMountainLion, shortName: &quot;mac&quot;, title: &quot;WebKit1\xa0Release\xa0Tests\xa0EWS&quot;},
+        &quot;mac-wk2-ews&quot;: {platform: Dashboard.Platform.MacOSXMountainLion, shortName: &quot;mac-wk2&quot;, title: &quot;WebKit2\xa0Release\xa0Tests\xa0EWS&quot;},
+        &quot;win-ews&quot;: {platform: Dashboard.Platform.Windows7, shortName: &quot;win&quot;, title: &quot;WebKit1\xa0Release\xa0Build\xa0EWS&quot;},
+        &quot;gtk-wk2-ews&quot;: {platform: Dashboard.Platform.LinuxGTK, shortName: &quot;gtk-wk2&quot;, title: &quot;WebKit2\xa0Release\xa0Build\xa0EWS&quot;},
+        &quot;efl-wk2-ews&quot;: {platform: Dashboard.Platform.LinuxEFL, shortName: &quot;efl-wk2&quot;, title: &quot;WebKit2\xa0Release\xa0Build\xa0EWS&quot;}
+    };
+
+    BaseObject.call(this);
+
+    this.baseURL = &quot;https://webkit-queues.appspot.com/&quot;;
+    this.queues = {};
+
+    for (var id in queueInfo)
+        this.queues[id] = new BubbleQueue(this, id, queueInfo[id]);
+};
+
+BaseObject.addConstructorFunctions(BubbleQueueServer);
+
+BubbleQueueServer.prototype = {
+    constructor: BubbleQueueServer,
+    __proto__: BaseObject.prototype,
+
+    jsonQueueLengthURL: function(queueID)
+    {
+        return this.baseURL + &quot;queue-length-json/&quot; + encodeURIComponent(queueID);
+    },
+
+    jsonQueueStatusURL: function(queueID)
+    {
+        return this.baseURL + &quot;queue-status-json/&quot; + encodeURIComponent(queueID);
+    },
+
+    queueStatusURL: function(queueID)
+    {
+        return this.baseURL + &quot;queue-status/&quot; + encodeURIComponent(queueID);
+    },
+};
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsBubbleQueueViewjsfromrev174343trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueueViewjs"></a>
<div class="copfile"><h4>Copied: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js (from rev 174343, trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js) (0 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js                                (rev 0)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -0,0 +1,230 @@
</span><ins>+/*
+ * Copyright (C) 2013, 2014 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.
+ */
+
+BubbleQueueView = function(queues)
+{
+    QueueView.call(this);
+
+    this.queues = queues || [];
+
+    this.queues.forEach(function(queue) {
+        if (this.platform &amp;&amp; this.platform != queue.platform)
+            throw &quot;A bubble queue view may not contain queues for multiple platforms.&quot;
+        else
+            this.platform = queue.platform;
+        queue.addEventListener(BubbleQueue.Event.Updated, this._queueUpdated, this);
+    }.bind(this));
+
+    this.update();
+};
+
+BaseObject.addConstructorFunctions(BubbleQueueView);
+
+BubbleQueueView.prototype = {
+    constructor: BubbleQueueView,
+    __proto__: QueueView.prototype,
+
+    update: function()
+    {
+        QueueView.prototype.update.call(this);
+
+        this.element.removeChildren();
+
+        function appendQueue(queue)
+        {
+            var queueLabel = document.createElement(&quot;a&quot;);
+            queueLabel.classList.add(&quot;queueLabel&quot;);
+            queueLabel.textContent = queue.title;
+            queueLabel.href = queue.statusPageURL;
+            queueLabel.target = &quot;_blank&quot;;
+            this.element.appendChild(queueLabel);
+
+            var patchCount = queue.patchCount;
+
+            var message = patchCount === 1 ? &quot;patch in queue&quot; : &quot;patches in queue&quot;;
+            var status = new StatusLineView(message, StatusLineView.Status.Neutral, null, patchCount || &quot;0&quot;);
+            this.element.appendChild(status.element);
+
+            new PopoverTracker(status.statusBubbleElement, this._presentPopoverForBubbleQueue.bind(this), queue);
+        }
+
+        this.queues.forEach(function(queue) {
+            appendQueue.call(this, queue);
+        }, this);
+    },
+
+    addLinkToRow: function(rowElement, className, text, url)
+    {
+        var linkElement = document.createElement(&quot;a&quot;);
+        linkElement.className = className;
+        linkElement.textContent = text;
+        linkElement.href = url;
+        linkElement.target = &quot;_blank&quot;;
+        rowElement.appendChild(linkElement);
+    },
+
+    addTextToRow: function(rowElement, className, text)
+    {
+        var spanElement = document.createElement(&quot;span&quot;);
+        spanElement.className = className;
+        spanElement.textContent = text;
+        rowElement.appendChild(spanElement);
+    },
+
+    _addQueueHeadingToPopover: function(queue, content)
+    {
+        var title = document.createElement(&quot;div&quot;);
+        title.className = &quot;popover-queue-heading&quot;;
+
+        this.addTextToRow(title, &quot;queue-name&quot;, queue.id);
+        this.addLinkToRow(title, &quot;queue-status-link&quot;, &quot;status page&quot;, queue.statusPageURL);
+        this.addLinkToRow(title, &quot;queue-charts-link&quot;, &quot;charts&quot;, queue.chartsPageURL);
+
+        content.appendChild(title);
+    },
+
+    _addBotsHeadingToPopover: function(queue, content)
+    {
+        var title = document.createElement(&quot;div&quot;);
+        title.className = &quot;popover-bots-heading&quot;;
+        title.textContent = &quot;latest bot event&quot;;
+        content.appendChild(title);
+    },
+
+    _addDividerToPopover: function(content)
+    {
+        var divider = document.createElement(&quot;div&quot;);
+        divider.className = &quot;divider&quot;;
+        content.appendChild(divider);
+    },
+
+    _timeIntervalString: function(time)
+    {
+        var secondsInHour = 60 * 60;
+        var timeDifference = (Date.now() - time.getTime()) / 1000;
+        var hours = Math.floor(timeDifference / secondsInHour);
+        var minutes = Math.floor((timeDifference - hours * secondsInHour) / 60);
+        var hoursPart = &quot;&quot;;
+        if (hours === 1)
+            hoursPart = &quot;1\xa0hour and &quot;;
+        else if (hours &gt; 0)
+            hoursPart = hours + &quot;\xa0hours and &quot;;
+        if (!minutes)
+            return &quot;less than a minute&quot;;
+        if (minutes === 1)
+            return hoursPart + &quot;1\xa0minute&quot;;
+        return hoursPart + minutes + &quot;\xa0minutes&quot;;
+    },
+
+    _popoverContentForBubbleQueue: function(queue)
+    {
+        var content = document.createElement(&quot;div&quot;);
+        content.className = &quot;bubble-server-popover&quot;;
+
+        this._addQueueHeadingToPopover(queue, content);
+        this._addDividerToPopover(content);
+
+        var patches = queue.patches;
+        for (var i = 0, end = patches.length; i &lt; end; ++i) {
+            var patch = patches[i];
+
+            var rowElement = document.createElement(&quot;div&quot;);
+
+            this.addLinkToRow(rowElement, &quot;patch-details-link&quot;, patch.attachmentID, patch.statusPageURL);
+
+            if (patch.retryCount)
+                this.addTextToRow(rowElement, &quot;failure-count&quot;, patch.retryCount + &quot;\xa0&quot; + (patch.retryCount === 1 ? &quot;attempt&quot; : &quot;attempts&quot;));
+
+            if (patch.detailedResultsURLForLatestMessage)
+                this.addLinkToRow(rowElement, &quot;latest-status-with-link&quot;, patch.latestMessage, patch.detailedResultsURLForLatestMessage);
+            else if (patch.latestMessage &amp;&amp; patch.latestMessage.length)
+                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, patch.latestMessage);
+            else if (patch.active) {
+                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, &quot;Started&quot;);
+                this.addTextToRow(rowElement, &quot;time-since-message&quot;, this._timeIntervalString(patch.activeSince) + &quot;\xa0ago&quot;);
+            } else
+                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, &quot;Not started yet&quot;);
+
+            if (patch.latestMessageTime)
+                this.addTextToRow(rowElement, &quot;time-since-message&quot;, this._timeIntervalString(patch.latestMessageTime) + &quot;\xa0ago&quot;);
+
+            this.addLinkToRow(rowElement, &quot;bugzilla-link&quot;, &quot;bugzilla&quot;, bugzilla.detailsURLForAttachment(patch.attachmentID));
+
+            content.appendChild(rowElement);
+        }
+
+        this._addDividerToPopover(content);
+        this._addBotsHeadingToPopover(queue, content);
+        this._addDividerToPopover(content);
+
+        var bots = queue.bots;
+        for (var i = 0, end = bots.length; i &lt; end; ++i) {
+            var bot = bots[i];
+
+            var rowElement = document.createElement(&quot;div&quot;);
+
+            this.addLinkToRow(rowElement, &quot;bot-status-link&quot;, bot.id, bot.statusPageURL);
+            this.addTextToRow(rowElement, &quot;bot-status-description&quot;, this._timeIntervalString(bot.latestMessageTime) + &quot;\xa0ago&quot;);
+
+            content.appendChild(rowElement);
+        }
+
+        return content;
+    },
+
+    _presentPopoverForBubbleQueue: function(element, popover, queue)
+    {
+        if (queue.loadedDetailedStatus)
+            var content = this._popoverContentForBubbleQueue(queue);
+        else {
+            var content = document.createElement(&quot;div&quot;);
+            content.className = &quot;bubble-server-popover&quot;;
+
+            var loadingIndicator = document.createElement(&quot;div&quot;);
+            loadingIndicator.className = &quot;loading-indicator&quot;;
+            loadingIndicator.textContent = &quot;Loading\u2026&quot;;
+            content.appendChild(loadingIndicator);
+
+            queue.loadDetailedStatus(function() {
+                popover.content = this._popoverContentForBubbleQueue(queue);
+            }.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;
+    },
+
+    _updateQueues: function()
+    {
+        this.queues.forEach(function(queue) { queue.update(); });
+    },
+
+    _queueUpdated: function(event)
+    {
+        this.updateSoon();
+    },
+};
</ins></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSjs"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -1,65 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 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.
- */
-
-EWS = function()
-{
-    const queueInfo = {
-        &quot;mac&quot;: {platform: Dashboard.Platform.MacOSXMountainLion, title: &quot;WebKit1 Release Tests&quot;},
-        &quot;mac-wk2&quot;: {platform: Dashboard.Platform.MacOSXMountainLion, title: &quot;WebKit2 Release Tests&quot;},
-        &quot;win&quot;: {platform: Dashboard.Platform.Windows7, title: &quot;WebKit1 Release Build&quot;},
-        &quot;gtk-wk2&quot;: {platform: Dashboard.Platform.LinuxGTK, title: &quot;WebKit2 Release Build&quot;},
-        &quot;efl-wk2&quot;: {platform: Dashboard.Platform.LinuxEFL, title: &quot;WebKit2 Release Build&quot;}
-    };
-
-    BaseObject.call(this);
-
-    this.baseURL = &quot;https://webkit-queues.appspot.com/&quot;;
-    this.queues = {};
-
-    for (var id in queueInfo)
-        this.queues[id] = new EWSQueue(this, id, queueInfo[id]);
-};
-
-BaseObject.addConstructorFunctions(EWS);
-
-EWS.prototype = {
-    constructor: EWS,
-    __proto__: BaseObject.prototype,
-
-    jsonQueueLengthURL: function(queueID)
-    {
-        return this.baseURL + &quot;queue-length-json/&quot; + encodeURIComponent(queueID) + &quot;-ews&quot;;
-    },
-
-    jsonQueueStatusURL: function(queueID)
-    {
-        return this.baseURL + &quot;queue-status-json/&quot; + encodeURIComponent(queueID) + &quot;-ews&quot;;
-    },
-
-    queueStatusURL: function(queueID)
-    {
-        return this.baseURL + &quot;queue-status/&quot; + encodeURIComponent(queueID) + &quot;-ews&quot;;
-    },
-};
</del></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueuejs"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -1,142 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 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.
- */
-
-EWSQueue = function(ews, id, info)
-{
-    BaseObject.call(this);
-
-    console.assert(ews);
-    console.assert(id);
-
-    this.ews = ews;
-    this.id = id;
-    this.title = info.title || &quot;\xa0&quot;;
-
-    this.platform = info.platform.name || &quot;unknown&quot;;
-};
-
-BaseObject.addConstructorFunctions(EWSQueue);
-
-EWSQueue.Event = {
-    Updated: &quot;updated&quot;
-};
-
-EWSQueue.prototype = {
-    constructor: EWSQueue,
-    __proto__: BaseObject.prototype,
-
-    get statusPageURL()
-    {
-        return this.ews.queueStatusURL(this.id);
-    },
-
-    get chartsPageURL()
-    {
-        return this._chartsPageURL;
-    },
-
-    get patchCount()
-    {
-        return this._patchCount;
-    },
-
-    get loadedDetailedStatus()
-    {
-        return this._loadedDetailedStatus;
-    },
-
-    get patches()
-    {
-        console.assert(this._loadedDetailedStatus);
-        return this._queue;
-    },
-
-    get bots()
-    {
-        console.assert(this._loadedDetailedStatus);
-        return this._bots;
-    },
-
-    update: function()
-    {
-        this._loadedDetailedStatus = false;
-
-        JSON.load(this.ews.jsonQueueLengthURL(this.id), function(data) {
-            var newPatchCount = data.queue_length;
-            if (this._patchCount == newPatchCount)
-                return;
-            this._patchCount = newPatchCount;
-            this.dispatchEventToListeners(EWSQueue.Event.Updated, null);
-        }.bind(this));
-    },
-
-    loadDetailedStatus: function(callback)
-    {
-        JSON.load(this.ews.jsonQueueStatusURL(this.id), function(data) {
-            this._queue = [];
-            for (var i = 0, end = data.queue.length; i &lt; end; ++i) {
-                var patch = data.queue[i];
-                var activeSinceTime = patch.active_since ? Date.parse(patch.active_since) : 0;
-                this._queue.push({
-                    attachmentID: patch.attachment_id,
-                    statusPageURL: patch.status_page,
-                    latestMessage: patch.latest_message,
-                    latestMessageTime: patch.latest_message_time ? new Date(patch.latest_message_time) : null,
-                    detailedResultsURLForLatestMessage: patch.latest_results,
-                    retryCount: patch.retry_count,
-                    active: patch.active,
-                    activeSince: new Date(activeSinceTime),
-                });
-            }
-
-            this._bots = [];
-            for (var i = 0, end = data.bots.length; i &lt; end; ++i) {
-                var bot = data.bots[i];
-                var latestMessageTime = bot.latest_message_time ? Date.parse(bot.latest_message_time) : 0;
-
-                var oneDayInMilliseconds = 24 * 60 * 60 * 1000;
-                var botIsCurrentlyActive = Date.now() &lt; latestMessageTime + oneDayInMilliseconds;
-                if (!botIsCurrentlyActive)
-                    continue;
-
-                // Sometimes (rarely), there are status messages with an empty bot name added to the database.
-                if (!bot.bot_id.length)
-                    bot.bot_id = &quot;&lt;empty name&gt;&quot;;
-
-                this._bots.push({
-                    id: bot.bot_id,
-                    statusPageURL: bot.status_page,
-                    latestMessageTime: new Date(latestMessageTime),
-                });
-            }
-
-            console.assert(this.statusPageURL === data.status_page);
-            this._chartsPageURL = data.charts_page;
-
-            this._loadedDetailedStatus = true;
-            callback();
-        }.bind(this));
-    },
-};
</del></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsEWSQueueViewjs"></a>
<div class="delfile"><h4>Deleted: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -1,230 +0,0 @@
</span><del>-/*
- * Copyright (C) 2013, 2014 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.
- */
-
-EWSQueueView = function(queues)
-{
-    QueueView.call(this);
-
-    this.queues = queues || [];
-
-    this.queues.forEach(function(queue) {
-        if (this.platform &amp;&amp; this.platform != queue.platform)
-            throw &quot;A EWS view may not contain queues for multiple platforms.&quot;
-        else
-            this.platform = queue.platform;
-        queue.addEventListener(EWSQueue.Event.Updated, this._queueUpdated, this);
-    }.bind(this));
-
-    this.update();
-};
-
-BaseObject.addConstructorFunctions(EWSQueueView);
-
-EWSQueueView.prototype = {
-    constructor: EWSQueueView,
-    __proto__: QueueView.prototype,
-
-    update: function()
-    {
-        QueueView.prototype.update.call(this);
-
-        this.element.removeChildren();
-
-        function appendQueue(queue)
-        {
-            var queueLabel = document.createElement(&quot;a&quot;);
-            queueLabel.classList.add(&quot;queueLabel&quot;);
-            queueLabel.textContent = queue.title;
-            queueLabel.href = queue.statusPageURL;
-            queueLabel.target = &quot;_blank&quot;;
-            this.element.appendChild(queueLabel);
-
-            var patchCount = queue.patchCount;
-
-            var message = patchCount === 1 ? &quot;patch in queue&quot; : &quot;patches in queue&quot;;
-            var status = new StatusLineView(message, StatusLineView.Status.Neutral, null, patchCount || &quot;0&quot;);
-            this.element.appendChild(status.element);
-
-            new PopoverTracker(status.statusBubbleElement, this._presentPopoverForEWSQueue.bind(this), queue);
-        }
-
-        this.queues.forEach(function(queue) {
-            appendQueue.call(this, queue);
-        }, this);
-    },
-
-    addLinkToRow: function(rowElement, className, text, url)
-    {
-        var linkElement = document.createElement(&quot;a&quot;);
-        linkElement.className = className;
-        linkElement.textContent = text;
-        linkElement.href = url;
-        linkElement.target = &quot;_blank&quot;;
-        rowElement.appendChild(linkElement);
-    },
-
-    addTextToRow: function(rowElement, className, text)
-    {
-        var spanElement = document.createElement(&quot;span&quot;);
-        spanElement.className = className;
-        spanElement.textContent = text;
-        rowElement.appendChild(spanElement);
-    },
-
-    _addQueueHeadingToPopover: function(queue, content)
-    {
-        var title = document.createElement(&quot;div&quot;);
-        title.className = &quot;popover-queue-heading&quot;;
-
-        this.addTextToRow(title, &quot;queue-name&quot;, queue.id + &quot; ews queue&quot;);
-        this.addLinkToRow(title, &quot;queue-status-link&quot;, &quot;status page&quot;, queue.statusPageURL);
-        this.addLinkToRow(title, &quot;queue-charts-link&quot;, &quot;charts&quot;, queue.chartsPageURL);
-
-        content.appendChild(title);
-    },
-
-    _addBotsHeadingToPopover: function(queue, content)
-    {
-        var title = document.createElement(&quot;div&quot;);
-        title.className = &quot;popover-bots-heading&quot;;
-        title.textContent = &quot;latest bot event&quot;;
-        content.appendChild(title);
-    },
-
-    _addDividerToPopover: function(content)
-    {
-        var divider = document.createElement(&quot;div&quot;);
-        divider.className = &quot;divider&quot;;
-        content.appendChild(divider);
-    },
-
-    _timeIntervalString: function(time)
-    {
-        var secondsInHour = 60 * 60;
-        var timeDifference = (Date.now() - time.getTime()) / 1000;
-        var hours = Math.floor(timeDifference / secondsInHour);
-        var minutes = Math.floor((timeDifference - hours * secondsInHour) / 60);
-        var hoursPart = &quot;&quot;;
-        if (hours === 1)
-            hoursPart = &quot;1\xa0hour and &quot;;
-        else if (hours &gt; 0)
-            hoursPart = hours + &quot;\xa0hours and &quot;;
-        if (!minutes)
-            return &quot;less than a minute&quot;;
-        if (minutes === 1)
-            return hoursPart + &quot;1\xa0minute&quot;;
-        return hoursPart + minutes + &quot;\xa0minutes&quot;;
-    },
-
-    _popoverContentForEWSQueue: function(queue)
-    {
-        var content = document.createElement(&quot;div&quot;);
-        content.className = &quot;ews-popover&quot;;
-
-        this._addQueueHeadingToPopover(queue, content);
-        this._addDividerToPopover(content);
-
-        var patches = queue.patches;
-        for (var i = 0, end = patches.length; i &lt; end; ++i) {
-            var patch = patches[i];
-
-            var rowElement = document.createElement(&quot;div&quot;);
-
-            this.addLinkToRow(rowElement, &quot;patch-details-link&quot;, patch.attachmentID, patch.statusPageURL);
-
-            if (patch.retryCount)
-                this.addTextToRow(rowElement, &quot;failure-count&quot;, patch.retryCount + &quot;\xa0&quot; + (patch.retryCount === 1 ? &quot;attempt&quot; : &quot;attempts&quot;));
-
-            if (patch.detailedResultsURLForLatestMessage)
-                this.addLinkToRow(rowElement, &quot;latest-status-with-link&quot;, patch.latestMessage, patch.detailedResultsURLForLatestMessage);
-            else if (patch.latestMessage &amp;&amp; patch.latestMessage.length)
-                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, patch.latestMessage);
-            else if (patch.active) {
-                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, &quot;Started&quot;);
-                this.addTextToRow(rowElement, &quot;time-since-message&quot;, this._timeIntervalString(patch.activeSince) + &quot;\xa0ago&quot;);
-            } else
-                this.addTextToRow(rowElement, &quot;latest-status-no-link&quot;, &quot;Not started yet&quot;);
-
-            if (patch.latestMessageTime)
-                this.addTextToRow(rowElement, &quot;time-since-message&quot;, this._timeIntervalString(patch.latestMessageTime) + &quot;\xa0ago&quot;);
-
-            this.addLinkToRow(rowElement, &quot;bugzilla-link&quot;, &quot;bugzilla&quot;, bugzilla.detailsURLForAttachment(patch.attachmentID));
-
-            content.appendChild(rowElement);
-        }
-
-        this._addDividerToPopover(content);
-        this._addBotsHeadingToPopover(queue, content);
-        this._addDividerToPopover(content);
-
-        var bots = queue.bots;
-        for (var i = 0, end = bots.length; i &lt; end; ++i) {
-            var bot = bots[i];
-
-            var rowElement = document.createElement(&quot;div&quot;);
-
-            this.addLinkToRow(rowElement, &quot;bot-status-link&quot;, bot.id, bot.statusPageURL);
-            this.addTextToRow(rowElement, &quot;bot-status-description&quot;, this._timeIntervalString(bot.latestMessageTime) + &quot;\xa0ago&quot;);
-
-            content.appendChild(rowElement);
-        }
-
-        return content;
-    },
-
-    _presentPopoverForEWSQueue: function(element, popover, queue)
-    {
-        if (queue.loadedDetailedStatus)
-            var content = this._popoverContentForEWSQueue(queue);
-        else {
-            var content = document.createElement(&quot;div&quot;);
-            content.className = &quot;ews-popover&quot;;
-
-            var loadingIndicator = document.createElement(&quot;div&quot;);
-            loadingIndicator.className = &quot;loading-indicator&quot;;
-            loadingIndicator.textContent = &quot;Loading\u2026&quot;;
-            content.appendChild(loadingIndicator);
-
-            queue.loadDetailedStatus(function() {
-                popover.content = this._popoverContentForEWSQueue(queue);
-            }.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;
-    },
-
-    _updateQueues: function()
-    {
-        this.queues.forEach(function(queue) { queue.update(); });
-    },
-
-    _queueUpdated: function(event)
-    {
-        this.updateSoon();
-    },
-};
</del></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsInitializationjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -28,7 +28,7 @@
</span><span class="cx"> var webkitTrac = new Trac(&quot;https://trac.webkit.org/&quot;);
</span><span class="cx"> if (typeof Bugzilla !== &quot;undefined&quot;)
</span><span class="cx">     var bugzilla = new Bugzilla;
</span><del>-if (typeof EWS !== &quot;undefined&quot;)
-    var ews = new EWS;
</del><ins>+if (typeof BubbleQueueServer !== &quot;undefined&quot;)
+    var bubbleQueueServer = new BubbleQueueServer;
</ins><span class="cx"> if (typeof TestHistory !== &quot;undefined&quot;)
</span><span class="cx">     var testHistory = new TestHistory;
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js        2014-10-06 21:37:28 UTC (rev 174366)
</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, 2014 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">@@ -23,8 +23,8 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-var hasEWS = typeof ews != &quot;undefined&quot;;
-var EWSCategory = &quot;ews&quot;;
</del><ins>+var hasBubbles = typeof bubbleQueueServer != &quot;undefined&quot;;
+var BubblesCategory = &quot;bubbles&quot;;
</ins><span class="cx"> 
</span><span class="cx"> var categorizedQueuesByPlatformAndBuildType = {};
</span><span class="cx"> 
</span><span class="lines">@@ -64,16 +64,16 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-if (hasEWS) {
-    for (var id in ews.queues) {
-        var queue = ews.queues[id];
</del><ins>+if (hasBubbles) {
+    for (var id in bubbleQueueServer.queues) {
+        var queue = bubbleQueueServer.queues[id];
</ins><span class="cx">         var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
</span><span class="cx">         if (!platform)
</span><span class="cx">             platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
</span><span class="cx">         if (!platform.builders)
</span><span class="cx">             platform.builders = {};
</span><span class="cx"> 
</span><del>-        var categoryName = EWSCategory;
</del><ins>+        var categoryName = BubblesCategory;
</ins><span class="cx"> 
</span><span class="cx">         platformQueues = platform[categoryName];
</span><span class="cx">         if (!platformQueues)
</span><span class="lines">@@ -154,9 +154,11 @@
</span><span class="cx">     header.textContent = &quot;Performance&quot;;
</span><span class="cx">     row.appendChild(header);
</span><span class="cx"> 
</span><del>-    if (hasEWS) {
</del><ins>+    if (hasBubbles) {
+        // Currently, EWS and commit queues are the only items in Other category.
+        // To add more (e.g. leaks bot), we'll need to refactor view classes.
</ins><span class="cx">         var header = document.createElement(&quot;th&quot;);
</span><del>-        header.textContent = &quot;EWS&quot;;
</del><ins>+        header.textContent = &quot;Other&quot;;
</ins><span class="cx">         row.appendChild(header);
</span><span class="cx">     }
</span><span class="cx"> 
</span><span class="lines">@@ -220,11 +222,11 @@
</span><span class="cx"> 
</span><span class="cx">         row.appendChild(cell);
</span><span class="cx"> 
</span><del>-        if (hasEWS) {
</del><ins>+        if (hasBubbles) {
</ins><span class="cx">             var cell = document.createElement(&quot;td&quot;);
</span><span class="cx"> 
</span><del>-            if (platformQueues[EWSCategory]) {
-                var view = new EWSQueueView(platformQueues[EWSCategory]);
</del><ins>+            if (platformQueues[BubblesCategory]) {
+                var view = new BubbleQueueView(platformQueues[BubblesCategory]);
</ins><span class="cx">                 cell.appendChild(view.element);
</span><span class="cx">             }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardScriptsMetricsMainjs"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -23,9 +23,6 @@
</span><span class="cx">  * THE POSSIBILITY OF SUCH DAMAGE.
</span><span class="cx">  */
</span><span class="cx"> 
</span><del>-var hasEWS = typeof ews !== &quot;undefined&quot;;
-var EWSCategory = &quot;ews&quot;;
-
</del><span class="cx"> var analyzer = new Analyzer;
</span><span class="cx"> 
</span><span class="cx"> var allBuilderResultsPseudoQueue = { id: &quot;allBuilderResultsPseudoQueue&quot; };
</span><span class="lines">@@ -67,25 +64,6 @@
</span><span class="cx">     }
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-if (hasEWS) {
-    for (var id in ews.queues) {
-        var queue = ews.queues[id];
-        var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
-        if (!platform)
-            platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
-        if (!platform.builders)
-            platform.builders = {};
-
-        var categoryName = EWSCategory;
-
-        platformQueues = platform[categoryName];
-        if (!platformQueues)
-            platformQueues = platform[categoryName] = [];
-
-        platformQueues.push(queue);
-    }
-}
-
</del><span class="cx"> var testNames = {};
</span><span class="cx"> testNames[Buildbot.TestCategory.WebKit2] = &quot;WK2 Tests&quot;;
</span><span class="cx"> testNames[Buildbot.TestCategory.WebKit1] = &quot;WK1 Tests&quot;;
</span><span class="lines">@@ -174,12 +152,6 @@
</span><span class="cx">     header.textContent = &quot;All queues&quot;;
</span><span class="cx">     row.appendChild(header);
</span><span class="cx"> 
</span><del>-    if (hasEWS) {
-        var header = document.createElement(&quot;th&quot;);
-        header.textContent = &quot;EWS&quot;;
-        row.appendChild(header);
-    }
-
</del><span class="cx">     table.appendChild(row);
</span><span class="cx"> 
</span><span class="cx">     var row = document.createElement(&quot;tr&quot;);
</span><span class="lines">@@ -228,12 +200,6 @@
</span><span class="cx">         row.appendChild(header);
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    if (hasEWS) {
-        var header = document.createElement(&quot;th&quot;);
-        header.textContent = &quot;EWS&quot;;
-        row.appendChild(header);
-    }
-
</del><span class="cx">     table.appendChild(row);
</span><span class="cx"> 
</span><span class="cx">     var platforms = sortedPlatforms();
</span><span class="lines">@@ -286,17 +252,6 @@
</span><span class="cx">             row.appendChild(cell);
</span><span class="cx">         }
</span><span class="cx"> 
</span><del>-        if (hasEWS) {
-            var cell = document.createElement(&quot;td&quot;);
-
-            if (platformQueues[EWSCategory]) {
-                var view = new EWSQueueView(platformQueues[EWSCategory]);
-                cell.appendChild(view.element);
-            }
-
-            row.appendChild(cell);
-        }
-
</del><span class="cx">         table.appendChild(row);
</span><span class="cx">     }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardStylesQueueViewcss"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -120,7 +120,7 @@
</span><span class="cx">     padding-left: 7px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.ews-popover,
</del><ins>+.bubble-server-popover,
</ins><span class="cx"> .performance-popover {
</span><span class="cx">     font-family: &quot;HelveticaNeue-Light&quot;, &quot;Helvetica Neue&quot;, sans-serif;
</span><span class="cx">     color: rgb(145, 135, 95);
</span><span class="lines">@@ -129,22 +129,22 @@
</span><span class="cx">     padding: 1px 6px 1px 6px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.ews-popover .popover-queue-heading .queue-status-link,
-.ews-popover .popover-queue-heading .queue-charts-link {
</del><ins>+.bubble-server-popover .popover-queue-heading .queue-status-link,
+.bubble-server-popover .popover-queue-heading .queue-charts-link {
</ins><span class="cx">     color: rgb(145, 135, 95);
</span><span class="cx">     padding-left: 7px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.ews-popover .latest-status-with-link,
-.ews-popover .latest-status-no-link {
</del><ins>+.bubble-server-popover .latest-status-with-link,
+.bubble-server-popover .latest-status-no-link {
</ins><span class="cx">     color: black;
</span><span class="cx">     padding-left: 7px;
</span><span class="cx"> }
</span><span class="cx"> 
</span><del>-.ews-popover .failure-count,
-.ews-popover .time-since-message,
-.ews-popover .bugzilla-link,
-.ews-popover .bot-status-description {
</del><ins>+.bubble-server-popover .failure-count,
+.bubble-server-popover .time-since-message,
+.bubble-server-popover .bugzilla-link,
+.bubble-server-popover .bot-status-description {
</ins><span class="cx">     padding-left: 7px;
</span><span class="cx"> }
</span><span class="cx"> 
</span></span></pre></div>
<a id="trunkToolsBuildSlaveSupportbuildwebkitorgconfigpublic_htmldashboardindexhtml"></a>
<div class="modfile"><h4>Modified: trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -37,10 +37,10 @@
</span><span class="cx">     &lt;script src=&quot;Scripts/Dashboard.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/Buildbot.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/Bugzilla.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Scripts/EWS.js&quot;&gt;&lt;/script&gt;
</del><ins>+    &lt;script src=&quot;Scripts/BubbleQueueServer.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Scripts/WebKitBuildbot.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/BuildbotQueue.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Scripts/EWSQueue.js&quot;&gt;&lt;/script&gt;
</del><ins>+    &lt;script src=&quot;Scripts/BubbleQueue.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Scripts/BuildbotIteration.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/BuildbotTestResults.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/Geometry.js&quot;&gt;&lt;/script&gt;
</span><span class="lines">@@ -51,7 +51,7 @@
</span><span class="cx">     &lt;script src=&quot;Scripts/BuildbotBuilderQueueView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/BuildbotTesterQueueView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/BuildbotPerformanceQueueView.js&quot;&gt;&lt;/script&gt;
</span><del>-    &lt;script src=&quot;Scripts/EWSQueueView.js&quot;&gt;&lt;/script&gt;
</del><ins>+    &lt;script src=&quot;Scripts/BubbleQueueView.js&quot;&gt;&lt;/script&gt;
</ins><span class="cx">     &lt;script src=&quot;Scripts/StatusLineView.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/Settings.js&quot;&gt;&lt;/script&gt;
</span><span class="cx">     &lt;script src=&quot;Scripts/Trac.js&quot;&gt;&lt;/script&gt;
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (174365 => 174366)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2014-10-06 21:36:31 UTC (rev 174365)
+++ trunk/Tools/ChangeLog        2014-10-06 21:37:28 UTC (rev 174366)
</span><span class="lines">@@ -1,5 +1,53 @@
</span><span class="cx"> 2014-10-06  Alexey Proskuryakov  &lt;ap@apple.com&gt;
</span><span class="cx"> 
</span><ins>+        build.webkit.org/dashboard: Add commit queue
+        https://bugs.webkit.org/show_bug.cgi?id=137462
+
+        Reviewed by Tim Horton.
+
+        Generalizes EWS into &quot;bubble queue&quot;, which also includes commit queue and style queue.
+        Style queue is still invisible, as it doesn't have an associated platform, and also
+        we never have problems with it anyway, so it's not worth watching.
+
+        The UI now allows for adding more bots to the Other column (such as leaks bot).
+        To make that actually happen, we'll need to refactor QueueView, allowing for multiple
+        sources of data in a cell.
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueue.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js.
+        (BubbleQueue):
+        (BubbleQueue.prototype.get statusPageURL):
+        (BubbleQueue.prototype.update):
+        (BubbleQueue.prototype.loadDetailedStatus):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueServer.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js.
+        (BubbleQueueServer):
+        (BubbleQueueServer.prototype.jsonQueueLengthURL):
+        (BubbleQueueServer.prototype.jsonQueueStatusURL):
+        (BubbleQueueServer.prototype.queueStatusURL):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/BubbleQueueView.js: Copied from Tools/BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js.
+        (BubbleQueueView):
+        (BubbleQueueView.prototype.update.appendQueue):
+        (BubbleQueueView.prototype.update):
+        (BubbleQueueView.prototype._addQueueHeadingToPopover):
+        (BubbleQueueView.prototype._popoverContentForBubbleQueue):
+        (BubbleQueueView.prototype._presentPopoverForBubbleQueue):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWS.js: Removed.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueue.js: Removed.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/EWSQueueView.js: Removed.
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Initialization.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/Main.js:
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Styles/QueueView.css:
+        (.bubble-server-popover .popover-queue-heading .queue-charts-link):
+        (.bubble-server-popover .latest-status-no-link):
+        (.bubble-server-popover .bot-status-description):
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/index.html:
+
+        * BuildSlaveSupport/build.webkit.org-config/public_html/dashboard/Scripts/MetricsMain.js:
+        (buildAggregateTable):
+        (buildQueuesTable):
+        Removed dysfunctional support for EWS for now. It will be different.
+
+2014-10-06  Alexey Proskuryakov  &lt;ap@apple.com&gt;
+
</ins><span class="cx">         One more case of incorrect comparison in recordpatchevent.py
</span><span class="cx">         https://bugs.webkit.org/show_bug.cgi?id=137459
</span><span class="cx"> 
</span></span></pre>
</div>
</div>

</body>
</html>