tor-browser

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

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 }