/* -*- 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;
  }
}
