tor-browser

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

test_loadgroup_cancel.js (2911B)


      1 /* This Source Code Form is subject to the terms of the Mozilla Public
      2 * License, v. 2.0. If a copy of the MPL was not distributed with this
      3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
      4 
      5 "use strict";
      6 
      7 function makeChan(url) {
      8  return NetUtil.newChannel({
      9    uri: url,
     10    loadUsingSystemPrincipal: true,
     11  }).QueryInterface(Ci.nsIHttpChannel);
     12 }
     13 
     14 const { HttpServer } = ChromeUtils.importESModule(
     15  "resource://testing-common/httpd.sys.mjs"
     16 );
     17 
     18 function request_handler(metadata, response) {
     19  response.processAsync();
     20  do_timeout(500, () => {
     21    const body = "some body once told me...";
     22    response.setStatusLine(metadata.httpVersion, 200, "Ok");
     23    response.setHeader("Content-Type", "text/plain", false);
     24    response.setHeader("Content-Length", "" + body.length, false);
     25    response.bodyOutputStream.write(body, body.length);
     26    response.finish();
     27  });
     28 }
     29 
     30 // This test checks that when canceling a loadgroup by the time the loadgroup's
     31 // groupObserver is sent OnStopRequest for a request, that request has been
     32 // canceled.
     33 add_task(async function test_cancelledInOnStop() {
     34  let http_server = new HttpServer();
     35  http_server.registerPathHandler("/test1", request_handler);
     36  http_server.registerPathHandler("/test2", request_handler);
     37  http_server.registerPathHandler("/test3", request_handler);
     38  http_server.start(-1);
     39  const port = http_server.identity.primaryPort;
     40 
     41  let loadGroup = Cc["@mozilla.org/network/load-group;1"].createInstance(
     42    Ci.nsILoadGroup
     43  );
     44 
     45  let loadListener = {
     46    onStartRequest: () => {
     47      info("onStartRequest");
     48    },
     49    onStopRequest: (aRequest, aStatusCode) => {
     50      equal(
     51        aStatusCode,
     52        Cr.NS_ERROR_ABORT,
     53        "aStatusCode must be the cancellation code"
     54      );
     55      equal(
     56        aRequest.status,
     57        Cr.NS_ERROR_ABORT,
     58        "aRequest.status must be the cancellation code"
     59      );
     60    },
     61    QueryInterface: ChromeUtils.generateQI([
     62      "nsIRequestObserver",
     63      "nsISupportsWeakReference",
     64    ]),
     65  };
     66  loadGroup.groupObserver = loadListener;
     67 
     68  let chan1 = makeChan(`http://localhost:${port}/test1`);
     69  chan1.loadGroup = loadGroup;
     70  let chan2 = makeChan(`http://localhost:${port}/test2`);
     71  chan2.loadGroup = loadGroup;
     72  let chan3 = makeChan(`http://localhost:${port}/test3`);
     73  chan3.loadGroup = loadGroup;
     74 
     75  await new Promise(resolve => do_timeout(500, resolve));
     76 
     77  let promises = [
     78    new Promise(resolve => {
     79      chan1.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE));
     80    }),
     81    new Promise(resolve => {
     82      chan2.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE));
     83    }),
     84    new Promise(resolve => {
     85      chan3.asyncOpen(new ChannelListener(resolve, null, CL_EXPECT_FAILURE));
     86    }),
     87  ];
     88 
     89  loadGroup.cancel(Cr.NS_ERROR_ABORT);
     90 
     91  await Promise.all(promises);
     92 
     93  await new Promise(resolve => {
     94    http_server.stop(resolve);
     95  });
     96 });