Dashboard should show performance bots.
[WebKit-https.git] / Tools / BuildSlaveSupport / build.webkit.org-config / public_html / dashboard / Scripts / Main.js
1 /*
2  * Copyright (C) 2013 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 var hasEWS = typeof ews != "undefined";
27 var EWSCategory = "ews";
28
29 var categorizedQueuesByPlatformAndBuildType = {};
30
31 for (var i = 0; i < buildbots.length; ++i) {
32     var buildbot = buildbots[i];
33     for (var id in buildbot.queues) {
34         var queue = buildbot.queues[id];
35         var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
36         if (!platform)
37             platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
38         if (!platform.builders)
39             platform.builders = {};
40
41         var categoryName;
42         if (queue.builder) {
43             categoryName = "builders";
44         } else if (queue.tester) {
45             categoryName = queue.testCategory;
46         } else if (queue.performance) {
47             categoryName = "performance";
48         } else {
49             console.assert("Unknown queue type.");
50             continue;
51         }
52
53         category = platform[categoryName];
54         if (!category)
55             category = platform[categoryName] = {};
56
57         var buildType = queue.debug ? "debug" : "release";
58
59         buildQueues = category[buildType];
60         if (!buildQueues)
61             buildQueues = category[buildType] = [];
62
63         buildQueues.push(queue);
64     }
65 }
66
67 if (hasEWS) {
68     for (var id in ews.queues) {
69         var queue = ews.queues[id];
70         var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
71         if (!platform)
72             platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
73         if (!platform.builders)
74             platform.builders = {};
75
76         var categoryName = EWSCategory;
77
78         platformQueues = platform[categoryName];
79         if (!platformQueues)
80             platformQueues = platform[categoryName] = [];
81
82         platformQueues.push(queue);
83     }
84 }
85
86 var testNames = {};
87 testNames[Buildbot.TestCategory.WebKit2] = "WK2 Tests";
88 testNames[Buildbot.TestCategory.WebKit1] = "WK1 Tests";
89
90 function sortedPlatforms()
91 {
92     var platforms = [];
93
94     for (var platformKey in Dashboard.Platform)
95         platforms.push(Dashboard.Platform[platformKey]);
96
97     platforms.sort(function(a, b) {
98         return a.order - b.order;
99     });
100
101     return platforms;
102 }
103
104 function updateHiddenPlatforms()
105 {
106     var hiddenPlatforms = settings.getObject("hiddenPlatforms");
107     if (!hiddenPlatforms)
108         hiddenPlatforms = [];
109
110     var platformRows = document.querySelectorAll("tr.platform");
111     for (var i = 0; i < platformRows.length; ++i)
112         platformRows[i].classList.remove("hidden");
113
114     for (var i = 0; i < hiddenPlatforms.length; ++i) {
115         var platformRow = document.querySelector("tr.platform." + hiddenPlatforms[i]);
116         if (platformRow)
117             platformRow.classList.add("hidden");
118     }
119
120     var unhideButton = document.querySelector("div.cellButton.unhide");
121     if (hiddenPlatforms.length)
122         unhideButton.classList.remove("hidden");
123     else
124         unhideButton.classList.add("hidden");
125 }
126
127 function documentReady()
128 {
129     var table = document.createElement("table");
130     table.classList.add("queue-grid");
131
132     var row = document.createElement("tr");
133     row.classList.add("headers");
134
135     var header = document.createElement("th");
136     var unhideButton = document.createElement("div");
137     unhideButton.addEventListener("click", function () { settings.clearHiddenPlatforms(); });
138     unhideButton.textContent = "Show All Platforms";
139     unhideButton.classList.add("cellButton", "unhide", "hidden");
140     header.appendChild(unhideButton);
141     row.appendChild(header);
142
143     header = document.createElement("th");
144     header.textContent = "Builders";
145     row.appendChild(header);
146
147     for (var testerKey in Buildbot.TestCategory) {
148         var header = document.createElement("th");
149         header.textContent = testNames[Buildbot.TestCategory[testerKey]];
150         row.appendChild(header);
151     }
152
153     var header = document.createElement("th");
154     header.textContent = "Performance";
155     row.appendChild(header);
156
157     if (hasEWS) {
158         var header = document.createElement("th");
159         header.textContent = "EWS";
160         row.appendChild(header);
161     }
162
163     table.appendChild(row);
164
165     var platforms = sortedPlatforms();
166
167     for (var i in platforms) {
168         var platform = platforms[i];
169         var platformQueues = categorizedQueuesByPlatformAndBuildType[platform.name];
170         if (!platformQueues)
171             continue;
172
173         var row = document.createElement("tr");
174         row.classList.add("platform");
175         row.classList.add(platform.name);
176
177         var cell = document.createElement("td");
178         cell.classList.add("logo");
179
180         var ringImage = document.createElement("img");
181         ringImage.classList.add("ring");
182         ringImage.title = platform.readableName;
183         cell.appendChild(ringImage);
184
185         var logoImage = document.createElement("img");
186         logoImage.classList.add("logo");
187         cell.appendChild(logoImage);
188
189         var hideButton = document.createElement("div");
190         hideButton.addEventListener("click", function (platformName) { return function () { settings.toggleHiddenPlatform(platformName); }; }(platform.name) );
191         hideButton.textContent = "hide";
192         hideButton.classList.add("cellButton", "hide");
193         cell.appendChild(hideButton);
194
195         row.appendChild(cell);
196
197         cell = document.createElement("td");
198
199         var view = new BuildbotBuilderQueueView(platformQueues.builders.debug, platformQueues.builders.release);
200         cell.appendChild(view.element);
201         row.appendChild(cell);
202
203         for (var testerKey in Buildbot.TestCategory) {
204             var cell = document.createElement("td");
205
206             var testerProperty = Buildbot.TestCategory[testerKey];
207             if (platformQueues[testerProperty]) {
208                 var view = new BuildbotTesterQueueView(platformQueues[testerProperty].debug, platformQueues[testerProperty].release);
209                 cell.appendChild(view.element);
210             }
211
212             row.appendChild(cell);
213         }
214
215         var cell = document.createElement("td");
216         if (platformQueues.performance && platformQueues.performance.release) {
217             var view = new BuildbotPerformanceQueueView(platformQueues.performance.release);
218             cell.appendChild(view.element);
219         }
220
221         row.appendChild(cell);
222
223         if (hasEWS) {
224             var cell = document.createElement("td");
225
226             if (platformQueues[EWSCategory]) {
227                 var view = new EWSQueueView(platformQueues[EWSCategory]);
228                 cell.appendChild(view.element);
229             }
230
231             row.appendChild(cell);
232         }
233
234         table.appendChild(row);
235     }
236
237     document.body.appendChild(table);
238
239     if (settings.available()) {
240         var settingsButton = document.createElement("div");
241         settingsButton.addEventListener("click", function () { settings.toggleSettingsDisplay(); });
242         settingsButton.classList.add("settings");
243         document.body.appendChild(settingsButton);
244
245         updateHiddenPlatforms();
246         settings.addSettingListener("hiddenPlatforms", updateHiddenPlatforms);
247     }
248 }
249
250 webkitTrac.startPeriodicUpdates();
251 if (typeof internalTrac !== "undefined")
252     internalTrac.startPeriodicUpdates();
253
254 document.addEventListener("DOMContentLoaded", documentReady);