summaryrefslogtreecommitdiffstats
path: root/netwerk/test/unit_ipc/child_cookie_header.js
blob: 4686f509f49b1de817d11deb3fd7768d6450edab (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/* global NetUtil, ChannelListener */

"use strict";

function inChildProcess() {
  return (
    // eslint-disable-next-line mozilla/use-services
    Cc["@mozilla.org/xre/app-info;1"].getService(Ci.nsIXULRuntime)
      .processType != Ci.nsIXULRuntime.PROCESS_TYPE_DEFAULT
  );
}

let uri = null;
function makeChan() {
  return NetUtil.newChannel({
    uri,
    loadUsingSystemPrincipal: true,
  }).QueryInterface(Ci.nsIHttpChannel);
}

function OpenChannelPromise(aChannel, aClosure) {
  return new Promise(resolve => {
    function processResponse(request, buffer, context) {
      aClosure(request.QueryInterface(Ci.nsIHttpChannel), buffer, context);
      resolve();
    }
    aChannel.asyncOpen(new ChannelListener(processResponse, null));
  });
}

// This test doesn't do much, except to communicate with the parent, and get
// URL we need to connect to.
add_task(async function setup() {
  ok(inChildProcess(), "Sanity check. This should run in the child process");
  // Initialize the URL. Parent runs the server
  do_send_remote_message("start-test");
  uri = await do_await_remote_message("start-test-done");
});

// This test performs a request, and checks that no cookie header are visible
// to the child process
add_task(async function test1() {
  let chan = makeChan();

  await OpenChannelPromise(chan, (request, buffer) => {
    equal(buffer, "response");
    Assert.throws(
      () => request.getRequestHeader("Cookie"),
      /NS_ERROR_NOT_AVAILABLE/,
      "Cookie header should not be visible on request in the child"
    );
    Assert.throws(
      () => request.getResponseHeader("Set-Cookie"),
      /NS_ERROR_NOT_AVAILABLE/,
      "Cookie header should not be visible on response in the child"
    );
  });

  // We also check that a cookie was saved by the Set-Cookie header
  // in the parent.
  do_send_remote_message("check-cookie-count");
  let count = await do_await_remote_message("check-cookie-count-done");
  equal(count, 1);
});

// This test communicates with the parent, to locally save a new cookie.
// Then it performs another request, makes sure no cookie headers are visible,
// after which it checks that both cookies are visible to the parent.
add_task(async function test2() {
  do_send_remote_message("set-cookie");
  await do_await_remote_message("set-cookie-done");

  let chan = makeChan();
  await OpenChannelPromise(chan, (request, buffer) => {
    equal(buffer, "response");
    Assert.throws(
      () => request.getRequestHeader("Cookie"),
      /NS_ERROR_NOT_AVAILABLE/,
      "Cookie header should not be visible on request in the child"
    );
    Assert.throws(
      () => request.getResponseHeader("Set-Cookie"),
      /NS_ERROR_NOT_AVAILABLE/,
      "Cookie header should not be visible on response in the child"
    );
  });

  // We should have two cookies. One set by the Set-Cookie header sent by the
  // server, and one that was manually set in the parent.
  do_send_remote_message("second-check-cookie-count");
  let count = await do_await_remote_message("second-check-cookie-count-done");
  equal(count, 2);
});