tor-browser

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

test_cache_jar.js (2509B)


      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:" + httpserv.identity.primaryPort + "/cached";
      9 });
     10 
     11 var httpserv = null;
     12 var handlers_called = 0;
     13 
     14 function cached_handler(metadata, response) {
     15  response.setHeader("Content-Type", "text/plain", false);
     16  response.setHeader("Cache-Control", "max-age=10000", false);
     17  response.setStatusLine(metadata.httpVersion, 200, "OK");
     18  var body = "0123456789";
     19  response.bodyOutputStream.write(body, body.length);
     20  handlers_called++;
     21 }
     22 
     23 function makeChan(url, userContextId) {
     24  var chan = NetUtil.newChannel({
     25    uri: url,
     26    loadUsingSystemPrincipal: true,
     27  }).QueryInterface(Ci.nsIHttpChannel);
     28  chan.loadInfo.originAttributes = { userContextId };
     29  return chan;
     30 }
     31 
     32 // [userContextId, expected_handlers_called]
     33 var firstTests = [
     34  [0, 1],
     35  [1, 1],
     36 ];
     37 var secondTests = [
     38  [0, 0],
     39  [1, 1],
     40  [1, 0],
     41 ];
     42 
     43 async function run_all_tests() {
     44  for (let test of firstTests) {
     45    handlers_called = 0;
     46    await test_channel(...test);
     47  }
     48 
     49  // We can't easily cause webapp data to be cleared from the child process, so skip
     50  // the rest of these tests.
     51  let procType = Services.appinfo.processType;
     52  if (procType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT) {
     53    return;
     54  }
     55 
     56  Services.clearData.deleteDataFromOriginAttributesPattern({
     57    userContextId: 1,
     58  });
     59 
     60  for (let test of secondTests) {
     61    handlers_called = 0;
     62    await test_channel(...test);
     63  }
     64 }
     65 
     66 function run_test() {
     67  do_get_profile();
     68 
     69  do_test_pending();
     70 
     71  Services.prefs.setBoolPref("network.http.rcwn.enabled", false);
     72 
     73  httpserv = new HttpServer();
     74  httpserv.registerPathHandler("/cached", cached_handler);
     75  httpserv.start(-1);
     76  run_all_tests().then(() => {
     77    do_test_finished();
     78  });
     79 }
     80 
     81 function test_channel(userContextId, expected) {
     82  return new Promise(resolve => {
     83    var chan = makeChan(URL, userContextId);
     84    chan.asyncOpen(
     85      new ChannelListener(doneFirstLoad.bind(null, resolve), expected)
     86    );
     87  });
     88 }
     89 
     90 function doneFirstLoad(resolve, req, buffer, expected) {
     91  // Load it again, make sure it hits the cache
     92  var oa = req.loadInfo.originAttributes;
     93  var chan = makeChan(URL, oa.userContextId);
     94  chan.asyncOpen(
     95    new ChannelListener(doneSecondLoad.bind(null, resolve), expected)
     96  );
     97 }
     98 
     99 function doneSecondLoad(resolve, req, buffer, expected) {
    100  Assert.equal(handlers_called, expected);
    101  resolve();
    102 }