Chromium Code Reviews| Index: chrome/common/extensions/docs/examples/extensions/buildbot/popup.js |
| diff --git a/chrome/common/extensions/docs/examples/extensions/buildbot/popup.js b/chrome/common/extensions/docs/examples/extensions/buildbot/popup.js |
| index 1c578dfdf10a2effcc024b03d1356bb7e51f8fa1..c7376f9daca4a5b1004d70fefa172bd55b95cfbc 100644 |
| --- a/chrome/common/extensions/docs/examples/extensions/buildbot/popup.js |
| +++ b/chrome/common/extensions/docs/examples/extensions/buildbot/popup.js |
| @@ -2,8 +2,15 @@ |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| +(function(){ |
| + |
| var lkgrURL = 'http://chromium-status.appspot.com/lkgr'; |
| +// Interval at which to reload the non-CL bot status. |
| +var botStatusRefreshIntervalInMs = 60 * 1000; |
| +// Interval at which to check for LKGR updates. |
| +var lkgrRefreshIntervalInMs = 60 * 1000; |
| + |
| function getClassForTryJobResult(result) { |
| // Some win bots seem to report a null result while building. |
| if (result === null) |
| @@ -135,49 +142,96 @@ function createPatchsetStatusElement(patchset) { |
| return iframe; |
| } |
| -function addTryStatusRows(table) { |
| - var codereviewBaseURL = "https://codereview.chromium.org"; |
| +function getLastFullPatchsetWithTryJobs(issue) { |
| + var index = issue.patchsets.length - 1; |
| + var full_patchsets = issue.full_patchsets; |
|
not at google - send to devlin
2013/07/04 00:37:11
fullPatchsets
Mike Wittman
2013/07/16 17:53:19
Done.
|
| + while (index >= 0 && |
| + (!full_patchsets[issue.patchsets[index]] || |
| + !full_patchsets[issue.patchsets[index]].try_job_results || |
| + full_patchsets[issue.patchsets[index]].try_job_results.length == 0)) { |
| + index--; |
| + } |
| + |
| + return index >= 0 ? full_patchsets[issue.patchsets[index]] : null; |
| +} |
| + |
| +function updateSpacerDisplay() { |
| + var postCLRow = document.getElementsByClassName("post-cl-row")[0]; |
| + |
| + if (document.getElementsByClassName("hastryjobs").length > 0) |
| + postCLRow.classList.add("status-pre-pad"); |
| + else |
| + postCLRow.classList.remove("status-pre-pad"); |
|
not at google - send to devlin
2013/07/04 00:37:11
if you added "closerBot" and "otherBot" classes to
Mike Wittman
2013/07/16 17:53:19
Done.
|
| +} |
| - var background = chrome.extension.getBackgroundPage(); |
| +function createTryStatusRow(issue) { |
| + var table = document.getElementById("status-table"); |
| - var issues = []; |
| - for (var key in background.activeIssues) |
| - issues.push(background.activeIssues[key]); |
| + // Order by decreasing issue number. |
| + var position = document.getElementsByClassName("post-cl-row")[0].rowIndex; |
| + while (position > 0 && |
| + parseInt(issue.issue) > |
| + parseInt(table.rows[position - 1].getAttribute("data-issue"))) { |
| + position--; |
| + } |
| - // Sort issues in descending order. |
| - issues.sort(function(a, b) {return parseInt(b.issue) - parseInt(a.issue);}); |
| + var row = table.insertRow(position); |
| + row.id = "issue_" + issue.issue + "_row"; |
| + row.classList.add("issue"); |
| + row.setAttribute("data-issue", issue.issue); |
|
not at google - send to devlin
2013/07/04 00:37:11
I don't think you need all of these, just the data
Mike Wittman
2013/07/16 17:53:19
Done.
|
| - issues.forEach(function(issue) { |
| - var codereviewURL = codereviewBaseURL + "/" + issue.issue; |
| + return row; |
|
not at google - send to devlin
2013/07/04 00:37:11
all that said I think this would all be a lot simp
Mike Wittman
2013/07/16 17:53:19
I tested rewriting the table and the redraw is vis
|
| +} |
| - if (!issue.full_patchsets) |
| - return; |
| +function updateIssueDisplay(issue) { |
| + if (!issue.full_patchsets) |
| + return; |
| - var lastPatchset = issue.patchsets[issue.patchsets.length - 1]; |
| - var lastFullPatchset = issue.full_patchsets[lastPatchset]; |
| + var codereviewBaseURL = "https://codereview.chromium.org"; |
| - if (!lastFullPatchset.try_job_results || |
| - lastFullPatchset.try_job_results.length == 0) |
| - return; |
| + var row = document.getElementById("issue_" + issue.issue + "_row") || |
| + createTryStatusRow(issue); |
| - var row = table.insertRow(-1); |
| - var label = row.insertCell(-1); |
| - label.className = "status-label"; |
| - var clAnchor = document.createElement("a"); |
| - clAnchor.textContent = "CL " + issue.issue; |
| - clAnchor.href = codereviewURL; |
| - clAnchor.title = issue.subject; |
| - if (lastFullPatchset.message) |
| - clAnchor.title += " | " + lastFullPatchset.message; |
| - clAnchor.target = "_blank"; |
| - label.appendChild(clAnchor); |
| + var lastFullPatchset = getLastFullPatchsetWithTryJobs(issue); |
| + row.classList.add(lastFullPatchset ? "hastryjobs" : "notryjobs"); |
| + row.classList.remove(lastFullPatchset ? "notryjobs" : "hastryjobs"); |
| - var status = row.insertCell(-1); |
| - status.appendChild(createPatchsetStatusElement(lastFullPatchset)); |
| - }); |
| + var label = row.childNodes[0] || row.insertCell(-1); |
| + var status = row.childNodes[1] || row.insertCell(-1); |
| + |
| + label.className = "status-label"; |
| + var clAnchor = label.childNodes[0] || |
| + label.appendChild(document.createElement("a")); |
| + clAnchor.textContent = "CL " + issue.issue; |
| + clAnchor.href = codereviewBaseURL + "/" + issue.issue; |
| + clAnchor.title = issue.subject; |
| + if (lastFullPatchset && lastFullPatchset.message) |
| + clAnchor.title += " | " + lastFullPatchset.message; |
| + clAnchor.target = "_blank"; |
| + |
| + if (lastFullPatchset) { |
| + var statusElement = createPatchsetStatusElement(lastFullPatchset); |
| + if (status.childElementCount < 1) |
| + status.appendChild(statusElement); |
| + else |
| + status.replaceChild(statusElement, status.firstChild); |
| + } else { |
| + if (status.firstChild) |
| + status.removeChild(status.firstChild); |
| + } |
| - if (issues.length > 0) |
| - table.insertRow(-1).insertCell().className = "spacer"; |
| + updateSpacerDisplay(); |
| +} |
| + |
| +function removeIssueDisplay(issueNumber) { |
| + var row = document.getElementById("issue_" + issueNumber + "_row"); |
| + row.parentNode.removeChild(row); |
| + |
| + updateSpacerDisplay(); |
| +} |
| + |
| +function addTryStatusRows() { |
| + getActiveIssues().forEach(updateIssueDisplay); |
| } |
| function updateLKGR(lkgr) { |
| @@ -185,7 +239,9 @@ function updateLKGR(lkgr) { |
| link.textContent = 'LKGR (' + lkgr + ')'; |
| } |
| -function addBotStatusRow(table, bot) { |
| +function addBotStatusRow(bot) { |
| + var table = document.getElementById("status-table"); |
| + |
| var baseURL = "http://build.chromium.org/p/chromium" + |
| (bot.id != "" ? "." + bot.id : ""); |
| var consoleURL = baseURL + "/console"; |
| @@ -204,13 +260,13 @@ function addBotStatusRow(table, bot) { |
| var status = row.insertCell(-1); |
| status.className = "botstatus"; |
| var statusIframe = document.createElement("iframe"); |
| - statusIframe.className = "statusiframe"; |
| + statusIframe.className = "statusiframe botstatusiframe"; |
| statusIframe.scrolling = "no"; |
| statusIframe.src = statusURL; |
| status.appendChild(statusIframe); |
| } |
| -function addBotStatusRows(table) { |
| +function addBotStatusRows() { |
| var closerBots = [ |
| {id: "", label: "Chromium"}, |
| {id: "win", label: "Win"}, |
| @@ -229,26 +285,55 @@ function addBotStatusRows(table) { |
| {id: "gpu.fyi", label: "GPU FYI"} |
| ]; |
| - closerBots.forEach(function(bot) { |
| - addBotStatusRow(table, bot); |
| - }); |
| + var table = document.getElementById("status-table"); |
| + var preSpacerIndices = []; |
| - table.insertRow(-1).insertCell().className = "spacer"; |
| + preSpacerIndices.push(table.rows.length); |
| + closerBots.forEach(addBotStatusRow); |
| - otherBots.forEach(function(bot) { |
| - addBotStatusRow(table, bot); |
| - }); |
| + preSpacerIndices.push(table.rows.length); |
| + otherBots.forEach(addBotStatusRow); |
| + |
| + table.rows[preSpacerIndices[0]].classList.add("post-cl-row"); |
| + table.rows[preSpacerIndices[1]].classList.add("status-pre-pad"); |
| } |
| function fillStatusTable() { |
| - var table = document.getElementById("status-table"); |
| - addTryStatusRows(table); |
| - addBotStatusRows(table); |
| + addBotStatusRows(); |
| + addTryStatusRows(); |
| } |
| function main() { |
| requestURL(lkgrURL, "text", updateLKGR); |
| fillStatusTable(); |
| + |
| + var port = getActiveIssues().connectEventsPort(); |
| + port.onMessage.addListener(function (request) { |
| + switch (request.event) { |
| + case "issueUpdated": |
| + case "issueAdded": |
| + updateIssueDisplay(getActiveIssues().getIssue(request.issue)); |
| + break; |
| + |
| + case "issueRemoved": |
| + removeIssueDisplay(request.issue); |
| + break; |
| + } |
| + }); |
| + |
| + setInterval(function() { |
| + requestURL(lkgrURL, "text", updateLKGR); |
| + }, lkgrRefreshIntervalInMs); |
| + |
| + setInterval(function() { |
| + var botStatusElements = document.getElementsByClassName("botstatusiframe"); |
| + for (var i = 0; i < botStatusElements.length; i++) |
| + // Force a reload of the iframe in a way that doesn't cause cross-domain |
| + // policy violations. |
| + botStatusElements.item(i).src = botStatusElements.item(i).src; |
| + }, botStatusRefreshIntervalInMs); |
| } |
| main(); |
| + |
| +})(); |