file_fetch_observer.html (3500B)
1 <script> 2 function ok(a, msg) { 3 parent.postMessage({ type: "check", status: !!a, message: msg }, "*"); 4 } 5 6 function is(a, b, msg) { 7 ok(a === b, msg); 8 } 9 10 function testObserver() { 11 ok("FetchObserver" in self, "We have a FetchObserver prototype"); 12 13 fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', { observe: o => { 14 ok(!!o, "We have an observer"); 15 ok(o instanceof FetchObserver, "The correct object has been passed"); 16 is(o.state, "requesting", "By default the state is requesting"); 17 next(); 18 }}); 19 } 20 21 function testObserveAbort() { 22 var ac = new AbortController(); 23 24 fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', { 25 signal: ac.signal, 26 observe: o => { 27 o.onstatechange = () => { 28 ok(true, "StateChange event dispatched"); 29 if (o.state == "aborted") { 30 ok(true, "Aborted!"); 31 next(); 32 } 33 } 34 ac.abort(); 35 } 36 }); 37 } 38 39 function testObserveComplete() { 40 var ac = new AbortController(); 41 42 fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', { 43 signal: ac.signal, 44 observe: o => { 45 o.onstatechange = () => { 46 ok(true, "StateChange event dispatched"); 47 if (o.state == "complete") { 48 ok(true, "Operation completed"); 49 next(); 50 } 51 } 52 } 53 }); 54 } 55 56 function testObserveErrored() { 57 var ac = new AbortController(); 58 59 fetch('foo: bar', { 60 signal: ac.signal, 61 observe: o => { 62 o.onstatechange = () => { 63 ok(true, "StateChange event dispatched"); 64 if (o.state == "errored") { 65 ok(true, "Operation completed"); 66 next(); 67 } 68 } 69 } 70 }); 71 } 72 73 function testObserveResponding() { 74 var ac = new AbortController(); 75 76 fetch('http://mochi.test:8888/tests/dom/tests/mochitest/fetch/slow.sjs', { 77 signal: ac.signal, 78 observe: o => { 79 o.onstatechange = () => { 80 if (o.state == "responding") { 81 ok(true, "We have responding events"); 82 next(); 83 } 84 } 85 } 86 }); 87 } 88 89 function workify(worker) { 90 function methods() { 91 function ok(a, msg) { 92 postMessage( { type: 'check', state: !!a, message: msg }); 93 }; 94 function is(a, b, msg) { 95 postMessage( { type: 'check', state: a === b, message: msg }); 96 }; 97 function next() { 98 postMessage( { type: 'finish' }); 99 }; 100 } 101 102 var str = methods.toString(); 103 var methodsContent = str.substring(0, str.length - 1).split('\n').splice(1).join('\n'); 104 105 str = worker.toString(); 106 var workerContent = str.substring(0, str.length - 1).split('\n').splice(1).join('\n'); 107 108 var content = methodsContent + workerContent; 109 var url = URL.createObjectURL(new Blob([content], { type: "application/javascript" })); 110 var w = new Worker(url); 111 w.onmessage = e => { 112 if (e.data.type == 'check') { 113 ok(e.data.state, "WORKER: " + e.data.message); 114 } else if (e.data.type == 'finish') { 115 next(); 116 } else { 117 ok(false, "Something went wrong"); 118 } 119 } 120 } 121 122 var steps = [ 123 testObserver, 124 testObserveAbort, 125 function() { workify(testObserveAbort); }, 126 testObserveComplete, 127 function() { workify(testObserveComplete); }, 128 testObserveErrored, 129 function() { workify(testObserveErrored); }, 130 testObserveResponding, 131 function() { workify(testObserveResponding); }, 132 ]; 133 134 function next() { 135 if (!steps.length) { 136 parent.postMessage({ type: "finish" }, "*"); 137 return; 138 } 139 140 var step = steps.shift(); 141 step(); 142 } 143 144 next(); 145 146 </script>