Thu, 15 Jan 2015 15:59:08 +0100
Implement a real Private Browsing Mode condition by changing the API/ABI;
This solves Tor bug #9701, complying with disk avoidance documented in
https://www.torproject.org/projects/torbrowser/design/#disk-avoidance.
1 /* Any copyright is dedicated to the Public Domain.
2 * http://creativecommons.org/publicdomain/zero/1.0/
3 */
5 var timer = Components.classes["@mozilla.org/timer;1"];
6 var partTimer = timer.createInstance(Components.interfaces.nsITimer);
8 function getFileAsInputStream(aFilename) {
9 var file = Components.classes["@mozilla.org/file/directory_service;1"]
10 .getService(Components.interfaces.nsIProperties)
11 .get("CurWorkD", Components.interfaces.nsIFile);
13 file.append("tests");
14 file.append("image");
15 file.append("test");
16 file.append("mochitest");
17 file.append(aFilename);
19 var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1']
20 .createInstance(Components.interfaces.nsIFileInputStream);
21 fileStream.init(file, 1, 0, false);
22 return fileStream;
23 }
25 function handleRequest(request, response)
26 {
27 response.setHeader("Content-Type", "image/gif", false);
28 response.setHeader("Cache-Control", "no-cache", false);
29 response.setStatusLine(request.httpVersion, 200, "OK");
30 // We're sending data off in a delayed fashion
31 response.processAsync();
32 var inputStream = getFileAsInputStream("animated-gif_trailing-garbage.gif");
33 var available = inputStream.available(); // = 4029 bytes
34 // Send the good data at once
35 response.bodyOutputStream.writeFrom(inputStream, 285);
36 sendParts(inputStream, response);
37 }
39 function sendParts(inputStream, response) {
40 // 3744 left, send in 8 chunks of 468 each
41 partTimer.initWithCallback(getSendNextPart(inputStream, response), 500,
42 Components.interfaces.nsITimer.TYPE_ONE_SHOT);
43 }
45 function getSendNextPart(inputStream, response) {
46 return function () {
47 response.bodyOutputStream.writeFrom(inputStream, 468);
48 if (!inputStream.available()) {
49 inputStream.close();
50 response.finish();
51 } else {
52 sendParts(inputStream, response);
53 }
54 };
55 }