tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

throttling.js (3208B)


      1 function waitForLoad() {
      2  return new Promise(resolve => addEventListener('load', resolve))
      3    .then(() => delay(10));
      4 }
      5 
      6 function delay(timeout) {
      7  return new Promise(resolve => step_timeout(() => resolve(), 10));
      8 }
      9 
     10 function busy(work) {
     11  return delay(10).then(() => new Promise(resolve => {
     12    step_timeout(() => {
     13      let end = performance.now() + work;
     14      while (performance.now() < end) {
     15 
     16      }
     17 
     18      resolve();
     19    }, 1);
     20  }));
     21 }
     22 
     23 function getThrottlingRate(delay) {
     24  return new Promise(resolve => {
     25    let start = performance.now();
     26    setTimeout(() => {
     27      let rate = Math.floor((performance.now() - start) / delay);
     28      resolve(rate);
     29    }, delay);
     30  });
     31 }
     32 
     33 function addElement(t, element, src) {
     34  return new Promise((resolve, reject) => {
     35    let e = document.createElement(element);
     36    e.addEventListener('load', () => resolve(e));
     37    if (src) {
     38      e.src = src;
     39    }
     40    document.body.appendChild(e);
     41    t.add_cleanup(() => e.remove());
     42  });
     43 }
     44 
     45 function inFrame(t) {
     46  return addElement(t, "iframe", "resources/test.html")
     47    .then(frame => delay(10).then(() => Promise.resolve(frame.contentWindow)));
     48 }
     49 
     50 function addWebSocket(t, url) {
     51  return new Promise((resolve, reject) => {
     52    let socket = new WebSocket(url);
     53    socket.onopen = () => {
     54      t.add_cleanup(() => socket.close());
     55      resolve();
     56    };
     57    socket.onerror = reject;
     58  });
     59 }
     60 
     61 function addRTCPeerConnection(t) {
     62  return new Promise((resolve, reject) => {
     63    let connection = new RTCPeerConnection();
     64    t.add_cleanup(() => {
     65      connection.close()
     66    });
     67 
     68    resolve();
     69  });
     70 }
     71 
     72 function addIndexedDB(t) {
     73  return new Promise((resolve, reject) => {
     74    let iDBState = {
     75      running: false,
     76      db: null
     77    };
     78 
     79    let req = indexedDB.open("testDB", 1);
     80 
     81    req.onupgradeneeded = e => {
     82      let db = e.target.result;
     83      let store = db.createObjectStore("testOS", {keyPath: "id"});
     84      let index = store.createIndex("index", ["col"]);
     85    };
     86 
     87    req.onsuccess = e => {
     88      let db = iDBState.db = e.target.result;
     89      let store = db.transaction("testOS", "readwrite").objectStore("testOS");
     90      let ctr = 0;
     91 
     92      iDBState.running = true;
     93 
     94      function putLoop() {
     95        if (!iDBState.running) {
     96          return;
     97        }
     98 
     99        let req = store.put({id: ctr++, col: "foo"});
    100        req.onsuccess = putLoop;
    101 
    102        if (!iDBState.request) {
    103          iDBState.request = req;
    104        }
    105      }
    106 
    107      putLoop();
    108      resolve();
    109    };
    110 
    111    t.add_cleanup(() => {
    112      iDBState.running = false;
    113      iDBState.db && iDBState.db.close();
    114      iDBState.db = null;
    115    });
    116  });
    117 }
    118 
    119 function addWebAudio(t) {
    120  return new Promise(resolve => {
    121    let context = new (window.AudioContext || window.webkitAudioContext)();
    122    context.onstatechange = () => (context.state === "running") && resolve();
    123 
    124    let gain = context.createGain();
    125    gain.gain.value = 0.1;
    126    gain.connect(context.destination);
    127 
    128    let webaudionode = context.createOscillator();
    129    webaudionode.type = 'square';
    130    webaudionode.frequency.value = 440; // value in hertz
    131    webaudionode.connect(gain);
    132    webaudionode.start();
    133 
    134    t.add_cleanup(() => webaudionode.stop());
    135  });
    136 }