file_blocked_script.sjs (2254B)
1 /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 2 /* vim: set ts=8 sts=2 et sw=2 tw=80: */ 3 /* This Source Code Form is subject to the terms of the Mozilla Public 4 * License, v. 2.0. If a copy of the MPL was not distributed with this 5 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 6 7 function setGlobalState(data, key) { 8 x = { 9 data, 10 QueryInterface(iid) { 11 return this; 12 }, 13 }; 14 x.wrappedJSObject = x; 15 setObjectState(key, x); 16 } 17 18 function getGlobalState(key) { 19 var data; 20 getObjectState(key, function (x) { 21 data = x && x.wrappedJSObject.data; 22 }); 23 return data; 24 } 25 26 function finishBlockedRequest(request, response, query) { 27 response.setStatusLine(request.httpVersion, 200, "OK"); 28 response.setHeader("Cache-Control", "no-cache", false); 29 response.setHeader("Content-Type", "application/javascript", false); 30 response.write("scriptLoaded('" + query[1] + "');"); 31 response.finish(); 32 33 setGlobalState(undefined, query[1]); 34 } 35 36 function handleRequest(request, response) { 37 var query = request.queryString.split("&"); 38 switch (query[0]) { 39 case "blocked": 40 var alreadyUnblocked = getGlobalState(query[1]); 41 42 response.processAsync(); 43 if (alreadyUnblocked === true) { 44 // the unblock request came before the blocked request, just go on and finish synchronously 45 finishBlockedRequest(request, response, query); 46 } else { 47 setGlobalState(response, query[1]); 48 } 49 break; 50 51 case "unblock": 52 response.setStatusLine(request.httpVersion, 200, "OK"); 53 response.setHeader("Cache-Control", "no-cache", false); 54 response.setHeader("Content-Type", "image/png", false); 55 response.write("\x89PNG"); // just a broken image is enough for our purpose 56 57 var blockedResponse = getGlobalState(query[1]); 58 if (blockedResponse === undefined) { 59 // the unblock request came before the blocked request, remember to not block it 60 setGlobalState(true, query[1]); 61 } else if (typeof blockedResponse == "object") { 62 finishBlockedRequest(request, blockedResponse, query); 63 } 64 break; 65 66 default: 67 response.setStatusLine(request.httpVersion, 400, "Bad request"); 68 break; 69 } 70 }