mirror of
				https://github.com/mozilla/gecko-dev.git
				synced 2025-11-04 02:09:05 +02:00 
			
		
		
		
	
		
			
				
	
	
		
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
	
		
			2.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
/* Any copyright is dedicated to the Public Domain.
 | 
						|
   http://creativecommons.org/publicdomain/zero/1.0/ */
 | 
						|
 | 
						|
const lazy = {};
 | 
						|
 | 
						|
ChromeUtils.defineESModuleGetters(lazy, {
 | 
						|
  NetUtil: "resource://gre/modules/NetUtil.sys.mjs",
 | 
						|
});
 | 
						|
 | 
						|
export 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,
 | 
						|
          // Avoid crashing for non-existant files. If the file not existing
 | 
						|
          // is bad, we can deal with it in the test instead.
 | 
						|
          contentPolicyType: Ci.nsIContentPolicy.TYPE_FETCH,
 | 
						|
        });
 | 
						|
 | 
						|
        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);
 | 
						|
      }
 | 
						|
    });
 | 
						|
  },
 | 
						|
};
 |