diff options
Diffstat (limited to 'dom/base/test/bug704320_counter.sjs')
-rw-r--r-- | dom/base/test/bug704320_counter.sjs | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/dom/base/test/bug704320_counter.sjs b/dom/base/test/bug704320_counter.sjs new file mode 100644 index 000000000..907d22493 --- /dev/null +++ b/dom/base/test/bug704320_counter.sjs @@ -0,0 +1,94 @@ +// Handle counting loads for bug 704320. + +const SHARED_KEY="bug704320_counter"; +const DEFAULT_STATE = {'css': {'count': 0, 'referrers': []}, + 'img': {'count': 0, 'referrers': []}, + 'js': {'count': 0, 'referrers': []}}; +const TYPE_MAP = {'css': 'text/css', + 'js': 'application/javascript', + 'img': 'image/png', + 'html': 'text/html'}; + +// Writes an image to the response +function WriteOutImage(response) +{ + var file = Components.classes["@mozilla.org/file/directory_service;1"] + .getService(Components.interfaces.nsIProperties) + .get("CurWorkD", Components.interfaces.nsIFile); + + file.append("tests"); + file.append("image"); + file.append("test"); + file.append("mochitest"); + file.append('blue.png'); + + var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1'] + .createInstance(Components.interfaces.nsIFileInputStream); + fileStream.init(file, 1, 0, false); + response.bodyOutputStream.writeFrom(fileStream, fileStream.available()); +} + +function handleRequest(request, response) +{ + var query = {}; + request.queryString.split('&').forEach(function (val) { + var [name, value] = val.split('='); + query[name] = unescape(value); + }); + + var referrerLevel = "none"; + if (request.hasHeader('Referer')) { + let referrer = request.getHeader('Referer'); + if (referrer.indexOf("bug704320") > 0) { + referrerLevel = "full"; + } else if (referrer == "http://mochi.test:8888/") { + referrerLevel = "origin"; + } + } + + var state = getSharedState(SHARED_KEY); + if (state === '') { + state = DEFAULT_STATE; + } else { + state = JSON.parse(state); + } + + response.setStatusLine(request.httpVersion, 200, "OK"); + + + //avoid confusing cache behaviors + response.setHeader("Cache-Control", "no-cache", false); + + if ("reset" in query) { + //reset server state + setSharedState(SHARED_KEY, JSON.stringify(DEFAULT_STATE)); + //serve any CSS that we want to use. + response.write(""); + return; + } + + if ("results" in query) { + response.setHeader("Content-Type", "text/javascript", false); + response.write(JSON.stringify(state)); + return; + } + + if ('type' in query) { + state[query.type].count++; + response.setHeader("Content-Type", TYPE_MAP[query.type], false); + if (state[query.type].referrers.indexOf(referrerLevel) < 0) { + state[query.type].referrers.push(referrerLevel); + } + + if (query.type == 'img') { + WriteOutImage(response); + } + } + + if ('content' in query) { + response.write(unescape(query['content'])); + } + + setSharedState(SHARED_KEY, JSON.stringify(state)); + return; +} |