Thu, 22 Jan 2015 13:21:57 +0100
Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6
1 var data = '<!DOCTYPE HTML>\n\
2 <html>\n\
3 <head>\n\
4 <script>\n\
5 window.addEventListener("message", function(e) {\n\
6 \n\
7 sendData = null;\n\
8 \n\
9 req = eval(e.data);\n\
10 var res = {\n\
11 didFail: false,\n\
12 events: [],\n\
13 progressEvents: 0\n\
14 };\n\
15 \n\
16 var xhr = new XMLHttpRequest();\n\
17 for (type of ["load", "abort", "error", "loadstart", "loadend"]) {\n\
18 xhr.addEventListener(type, function(e) {\n\
19 res.events.push(e.type);\n\
20 }, false);\n\
21 }\n\
22 xhr.addEventListener("readystatechange", function(e) {\n\
23 res.events.push("rs" + xhr.readyState);\n\
24 }, false);\n\
25 xhr.addEventListener("progress", function(e) {\n\
26 res.progressEvents++;\n\
27 }, false);\n\
28 if (req.uploadProgress) {\n\
29 xhr.upload.addEventListener(req.uploadProgress, function(e) {\n\
30 res.progressEvents++;\n\
31 }, false);\n\
32 }\n\
33 xhr.onerror = function(e) {\n\
34 res.didFail = true;\n\
35 };\n\
36 xhr.onloadend = function (event) {\n\
37 res.status = xhr.status;\n\
38 try {\n\
39 res.statusText = xhr.statusText;\n\
40 } catch (e) {\n\
41 delete(res.statusText);\n\
42 }\n\
43 res.responseXML = xhr.responseXML ?\n\
44 (new XMLSerializer()).serializeToString(xhr.responseXML) :\n\
45 null;\n\
46 res.responseText = xhr.responseText;\n\
47 \n\
48 res.responseHeaders = {};\n\
49 for (responseHeader in req.responseHeaders) {\n\
50 res.responseHeaders[responseHeader] =\n\
51 xhr.getResponseHeader(responseHeader);\n\
52 }\n\
53 res.allResponseHeaders = {};\n\
54 var splitHeaders = xhr.getAllResponseHeaders().split("\\r\\n");\n\
55 for (var i = 0; i < splitHeaders.length; i++) {\n\
56 var headerValuePair = splitHeaders[i].split(":");\n\
57 if(headerValuePair[1] != null){\n\
58 var headerName = trimString(headerValuePair[0]);\n\
59 var headerValue = trimString(headerValuePair[1]); \n\
60 res.allResponseHeaders[headerName] = headerValue;\n\
61 }\n\
62 }\n\
63 post(e, res);\n\
64 }\n\
65 \n\
66 if (req.withCred)\n\
67 xhr.withCredentials = true;\n\
68 if (req.body)\n\
69 sendData = req.body;\n\
70 \n\
71 res.events.push("opening");\n\
72 xhr.open(req.method, req.url, true);\n\
73 \n\
74 for (header in req.headers) {\n\
75 xhr.setRequestHeader(header, req.headers[header]);\n\
76 }\n\
77 \n\
78 res.events.push("sending");\n\
79 xhr.send(sendData);\n\
80 \n\
81 }, false);\n\
82 \n\
83 function post(e, res) {\n\
84 e.source.postMessage(res.toSource(), "*");\n\
85 }\n\
86 function trimString(stringValue) {\n\
87 return stringValue.replace("/^\s+|\s+$/g","");\n\
88 };\n\
89 \n\
90 </script>\n\
91 </head>\n\
92 <body>\n\
93 Inner page\n\
94 </body>\n\
95 </html>'
97 function handleRequest(request, response)
98 {
99 response.setStatusLine(null, 302, "Follow me");
100 response.setHeader("Location", "data:text/html," + escape(data));
101 response.setHeader("Content-Type", "text/plain");
102 response.write("Follow that guy!");
103 }