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