<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>