fune/browser/base/content/test/performance/PerfTestHelpers.jsm
Kris Maglione a78b44be00 Bug 1777886 - Check that denylist/intermittent files actually exist in startup perf tests. r=florian
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
2022-07-08 00:59:02 +00:00

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);
}
});
},
};