Source code

Revision control

Copy as Markdown

Other Tools

/* -*- 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/. */
// small red image
const IMG_BYTES = atob(
"iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12" +
"P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="
);
// stolen from file_blocked_script.sjs
function setGlobalState(data, key) {
let x = {
data,
QueryInterface: ChromeUtils.generateQI([]),
};
x.wrappedJSObject = x;
setObjectState(key, x);
}
function getGlobalState(key) {
var data;
getObjectState(key, function (x) {
data = x && x.wrappedJSObject.data;
});
return data;
}
function handleRequest(request, response) {
if (request.queryString == "complete") {
// Unblock the previous request.
response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Cache-Control", "no-cache", false);
response.setHeader("Content-Type", "application/json", false);
response.write("true"); // the payload doesn't matter.
let blockedResponse = getGlobalState("a11y-image");
if (blockedResponse) {
blockedResponse.setStatusLine(request.httpVersion, 200, "OK");
blockedResponse.setHeader("Cache-Control", "no-cache", false);
blockedResponse.setHeader("Content-Type", "image/png", false);
blockedResponse.write(IMG_BYTES);
blockedResponse.finish();
setGlobalState(undefined, "a11y-image");
}
} else {
// Getting the image
response.processAsync();
// Store the response in the global state
setGlobalState(response, "a11y-image");
}
}