test_reentrancy.js (2270B)
1 "use strict"; 2 3 const { HttpServer } = ChromeUtils.importESModule( 4 "resource://testing-common/httpd.sys.mjs" 5 ); 6 7 ChromeUtils.defineLazyGetter(this, "URL", function () { 8 return "http://localhost:" + httpserver.identity.primaryPort; 9 }); 10 11 var httpserver = new HttpServer(); 12 var testpath = "/simple"; 13 var httpbody = "<?xml version='1.0' ?><root>0123456789</root>"; 14 15 function syncXHR() { 16 var xhr = new XMLHttpRequest(); 17 xhr.open("GET", URL + testpath, false); 18 xhr.send(null); 19 } 20 21 const MAX_TESTS = 2; 22 23 var listener = { 24 _done_onStart: false, 25 _done_onData: false, 26 _test: 0, 27 28 QueryInterface: ChromeUtils.generateQI([ 29 "nsIStreamListener", 30 "nsIRequestObserver", 31 ]), 32 33 onStartRequest(request) { 34 switch (this._test) { 35 case 0: 36 request.suspend(); 37 syncXHR(); 38 request.resume(); 39 break; 40 case 1: 41 request.suspend(); 42 syncXHR(); 43 executeSoon(function () { 44 request.resume(); 45 }); 46 break; 47 case 2: 48 executeSoon(function () { 49 request.suspend(); 50 }); 51 executeSoon(function () { 52 request.resume(); 53 }); 54 syncXHR(); 55 break; 56 } 57 58 this._done_onStart = true; 59 }, 60 61 onDataAvailable(request, stream, offset, count) { 62 Assert.ok(this._done_onStart); 63 read_stream(stream, count); 64 this._done_onData = true; 65 }, 66 67 onStopRequest() { 68 Assert.ok(this._done_onData); 69 this._reset(); 70 if (this._test <= MAX_TESTS) { 71 next_test(); 72 } else { 73 httpserver.stop(do_test_finished); 74 } 75 }, 76 77 _reset() { 78 this._done_onStart = false; 79 this._done_onData = false; 80 this._test++; 81 }, 82 }; 83 84 function makeChan(url) { 85 return NetUtil.newChannel({ 86 uri: url, 87 loadUsingSystemPrincipal: true, 88 }).QueryInterface(Ci.nsIHttpChannel); 89 } 90 91 function next_test() { 92 var chan = makeChan(URL + testpath); 93 chan.QueryInterface(Ci.nsIRequest); 94 chan.asyncOpen(listener); 95 } 96 97 function run_test() { 98 httpserver.registerPathHandler(testpath, serverHandler); 99 httpserver.start(-1); 100 101 next_test(); 102 103 do_test_pending(); 104 } 105 106 function serverHandler(metadata, response) { 107 response.setHeader("Content-Type", "text/xml", false); 108 response.bodyOutputStream.write(httpbody, httpbody.length); 109 }