70 lines
2.2 KiB
JavaScript
70 lines
2.2 KiB
JavaScript
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
function setGlobalState(data, key) {
|
|
x = {
|
|
data,
|
|
QueryInterface(iid) {
|
|
return this;
|
|
},
|
|
};
|
|
x.wrappedJSObject = x;
|
|
setObjectState(key, x);
|
|
}
|
|
|
|
function getGlobalState(key) {
|
|
var data;
|
|
getObjectState(key, function (x) {
|
|
data = x && x.wrappedJSObject.data;
|
|
});
|
|
return data;
|
|
}
|
|
|
|
function finishBlockedRequest(request, response, query) {
|
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
|
response.setHeader("Cache-Control", "no-cache", false);
|
|
response.setHeader("Content-Type", "application/javascript", false);
|
|
response.write("scriptLoaded('" + query[1] + "');");
|
|
response.finish();
|
|
|
|
setGlobalState(undefined, query[1]);
|
|
}
|
|
|
|
function handleRequest(request, response) {
|
|
var query = request.queryString.split("&");
|
|
switch (query[0]) {
|
|
case "blocked":
|
|
var alreadyUnblocked = getGlobalState(query[1]);
|
|
|
|
response.processAsync();
|
|
if (alreadyUnblocked === true) {
|
|
// the unblock request came before the blocked request, just go on and finish synchronously
|
|
finishBlockedRequest(request, response, query);
|
|
} else {
|
|
setGlobalState(response, query[1]);
|
|
}
|
|
break;
|
|
|
|
case "unblock":
|
|
response.setStatusLine(request.httpVersion, 200, "OK");
|
|
response.setHeader("Cache-Control", "no-cache", false);
|
|
response.setHeader("Content-Type", "image/png", false);
|
|
response.write("\x89PNG"); // just a broken image is enough for our purpose
|
|
|
|
var blockedResponse = getGlobalState(query[1]);
|
|
if (blockedResponse === undefined) {
|
|
// the unblock request came before the blocked request, remember to not block it
|
|
setGlobalState(true, query[1]);
|
|
} else if (typeof blockedResponse == "object") {
|
|
finishBlockedRequest(request, blockedResponse, query);
|
|
}
|
|
break;
|
|
|
|
default:
|
|
response.setStatusLine(request.httpVersion, 400, "Bad request");
|
|
break;
|
|
}
|
|
}
|