forked from mirrors/gecko-dev
This will require that entries for renamed files be updated so that they don't accidentally start being loaded under the new name later. It also prevents dead code entries from sticking around after their targets are removed. Using `throttledMapPromises` is probably not strictly necessary given the small number of entries in most lists, but since it already exists, we may as well use it here. Differential Revision: https://phabricator.services.mozilla.com/D150921
78 lines
2.1 KiB
JavaScript
78 lines
2.1 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
|
|
var EXPORTED_SYMBOLS = ["PerfTestHelpers"];
|
|
|
|
const lazy = {};
|
|
|
|
ChromeUtils.defineModuleGetter(
|
|
lazy,
|
|
"NetUtil",
|
|
"resource://gre/modules/NetUtil.jsm"
|
|
);
|
|
|
|
var PerfTestHelpers = {
|
|
/**
|
|
* Maps the entries in the given iterable to the given
|
|
* promise-returning task function, and waits for all returned
|
|
* promises to have resolved. At most `limit` promises may remain
|
|
* unresolved at a time. When the limit is reached, the function will
|
|
* wait for some to resolve before spawning more tasks.
|
|
*/
|
|
async throttledMapPromises(iterable, task, limit = 64) {
|
|
let pending = new Set();
|
|
let promises = [];
|
|
for (let data of iterable) {
|
|
while (pending.size >= limit) {
|
|
await Promise.race(pending);
|
|
}
|
|
|
|
let promise = task(data);
|
|
promises.push(promise);
|
|
if (promise) {
|
|
promise.finally(() => pending.delete(promise));
|
|
pending.add(promise);
|
|
}
|
|
}
|
|
|
|
return Promise.all(promises);
|
|
},
|
|
|
|
/**
|
|
* Returns a promise which resolves to true if the resource at the
|
|
* given URI exists, false if it doesn't. This should only be used
|
|
* with local resources, such as from resource:/chrome:/jar:/file:
|
|
* URIs.
|
|
*/
|
|
checkURIExists(uri) {
|
|
return new Promise(resolve => {
|
|
try {
|
|
let channel = lazy.NetUtil.newChannel({
|
|
uri,
|
|
loadUsingSystemPrincipal: true,
|
|
});
|
|
|
|
channel.asyncOpen({
|
|
onStartRequest(request) {
|
|
resolve(Components.isSuccessCode(request.status));
|
|
request.cancel(Cr.NS_BINDING_ABORTED);
|
|
},
|
|
|
|
onStopRequest(request, status) {
|
|
// We should have already resolved from `onStartRequest`, but
|
|
// we resolve again here just as a failsafe.
|
|
resolve(Components.isSuccessCode(status));
|
|
},
|
|
});
|
|
} catch (e) {
|
|
if (
|
|
e.result != Cr.NS_ERROR_FILE_NOT_FOUND &&
|
|
e.result != Cr.NS_ERROR_NOT_AVAILABLE
|
|
) {
|
|
throw e;
|
|
}
|
|
resolve(false);
|
|
}
|
|
});
|
|
},
|
|
};
|