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 }