<html>
<head>
  <title>pdf.js test slave</title>
  <script type="text/javascript" src="pdf.js"></script>
  <script type="text/javascript" src="fonts.js"></script>
  <script type="text/javascript" src="glyphlist.js"></script>
  <script type="application/javascript">
var browser, canvas, currentTask, currentTaskIdx, failure, manifest, pdfDoc, stdout;

function queryParams() {
    var qs = window.location.search.substring(1);
    var kvs = qs.split("&");
    var params = { };
    for (var i = 0; i < kvs.length; ++i) {
        var kv = kvs[i].split("=");
        params[unescape(kv[0])] = unescape(kv[1]);
    }
    return params;
}

function load() {
  var params = queryParams();
  browser = params.browser;
  manifestFile = params.manifestFile;

  canvas = document.createElement("canvas");
  // 8.5x11in @ 100% ... XXX need something better here
  canvas.width = 816;
  canvas.height = 1056;
  canvas.mozOpaque = true;
  stdout = document.getElementById("stdout");

  log("Harness thinks this browser is '"+ browser +"'\n");
  log("Fetching manifest ...");

  var r = new XMLHttpRequest();
  r.open("GET", manifestFile, false);
  r.onreadystatechange = function(e) {
    if (r.readyState == 4) {
      log("done\n");

      manifest = JSON.parse(r.responseText);
      currentTaskIdx = 0, nextTask();
    }
  };
  r.send(null);
}

function nextTask() {
  if (currentTaskIdx == manifest.length) {
    return done();
  }
  currentTask = manifest[currentTaskIdx];
  currentTask.round = 0;

  log("Loading file "+ currentTask.file +"\n");

  var r = new XMLHttpRequest();
  r.open("GET", currentTask.file);
  r.mozResponseType = r.responseType = "arraybuffer";
  r.onreadystatechange = function() {
    if (r.readyState == 4) {
      var data = r.mozResponseArrayBuffer || r.mozResponse ||
                 r.responseArrayBuffer || r.response;
      pdfDoc = new PDFDoc(new Stream(data));
      currentTask.pageNum = 1, nextPage();
    }    
  };
  r.send(null);
}

function nextPage() {
  if (currentTask.pageNum > pdfDoc.numPages) {
    if (++currentTask.round < currentTask.rounds) {
      log("  Round "+ (1 + currentTask.round) +"\n");
      currentTask.pageNum = 1;
    } else {
      ++currentTaskIdx, nextTask();
      return;
    }
  }

  failure = '';
  log("    drawing page "+ currentTask.pageNum +"...");

  currentPage = pdfDoc.getPage(currentTask.pageNum);

  var ctx = canvas.getContext("2d");
  clear(ctx);

  var fonts = [];
  var gfx = new CanvasGraphics(ctx);
  try {
    currentPage.compile(gfx, fonts);
  } catch(e) {
    failure = 'compile: '+ e.toString();
  }

  // TODO load fonts
  setTimeout(function() {
      if (!failure) {
        try {
          currentPage.display(gfx);
        } catch(e) {
          failure = 'render: '+ e.toString();
        }
      }
      currentTask.taskDone = (currentTask.pageNum == pdfDoc.numPages
                              && (1 + currentTask.round) == currentTask.rounds);
      sendTaskResult(canvas.toDataURL("image/png"));
      log("done"+ (failure ? " (failed!)" : "") +"\n");

      ++currentTask.pageNum, nextPage();
    },
    0
  );
}

function done() {
  log("Done!\n");
  setTimeout(function() {
      document.body.innerHTML = "Tests are finished.  <h1>CLOSE ME!</h1>";
      window.close();
    },
    100
  );
}

function sendTaskResult(snapshot) {
  var result = { browser: browser,
                 id: currentTask.id,
                 taskDone: currentTask.taskDone,
                 failure: failure,
                 file: currentTask.file,
                 round: currentTask.round,
                 page: currentTask.pageNum,
                 snapshot: snapshot };

  var r = new XMLHttpRequest();
  // (The POST URI is ignored atm.)
  r.open("POST", "submit_task_results", false);
  r.setRequestHeader("Content-Type", "application/json");
  // XXX async
  r.send(JSON.stringify(result));
}

function clear(ctx) {
  var ctx = canvas.getContext("2d");
  ctx.save();
  ctx.fillStyle = "rgb(255, 255, 255)";
  ctx.fillRect(0, 0, canvas.width, canvas.height);
  ctx.restore();
}

function log(str) {
  stdout.innerHTML += str;
  window.scrollTo(0, stdout.getBoundingClientRect().bottom);
}
  </script>
</head>

<body onload="load();">
  <pre id="stdout"></pre>
</body>

</html>