96769fd3d199b42ff99018a2224bba5b35d7e2ba
[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 {
47             console.assert("Unknown queue type.");
48             continue;
49         }
50
51         category = platform[categoryName];
52         if (!category)
53             category = platform[categoryName] = {};
54
55         var buildType = queue.debug ? "debug" : "release";
56
57         buildQueues = category[buildType];
58         if (!buildQueues)
59             buildQueues = category[buildType] = [];
60
61         buildQueues.push(queue);
62     }
63 }
64
65 if (hasEWS) {
66     for (var id in ews.queues) {
67         var queue = ews.queues[id];
68         var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
69         if (!platform)
70             platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
71         if (!platform.builders)
72             platform.builders = {};
73
74         var categoryName = EWSCategory;
75
76         platformQueues = platform[categoryName];
77         if (!platformQueues)
78             platformQueues = platform[categoryName] = [];
79
80         platformQueues.push(queue);
81     }
82 }
83
84 var testNames = {};
85 testNames[Buildbot.TestCategory.WebKit2] = "WK2 Tests";
86 testNames[Buildbot.TestCategory.WebKit1] = "WK1 Tests";
87
88 function sortedPlatforms()
89 {
90     var platforms = [];
91
92     for (var platformKey in Dashboard.Platform)
93         platforms.push(Dashboard.Platform[platformKey]);
94
95     platforms.sort(function(a, b) {
96         return a.order - b.order;
97     });
98
99     return platforms;
100 }
101
102 function updateHiddenPlatforms()
103 {
104     var hiddenPlatforms = settings.getObject("hiddenPlatforms");
105     if (!hiddenPlatforms)
106         hiddenPlatforms = [];
107
108     var platformRows = document.querySelectorAll("tr.platform");
109     for (var i = 0; i < platformRows.length; ++i)
110         platformRows[i].classList.remove("hidden");
111
112     for (var i = 0; i < hiddenPlatforms.length; ++i) {
113         var platformRow = document.querySelector("tr.platform." + hiddenPlatforms[i]);
114         if (platformRow)
115             platformRow.classList.add("hidden");
116     }
117
118     var unhideButton = document.querySelector("div.cellButton.unhide");
119     if (hiddenPlatforms.length)
120         unhideButton.classList.remove("hidden");
121     else
122         unhideButton.classList.add("hidden");
123 }
124
125 function documentReady()
126 {
127     var table = document.createElement("table");
128     table.classList.add("queue-grid");
129
130     var row = document.createElement("tr");
131     row.classList.add("headers");
132
133     var header = document.createElement("th");
134     var unhideButton = document.createElement("div");
135     unhideButton.addEventListener("click", function () { settings.clearHiddenPlatforms(); });
136     unhideButton.textContent = "Show All Platforms";
137     unhideButton.classList.add("cellButton", "unhide", "hidden");
138     header.appendChild(unhideButton);
139     row.appendChild(header);
140
141     header = document.createElement("th");
142     header.textContent = "Builders";
143     row.appendChild(header);
144
145     for (var testerKey in Buildbot.TestCategory) {
146         var header = document.createElement("th");
147         header.textContent = testNames[Buildbot.TestCategory[testerKey]];
148         row.appendChild(header);
149     }
150
151     if (hasEWS) {
152         var header = document.createElement("th");
153         header.textContent = "EWS";
154         row.appendChild(header);
155     }
156
157     table.appendChild(row);
158
159     var platforms = sortedPlatforms();
160
161     for (var i in platforms) {
162         var platform = platforms[i];
163         var platformQueues = categorizedQueuesByPlatformAndBuildType[platform.name];
164         if (!platformQueues)
165             continue;
166
167         var row = document.createElement("tr");
168         row.classList.add("platform");
169         row.classList.add(platform.name);
170
171         var cell = document.createElement("td");
172         cell.classList.add("logo");
173
174         var ringImage = document.createElement("img");
175         ringImage.classList.add("ring");
176         ringImage.title = platform.readableName;
177         cell.appendChild(ringImage);
178
179         var logoImage = document.createElement("img");
180         logoImage.classList.add("logo");
181         cell.appendChild(logoImage);
182
183         var hideButton = document.createElement("div");
184         hideButton.addEventListener("click", function (platformName) { return function () { settings.toggleHiddenPlatform(platformName); }; }(platform.name) );
185         hideButton.textContent = "hide";
186         hideButton.classList.add("cellButton", "hide");
187         cell.appendChild(hideButton);
188
189         row.appendChild(cell);
190
191         cell = document.createElement("td");
192
193         var view = new BuildbotBuilderQueueView(platformQueues.builders.debug, platformQueues.builders.release);
194         cell.appendChild(view.element);
195         row.appendChild(cell);
196
197         for (var testerKey in Buildbot.TestCategory) {
198             var cell = document.createElement("td");
199
200             var testerProperty = Buildbot.TestCategory[testerKey];
201             if (platformQueues[testerProperty]) {
202                 var view = new BuildbotTesterQueueView(platformQueues[testerProperty].debug, platformQueues[testerProperty].release);
203                 cell.appendChild(view.element);
204             }
205
206             row.appendChild(cell);
207         }
208
209         if (hasEWS) {
210             var cell = document.createElement("td");
211
212             if (platformQueues[EWSCategory]) {
213                 var view = new EWSQueueView(platformQueues[EWSCategory]);
214                 cell.appendChild(view.element);
215             }
216
217             row.appendChild(cell);
218         }
219
220         table.appendChild(row);
221     }
222
223     document.body.appendChild(table);
224
225     if (settings.available()) {
226         var settingsButton = document.createElement("div");
227         settingsButton.addEventListener("click", function () { settings.toggleSettingsDisplay(); });
228         settingsButton.classList.add("settings");
229         document.body.appendChild(settingsButton);
230
231         updateHiddenPlatforms();
232         settings.addSettingListener("hiddenPlatforms", updateHiddenPlatforms);
233     }
234 }
235
236 webkitTrac.startPeriodicUpdates();
237 if (typeof internalTrac !== "undefined")
238     internalTrac.startPeriodicUpdates();
239
240 document.addEventListener("DOMContentLoaded", documentReady);