summaryrefslogtreecommitdiffstats
path: root/dom/security/test/csp/file_report_chromescript.js
diff options
context:
space:
mode:
Diffstat (limited to 'dom/security/test/csp/file_report_chromescript.js')
-rw-r--r--dom/security/test/csp/file_report_chromescript.js54
1 files changed, 54 insertions, 0 deletions
diff --git a/dom/security/test/csp/file_report_chromescript.js b/dom/security/test/csp/file_report_chromescript.js
new file mode 100644
index 000000000..bf4f70edb
--- /dev/null
+++ b/dom/security/test/csp/file_report_chromescript.js
@@ -0,0 +1,54 @@
+Components.utils.import("resource://gre/modules/Services.jsm");
+
+const Ci = Components.interfaces;
+const Cc = Components.classes;
+
+const reportURI = "http://mochi.test:8888/foo.sjs";
+
+var openingObserver = {
+ observe: function(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);
+
+ var segments = [];
+ for (var count = uploadStream.available(); count; count = uploadStream.available()) {
+ var data = binstream.readBytes(count);
+ segments.push(data);
+ }
+
+ var reportText = segments.join("");
+ // 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);
+ }
+ message.report = reportText;
+ } catch (e) {
+ message.error = e.toString();
+ }
+
+ sendAsyncMessage('opening-request-completed', message);
+ Services.obs.removeObserver(openingObserver, 'http-on-opening-request');
+ }
+ }
+};
+
+Services.obs.addObserver(openingObserver, 'http-on-opening-request', false);