summaryrefslogtreecommitdiffstats
path: root/dom/security/test/csp/file_report_chromescript.js
blob: 8c8ddcf0a07103f5d19209ccce089b8ac04819f5 (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
/* eslint-env mozilla/chrome-script */

const { NetUtil } = ChromeUtils.importESModule(
  "resource://gre/modules/NetUtil.sys.mjs"
);

// eslint-disable-next-line mozilla/reject-importGlobalProperties
Cu.importGlobalProperties(["TextDecoder"]);

const reportURI = "http://mochi.test:8888/foo.sjs";

var openingObserver = {
  observe(subject, topic, data) {
    // subject should be an nsURI
    if (subject.QueryInterface == undefined) {
      return;
    }

    var message = { report: "", error: false };

    if (topic == "http-on-opening-request") {
      var asciiSpec = subject.QueryInterface(Ci.nsIHttpChannel).URI.asciiSpec;
      if (asciiSpec !== reportURI) {
        return;
      }

      var reportText = false;
      try {
        // Verify that the report was properly formatted.
        // We'll parse the report text as JSON and verify that the properties
        // have expected values.
        var reportText = "{}";
        var uploadStream = subject.QueryInterface(
          Ci.nsIUploadChannel
        ).uploadStream;

        if (uploadStream) {
          // get the bytes from the request body
          var binstream = Cc["@mozilla.org/binaryinputstream;1"].createInstance(
            Ci.nsIBinaryInputStream
          );
          binstream.setInputStream(uploadStream);

          let bytes = NetUtil.readInputStream(binstream);

          // rewind stream as we are supposed to - there will be an assertion later if we don't.
          uploadStream
            .QueryInterface(Ci.nsISeekableStream)
            .seek(Ci.nsISeekableStream.NS_SEEK_SET, 0);

          let textDecoder = new TextDecoder();
          reportText = textDecoder.decode(bytes);
        }

        message.report = reportText;
      } catch (e) {
        message.error = e.toString();
      }

      sendAsyncMessage("opening-request-completed", message);
    }
  },
};

Services.obs.addObserver(openingObserver, "http-on-opening-request");
addMessageListener("finish", function () {
  Services.obs.removeObserver(openingObserver, "http-on-opening-request");
});