1// Handle counting loads for bug 704320.
2
3const SHARED_KEY = "bug704320_counter";
4const DEFAULT_STATE = {
5  css: { count: 0, referrers: [] },
6  img: { count: 0, referrers: [] },
7  js: { count: 0, referrers: [] },
8};
9const TYPE_MAP = {
10  css: "text/css",
11  js: "application/javascript",
12  img: "image/png",
13  html: "text/html",
14};
15
16// Writes an image to the response
17function WriteOutImage(response) {
18  var file = Components.classes["@mozilla.org/file/directory_service;1"]
19    .getService(Components.interfaces.nsIProperties)
20    .get("CurWorkD", Components.interfaces.nsIFile);
21
22  file.append("tests");
23  file.append("image");
24  file.append("test");
25  file.append("mochitest");
26  file.append("blue.png");
27
28  var fileStream = Components.classes[
29    "@mozilla.org/network/file-input-stream;1"
30  ].createInstance(Components.interfaces.nsIFileInputStream);
31  fileStream.init(file, 1, 0, false);
32  response.bodyOutputStream.writeFrom(fileStream, fileStream.available());
33}
34
35function handleRequest(request, response) {
36  var query = {};
37  request.queryString.split("&").forEach(function(val) {
38    var [name, value] = val.split("=");
39    query[name] = unescape(value);
40  });
41
42  var referrerLevel = "none";
43  if (request.hasHeader("Referer")) {
44    let referrer = request.getHeader("Referer");
45    if (referrer.indexOf("bug704320") > 0) {
46      referrerLevel = "full";
47    } else if (referrer == "http://mochi.test:8888/") {
48      referrerLevel = "origin";
49    }
50  }
51
52  var state = getSharedState(SHARED_KEY);
53  if (state === "") {
54    state = DEFAULT_STATE;
55  } else {
56    state = JSON.parse(state);
57  }
58
59  response.setStatusLine(request.httpVersion, 200, "OK");
60
61  //avoid confusing cache behaviors
62  response.setHeader("Cache-Control", "no-cache", false);
63
64  if ("reset" in query) {
65    //reset server state
66    setSharedState(SHARED_KEY, JSON.stringify(DEFAULT_STATE));
67    //serve any CSS that we want to use.
68    response.write("");
69    return;
70  }
71
72  if ("results" in query) {
73    response.setHeader("Content-Type", "text/javascript", false);
74    response.write(JSON.stringify(state));
75    return;
76  }
77
78  if ("type" in query) {
79    state[query.type].count++;
80    response.setHeader("Content-Type", TYPE_MAP[query.type], false);
81    if (state[query.type].referrers.indexOf(referrerLevel) < 0) {
82      state[query.type].referrers.push(referrerLevel);
83    }
84
85    if (query.type == "img") {
86      WriteOutImage(response);
87    }
88  }
89
90  if ("content" in query) {
91    response.write(unescape(query.content));
92  }
93
94  setSharedState(SHARED_KEY, JSON.stringify(state));
95  return;
96}
97