Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Side by Side Diff: chrome/common/extensions/docs/examples/extensions/buildbot/bg.js

Issue 18401004: Continuously update status in the buildbot extension popup window (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address initial review comments Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // TODO(wittman): Convert this extension to event pages once they work with 5 // TODO(wittman): Convert this extension to event pages once they work with
6 // the notifications API. Currently it's not possible to restore the 6 // the notifications API. Currently it's not possible to restore the
7 // Notification object when event pages get reloaded. See 7 // Notification object when event pages get reloaded. See
8 // http://crbug.com/165276. 8 // http://crbug.com/165276.
9 9
10 (function() {
11
10 var statusURL = "http://chromium-status.appspot.com/current?format=raw"; 12 var statusURL = "http://chromium-status.appspot.com/current?format=raw";
11 var statusHistoryURL = 13 var statusHistoryURL =
12 "http://chromium-status.appspot.com/allstatus?limit=20&format=json"; 14 "http://chromium-status.appspot.com/allstatus?limit=20&format=json";
13 var pollFrequencyInMs = 30000; 15 var pollFrequencyInMs = 30000;
14 var tryPollFrequencyInMs = 30000; 16 var tryPollFrequencyInMs = 30000;
15 17
16 var prefs = new Prefs; 18 var prefs = new Prefs;
17 19
18 function updateBadgeOnErrorStatus() { 20 function updateBadgeOnErrorStatus() {
19 chrome.browserAction.setBadgeText({text:"?"}); 21 chrome.browserAction.setBadgeText({text:"?"});
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
112 } 114 }
113 updateTimeBadge(Date.now() - lastChangeTime); 115 updateTimeBadge(Date.now() - lastChangeTime);
114 } 116 }
115 } 117 }
116 118
117 function requestStatus() { 119 function requestStatus() {
118 requestURL(statusURL, "text", updateStatus, updateBadgeOnErrorStatus); 120 requestURL(statusURL, "text", updateStatus, updateBadgeOnErrorStatus);
119 setTimeout(requestStatus, pollFrequencyInMs); 121 setTimeout(requestStatus, pollFrequencyInMs);
120 } 122 }
121 123
122 var activeIssues = {};
123 // Record of the last defunct build number we're aware of on each builder. If 124 // Record of the last defunct build number we're aware of on each builder. If
124 // the build number is less than or equal to this number, the buildbot 125 // the build number is less than or equal to this number, the buildbot
125 // information is not available and a request will return a 404. 126 // information is not available and a request will return a 404.
126 var lastDefunctTryJob = {}; 127 var lastDefunctTryJob = {};
127 128
128 function fetchTryJobResults(fullPatchset, builder, buildnumber) { 129 function fetchTryJobResults(fullPatchset, builder, buildnumber, completed) {
129 var tryJobURL = 130 var tryJobURL =
130 "http://build.chromium.org/p/tryserver.chromium/json/builders/" + 131 "http://build.chromium.org/p/tryserver.chromium/json/builders/" +
131 builder + "/builds/" + buildnumber; 132 builder + "/builds/" + buildnumber;
132 133
133 if (lastDefunctTryJob.hasOwnProperty(builder) && 134 if (lastDefunctTryJob.hasOwnProperty(builder) &&
134 buildnumber <= lastDefunctTryJob[builder]) 135 buildnumber <= lastDefunctTryJob[builder])
135 return; 136 return;
136 137
137 var onStatusError = function(status) { 138 var onStatusError = function(status) {
not at google - send to devlin 2013/07/04 00:37:11 can you inline this function, or un-inline the oth
Mike Wittman 2013/07/16 17:53:19 Done.
138 if (status == 404) 139 if (status == 404) {
139 lastDefunctTryJob[builder] = buildnumber; 140 lastDefunctTryJob[builder] =
141 Math.max(lastDefunctTryJob[builder] || 0, buildnumber);
142 completed();
143 }
140 }; 144 };
141 145
142 requestURL(tryJobURL, "json", function(tryJobResult) { 146 requestURL(tryJobURL, "json", function(tryJobResult) {
143 if (!fullPatchset.full_try_job_results) 147 if (!fullPatchset.full_try_job_results)
144 fullPatchset.full_try_job_results = {}; 148 fullPatchset.full_try_job_results = {};
145 149
146 var key = builder + "-" + buildnumber; 150 var key = builder + "-" + buildnumber;
147 fullPatchset.full_try_job_results[key] = tryJobResult; 151 fullPatchset.full_try_job_results[key] = tryJobResult;
152
153 completed();
148 }, onStatusError); 154 }, onStatusError);
149 } 155 }
150 156
151 function fetchPatches(issue, completed) { 157 // Enums corresponding to how much state has been loaded for an issue.
158 var PATCHES_COMPLETE = 0;
159 var TRY_JOBS_COMPLETE = 1;
160
161 function fetchPatches(issue, updatedCallback) {
162 // Notify updated once after receiving all patchsets, and a second time after
163 // receiving all try job results.
152 var patchsetsRetrieved = 0; 164 var patchsetsRetrieved = 0;
165 var tryJobResultsOutstanding = 0;
153 issue.patchsets.forEach(function(patchset) { 166 issue.patchsets.forEach(function(patchset) {
154 var patchURL = "https://codereview.chromium.org/api/" + issue.issue + 167 var patchURL = "https://codereview.chromium.org/api/" + issue.issue +
155 "/" + patchset; 168 "/" + patchset;
156 169
157 requestURL(patchURL, "json", function(patch) { 170 requestURL(patchURL, "json", function(patch) {
158 if (!issue.full_patchsets) 171 if (!issue.full_patchsets)
159 issue.full_patchsets = {}; 172 issue.full_patchsets = {};
160 173
161 issue.full_patchsets[patch.patchset] = patch; 174 issue.full_patchsets[patch.patchset] = patch;
162 175
163 patch.try_job_results.forEach(function(results) { 176 patch.try_job_results.forEach(function(results) {
164 if (results.buildnumber) 177 if (results.buildnumber) {
165 fetchTryJobResults(patch, results.builder, results.buildnumber); 178 tryJobResultsOutstanding++;
179
180 fetchTryJobResults(
181 patch,
182 results.builder,
183 results.buildnumber,
184 function() {
185 if (--tryJobResultsOutstanding == 0)
186 updatedCallback(TRY_JOBS_COMPLETE);
187 });
not at google - send to devlin 2013/07/04 00:37:11 looks a bit, odd, I'd probably cheat like
Mike Wittman 2013/07/16 17:53:19 Done.
188 }
166 }); 189 });
167 190
168 if (++patchsetsRetrieved == issue.patchsets.length) 191 if (++patchsetsRetrieved == issue.patchsets.length)
169 completed(issue); 192 updatedCallback(PATCHES_COMPLETE);
170 }); 193 });
171 }); 194 });
172 } 195 }
173 196
174 function updateTryStatus(status) { 197 function updateTryStatus(status) {
175 var seen = {}; 198 var seen = {};
199 var activeIssues = getActiveIssues();
176 status.results.forEach(function(result) { 200 status.results.forEach(function(result) {
177 var issueURL = "https://codereview.chromium.org/api/" + result.issue; 201 var issueURL = "https://codereview.chromium.org/api/" + result.issue;
178 202
179 requestURL(issueURL, "json", function(issue) { 203 requestURL(issueURL, "json", function(issue) {
180 fetchPatches(issue, function() {activeIssues[issue.issue] = issue;}); 204 fetchPatches(issue, function(state) {
205 // If the issue already exists, wait until all the issue state has
206 // loaded before updating the issue so we don't lose try job information
207 // from the display.
208 if (activeIssues.getIssue(issue.issue)) {
209 if (state == TRY_JOBS_COMPLETE)
210 activeIssues.updateIssue(issue);
211 } else {
212 activeIssues.updateIssue(issue);
213 }
214 });
181 }); 215 });
182 216
183 seen[result.issue] = true; 217 seen[result.issue] = true;
184 }); 218 });
185 219
186 for (var issue in activeIssues) 220 activeIssues.forEach(function(issue) {
187 if (!seen[issue]) 221 if (!seen[issue.issue])
188 delete activeIssues[issue]; 222 activeIssues.removeIssue(issue);
223 });
189 } 224 }
190 225
226 var tryStatusTimeoutID;
227
191 function requestTryStatus() { 228 function requestTryStatus() {
229 var searchBaseURL = "https://codereview.chromium.org/search";
230
192 prefs.getTryJobUsername(function(username) { 231 prefs.getTryJobUsername(function(username) {
193 if (username) { 232 // Use the username if set and not consisting solely of whitespace.
194 var url = "https://codereview.chromium.org/search" + 233 if (username && username.trim()) {
234 var url = searchBaseURL +
195 // commit=2 is CLs with commit bit set, commit=3 is CLs with commit 235 // commit=2 is CLs with commit bit set, commit=3 is CLs with commit
196 // bit cleared, commit=1 is either. 236 // bit cleared, commit=1 is either.
197 "?closed=3&commit=1&limit=100&order=-modified&format=json&owner=" + 237 "?closed=3&commit=1&limit=100&order=-modified&format=json&owner=" +
198 username; 238 username.trim();
199 requestURL(url, "json", updateTryStatus); 239 requestURL(url, "json", updateTryStatus);
240 } else if (username == null) {
241 // Try scraping username from Rietveld if unset.
242 requestURL(searchBaseURL, "text", function(text) {
243 var match = /([^<>\s]+@\S+)\s+\(.+\)/.exec(text);
244 if (match) {
245 prefs.setTryJobUsername(match[1]);
246 clearTimeout(tryStatusTimeoutID);
not at google - send to devlin 2013/07/04 00:37:11 I'm a bit confused by the flow here, with the clea
Mike Wittman 2013/07/16 17:53:19 I've refactored this to avoid the clearTimeout and
247 requestTryStatus();
248 }
249 });
200 } 250 }
201 251
202 setTimeout(requestTryStatus, tryPollFrequencyInMs); 252 tryStatusTimeoutID = setTimeout(requestTryStatus, tryPollFrequencyInMs);
203 }); 253 });
204 } 254 }
205 255
206 function main() { 256 function main() {
207 requestStatus(); 257 requestStatus();
208 requestTryStatus(); 258 requestTryStatus();
209 } 259 }
210 260
211 main(); 261 main();
262
263 })();
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698