1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/image/test/mochitest/bug733553.sjs Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,104 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + * http://creativecommons.org/publicdomain/zero/1.0/ 1.6 + */ 1.7 + 1.8 +var bodyPartIndex = -1; 1.9 +var bodyParts = [ 1.10 + ["red.png", "image/png"], 1.11 + ["animated-gif2.gif", "image/gif"], 1.12 + ["red.png", "image/png"], 1.13 + ["lime100x100.svg", "image/svg+xml"], 1.14 + ["lime100x100.svg", "image/svg+xml"], 1.15 + ["animated-gif2.gif", "image/gif"], 1.16 + ["red.png", "image/png"], 1.17 + // Mime type intentionally wrong (test for bug 907575) 1.18 + ["shaver.png", "image/gif"], 1.19 + ["red.png", "image/png"], 1.20 + ["damon.jpg", "image/jpeg"], 1.21 + ["damon.jpg", "application/octet-stream"], 1.22 + ["damon.jpg", "image/jpeg"], 1.23 + ["rillybad.jpg", "application/x-unknown-content-type"], 1.24 + ["damon.jpg", "image/jpeg"], 1.25 + ["bad.jpg", "image/jpeg"], 1.26 + ["red.png", "image/png"], 1.27 + ["invalid.jpg", "image/jpeg"], 1.28 + ["animated-gif2.gif", "image/gif"] 1.29 +]; 1.30 +var timer = Components.classes["@mozilla.org/timer;1"]; 1.31 +var partTimer = timer.createInstance(Components.interfaces.nsITimer); 1.32 + 1.33 +function getFileAsInputStream(aFilename) { 1.34 + var file = Components.classes["@mozilla.org/file/directory_service;1"] 1.35 + .getService(Components.interfaces.nsIProperties) 1.36 + .get("CurWorkD", Components.interfaces.nsIFile); 1.37 + 1.38 + file.append("tests"); 1.39 + file.append("image"); 1.40 + file.append("test"); 1.41 + file.append("mochitest"); 1.42 + file.append(aFilename); 1.43 + 1.44 + var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1'] 1.45 + .createInstance(Components.interfaces.nsIFileInputStream); 1.46 + fileStream.init(file, 1, 0, false); 1.47 + return fileStream; 1.48 +} 1.49 + 1.50 +function handleRequest(request, response) 1.51 +{ 1.52 + if (!getSharedState("next-part")) { 1.53 + setSharedState("next-part", "-1"); 1.54 + } 1.55 + response.setHeader("Content-Type", 1.56 + "multipart/x-mixed-replace;boundary=BOUNDARYOMG", false); 1.57 + response.setHeader("Cache-Control", "no-cache", false); 1.58 + response.setStatusLine(request.httpVersion, 200, "OK"); 1.59 + // We're sending parts off in a delayed fashion, to let the tests occur. 1.60 + response.processAsync(); 1.61 + response.write("--BOUNDARYOMG\r\n"); 1.62 + sendParts(response); 1.63 +} 1.64 + 1.65 +function sendParts(response) { 1.66 + let wait = false; 1.67 + let nextPart = parseInt(getSharedState("next-part"), 10); 1.68 + if (nextPart == bodyPartIndex) { 1.69 + // Haven't been signaled yet, remain in holding pattern 1.70 + wait = true; 1.71 + } else { 1.72 + bodyPartIndex = nextPart; 1.73 + } 1.74 + if (bodyParts.length > bodyPartIndex) { 1.75 + let callback; 1.76 + if (!wait) { 1.77 + callback = getSendNextPart(response); 1.78 + } else { 1.79 + callback = function () { sendParts(response); }; 1.80 + } 1.81 + partTimer.initWithCallback(callback, 1000, 1.82 + Components.interfaces.nsITimer.TYPE_ONE_SHOT); 1.83 + } 1.84 + else { 1.85 + sendClose(response); 1.86 + } 1.87 +} 1.88 + 1.89 +function sendClose(response) { 1.90 + response.write("--BOUNDARYOMG--\r\n"); 1.91 + response.finish(); 1.92 +} 1.93 + 1.94 +function getSendNextPart(response) { 1.95 + var part = bodyParts[bodyPartIndex]; 1.96 + var nextPartHead = "Content-Type: " + part[1] + "\r\n\r\n"; 1.97 + var inputStream = getFileAsInputStream(part[0]); 1.98 + return function () { 1.99 + response.bodyOutputStream.write(nextPartHead, nextPartHead.length); 1.100 + response.bodyOutputStream.writeFrom(inputStream, inputStream.available()); 1.101 + inputStream.close(); 1.102 + // Toss in the boundary, so the browser can know this part is complete 1.103 + response.write("--BOUNDARYOMG\r\n"); 1.104 + sendParts(response); 1.105 + } 1.106 +} 1.107 +