build.webkit.org/dashboard should provide a way to focus on a subset of 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 categorizedQueuesByPlatformAndBuildType = {};
27
28 for (var id in buildbot.queues) {
29     var queue = buildbot.queues[id];
30     var platform = categorizedQueuesByPlatformAndBuildType[queue.platform];
31     if (!platform)
32         platform = categorizedQueuesByPlatformAndBuildType[queue.platform] = {};
33     if (!platform.builders)
34         platform.builders = {};
35
36     var categoryName;
37     if (queue.builder) {
38         categoryName = "builders";
39     } else if (queue.tester) {
40         categoryName = queue.testCategory;
41     } else {
42         console.assert("Unknown queue type.");
43         continue;
44     }
45
46     category = platform[categoryName];
47     if (!category)
48         category = platform[categoryName] = {};
49
50     var buildType = queue.debug ? "debug" : "release";
51
52     buildQueues = category[buildType];
53     if (!buildQueues)
54         buildQueues = category[buildType] = [];
55
56     buildQueues.push(queue);
57 }
58
59 var testNames = {};
60 testNames[Buildbot.TestCategory.WebKit2] = "WK2 Tests";
61 testNames[Buildbot.TestCategory.WebKit1] = "WK1 Tests";
62
63 function sortedPlatforms()
64 {
65     var platforms = [];
66
67     for (var platformKey in Buildbot.Platform)
68         platforms.push(Buildbot.Platform[platformKey]);
69
70     platforms.sort(function(a, b) {
71         return a.order - b.order;
72     });
73
74     return platforms;
75 }
76
77 function updateHiddenPlatforms()
78 {
79     var hiddenPlatforms = settings.getObject("hiddenPlatforms");
80     if (!hiddenPlatforms)
81         hiddenPlatforms = [];
82
83     var platformRows = document.querySelectorAll("tr.platform");
84     for (var i = 0; i < platformRows.length; ++i)
85         platformRows[i].classList.remove("hidden");
86
87     for (var i = 0; i < hiddenPlatforms.length; ++i)
88         document.querySelector("tr.platform." + hiddenPlatforms[i]).classList.add("hidden");
89
90     var unhideButton = document.querySelector("div.cellButton.unhide");
91     if (hiddenPlatforms.length)
92         unhideButton.classList.remove("hidden");
93     else
94         unhideButton.classList.add("hidden");
95 }
96
97 function documentReady()
98 {
99     var table = document.createElement("table");
100     table.classList.add("queue-grid");
101
102     var row = document.createElement("tr");
103     row.classList.add("headers");
104
105     var header = document.createElement("th");
106     var unhideButton = document.createElement("div");
107     unhideButton.addEventListener("click", function () { settings.clearHiddenPlatforms(); });
108     unhideButton.textContent = "Show All Platforms";
109     unhideButton.classList.add("cellButton", "unhide", "hidden");
110     header.appendChild(unhideButton);
111     row.appendChild(header);
112
113     header = document.createElement("th");
114     header.textContent = "Builders";
115     row.appendChild(header);
116
117     for (var testerKey in Buildbot.TestCategory) {
118         var header = document.createElement("th");
119         header.textContent = testNames[Buildbot.TestCategory[testerKey]];
120         row.appendChild(header);
121     }
122
123     table.appendChild(row);
124
125     var platforms = sortedPlatforms();
126
127     for (var i in platforms) {
128         var platform = platforms[i];
129         var platformQueues = categorizedQueuesByPlatformAndBuildType[platform.name];
130         if (!platformQueues)
131             continue;
132
133         var row = document.createElement("tr");
134         row.classList.add("platform");
135         row.classList.add(platform.name);
136
137         var cell = document.createElement("td");
138         cell.classList.add("logo");
139
140         var ringImage = document.createElement("img");
141         ringImage.classList.add("ring");
142         ringImage.title = platform.readableName;
143         cell.appendChild(ringImage);
144
145         var logoImage = document.createElement("img");
146         logoImage.classList.add("logo");
147         cell.appendChild(logoImage);
148
149         var hideButton = document.createElement("div");
150         hideButton.addEventListener("click", function (platformName) { return function () { settings.toggleHiddenPlatform(platformName); }; }(platform.name) );
151         hideButton.textContent = "hide";
152         hideButton.classList.add("cellButton", "hide");
153         cell.appendChild(hideButton);
154
155         row.appendChild(cell);
156
157         cell = document.createElement("td");
158
159         var view = new BuildbotBuilderQueueView(platformQueues.builders.debug, platformQueues.builders.release);
160         cell.appendChild(view.element);
161         row.appendChild(cell);
162
163         for (var testerKey in Buildbot.TestCategory) {
164             var cell = document.createElement("td");
165
166             var testerProperty = Buildbot.TestCategory[testerKey];
167             if (platformQueues[testerProperty]) {
168                 var view = new BuildbotTesterQueueView(platformQueues[testerProperty].debug, platformQueues[testerProperty].release);
169                 cell.appendChild(view.element);
170             }
171
172             row.appendChild(cell);
173         }
174
175         table.appendChild(row);
176     }
177
178     document.body.appendChild(table);
179
180     updateHiddenPlatforms();
181     settings.addSettingListener("hiddenPlatforms", updateHiddenPlatforms);
182 }
183
184 document.addEventListener("DOMContentLoaded", documentReady);