Bug 1576768 - Automatically format .sjs files using prettier. r=Standard8,agi,zombie,extension-reviewers

# ignore-this-changeset

Differential Revision: https://phabricator.services.mozilla.com/D128482
This commit is contained in:
Evgenia Kotovich
2021-10-18 09:26:33 +00:00
parent 4ceebe1232
commit 685e68c48b
421 changed files with 7235 additions and 4987 deletions

View File

@@ -12,7 +12,10 @@ const IMG_BYTES = atob(
// stolen from file_blocked_script.sjs // stolen from file_blocked_script.sjs
function setGlobalState(data, key) { function setGlobalState(data, key) {
x = { data: data, QueryInterface: function(iid) { return this } }; x = {
data,
QueryInterface: ChromeUtils.generateQI([]),
};
x.wrappedJSObject = x; x.wrappedJSObject = x;
setObjectState(key, x); setObjectState(key, x);
} }

View File

@@ -3,7 +3,11 @@
function handleRequest(request, response) { function handleRequest(request, response) {
// let's enjoy the amazing CSP setting // let's enjoy the amazing CSP setting
response.setHeader("Content-Security-Policy", "frame-ancestors 'self'", false); response.setHeader(
"Content-Security-Policy",
"frame-ancestors 'self'",
false
);
// let's avoid caching issues // let's avoid caching issues
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");

View File

@@ -1,7 +1,9 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);

View File

@@ -13,7 +13,8 @@ function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200); response.setStatusLine(request.httpVersion, 200);
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
let txt = "<html><head><title>XFO page</title></head>" + let txt =
"<html><head><title>XFO page</title></head>" +
"<body><h1>" + "<body><h1>" +
"XFO blocked page opened in new window!" + "XFO blocked page opened in new window!" +
"</h1></body></html>"; "</h1></body></html>";

View File

@@ -17,6 +17,9 @@ function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 302, "Moved Temporarily"); response.setStatusLine(request.httpVersion, 302, "Moved Temporarily");
response.setHeader("Set-Cookie", `faviconCookie=${++state}`); response.setHeader("Set-Cookie", `faviconCookie=${++state}`);
response.setHeader("Location", "http://example.com/browser/browser/base/content/test/favicons/moz.png"); response.setHeader(
"Location",
"http://example.com/browser/browser/base/content/test/favicons/moz.png"
);
setState("cache_cookie", `${state}`); setState("cache_cookie", `${state}`);
} }

View File

@@ -2,8 +2,7 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file, * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */ * You can obtain one at http://mozilla.org/MPL/2.0/. */
function handleRequest(request, response) function handleRequest(request, response) {
{
let page = "<!DOCTYPE html><html><body><p>HSTS page</p></body></html>"; let page = "<!DOCTYPE html><html><body><p>HSTS page</p></body></html>";
response.setStatusLine(request.httpVersion, "200", "OK"); response.setStatusLine(request.httpVersion, "200", "OK");
response.setHeader("Strict-Transport-Security", "max-age=60"); response.setHeader("Strict-Transport-Security", "max-age=60");

View File

@@ -4,7 +4,7 @@
function handleRequest(aRequest, aResponse) { function handleRequest(aRequest, aResponse) {
aResponse.setStatusLine(aRequest.httpVersion, 200); aResponse.setStatusLine(aRequest.httpVersion, 200);
if (aRequest.hasHeader('Cookie')) { if (aRequest.hasHeader("Cookie")) {
aResponse.write("cookie-present"); aResponse.write("cookie-present");
} else { } else {
aResponse.setHeader("Set-Cookie", "foopy=1"); aResponse.setHeader("Set-Cookie", "foopy=1");

View File

@@ -2,20 +2,17 @@
* License, v. 2.0. If a copy of the MPL was not distributed with this file, * License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */ * You can obtain one at http://mozilla.org/MPL/2.0/. */
function handleRequest(request, response) function handleRequest(request, response) {
{
let page = "download"; let page = "download";
response.setStatusLine(request.httpVersion, "200", "OK"); response.setStatusLine(request.httpVersion, "200", "OK");
let [first, second] = request.queryString.split('='); let [first, second] = request.queryString.split("=");
let headerStr = first; let headerStr = first;
if (second !== "none") { if (second !== "none") {
headerStr += "; filename=" + second; headerStr += "; filename=" + second;
} }
response.setHeader( response.setHeader("Content-Disposition", headerStr);
"Content-Disposition",
headerStr);
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.setHeader("Content-Length", page.length + "", false); response.setHeader("Content-Length", page.length + "", false);
response.write(page); response.write(page);

View File

@@ -1,7 +1,9 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);

View File

@@ -5,5 +5,7 @@ function handleRequest(request, response) {
response.setStatusLine("1.1", 302, "Found"); response.setStatusLine("1.1", 302, "Found");
response.setHeader( response.setHeader(
"Location", "Location",
`download_with_content_disposition_header.sjs?${queryStr}`, false); `download_with_content_disposition_header.sjs?${queryStr}`,
false
);
} }

View File

@@ -25,8 +25,12 @@ function handleRequest(req, resp) {
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
resp.write(AUTOPLAY_HTML); resp.write(AUTOPLAY_HTML);
timer.init(() => { timer.init(
() => {
resp.write(""); resp.write("");
resp.finish(); resp.finish();
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY_MS,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -4,13 +4,17 @@
// A 1x1 PNG image. // A 1x1 PNG image.
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain) // Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" + const IMAGE = atob(
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="); "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200); response.setStatusLine(request.httpVersion, 200);
if (request.queryString && if (
request.queryString.includes("type=image-no-cookie")) { request.queryString &&
request.queryString.includes("type=image-no-cookie")
) {
response.setHeader("Content-Type", "image/png", false); response.setHeader("Content-Type", "image/png", false);
response.write(IMAGE); response.write(IMAGE);
} else { } else {

View File

@@ -3,8 +3,7 @@
* Used in browser_referrer_*.js, bug 1113431. * Used in browser_referrer_*.js, bug 1113431.
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer * Arguments: ?scheme=http://&policy=origin&rel=noreferrer
*/ */
function handleRequest(request, response) function handleRequest(request, response) {
{
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
let query = new URLSearchParams(request.queryString); let query = new URLSearchParams(request.queryString);
@@ -14,11 +13,14 @@ function handleRequest(request, response)
let cross = query.get("cross"); let cross = query.get("cross");
let host = cross ? "example.com" : "test1.example.com"; let host = cross ? "example.com" : "test1.example.com";
let linkUrl = scheme + host + let linkUrl =
scheme +
host +
"/browser/browser/base/content/test/referrer/" + "/browser/browser/base/content/test/referrer/" +
"file_referrer_testserver.sjs"; "file_referrer_testserver.sjs";
let metaReferrerTag = let metaReferrerTag = policy
policy ? `<meta name='referrer' content='${policy}'>` : ""; ? `<meta name='referrer' content='${policy}'>`
: "";
let html = `<!DOCTYPE HTML> let html = `<!DOCTYPE HTML>
<html> <html>

View File

@@ -3,8 +3,7 @@
* Used in browser_referrer_*.js, bug 1113431. * Used in browser_referrer_*.js, bug 1113431.
* Arguments: ?scheme=http://&policy=origin&rel=noreferrer * Arguments: ?scheme=http://&policy=origin&rel=noreferrer
*/ */
function handleRequest(request, response) function handleRequest(request, response) {
{
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
let query = new URLSearchParams(request.queryString); let query = new URLSearchParams(request.queryString);
@@ -14,12 +13,13 @@ function handleRequest(request, response)
let cross = query.get("cross"); let cross = query.get("cross");
let host = cross ? "example.com" : "test1.example.com"; let host = cross ? "example.com" : "test1.example.com";
let linkUrl = scheme + host + let linkUrl =
scheme +
host +
"/browser/browser/base/content/test/referrer/" + "/browser/browser/base/content/test/referrer/" +
"file_referrer_testserver.sjs"; "file_referrer_testserver.sjs";
let referrerPolicy = let referrerPolicy = policy ? `referrerpolicy="${policy}"` : "";
policy ? `referrerpolicy="${policy}"` : "";
let html = `<!DOCTYPE HTML> let html = `<!DOCTYPE HTML>
<html> <html>
@@ -28,7 +28,9 @@ function handleRequest(request, response)
<title>Test referrer</title> <title>Test referrer</title>
</head> </head>
<body> <body>
<a id='testlink' href='${linkUrl}' ${referrerPolicy} ${rel ? ` rel='${rel}'` : ""}> <a id='testlink' href='${linkUrl}' ${referrerPolicy} ${
rel ? ` rel='${rel}'` : ""
}>
referrer test link</a> referrer test link</a>
</body> </body>
</html>`; </html>`;

View File

@@ -2,8 +2,7 @@
* Renders the HTTP Referer header up to the second path slash. * Renders the HTTP Referer header up to the second path slash.
* Used in browser_referrer_*.js, bug 1113431. * Used in browser_referrer_*.js, bug 1113431.
*/ */
function handleRequest(request, response) function handleRequest(request, response) {
{
let referrer = ""; let referrer = "";
try { try {
referrer = request.getHeader("referer"); referrer = request.getHeader("referer");
@@ -12,7 +11,10 @@ function handleRequest(request, response)
} }
// Strip it past the first path slash. Makes tests easier to read. // Strip it past the first path slash. Makes tests easier to read.
referrer = referrer.split("/").slice(0, 4).join("/"); referrer = referrer
.split("/")
.slice(0, 4)
.join("/");
let html = `<!DOCTYPE HTML> let html = `<!DOCTYPE HTML>
<html> <html>

View File

@@ -1,9 +1,10 @@
function handleRequest(request, response) { function handleRequest(request, response) {
var page = "<!DOCTYPE html><html><body>bug 906190</body></html>"; var page = "<!DOCTYPE html><html><body>bug 906190</body></html>";
var path = "https://test1.example.com/browser/browser/base/content/test/siteIdentity/"; var path =
"https://test1.example.com/browser/browser/base/content/test/siteIdentity/";
var url; var url;
if (request.queryString.includes('bad-redirection=1')) { if (request.queryString.includes("bad-redirection=1")) {
url = path + "this_page_does_not_exist.html"; url = path + "this_page_does_not_exist.html";
} else { } else {
url = path + "file_bug906190_redirected.html"; url = path + "file_bug906190_redirected.html";

View File

@@ -1,14 +1,17 @@
function handleRequest(request, response) { function handleRequest(request, response) {
var page = "<!DOCTYPE html><html><body>bug 418354 and bug 1082837</body></html>"; var page =
"<!DOCTYPE html><html><body>bug 418354 and bug 1082837</body></html>";
if (request.queryString === "script") { if (request.queryString === "script") {
var redirect = "http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.js"; var redirect =
"http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.js";
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
} else if (request.queryString === "image_http") { } else if (request.queryString === "image_http") {
var redirect = "http://example.com/tests/image/test/mochitest/blue.png"; var redirect = "http://example.com/tests/image/test/mochitest/blue.png";
response.setHeader("Cache-Control", "max-age=3600", false); response.setHeader("Cache-Control", "max-age=3600", false);
} else if (request.queryString === "image_redirect_http_sjs") { } else if (request.queryString === "image_redirect_http_sjs") {
var redirect = "http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.sjs?image_redirect_https"; var redirect =
"http://example.com/browser/browser/base/content/test/siteIdentity/test_mcb_redirect.sjs?image_redirect_https";
response.setHeader("Cache-Control", "max-age=3600", false); response.setHeader("Cache-Control", "max-age=3600", false);
} else if (request.queryString === "image_redirect_https") { } else if (request.queryString === "image_redirect_https") {
var redirect = "https://example.com/tests/image/test/mochitest/blue.png"; var redirect = "https://example.com/tests/image/test/mochitest/blue.png";

View File

@@ -1,6 +1,7 @@
const HTTP_ORIGIN = "http://example.com"; const HTTP_ORIGIN = "http://example.com";
const HTTPS_ORIGIN = "https://example.com"; const HTTPS_ORIGIN = "https://example.com";
const URI_PATH = "/browser/browser/components/contextualidentity/test/browser/saveLink.sjs"; const URI_PATH =
"/browser/browser/components/contextualidentity/test/browser/saveLink.sjs";
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
@@ -11,7 +12,12 @@ function handleRequest(aRequest, aResponse) {
if (params.has("UCI")) { if (params.has("UCI")) {
aResponse.setStatusLine(aRequest.httpVersion, 200); aResponse.setStatusLine(aRequest.httpVersion, 200);
aResponse.setHeader("Set-Cookie", "UCI=" + params.get("UCI")); aResponse.setHeader("Set-Cookie", "UCI=" + params.get("UCI"));
aResponse.write("<html><body><a href='" + HTTPS_ORIGIN + URI_PATH + "?redirect=1' id='fff'>this is a link</a></body></html>"); aResponse.write(
"<html><body><a href='" +
HTTPS_ORIGIN +
URI_PATH +
"?redirect=1' id='fff'>this is a link</a></body></html>"
);
return; return;
} }
@@ -19,7 +25,11 @@ function handleRequest(aRequest, aResponse) {
// if we are able to follow it. // if we are able to follow it.
if (params.has("redirect")) { if (params.has("redirect")) {
aResponse.setStatusLine(aRequest.httpVersion, 302, "Found"); aResponse.setStatusLine(aRequest.httpVersion, 302, "Found");
aResponse.setHeader("Location", HTTP_ORIGIN + URI_PATH + "?download=1", false); aResponse.setHeader(
"Location",
HTTP_ORIGIN + URI_PATH + "?download=1",
false
);
aResponse.write("Redirect!"); aResponse.write("Redirect!");
return; return;
} }

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
var match; var match;
var requestAuth = true; var requestAuth = true;
@@ -9,23 +8,27 @@ function handleRequest(request, response)
// at the beginning of the query string. // at the beginning of the query string.
var query = "?" + request.queryString; var query = "?" + request.queryString;
var expected_user = "test", expected_pass = "testpass", realm = "mochitest"; var expected_user = "test",
expected_pass = "testpass",
realm = "mochitest";
// user=xxx // user=xxx
match = /[^_]user=([^&]*)/.exec(query); match = /[^_]user=([^&]*)/.exec(query);
if (match) if (match) {
expected_user = match[1]; expected_user = match[1];
}
// pass=xxx // pass=xxx
match = /[^_]pass=([^&]*)/.exec(query); match = /[^_]pass=([^&]*)/.exec(query);
if (match) if (match) {
expected_pass = match[1]; expected_pass = match[1];
}
// realm=xxx // realm=xxx
match = /[^_]realm=([^&]*)/.exec(query); match = /[^_]realm=([^&]*)/.exec(query);
if (match) if (match) {
realm = match[1]; realm = match[1];
}
// Look for an authentication header, if any, in the request. // Look for an authentication header, if any, in the request.
// //
@@ -34,51 +37,59 @@ function handleRequest(request, response)
// This test only supports Basic auth. The value sent by the client is // This test only supports Basic auth. The value sent by the client is
// "username:password", obscured with base64 encoding. // "username:password", obscured with base64 encoding.
var actual_user = "", actual_pass = "", authHeader, authPresent = false; var actual_user = "",
actual_pass = "",
authHeader,
authPresent = false;
if (request.hasHeader("Authorization")) { if (request.hasHeader("Authorization")) {
authPresent = true; authPresent = true;
authHeader = request.getHeader("Authorization"); authHeader = request.getHeader("Authorization");
match = /Basic (.+)/.exec(authHeader); match = /Basic (.+)/.exec(authHeader);
if (match.length != 2) if (match.length != 2) {
throw new Error("Couldn't parse auth header: " + authHeader); throw new Error("Couldn't parse auth header: " + authHeader);
}
var userpass = base64ToString(match[1]); // no atob() :-( var userpass = base64ToString(match[1]); // no atob() :-(
match = /(.*):(.*)/.exec(userpass); match = /(.*):(.*)/.exec(userpass);
if (match.length != 3) if (match.length != 3) {
throw new Error("Couldn't decode auth header: " + userpass); throw new Error("Couldn't decode auth header: " + userpass);
}
actual_user = match[1]; actual_user = match[1];
actual_pass = match[2]; actual_pass = match[2];
} }
// Don't request authentication if the credentials we got were what we // Don't request authentication if the credentials we got were what we
// expected. // expected.
if (expected_user == actual_user && if (expected_user == actual_user && expected_pass == actual_pass) {
expected_pass == actual_pass) {
requestAuth = false; requestAuth = false;
} }
if (requestAuth) { if (requestAuth) {
response.setStatusLine("1.0", 401, "Authentication required"); response.setStatusLine("1.0", 401, "Authentication required");
response.setHeader("WWW-Authenticate", "basic realm=\"" + realm + "\"", true); response.setHeader("WWW-Authenticate", 'basic realm="' + realm + '"', true);
} else { } else {
response.setStatusLine("1.0", 200, "OK"); response.setStatusLine("1.0", 200, "OK");
} }
response.setHeader("Content-Type", "application/xhtml+xml", false); response.setHeader("Content-Type", "application/xhtml+xml", false);
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>"); response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
response.write("<p>Login: <span id='ok'>" + (requestAuth ? "FAIL" : "PASS") + "</span></p>\n"); response.write(
"<p>Login: <span id='ok'>" +
(requestAuth ? "FAIL" : "PASS") +
"</span></p>\n"
);
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n"); response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n"); response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n"); response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
response.write("</html>"); response.write("</html>");
} }
// base64 decoder // base64 decoder
// //
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa() // Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
// doesn't seem to exist. :-( // doesn't seem to exist. :-(
/* Convert Base64 data to a string */ /* Convert Base64 data to a string */
/* eslint-disable prettier/prettier */
const toBinaryTable = [ const toBinaryTable = [
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
@@ -89,20 +100,22 @@ const toBinaryTable = [
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
]; ];
const base64Pad = '='; /* eslint-enable prettier/prettier */
const base64Pad = "=";
function base64ToString(data) { function base64ToString(data) {
var result = "";
var result = '';
var leftbits = 0; // number of bits decoded, but yet to be appended var leftbits = 0; // number of bits decoded, but yet to be appended
var leftdata = 0; // bits decoded, but yet to be appended var leftdata = 0; // bits decoded, but yet to be appended
// Convert one by one. // Convert one by one.
for (var i = 0; i < data.length; i++) { for (var i = 0; i < data.length; i++) {
var c = toBinaryTable[data.charCodeAt(i) & 0x7f]; var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
var padding = (data[i] == base64Pad); var padding = data[i] == base64Pad;
// Skip illegal characters and whitespace // Skip illegal characters and whitespace
if (c == -1) continue; if (c == -1) {
continue;
}
// Collect data into leftdata, update bitcount // Collect data into leftdata, update bitcount
leftdata = (leftdata << 6) | c; leftdata = (leftdata << 6) | c;
@@ -112,15 +125,17 @@ function base64ToString(data) {
if (leftbits >= 8) { if (leftbits >= 8) {
leftbits -= 8; leftbits -= 8;
// Append if not padding. // Append if not padding.
if (!padding) if (!padding) {
result += String.fromCharCode((leftdata >> leftbits) & 0xff); result += String.fromCharCode((leftdata >> leftbits) & 0xff);
}
leftdata &= (1 << leftbits) - 1; leftdata &= (1 << leftbits) - 1;
} }
} }
// If there are any bits left, the base64 string was corrupted // If there are any bits left, the base64 string was corrupted
if (leftbits) if (leftbits) {
throw Components.Exception('Corrupted base64 string'); throw Components.Exception("Corrupted base64 string");
}
return result; return result;
} }

View File

@@ -6,6 +6,8 @@ function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false); response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) { if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
response.write(`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`); response.write(
`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`
);
} }
} }

View File

@@ -11,7 +11,11 @@ const URL = "file_slowed_document.sjs";
const DELAY = 2 * 1000; // Delay two seconds before completing the request. const DELAY = 2 * 1000; // Delay two seconds before completing the request.
let nsTimer = Components.Constructor("@mozilla.org/timer;1", "nsITimer", "initWithCallback"); let nsTimer = Components.Constructor(
"@mozilla.org/timer;1",
"nsITimer",
"initWithCallback"
);
let timer; let timer;
@@ -31,11 +35,15 @@ function handleRequest(request, response) {
// Note: We need to store a reference to the timer to prevent it from being // Note: We need to store a reference to the timer to prevent it from being
// canceled when it's GCed. // canceled when it's GCed.
timer = new nsTimer(() => { timer = new nsTimer(
() => {
if (request.queryString.includes("with-iframe")) { if (request.queryString.includes("with-iframe")) {
response.write(`<iframe src="${URL}?r=${Math.random()}"></iframe>`); response.write(`<iframe src="${URL}?r=${Math.random()}"></iframe>`);
} }
response.write(`</body></html>`); response.write(`</body></html>`);
response.finish(); response.finish();
}, DELAY, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -6,7 +6,7 @@ const LINK_PATH = `${URI_PATH}file_saveAs.sjs`;
const VIDEO_PATH = `${URI_PATH}file_thirdPartyChild.video.ogv`; const VIDEO_PATH = `${URI_PATH}file_thirdPartyChild.video.ogv`;
// Reusing existing png file for testing. // Reusing existing png file for testing.
const IMAGE_PATH = `${URI_PATH}file_favicon.png`; const IMAGE_PATH = `${URI_PATH}file_favicon.png`;
const FRAME_PATH = `${SECOND_ORIGIN}${URI_PATH}file_saveAs.sjs?image=1` const FRAME_PATH = `${SECOND_ORIGIN}${URI_PATH}file_saveAs.sjs?image=1`;
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);

View File

@@ -11,10 +11,11 @@ function handleRequest(request, response) {
var cookie = "name=value"; var cookie = "name=value";
var title = "No Cookie"; var title = "No Cookie";
if (request.hasHeader("Cookie") && request.getHeader("Cookie") == cookie) if (request.hasHeader("Cookie") && request.getHeader("Cookie") == cookie) {
title = "Cookie"; title = "Cookie";
else } else {
response.setHeader("Set-Cookie", cookie, false); response.setHeader("Set-Cookie", cookie, false);
}
response.write("<html><head><title>"); response.write("<html><head><title>");
response.write(title); response.write(title);

View File

@@ -55,8 +55,7 @@ const WORKER = `
}; };
`; `;
function handleRequest(request, response) function handleRequest(request, response) {
{
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
let query = new URLSearchParams(request.queryString); let query = new URLSearchParams(request.queryString);

View File

@@ -11,8 +11,12 @@ function handleRequest(req, resp) {
resp.setHeader("Content-Type", "text/html;charset=utf-8", false); resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.init(() => { timer.init(
() => {
resp.write("hi"); resp.write("hi");
resp.finish(); resp.finish();
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY_MS,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -11,8 +11,12 @@ function handleRequest(req, resp) {
resp.setHeader("Content-Type", "text/html;charset=utf-8", false); resp.setHeader("Content-Type", "text/html;charset=utf-8", false);
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.init(() => { timer.init(
() => {
resp.write("hi"); resp.write("hi");
resp.finish(); resp.finish();
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY_MS,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -1,6 +1,6 @@
function handleRequest(request, response) { function handleRequest(request, response) {
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
Components.utils.import("resource://gre/modules/NetUtil.jsm"); let { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
let query = new URLSearchParams(request.queryString); let query = new URLSearchParams(request.queryString);
response.setHeader("Cross-Origin-Opener-Policy", "same-origin", false); response.setHeader("Cross-Origin-Opener-Policy", "same-origin", false);
@@ -15,8 +15,9 @@ function handleRequest(request, response) {
}); });
// Set up the file streams to read in the file as UTF-8 // Set up the file streams to read in the file as UTF-8
let fstream = Components.classes["@mozilla.org/network/file-input-stream;1"]. let fstream = Components.classes[
createInstance(Components.interfaces.nsIFileInputStream); "@mozilla.org/network/file-input-stream;1"
].createInstance(Components.interfaces.nsIFileInputStream);
fstream.init(file, -1, 0, 0); fstream.init(file, -1, 0, 0);

View File

@@ -5,9 +5,11 @@
"use strict"; "use strict";
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
Cu.importGlobalProperties(["DOMParser"]); Cu.importGlobalProperties(["DOMParser"]);
function handleRequest(req, res) { function handleRequest(req, res) {
@@ -33,7 +35,7 @@ const statusCodes = {
405: "Method Not Allowed", 405: "Method Not Allowed",
500: "Internal Server Error", 500: "Internal Server Error",
501: "Not Implemented", 501: "Not Implemented",
503: "Service Unavailable" 503: "Service Unavailable",
}; };
function HTTPError(code = 500, message) { function HTTPError(code = 500, message) {
@@ -46,8 +48,10 @@ HTTPError.prototype.constructor = HTTPError;
function sendError(res, err) { function sendError(res, err) {
if (!(err instanceof HTTPError)) { if (!(err instanceof HTTPError)) {
err = new HTTPError(typeof err == "number" ? err : 500, err = new HTTPError(
err.message || typeof err == "string" ? err : ""); typeof err == "number" ? err : 500,
err.message || typeof err == "string" ? err : ""
);
} }
res.setStatusLine("1.1", err.code, err.name); res.setStatusLine("1.1", err.code, err.name);
res.write(err.message); res.write(err.message);
@@ -57,8 +61,9 @@ function parseQuery(query) {
let ret = {}; let ret = {};
for (let param of query.replace(/^[?&]/, "").split("&")) { for (let param of query.replace(/^[?&]/, "").split("&")) {
param = param.split("="); param = param.split("=");
if (!param[0]) if (!param[0]) {
continue; continue;
}
ret[unescape(param[0])] = unescape(param[1]); ret[unescape(param[0])] = unescape(param[1]);
} }
return ret; return ret;
@@ -69,22 +74,23 @@ function getRequestBody(req) {
let bytes = []; let bytes = [];
let body = new BinaryInputStream(req.bodyInputStream); let body = new BinaryInputStream(req.bodyInputStream);
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
return String.fromCharCode.apply(null, bytes); return String.fromCharCode.apply(null, bytes);
} }
function sha1(str) { function sha1(str) {
let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] let converter = Cc[
.createInstance(Ci.nsIScriptableUnicodeConverter); "@mozilla.org/intl/scriptableunicodeconverter"
].createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8"; converter.charset = "UTF-8";
// `result` is an out parameter, `result.value` will contain the array length. // `result` is an out parameter, `result.value` will contain the array length.
let result = {}; let result = {};
// `data` is an array of bytes. // `data` is an array of bytes.
let data = converter.convertToByteArray(str, result); let data = converter.convertToByteArray(str, result);
let ch = Cc["@mozilla.org/security/hash;1"] let ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
.createInstance(Ci.nsICryptoHash);
ch.init(ch.SHA1); ch.init(ch.SHA1);
ch.update(data, data.length); ch.update(data, data.length);
let hash = ch.finish(false); let hash = ch.finish(false);
@@ -101,8 +107,9 @@ function sha1(str) {
function parseXml(body) { function parseXml(body) {
let parser = new DOMParser(); let parser = new DOMParser();
let xml = parser.parseFromString(body, "text/xml"); let xml = parser.parseFromString(body, "text/xml");
if (xml.documentElement.localName == "parsererror") if (xml.documentElement.localName == "parsererror") {
throw new Error("Invalid XML"); throw new Error("Invalid XML");
}
return xml; return xml;
} }
@@ -110,10 +117,12 @@ function getInputStream(path) {
let file = Cc["@mozilla.org/file/directory_service;1"] let file = Cc["@mozilla.org/file/directory_service;1"]
.getService(Ci.nsIProperties) .getService(Ci.nsIProperties)
.get("CurWorkD", Ci.nsIFile); .get("CurWorkD", Ci.nsIFile);
for (let part of path.split("/")) for (let part of path.split("/")) {
file.append(part); file.append(part);
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"] }
.createInstance(Ci.nsIFileInputStream); let fileStream = Cc[
"@mozilla.org/network/file-input-stream;1"
].createInstance(Ci.nsIFileInputStream);
fileStream.init(file, 1, 0, false); fileStream.init(file, 1, 0, false);
return fileStream; return fileStream;
} }
@@ -122,25 +131,33 @@ function checkAuth(req) {
let err = new Error("Authorization failed"); let err = new Error("Authorization failed");
err.code = 401; err.code = 401;
if (!req.hasHeader("Authorization")) if (!req.hasHeader("Authorization")) {
throw new HTTPError(401, "No Authorization header provided."); throw new HTTPError(401, "No Authorization header provided.");
}
let auth = req.getHeader("Authorization"); let auth = req.getHeader("Authorization");
if (!auth.startsWith("Bearer ")) if (!auth.startsWith("Bearer ")) {
throw new HTTPError(401, "Invalid Authorization header content: '" + auth + "'"); throw new HTTPError(
401,
"Invalid Authorization header content: '" + auth + "'"
);
}
// Rejecting inactive subscriptions. // Rejecting inactive subscriptions.
if (auth.includes("inactive")) { if (auth.includes("inactive")) {
const INACTIVE_STATE_RESPONSE = "<html><body><h1>TranslateApiException</h1><p>Method: TranslateArray()</p><p>Message: The Azure Market Place Translator Subscription associated with the request credentials is not in an active state.</p><code></code><p>message id=5641.V2_Rest.TranslateArray.48CC6470</p></body></html>"; const INACTIVE_STATE_RESPONSE =
"<html><body><h1>TranslateApiException</h1><p>Method: TranslateArray()</p><p>Message: The Azure Market Place Translator Subscription associated with the request credentials is not in an active state.</p><code></code><p>message id=5641.V2_Rest.TranslateArray.48CC6470</p></body></html>";
throw new HTTPError(401, INACTIVE_STATE_RESPONSE); throw new HTTPError(401, INACTIVE_STATE_RESPONSE);
} }
} }
function reallyHandleRequest(req, res) { function reallyHandleRequest(req, res) {
log("method: " + req.method); log("method: " + req.method);
if (req.method != "POST") { if (req.method != "POST") {
sendError(res, "Bing only deals with POST requests, not '" + req.method + "'."); sendError(
res,
"Bing only deals with POST requests, not '" + req.method + "'."
);
return; return;
} }
@@ -148,7 +165,9 @@ function reallyHandleRequest(req, res) {
log("body: " + body); log("body: " + body);
// First, we'll see if we're dealing with an XML body: // First, we'll see if we're dealing with an XML body:
let contentType = req.hasHeader("Content-Type") ? req.getHeader("Content-Type") : null; let contentType = req.hasHeader("Content-Type")
? req.getHeader("Content-Type")
: null;
log("contentType: " + contentType); log("contentType: " + contentType);
if (contentType.startsWith("text/xml")) { if (contentType.startsWith("text/xml")) {
@@ -161,10 +180,11 @@ function reallyHandleRequest(req, res) {
let method = xml.documentElement.localName; let method = xml.documentElement.localName;
log("invoking method: " + method); log("invoking method: " + method);
// If the requested method is supported, delegate it to its handler. // If the requested method is supported, delegate it to its handler.
if (methodHandlers[method]) if (methodHandlers[method]) {
methodHandlers[method](res, xml); methodHandlers[method](res, xml);
else } else {
throw new HTTPError(501); throw new HTTPError(501);
}
} catch (ex) { } catch (ex) {
sendError(res, ex, ex.code); sendError(res, ex, ex.code);
} }
@@ -173,15 +193,16 @@ function reallyHandleRequest(req, res) {
let params = parseQuery(body); let params = parseQuery(body);
// Delegate an authentication request to the correct handler. // Delegate an authentication request to the correct handler.
if ("grant_type" in params && params.grant_type == "client_credentials") if ("grant_type" in params && params.grant_type == "client_credentials") {
methodHandlers.authenticate(res, params); methodHandlers.authenticate(res, params);
else } else {
sendError(res, 501); sendError(res, 501);
} }
} }
}
const methodHandlers = { const methodHandlers = {
authenticate: function(res, params) { authenticate(res, params) {
// Validate a few required parameters. // Validate a few required parameters.
if (params.scope != "http://api.microsofttranslator.com") { if (params.scope != "http://api.microsofttranslator.com") {
sendError(res, "Invalid scope."); sendError(res, "Invalid scope.");
@@ -198,16 +219,16 @@ const methodHandlers = {
// Defines the tokens for certain client ids. // Defines the tokens for certain client ids.
const TOKEN_MAP = { const TOKEN_MAP = {
'testInactive' : 'inactive', testInactive: "inactive",
'testClient' : 'test' testClient: "test",
}; };
let token = 'test'; // Default token. let token = "test"; // Default token.
if((params.client_id in TOKEN_MAP)){ if (params.client_id in TOKEN_MAP) {
token = TOKEN_MAP[params.client_id]; token = TOKEN_MAP[params.client_id];
} }
let content = JSON.stringify({ let content = JSON.stringify({
access_token: token, access_token: token,
expires_in: 600 expires_in: 600,
}); });
res.setStatusLine("1.1", 200, "OK"); res.setStatusLine("1.1", 200, "OK");
@@ -216,9 +237,9 @@ const methodHandlers = {
res.write(content); res.write(content);
}, },
TranslateArrayRequest: function(res, xml, body) { TranslateArrayRequest(res, xml, body) {
let from = xml.querySelector("From").firstChild.nodeValue; let from = xml.querySelector("From").firstChild.nodeValue;
let to = xml.querySelector("To").firstChild.nodeValue let to = xml.querySelector("To").firstChild.nodeValue;
log("translating from '" + from + "' to '" + to + "'"); log("translating from '" + from + "' to '" + to + "'");
res.setStatusLine("1.1", 200, "OK"); res.setStatusLine("1.1", 200, "OK");
@@ -227,8 +248,11 @@ const methodHandlers = {
let hash = sha1(body).substr(0, 10); let hash = sha1(body).substr(0, 10);
log("SHA1 hash of content: " + hash); log("SHA1 hash of content: " + hash);
let inputStream = getInputStream( let inputStream = getInputStream(
"browser/browser/components/translation/test/fixtures/result-" + hash + ".txt"); "browser/browser/components/translation/test/fixtures/result-" +
hash +
".txt"
);
res.bodyOutputStream.writeFrom(inputStream, inputStream.available()); res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
inputStream.close(); inputStream.close();
} },
}; };

View File

@@ -5,9 +5,11 @@
"use strict"; "use strict";
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(req, res) { function handleRequest(req, res) {
try { try {
@@ -34,7 +36,7 @@ const statusCodes = {
422: "The text could not be translated", 422: "The text could not be translated",
500: "Internal Server Error", 500: "Internal Server Error",
501: "The specified translation direction is not supported", 501: "The specified translation direction is not supported",
503: "Service Unavailable" 503: "Service Unavailable",
}; };
function HTTPError(code = 500, message) { function HTTPError(code = 500, message) {
@@ -47,8 +49,10 @@ HTTPError.prototype.constructor = HTTPError;
function sendError(res, err) { function sendError(res, err) {
if (!(err instanceof HTTPError)) { if (!(err instanceof HTTPError)) {
err = new HTTPError(typeof err == "number" ? err : 500, err = new HTTPError(
err.message || typeof err == "string" ? err : ""); typeof err == "number" ? err : 500,
err.message || typeof err == "string" ? err : ""
);
} }
res.setStatusLine("1.1", err.code, err.name); res.setStatusLine("1.1", err.code, err.name);
res.write(err.message); res.write(err.message);
@@ -61,16 +65,19 @@ function parseQuery(query) {
params = {}, params = {},
pl = /\+/g, pl = /\+/g,
search = /([^&=]+)=?([^&]*)/g, search = /([^&=]+)=?([^&]*)/g,
decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); }; decode = function(s) {
return decodeURIComponent(s.replace(pl, " "));
};
while (match = search.exec(query)) { while ((match = search.exec(query))) {
let k = decode(match[1]), let k = decode(match[1]),
v = decode(match[2]); v = decode(match[2]);
if (k in params) { if (k in params) {
if(params[k] instanceof Array) if (params[k] instanceof Array) {
params[k].push(v); params[k].push(v);
else } else {
params[k] = [params[k], v]; params[k] = [params[k], v];
}
} else { } else {
params[k] = v; params[k] = v;
} }
@@ -80,15 +87,15 @@ function parseQuery(query) {
} }
function sha1(str) { function sha1(str) {
let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"] let converter = Cc[
.createInstance(Ci.nsIScriptableUnicodeConverter); "@mozilla.org/intl/scriptableunicodeconverter"
].createInstance(Ci.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8"; converter.charset = "UTF-8";
// `result` is an out parameter, `result.value` will contain the array length. // `result` is an out parameter, `result.value` will contain the array length.
let result = {}; let result = {};
// `data` is an array of bytes. // `data` is an array of bytes.
let data = converter.convertToByteArray(str, result); let data = converter.convertToByteArray(str, result);
let ch = Cc["@mozilla.org/security/hash;1"] let ch = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
.createInstance(Ci.nsICryptoHash);
ch.init(ch.SHA1); ch.init(ch.SHA1);
ch.update(data, data.length); ch.update(data, data.length);
let hash = ch.finish(false); let hash = ch.finish(false);
@@ -107,8 +114,9 @@ function getRequestBody(req) {
let bytes = []; let bytes = [];
let body = new BinaryInputStream(req.bodyInputStream); let body = new BinaryInputStream(req.bodyInputStream);
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
return String.fromCharCode.apply(null, bytes); return String.fromCharCode.apply(null, bytes);
} }
@@ -117,10 +125,12 @@ function getInputStream(path) {
let file = Cc["@mozilla.org/file/directory_service;1"] let file = Cc["@mozilla.org/file/directory_service;1"]
.getService(Ci.nsIProperties) .getService(Ci.nsIProperties)
.get("CurWorkD", Ci.nsIFile); .get("CurWorkD", Ci.nsIFile);
for (let part of path.split("/")) for (let part of path.split("/")) {
file.append(part); file.append(part);
let fileStream = Cc["@mozilla.org/network/file-input-stream;1"] }
.createInstance(Ci.nsIFileInputStream); let fileStream = Cc[
"@mozilla.org/network/file-input-stream;1"
].createInstance(Ci.nsIFileInputStream);
fileStream.init(file, 1, 0, false); fileStream.init(file, 1, 0, false);
return fileStream; return fileStream;
} }
@@ -138,33 +148,34 @@ function getInputStream(path) {
* If any other key is used the server reponds with 401 error code. * If any other key is used the server reponds with 401 error code.
*/ */
function checkAuth(params) { function checkAuth(params) {
if(!("key" in params)) if (!("key" in params)) {
throw new HTTPError(400); throw new HTTPError(400);
}
let key = params.key; let key = params.key;
if(key === "yandexValidKey") if (key === "yandexValidKey") {
return true; return true;
}
let invalidKeys = { let invalidKeys = {
"yandexInvalidKey" : 401, yandexInvalidKey: 401,
"yandexBlockedKey" : 402, yandexBlockedKey: 402,
"yandexOutOfRequestsKey" : 403, yandexOutOfRequestsKey: 403,
"yandexOutOfCharsKey" : 404, yandexOutOfCharsKey: 404,
}; };
if(key in invalidKeys) if (key in invalidKeys) {
throw new HTTPError(invalidKeys[key]); throw new HTTPError(invalidKeys[key]);
}
throw new HTTPError(401); throw new HTTPError(401);
} }
function reallyHandleRequest(req, res) { function reallyHandleRequest(req, res) {
try { try {
// Preparing the query parameters. // Preparing the query parameters.
let params = {}; let params = {};
if(req.method == 'POST') { if (req.method == "POST") {
params = parseQuery(getRequestBody(req)); params = parseQuery(getRequestBody(req));
} }
@@ -172,28 +183,28 @@ function reallyHandleRequest(req, res) {
log(JSON.stringify(params)); log(JSON.stringify(params));
checkAuth(params); checkAuth(params);
methodHandlers['translate'](res, params); methodHandlers.translate(res, params);
} catch (ex) { } catch (ex) {
sendError(res, ex, ex.code); sendError(res, ex, ex.code);
} }
} }
const methodHandlers = { const methodHandlers = {
translate: function(res, params) { translate(res, params) {
res.setStatusLine("1.1", 200, "OK"); res.setStatusLine("1.1", 200, "OK");
res.setHeader("Content-Type", "application/json"); res.setHeader("Content-Type", "application/json");
let hash = sha1(JSON.stringify(params)).substr(0, 10); let hash = sha1(JSON.stringify(params)).substr(0, 10);
log("SHA1 hash of content: " + hash); log("SHA1 hash of content: " + hash);
let fixture = "browser/browser/components/translation/test/fixtures/result-yandex-" + hash + ".json"; let fixture =
"browser/browser/components/translation/test/fixtures/result-yandex-" +
hash +
".json";
log("PATH: " + fixture); log("PATH: " + fixture);
let inputStream = getInputStream(fixture); let inputStream = getInputStream(fixture);
res.bodyOutputStream.writeFrom(inputStream, inputStream.available()); res.bodyOutputStream.writeFrom(inputStream, inputStream.available());
inputStream.close(); inputStream.close();
} },
}; };

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
try { try {
reallyHandleRequest(request, response); reallyHandleRequest(request, response);
} catch (e) { } catch (e) {
@@ -8,10 +7,10 @@ function handleRequest(request, response)
} }
} }
function reallyHandleRequest(request, response) { function reallyHandleRequest(request, response) {
var match; var match;
var requestAuth = true, requestProxyAuth = true; var requestAuth = true,
requestProxyAuth = true;
// Allow the caller to drive how authentication is processed via the query. // Allow the caller to drive how authentication is processed via the query.
// Eg, http://localhost:8888/authenticate.sjs?user=foo&realm=bar // Eg, http://localhost:8888/authenticate.sjs?user=foo&realm=bar
@@ -19,59 +18,75 @@ function reallyHandleRequest(request, response) {
// at the beginning of the query string. // at the beginning of the query string.
var query = "?" + request.queryString; var query = "?" + request.queryString;
var expected_user = "", expected_pass = "", realm = "mochitest"; var expected_user = "",
var proxy_expected_user = "", proxy_expected_pass = "", proxy_realm = "mochi-proxy"; expected_pass = "",
var huge = false, plugin = false, anonymous = false; realm = "mochitest";
var proxy_expected_user = "",
proxy_expected_pass = "",
proxy_realm = "mochi-proxy";
var huge = false,
plugin = false,
anonymous = false;
var authHeaderCount = 1; var authHeaderCount = 1;
// user=xxx // user=xxx
match = /[^_]user=([^&]*)/.exec(query); match = /[^_]user=([^&]*)/.exec(query);
if (match) if (match) {
expected_user = match[1]; expected_user = match[1];
}
// pass=xxx // pass=xxx
match = /[^_]pass=([^&]*)/.exec(query); match = /[^_]pass=([^&]*)/.exec(query);
if (match) if (match) {
expected_pass = match[1]; expected_pass = match[1];
}
// realm=xxx // realm=xxx
match = /[^_]realm=([^&]*)/.exec(query); match = /[^_]realm=([^&]*)/.exec(query);
if (match) if (match) {
realm = match[1]; realm = match[1];
}
// proxy_user=xxx // proxy_user=xxx
match = /proxy_user=([^&]*)/.exec(query); match = /proxy_user=([^&]*)/.exec(query);
if (match) if (match) {
proxy_expected_user = match[1]; proxy_expected_user = match[1];
}
// proxy_pass=xxx // proxy_pass=xxx
match = /proxy_pass=([^&]*)/.exec(query); match = /proxy_pass=([^&]*)/.exec(query);
if (match) if (match) {
proxy_expected_pass = match[1]; proxy_expected_pass = match[1];
}
// proxy_realm=xxx // proxy_realm=xxx
match = /proxy_realm=([^&]*)/.exec(query); match = /proxy_realm=([^&]*)/.exec(query);
if (match) if (match) {
proxy_realm = match[1]; proxy_realm = match[1];
}
// huge=1 // huge=1
match = /huge=1/.exec(query); match = /huge=1/.exec(query);
if (match) if (match) {
huge = true; huge = true;
}
// plugin=1 // plugin=1
match = /plugin=1/.exec(query); match = /plugin=1/.exec(query);
if (match) if (match) {
plugin = true; plugin = true;
}
// multiple=1 // multiple=1
match = /multiple=([^&]*)/.exec(query); match = /multiple=([^&]*)/.exec(query);
if (match) if (match) {
authHeaderCount = match[1] + 0; authHeaderCount = match[1] + 0;
}
// anonymous=1 // anonymous=1
match = /anonymous=1/.exec(query); match = /anonymous=1/.exec(query);
if (match) if (match) {
anonymous = true; anonymous = true;
}
// Look for an authentication header, if any, in the request. // Look for an authentication header, if any, in the request.
// //
@@ -80,72 +95,101 @@ function reallyHandleRequest(request, response) {
// This test only supports Basic auth. The value sent by the client is // This test only supports Basic auth. The value sent by the client is
// "username:password", obscured with base64 encoding. // "username:password", obscured with base64 encoding.
var actual_user = "", actual_pass = "", authHeader, authPresent = false; var actual_user = "",
actual_pass = "",
authHeader,
authPresent = false;
if (request.hasHeader("Authorization")) { if (request.hasHeader("Authorization")) {
authPresent = true; authPresent = true;
authHeader = request.getHeader("Authorization"); authHeader = request.getHeader("Authorization");
match = /Basic (.+)/.exec(authHeader); match = /Basic (.+)/.exec(authHeader);
if (match.length != 2) if (match.length != 2) {
throw "Couldn't parse auth header: " + authHeader; throw "Couldn't parse auth header: " + authHeader;
}
var userpass = base64ToString(match[1]); // no atob() :-( var userpass = base64ToString(match[1]); // no atob() :-(
match = /(.*):(.*)/.exec(userpass); match = /(.*):(.*)/.exec(userpass);
if (match.length != 3) if (match.length != 3) {
throw "Couldn't decode auth header: " + userpass; throw "Couldn't decode auth header: " + userpass;
}
actual_user = match[1]; actual_user = match[1];
actual_pass = match[2]; actual_pass = match[2];
} }
var proxy_actual_user = "", proxy_actual_pass = ""; var proxy_actual_user = "",
proxy_actual_pass = "";
if (request.hasHeader("Proxy-Authorization")) { if (request.hasHeader("Proxy-Authorization")) {
authHeader = request.getHeader("Proxy-Authorization"); authHeader = request.getHeader("Proxy-Authorization");
match = /Basic (.+)/.exec(authHeader); match = /Basic (.+)/.exec(authHeader);
if (match.length != 2) if (match.length != 2) {
throw "Couldn't parse auth header: " + authHeader; throw "Couldn't parse auth header: " + authHeader;
}
var userpass = base64ToString(match[1]); // no atob() :-( var userpass = base64ToString(match[1]); // no atob() :-(
match = /(.*):(.*)/.exec(userpass); match = /(.*):(.*)/.exec(userpass);
if (match.length != 3) if (match.length != 3) {
throw "Couldn't decode auth header: " + userpass; throw "Couldn't decode auth header: " + userpass;
}
proxy_actual_user = match[1]; proxy_actual_user = match[1];
proxy_actual_pass = match[2]; proxy_actual_pass = match[2];
} }
// Don't request authentication if the credentials we got were what we // Don't request authentication if the credentials we got were what we
// expected. // expected.
if (expected_user == actual_user && if (expected_user == actual_user && expected_pass == actual_pass) {
expected_pass == actual_pass) {
requestAuth = false; requestAuth = false;
} }
if (proxy_expected_user == proxy_actual_user && if (
proxy_expected_pass == proxy_actual_pass) { proxy_expected_user == proxy_actual_user &&
proxy_expected_pass == proxy_actual_pass
) {
requestProxyAuth = false; requestProxyAuth = false;
} }
if (anonymous) { if (anonymous) {
if (authPresent) { if (authPresent) {
response.setStatusLine("1.0", 400, "Unexpected authorization header found"); response.setStatusLine(
"1.0",
400,
"Unexpected authorization header found"
);
} else { } else {
response.setStatusLine("1.0", 200, "Authorization header not found"); response.setStatusLine("1.0", 200, "Authorization header not found");
} }
} else { } else if (requestProxyAuth) {
if (requestProxyAuth) {
response.setStatusLine("1.0", 407, "Proxy authentication required"); response.setStatusLine("1.0", 407, "Proxy authentication required");
for (i = 0; i < authHeaderCount; ++i) for (i = 0; i < authHeaderCount; ++i) {
response.setHeader("Proxy-Authenticate", "basic realm=\"" + proxy_realm + "\"", true); response.setHeader(
"Proxy-Authenticate",
'basic realm="' + proxy_realm + '"',
true
);
}
} else if (requestAuth) { } else if (requestAuth) {
response.setStatusLine("1.0", 401, "Authentication required"); response.setStatusLine("1.0", 401, "Authentication required");
for (i = 0; i < authHeaderCount; ++i) for (i = 0; i < authHeaderCount; ++i) {
response.setHeader("WWW-Authenticate", "basic realm=\"" + realm + "\"", true); response.setHeader(
"WWW-Authenticate",
'basic realm="' + realm + '"',
true
);
}
} else { } else {
response.setStatusLine("1.0", 200, "OK"); response.setStatusLine("1.0", 200, "OK");
} }
}
response.setHeader("Content-Type", "application/xhtml+xml", false); response.setHeader("Content-Type", "application/xhtml+xml", false);
response.write("<html xmlns='http://www.w3.org/1999/xhtml'>"); response.write("<html xmlns='http://www.w3.org/1999/xhtml'>");
response.write("<p>Login: <span id='ok'>" + (requestAuth ? "FAIL" : "PASS") + "</span></p>\n"); response.write(
response.write("<p>Proxy: <span id='proxy'>" + (requestProxyAuth ? "FAIL" : "PASS") + "</span></p>\n"); "<p>Login: <span id='ok'>" +
(requestAuth ? "FAIL" : "PASS") +
"</span></p>\n"
);
response.write(
"<p>Proxy: <span id='proxy'>" +
(requestProxyAuth ? "FAIL" : "PASS") +
"</span></p>\n"
);
response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n"); response.write("<p>Auth: <span id='auth'>" + authHeader + "</span></p>\n");
response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n"); response.write("<p>User: <span id='user'>" + actual_user + "</span></p>\n");
response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n"); response.write("<p>Pass: <span id='pass'>" + actual_pass + "</span></p>\n");
@@ -156,23 +200,27 @@ function reallyHandleRequest(request, response) {
response.write("123456789\n"); response.write("123456789\n");
} }
response.write("</div>"); response.write("</div>");
response.write("<span id='footnote'>This is a footnote after the huge content fill</span>"); response.write(
"<span id='footnote'>This is a footnote after the huge content fill</span>"
);
} }
if (plugin) { if (plugin) {
response.write("<embed id='embedtest' style='width: 400px; height: 100px;' " + response.write(
"type='application/x-test'></embed>\n"); "<embed id='embedtest' style='width: 400px; height: 100px;' " +
"type='application/x-test'></embed>\n"
);
} }
response.write("</html>"); response.write("</html>");
} }
// base64 decoder // base64 decoder
// //
// Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa() // Yoinked from extensions/xml-rpc/src/nsXmlRpcClient.js because btoa()
// doesn't seem to exist. :-( // doesn't seem to exist. :-(
/* Convert Base64 data to a string */ /* Convert Base64 data to a string */
/* eslint-disable prettier/prettier */
const toBinaryTable = [ const toBinaryTable = [
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
@@ -183,20 +231,22 @@ const toBinaryTable = [
-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40, -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1 41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1
]; ];
const base64Pad = '='; /* eslint-enable prettier/prettier */
const base64Pad = "=";
function base64ToString(data) { function base64ToString(data) {
var result = "";
var result = '';
var leftbits = 0; // number of bits decoded, but yet to be appended var leftbits = 0; // number of bits decoded, but yet to be appended
var leftdata = 0; // bits decoded, but yet to be appended var leftdata = 0; // bits decoded, but yet to be appended
// Convert one by one. // Convert one by one.
for (var i = 0; i < data.length; i++) { for (var i = 0; i < data.length; i++) {
var c = toBinaryTable[data.charCodeAt(i) & 0x7f]; var c = toBinaryTable[data.charCodeAt(i) & 0x7f];
var padding = (data[i] == base64Pad); var padding = data[i] == base64Pad;
// Skip illegal characters and whitespace // Skip illegal characters and whitespace
if (c == -1) continue; if (c == -1) {
continue;
}
// Collect data into leftdata, update bitcount // Collect data into leftdata, update bitcount
leftdata = (leftdata << 6) | c; leftdata = (leftdata << 6) | c;
@@ -206,15 +256,17 @@ function base64ToString(data) {
if (leftbits >= 8) { if (leftbits >= 8) {
leftbits -= 8; leftbits -= 8;
// Append if not padding. // Append if not padding.
if (!padding) if (!padding) {
result += String.fromCharCode((leftdata >> leftbits) & 0xff); result += String.fromCharCode((leftdata >> leftbits) & 0xff);
}
leftdata &= (1 << leftbits) - 1; leftdata &= (1 << leftbits) - 1;
} }
} }
// If there are any bits left, the base64 string was corrupted // If there are any bits left, the base64 string was corrupted
if (leftbits) if (leftbits) {
throw Components.Exception('Corrupted base64 string'); throw Components.Exception("Corrupted base64 string");
}
return result; return result;
} }

View File

@@ -1,7 +1,9 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);

View File

@@ -9,8 +9,8 @@ function handleRequest(aRequest, aResponse) {
aResponse.setStatusLine(aRequest.httpVersion, 301, "Moved Permanently"); aResponse.setStatusLine(aRequest.httpVersion, 301, "Moved Permanently");
// Set redirect URI, mirroring the hash value. // Set redirect URI, mirroring the hash value.
let hash = (/\#.+/.test(aRequest.path))? let hash = /\#.+/.test(aRequest.path)
"#" + aRequest.path.split("#")[1]: ? "#" + aRequest.path.split("#")[1]
""; : "";
aResponse.setHeader("Location", REDIRECT_TO + hash); aResponse.setHeader("Location", REDIRECT_TO + hash);
} }

View File

@@ -18,15 +18,19 @@ function handleRequest(req, resp) {
return memo; return memo;
}, {}); }, {});
let timeout = parseInt(params["timeout"]); let timeout = parseInt(params.timeout);
if (timeout) { if (timeout) {
// Write the response after a timeout. // Write the response after a timeout.
resp.processAsync(); resp.processAsync();
gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); gTimer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
gTimer.init(() => { gTimer.init(
() => {
writeResponse(params, resp); writeResponse(params, resp);
resp.finish(); resp.finish();
}, timeout, Ci.nsITimer.TYPE_ONE_SHOT); },
timeout,
Ci.nsITimer.TYPE_ONE_SHOT
);
return; return;
} }
@@ -36,14 +40,14 @@ function handleRequest(req, resp) {
function writeResponse(params, resp) { function writeResponse(params, resp) {
// Echo back the search string with "foo" and "bar" appended. // Echo back the search string with "foo" and "bar" appended.
let suffixes = ["foo", "bar"]; let suffixes = ["foo", "bar"];
if (params["count"]) { if (params.count) {
// Add more suffixes. // Add more suffixes.
let serial = 0; let serial = 0;
while (suffixes.length < params["count"]) { while (suffixes.length < params.count) {
suffixes.push(++serial); suffixes.push(++serial);
} }
} }
let data = [params["query"], suffixes.map(s => params["query"] + s)]; let data = [params.query, suffixes.map(s => params.query + s)];
resp.setHeader("Content-Type", "application/json", false); resp.setHeader("Content-Type", "application/json", false);
resp.write(JSON.stringify(data)); resp.write(JSON.stringify(data));
} }

View File

@@ -1,5 +1,8 @@
function handleRequest(aRequest, aResponse) { function handleRequest(aRequest, aResponse) {
aResponse.setStatusLine(aRequest.httpVersion, 302, "Moved"); aResponse.setStatusLine(aRequest.httpVersion, 302, "Moved");
aResponse.setHeader("Location", "http://mochi.test:8888/tests/caps/tests/mochitest/file_bug1367586-target.html"); aResponse.setHeader(
"Location",
"http://mochi.test:8888/tests/caps/tests/mochitest/file_bug1367586-target.html"
);
aResponse.write("To be redirected to target"); aResponse.write("To be redirected to target");
} }

View File

@@ -2,19 +2,21 @@
http://creativecommons.org/publicdomain/zero/1.0/ */ http://creativecommons.org/publicdomain/zero/1.0/ */
function handleRequest(request, response) { function handleRequest(request, response) {
let Etag = '"4d881ab-b03-435f0a0f9ef00"'; const Etag = '"4d881ab-b03-435f0a0f9ef00"';
let IfNoneMatch = request.hasHeader("If-None-Match") const IfNoneMatch = request.hasHeader("If-None-Match")
? request.getHeader("If-None-Match") ? request.getHeader("If-None-Match")
: ""; : "";
let guid = 'xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { const guid = "xxxxxxxx-xxxx-xxxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function(
let r = Math.random() * 16 | 0; c
let v = c === "x" ? r : (r & 0x3 | 0x8); ) {
const r = (Math.random() * 16) | 0;
const v = c === "x" ? r : (r & 0x3) | 0x8;
return v.toString(16); return v.toString(16);
}); });
let page = "<!DOCTYPE html><html><body><h1>" + guid + "</h1></body></html>"; const page = "<!DOCTYPE html><html><body><h1>" + guid + "</h1></body></html>";
response.setHeader("Etag", Etag, false); response.setHeader("Etag", Etag, false);

View File

@@ -13,12 +13,15 @@ function handleRequest(request, response) {
response.setHeader("Access-Control-Allow-Origin", "*", false); response.setHeader("Access-Control-Allow-Origin", "*", false);
// Redirect to a different file each time. // Redirect to a different file each time.
let counter = 1 + (+getState("counter") % 2); const counter = 1 + (+getState("counter") % 2);
let index = request.path.lastIndexOf("/"); const index = request.path.lastIndexOf("/");
let newPath = request.path.substr(0, index + 1) + const newPath =
"code_bundle_reload_" + counter + ".js.map"; request.path.substr(0, index + 1) +
let newUrl = request.scheme + "://" + request.host + newPath; "code_bundle_reload_" +
counter +
".js.map";
const newUrl = request.scheme + "://" + request.host + newPath;
response.setStatusLine(request.httpVersion, 302, "Found"); response.setStatusLine(request.httpVersion, 302, "Found");
response.setHeader("Location", newUrl); response.setHeader("Location", newUrl);

View File

@@ -13,12 +13,12 @@ function handleRequest(request, response) {
response.setHeader("Access-Control-Allow-Origin", "*", false); response.setHeader("Access-Control-Allow-Origin", "*", false);
// Redirect to a different file each time. // Redirect to a different file each time.
let counter = 1 + (+getState("counter") % 2); const counter = 1 + (+getState("counter") % 2);
let index = request.path.lastIndexOf("/"); const index = request.path.lastIndexOf("/");
let newPath = request.path.substr(0, index + 1) + const newPath =
"code_bundle_reload_" + counter + ".js"; request.path.substr(0, index + 1) + "code_bundle_reload_" + counter + ".js";
let newUrl = request.scheme + "://" + request.host + newPath; const newUrl = request.scheme + "://" + request.host + newPath;
response.setStatusLine(request.httpVersion, 302, "Found"); response.setStatusLine(request.httpVersion, 302, "Found");
response.setHeader("Location", newUrl); response.setHeader("Location", newUrl);

View File

@@ -7,12 +7,14 @@ function setResponse(response) {
} }
function getResponse() { function getResponse() {
let response; let response;
getObjectState(key, v => { response = v }); getObjectState(key, v => {
response = v;
});
return response; return response;
} }
function handleRequest(request, response) { function handleRequest(request, response) {
let {queryString} = request; const { queryString } = request;
if (!queryString) { if (!queryString) {
response.processAsync(); response.processAsync();
setResponse(response); setResponse(response);
@@ -21,7 +23,7 @@ function handleRequest(request, response) {
response.write(" "); response.write(" ");
return; return;
} }
let [command, value] = queryString.split('='); const [command, value] = queryString.split("=");
switch (command) { switch (command) {
case "write": case "write":
getResponse().write(value); getResponse().write(value);

View File

@@ -3,7 +3,10 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 304, "Not Modified"); response.setStatusLine(request.httpVersion, 304, "Not Modified");
response.setHeader("Cache-Control", "no-transform,public,max-age=300,s-maxage=900"); response.setHeader(
"Cache-Control",
"no-transform,public,max-age=300,s-maxage=900"
);
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT"); response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
response.setHeader("Content-Type", "text/plain; charset=utf-8", false); response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
response.write("Hello from cache!"); response.write("Hello from cache!");

View File

@@ -4,16 +4,22 @@
Cu.importGlobalProperties(["TextEncoder"]); Cu.importGlobalProperties(["TextEncoder"]);
function gzipCompressString(string, obs) { function gzipCompressString(string, obs) {
const scs = Cc["@mozilla.org/streamConverters;1"].getService(
let scs = Cc["@mozilla.org/streamConverters;1"] Ci.nsIStreamConverterService
.getService(Ci.nsIStreamConverterService); );
let listener = Cc["@mozilla.org/network/stream-loader;1"] const listener = Cc["@mozilla.org/network/stream-loader;1"].createInstance(
.createInstance(Ci.nsIStreamLoader); Ci.nsIStreamLoader
);
listener.init(obs); listener.init(obs);
let converter = scs.asyncConvertData("uncompressed", "gzip", const converter = scs.asyncConvertData(
listener, null); "uncompressed",
let stringStream = Cc["@mozilla.org/io/string-input-stream;1"] "gzip",
.createInstance(Ci.nsIStringInputStream); listener,
null
);
const stringStream = Cc[
"@mozilla.org/io/string-input-stream;1"
].createInstance(Ci.nsIStringInputStream);
stringStream.data = string; stringStream.data = string;
converter.onStartRequest(null); converter.onStartRequest(null);
converter.onDataAvailable(null, stringStream, 0, string.length); converter.onDataAvailable(null, stringStream, 0, string.length);
@@ -21,11 +27,11 @@ function gzipCompressString(string, obs) {
} }
function doubleGzipCompressString(string, observer) { function doubleGzipCompressString(string, observer) {
let observer2 = { const observer2 = {
onStreamComplete: function(loader, context, status, length, result) { onStreamComplete: function(loader, context, status, length, result) {
let buffer = String.fromCharCode.apply(this, result); const buffer = String.fromCharCode.apply(this, result);
gzipCompressString(buffer, observer); gzipCompressString(buffer, observer);
} },
}; };
gzipCompressString(string, observer2); gzipCompressString(string, observer2);
} }
@@ -33,18 +39,25 @@ function doubleGzipCompressString(string, observer) {
function handleRequest(request, response) { function handleRequest(request, response) {
response.processAsync(); response.processAsync();
let params = request.queryString.split("&"); const params = request.queryString.split("&");
let format = (params.filter((s) => s.includes("fmt="))[0] || "").split("=")[1]; const format = (params.filter(s => s.includes("fmt="))[0] || "").split(
let status = (params.filter((s) => s.includes("sts="))[0] || "").split("=")[1] || 200; "="
let cookies = (params.filter((s) => s.includes("cookies="))[0] || "").split("=")[1] || 0; )[1];
let cors = request.queryString.includes("cors=1"); const status =
(params.filter(s => s.includes("sts="))[0] || "").split("=")[1] || 200;
const cookies =
(params.filter(s => s.includes("cookies="))[0] || "").split("=")[1] || 0;
const cors = request.queryString.includes("cors=1");
let cachedCount = 0; let cachedCount = 0;
let cacheExpire = 60; // seconds const cacheExpire = 60; // seconds
function setCacheHeaders() { function setCacheHeaders() {
if (status != 304) { if (status != 304) {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader(
"Cache-Control",
"no-cache, no-store, must-revalidate"
);
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0"); response.setHeader("Expires", "0");
return; return;
@@ -53,15 +66,27 @@ function handleRequest(request, response) {
if (cachedCount % 2) { if (cachedCount % 2) {
response.setHeader("Cache-Control", "max-age=" + cacheExpire, false); response.setHeader("Cache-Control", "max-age=" + cacheExpire, false);
} else { } else {
response.setHeader("Expires", Date(Date.now() + cacheExpire * 1000), false); response.setHeader(
"Expires",
Date(Date.now() + cacheExpire * 1000),
false
);
} }
cachedCount++; cachedCount++;
} }
function setCookieHeaders() { function setCookieHeaders() {
if (cookies) { if (cookies) {
response.setHeader("Set-Cookie", "name1=value1; Domain=.foo.example.com", true); response.setHeader(
response.setHeader("Set-Cookie", "name2=value2; Domain=.example.com", true); "Set-Cookie",
"name1=value1; Domain=.foo.example.com",
true
);
response.setHeader(
"Set-Cookie",
"name2=value2; Domain=.example.com",
true
);
} }
} }
@@ -72,7 +97,8 @@ function handleRequest(request, response) {
} }
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.initWithCallback(() => { timer.initWithCallback(
() => {
// to avoid garbage collection // to avoid garbage collection
timer = null; timer = null;
switch (format) { switch (format) {
@@ -89,8 +115,8 @@ function handleRequest(request, response) {
// bytes of the string in UTF-8. If it's evaluated as Latin-1, the // bytes of the string in UTF-8. If it's evaluated as Latin-1, the
// written bytes will be the result of UTF-8-encoding this string // written bytes will be the result of UTF-8-encoding this string
// *twice*. // *twice*.
let data = "Братан, ты вообще качаешься?"; const data = "Братан, ты вообще качаешься?";
let stringOfUtf8Bytes = convertToUtf8(data); const stringOfUtf8Bytes = convertToUtf8(data);
response.write(stringOfUtf8Bytes); response.write(stringOfUtf8Bytes);
response.finish(); response.finish();
@@ -105,7 +131,9 @@ function handleRequest(request, response) {
break; break;
} }
case "html": { case "html": {
let content = (params.filter((s) => s.includes("res="))[0] || "").split("=")[1]; const content = (
params.filter(s => s.includes("res="))[0] || ""
).split("=")[1];
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/html; charset=utf-8", false); response.setHeader("Content-Type", "text/html; charset=utf-8", false);
setAllowOriginHeaders(); setAllowOriginHeaders();
@@ -116,7 +144,7 @@ function handleRequest(request, response) {
break; break;
} }
case "html-long": { case "html-long": {
let str = new Array(102400 /* 100 KB in bytes */).join("."); const str = new Array(102400 /* 100 KB in bytes */).join(".");
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/html; charset=utf-8", false); response.setHeader("Content-Type", "text/html; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
@@ -134,7 +162,11 @@ function handleRequest(request, response) {
} }
case "js": { case "js": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "application/javascript; charset=utf-8", false); response.setHeader(
"Content-Type",
"application/javascript; charset=utf-8",
false
);
setCacheHeaders(); setCacheHeaders();
response.write("function() { return 'Hello JS!'; }"); response.write("function() { return 'Hello JS!'; }");
response.finish(); response.finish();
@@ -142,27 +174,37 @@ function handleRequest(request, response) {
} }
case "json": { case "json": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "application/json; charset=utf-8", false); response.setHeader(
"Content-Type",
"application/json; charset=utf-8",
false
);
setCacheHeaders(); setCacheHeaders();
response.write("{ \"greeting\": \"Hello JSON!\" }"); response.write('{ "greeting": "Hello JSON!" }');
response.finish(); response.finish();
break; break;
} }
case "jsonp": { case "jsonp": {
let fun = (params.filter((s) => s.includes("jsonp="))[0] || "").split("=")[1]; const fun = (params.filter(s => s.includes("jsonp="))[0] || "").split(
"="
)[1];
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/json; charset=utf-8", false); response.setHeader("Content-Type", "text/json; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
response.write(fun + "({ \"greeting\": \"Hello JSONP!\" })"); response.write(fun + '({ "greeting": "Hello JSONP!" })');
response.finish(); response.finish();
break; break;
} }
case "jsonp2": { case "jsonp2": {
let fun = (params.filter((s) => s.includes("jsonp="))[0] || "").split("=")[1]; const fun = (params.filter(s => s.includes("jsonp="))[0] || "").split(
"="
)[1];
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/json; charset=utf-8", false); response.setHeader("Content-Type", "text/json; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
response.write(" " + fun + " ( { \"greeting\": \"Hello weird JSONP!\" } ) ; "); response.write(
" " + fun + ' ( { "greeting": "Hello weird JSONP!" } ) ; '
);
response.finish(); response.finish();
break; break;
} }
@@ -170,12 +212,12 @@ function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/json; charset=utf-8", false); response.setHeader("Content-Type", "text/json; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
response.write(btoa("{ \"greeting\": \"This is a base 64 string.\" }")); response.write(btoa('{ "greeting": "This is a base 64 string." }'));
response.finish(); response.finish();
break; break;
} }
case "json-long": { case "json-long": {
let str = "{ \"greeting\": \"Hello long string JSON!\" },"; const str = '{ "greeting": "Hello long string JSON!" },';
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/json; charset=utf-8", false); response.setHeader("Content-Type", "text/json; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
@@ -187,23 +229,31 @@ function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/json; charset=utf-8", false); response.setHeader("Content-Type", "text/json; charset=utf-8", false);
setCacheHeaders(); setCacheHeaders();
response.write("{ \"greeting\": \"Hello malformed JSON!\" },"); response.write('{ "greeting": "Hello malformed JSON!" },');
response.finish(); response.finish();
break; break;
} }
case "json-text-mime": { case "json-text-mime": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/plain; charset=utf-8", false); response.setHeader(
"Content-Type",
"text/plain; charset=utf-8",
false
);
setCacheHeaders(); setCacheHeaders();
response.write("{ \"greeting\": \"Hello third-party JSON!\" }"); response.write('{ "greeting": "Hello third-party JSON!" }');
response.finish(); response.finish();
break; break;
} }
case "json-custom-mime": { case "json-custom-mime": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "text/x-bigcorp-json; charset=utf-8", false); response.setHeader(
"Content-Type",
"text/x-bigcorp-json; charset=utf-8",
false
);
setCacheHeaders(); setCacheHeaders();
response.write("{ \"greeting\": \"Hello oddly-named JSON!\" }"); response.write('{ "greeting": "Hello oddly-named JSON!" }');
response.finish(); response.finish();
break; break;
} }
@@ -238,13 +288,21 @@ function handleRequest(request, response) {
} }
case "flash": { case "flash": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "application/x-shockwave-flash", false); response.setHeader(
"Content-Type",
"application/x-shockwave-flash",
false
);
setCacheHeaders(); setCacheHeaders();
response.finish(); response.finish();
break; break;
} }
case "ws": { case "ws": {
response.setStatusLine(request.httpVersion, 101, "Switching Protocols"); response.setStatusLine(
request.httpVersion,
101,
"Switching Protocols"
);
response.setHeader("Connection", "upgrade", false); response.setHeader("Connection", "upgrade", false);
response.setHeader("Upgrade", "websocket", false); response.setHeader("Upgrade", "websocket", false);
setCacheHeaders(); setCacheHeaders();
@@ -258,15 +316,21 @@ function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.setHeader("Content-Encoding", "gzip\t ,gzip", false); response.setHeader("Content-Encoding", "gzip\t ,gzip", false);
setCacheHeaders(); setCacheHeaders();
let observer = { const observer = {
onStreamComplete: function(loader, context, status, length, result) { onStreamComplete: function(
let buffer = String.fromCharCode.apply(this, result); loader,
context,
status,
length,
result
) {
const buffer = String.fromCharCode.apply(this, result);
response.setHeader("Content-Length", "" + buffer.length, false); response.setHeader("Content-Length", "" + buffer.length, false);
response.write(buffer); response.write(buffer);
response.finish(); response.finish();
} },
}; };
let data = new Array(1000).join("Hello gzip!"); const data = new Array(1000).join("Hello gzip!");
doubleGzipCompressString(data, observer); doubleGzipCompressString(data, observer);
break; break;
} }
@@ -291,7 +355,11 @@ function handleRequest(request, response) {
} }
case "hls-m3u8-alt-mime-type": { case "hls-m3u8-alt-mime-type": {
response.setStatusLine(request.httpVersion, status, "OK"); response.setStatusLine(request.httpVersion, status, "OK");
response.setHeader("Content-Type", "application/vnd.apple.mpegurl", false); response.setHeader(
"Content-Type",
"application/vnd.apple.mpegurl",
false
);
setCacheHeaders(); setCacheHeaders();
response.write("#EXTM3U\n"); response.write("#EXTM3U\n");
response.finish(); response.finish();
@@ -302,7 +370,9 @@ function handleRequest(request, response) {
response.setHeader("Content-Type", "video/vnd.mpeg.dash.mpd", false); response.setHeader("Content-Type", "video/vnd.mpeg.dash.mpd", false);
setCacheHeaders(); setCacheHeaders();
response.write('<?xml version="1.0" encoding="UTF-8"?>\n'); response.write('<?xml version="1.0" encoding="UTF-8"?>\n');
response.write('<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></MPD>\n'); response.write(
'<MPD xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></MPD>\n'
);
response.finish(); response.finish();
break; break;
} }
@@ -315,5 +385,8 @@ function handleRequest(request, response) {
break; break;
} }
} }
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms. },
10,
Ci.nsITimer.TYPE_ONE_SHOT
); // Make sure this request takes a few ms.
} }

View File

@@ -15,5 +15,4 @@ function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200, "OK"); response.setStatusLine(request.httpVersion, 200, "OK");
response.write("Page was accessed over HTTPS!"); response.write("Page was accessed over HTTPS!");
} }
} }

View File

@@ -2,7 +2,6 @@
http://creativecommons.org/publicdomain/zero/1.0/ */ http://creativecommons.org/publicdomain/zero/1.0/ */
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200, "OK"); response.setStatusLine(request.httpVersion, 200, "OK");
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate");
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");
@@ -12,14 +11,14 @@ function handleRequest(request, response) {
// This server checks the name parameter from the request to decide which JSON object to // This server checks the name parameter from the request to decide which JSON object to
// return. // return.
let params = request.queryString.split("&"); const params = request.queryString.split("&");
let name = (params.filter((s) => s.includes("name="))[0] || "").split("=")[1]; const name = (params.filter(s => s.includes("name="))[0] || "").split("=")[1];
switch (name) { switch (name) {
case "null": case "null":
response.write("{ \"greeting\": null }"); response.write('{ "greeting": null }');
break; break;
case "nogrip": case "nogrip":
response.write("{\"obj\": {\"type\": \"string\" }}"); response.write('{"obj": {"type": "string" }}');
break; break;
case "empty": case "empty":
response.write("{}"); response.write("{}");

View File

@@ -3,9 +3,11 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(request.httpVersion, 200, "Och Aye"); response.setStatusLine(request.httpVersion, 200, "Och Aye");
@@ -14,12 +16,18 @@ function handleRequest(request, response) {
var body = ""; var body = "";
if (request.method == "POST") { if (request.method == "POST") {
var bodyStream = new BinaryInputStream(request.bodyInputStream); var bodyStream = new BinaryInputStream(request.bodyInputStream);
var bytes = [], avail = 0; var bytes = [],
avail = 0;
while ((avail = bodyStream.available()) > 0) { while ((avail = bodyStream.available()) > 0) {
body += String.fromCharCode.apply(String, bodyStream.readByteArray(avail)); body += String.fromCharCode.apply(
String,
bodyStream.readByteArray(avail)
);
} }
} }
var contentType = request.hasHeader("content-type") ? request.getHeader("content-type") : "" var contentType = request.hasHeader("content-type")
? request.getHeader("content-type")
: "";
var bodyOutput = [request.method, contentType, body].join("\n"); var bodyOutput = [request.method, contentType, body].join("\n");
response.bodyOutputStream.write(bodyOutput, bodyOutput.length); response.bodyOutputStream.write(bodyOutput, bodyOutput.length);

View File

@@ -9,9 +9,13 @@ const DELAY_MS = 2000;
function handleRequest(request, response) { function handleRequest(request, response) {
response.processAsync(); response.processAsync();
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.init(() => { timer.init(
() => {
response.setHeader("Content-Type", "text/javascript", false); response.setHeader("Content-Type", "text/javascript", false);
response.write("console.log('script loaded')\n"); response.write("console.log('script loaded')\n");
response.finish(); response.finish();
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY_MS,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -9,9 +9,15 @@ const DELAY_MS = 10000;
function handleRequest(request, response) { function handleRequest(request, response) {
response.processAsync(); response.processAsync();
timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.init(() => { timer.init(
() => {
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.write("<body>Slow loading page for netmonitor test. You should never see this.</body>"); response.write(
"<body>Slow loading page for netmonitor test. You should never see this.</body>"
);
response.finish(); response.finish();
}, DELAY_MS, Ci.nsITimer.TYPE_ONE_SHOT); },
DELAY_MS,
Ci.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -4,21 +4,32 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.processAsync(); response.processAsync();
let params = request.queryString.split("&"); const params = request.queryString.split("&");
let index = params.filter((s) => s.includes("index="))[0].split("=")[1]; const index = params.filter(s => s.includes("index="))[0].split("=")[1];
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.initWithCallback(() => { timer.initWithCallback(
() => {
// to avoid garbage collection // to avoid garbage collection
timer = null; timer = null;
response.setStatusLine(request.httpVersion, index == 1 ? 101 : index * 100, "Meh"); response.setStatusLine(
request.httpVersion,
index == 1 ? 101 : index * 100,
"Meh"
);
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader(
"Cache-Control",
"no-cache, no-store, must-revalidate"
);
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0"); response.setHeader("Expires", "0");
response.setHeader("Content-Type", "text/" + index, false); response.setHeader("Content-Type", "text/" + index, false);
response.write(new Array(index * 10).join(index)); // + 0.01 KB response.write(new Array(index * 10).join(index)); // + 0.01 KB
response.finish(); response.finish();
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms. },
10,
Ci.nsITimer.TYPE_ONE_SHOT
); // Make sure this request takes a few ms.
} }

View File

@@ -4,17 +4,22 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.processAsync(); response.processAsync();
let params = request.queryString.split("&"); const params = request.queryString.split("&");
let status = params.filter(s => s.includes("sts="))[0].split("=")[1]; const status = params.filter(s => s.includes("sts="))[0].split("=")[1];
let cached = params.filter(s => s === 'cached').length !== 0; const cached = params.filter(s => s === "cached").length !== 0;
let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer); let timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
timer.initWithCallback(() => { timer.initWithCallback(
() => {
// to avoid garbage collection // to avoid garbage collection
timer = null; timer = null;
switch (status) { switch (status) {
case "100": case "100":
response.setStatusLine(request.httpVersion, 101, "Switching Protocols"); response.setStatusLine(
request.httpVersion,
101,
"Switching Protocols"
);
break; break;
case "200": case "200":
response.setStatusLine(request.httpVersion, 202, "Created"); response.setStatusLine(request.httpVersion, 202, "Created");
@@ -41,17 +46,25 @@ function handleRequest(request, response) {
} }
if (!cached) { if (!cached) {
response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader(
"Cache-Control",
"no-cache, no-store, must-revalidate"
);
response.setHeader("Pragma", "no-cache"); response.setHeader("Pragma", "no-cache");
response.setHeader("Expires", "0"); response.setHeader("Expires", "0");
} } else {
else { response.setHeader(
response.setHeader("Cache-Control", "no-transform,public,max-age=300,s-maxage=900"); "Cache-Control",
"no-transform,public,max-age=300,s-maxage=900"
);
response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT"); response.setHeader("Expires", "Thu, 01 Dec 2100 20:00:00 GMT");
} }
response.setHeader("Content-Type", "text/plain; charset=utf-8", false); response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
response.write("Hello status code " + status + "!"); response.write("Hello status code " + status + "!");
response.finish(); response.finish();
}, 10, Ci.nsITimer.TYPE_ONE_SHOT); // Make sure this request takes a few ms. },
10,
Ci.nsITimer.TYPE_ONE_SHOT
); // Make sure this request takes a few ms.
} }

View File

@@ -3,12 +3,12 @@
var trailerServerTiming = [ var trailerServerTiming = [
{ metric: "metric3", duration: "99789.11", description: "time3" }, { metric: "metric3", duration: "99789.11", description: "time3" },
{metric:"metric4", duration:"1112.13", description:"time4"} { metric: "metric4", duration: "1112.13", description: "time4" },
]; ];
var responseServerTiming = [ var responseServerTiming = [
{ metric: "metric1", duration: "123.4", description: "time1" }, { metric: "metric1", duration: "123.4", description: "time1" },
{metric:"metric2", duration:"0", description:"time2"} { metric: "metric2", duration: "0", description: "time2" },
]; ];
function handleRequest(request, response) { function handleRequest(request, response) {
@@ -29,9 +29,16 @@ function handleRequest(request, response) {
function createServerTimingHeader(headerData) { function createServerTimingHeader(headerData) {
var header = ""; var header = "";
for (var i = 0; i < headerData.length; i++) { for (var i = 0; i < headerData.length; i++) {
header += "Server-Timing: " + headerData[i].metric + ";" + header +=
"dur=" + headerData[i].duration + ";" + "Server-Timing: " +
"desc=" + headerData[i].description + "\r\n"; headerData[i].metric +
";" +
"dur=" +
headerData[i].duration +
";" +
"desc=" +
headerData[i].description +
"\r\n";
} }
return header; return header;
} }

View File

@@ -2,8 +2,10 @@
http://creativecommons.org/publicdomain/zero/1.0/ */ http://creativecommons.org/publicdomain/zero/1.0/ */
function handleRequest(request, response) { function handleRequest(request, response) {
let params = request.queryString.split("&"); const params = request.queryString.split("&");
let limit = (params.filter((s) => s.includes("limit="))[0] || "").split("=")[1]; const limit = (params.filter(s => s.includes("limit="))[0] || "").split(
"="
)[1];
response.setStatusLine(request.httpVersion, 200, "Och Aye"); response.setStatusLine(request.httpVersion, 200, "Och Aye");

View File

@@ -1,14 +1,13 @@
/* Any copyright is dedicated to the Public Domain. /* Any copyright is dedicated to the Public Domain.
* http://creativecommons.org/publicdomain/zero/1.0/ */ * http://creativecommons.org/publicdomain/zero/1.0/ */
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain; charset=utf-8", false); response.setHeader("Content-Type", "text/plain; charset=utf-8", false);
let issue; let issue;
switch (request.queryString) { switch (request.queryString) {
case "badSyntax": case "badSyntax":
response.setHeader("Strict-Transport-Security", "\""); response.setHeader("Strict-Transport-Security", '"');
issue = "is not syntactically correct."; issue = "is not syntactically correct.";
break; break;
case "noMaxAge": case "noMaxAge":
@@ -24,13 +23,17 @@ function handleRequest(request, response)
issue = "includes an invalid max-age directive."; issue = "includes an invalid max-age directive.";
break; break;
case "multipleIncludeSubDomains": case "multipleIncludeSubDomains":
response.setHeader("Strict-Transport-Security", response.setHeader(
"includeSubDomains; includeSubDomains"); "Strict-Transport-Security",
"includeSubDomains; includeSubDomains"
);
issue = "includes multiple includeSubDomains directives."; issue = "includes multiple includeSubDomains directives.";
break; break;
case "multipleMaxAge": case "multipleMaxAge":
response.setHeader("Strict-Transport-Security", response.setHeader(
"max-age=444; max-age=999"); "Strict-Transport-Security",
"max-age=444; max-age=999"
);
issue = "includes multiple max-age directives."; issue = "includes multiple max-age directives.";
break; break;
} }

View File

@@ -5,16 +5,18 @@
// A 1x1 PNG image. // A 1x1 PNG image.
// Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain) // Source: https://commons.wikimedia.org/wiki/File:1x1.png (Public Domain)
const IMAGE = atob("iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" + const IMAGE = atob(
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="); "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAA" +
"ACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII="
);
// To avoid GC. // To avoid GC.
let timer = null; let timer = null;
function handleRequest(request, response) { function handleRequest(request, response) {
let query = {}; const query = {};
request.queryString.split("&").forEach(function(val) { request.queryString.split("&").forEach(function(val) {
let [name, value] = val.split("="); const [name, value] = val.split("=");
query[name] = unescape(value); query[name] = unescape(value);
}); });
@@ -33,8 +35,12 @@ function handleRequest(request, response) {
const nsITimer = Components.interfaces.nsITimer; const nsITimer = Components.interfaces.nsITimer;
timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer); timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer);
timer.initWithCallback(function() { timer.initWithCallback(
function() {
response.write(IMAGE); response.write(IMAGE);
response.finish(); response.finish();
}, query.delay, nsITimer.TYPE_ONE_SHOT); },
query.delay,
nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -1,7 +1,7 @@
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
function handleRequest(request, response) { function handleRequest(request, response) {
let params = new URLSearchParams(request.queryString); const params = new URLSearchParams(request.queryString);
switch (params.get("test")) { switch (params.get("test")) {
case "cache": case "cache":
@@ -22,7 +22,9 @@ function handleCacheTestRequest(request, response) {
response.setHeader("Content-Type", "text/plain; charset=UTF-8", false); response.setHeader("Content-Type", "text/plain; charset=UTF-8", false);
if (request.hasHeader("pragma") && request.hasHeader("cache-control")) { if (request.hasHeader("pragma") && request.hasHeader("cache-control")) {
response.write(`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`); response.write(
`${request.getHeader("pragma")}:${request.getHeader("cache-control")}`
);
} else { } else {
response.write("empty cache headers"); response.write("empty cache headers");
} }
@@ -47,11 +49,12 @@ function handleInjectedScriptTestRequest(request, response, params) {
if (frames > 0) { if (frames > 0) {
// Output an iframe in seamless mode, so that there is an higher chance that in case // Output an iframe in seamless mode, so that there is an higher chance that in case
// of test failures we get a screenshot where the nested iframes are all visible. // of test failures we get a screenshot where the nested iframes are all visible.
content = `<iframe seamless src="?test=injected-script&frames=${frames - 1}"></iframe>`; content = `<iframe seamless src="?test=injected-script&frames=${frames -
1}"></iframe>`;
} else { } else {
// Output an about:srcdoc frame to be sure that inspectedWindow.eval is able to // Output an about:srcdoc frame to be sure that inspectedWindow.eval is able to
// evaluate js code into it. // evaluate js code into it.
let srcdoc = ` const srcdoc = `
<pre>injected script NOT executed</pre> <pre>injected script NOT executed</pre>
<script>window.pageScriptExecutedFirst = true</script> <script>window.pageScriptExecutedFirst = true</script>
`; `;

View File

@@ -1,11 +1,11 @@
function handleRequest(request, response) { function handleRequest(request, response) {
let Etag = '"4d881ab-b03-435f0a0f9ef00"'; const Etag = '"4d881ab-b03-435f0a0f9ef00"';
let IfNoneMatch = request.hasHeader("If-None-Match") const IfNoneMatch = request.hasHeader("If-None-Match")
? request.getHeader("If-None-Match") ? request.getHeader("If-None-Match")
: ""; : "";
var counter = getState("cache-counter") || 1; var counter = getState("cache-counter") || 1;
let page = "<script>var jsValue = '" + counter + "';</script>" + counter; const page = "<script>var jsValue = '" + counter + "';</script>" + counter;
setState("cache-counter", "" + (parseInt(counter) + 1)); setState("cache-counter", "" + (parseInt(counter) + 1));

File diff suppressed because one or more lines are too long

View File

@@ -1,7 +1,10 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
if (getState("reloaded") == "reloaded") { if (getState("reloaded") == "reloaded") {
response.setHeader("Content-Type", "text/html; charset=windows-1254", false); response.setHeader(
"Content-Type",
"text/html; charset=windows-1254",
false
);
response.write("\u00E4"); response.write("\u00E4");
} else { } else {
response.setHeader("Content-Type", "text/html; charset=Shift_JIS", false); response.setHeader("Content-Type", "text/html; charset=Shift_JIS", false);

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
if (getState("reloaded") == "reloaded") { if (getState("reloaded") == "reloaded") {
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.write("<meta charset=iso-2022-kr>\u00E4"); response.write("<meta charset=iso-2022-kr>\u00E4");

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
if (getState("reloaded") == "reloaded") { if (getState("reloaded") == "reloaded") {
response.setHeader("Content-Type", "text/html; charset=iso-2022-kr", false); response.setHeader("Content-Type", "text/html; charset=iso-2022-kr", false);
response.write("\u00E4"); response.write("\u00E4");

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
if (getState("reloaded") == "reloaded") { if (getState("reloaded") == "reloaded") {
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.write("\u00FE\u00FF\u00E4"); response.write("\u00FE\u00FF\u00E4");

View File

@@ -1,7 +1,9 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) { function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
@@ -13,8 +15,9 @@ function handleRequest(request, response) {
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
var redirectstate = "/docshell/test/chrome/bug89419.sjs"; var redirectstate = "/docshell/test/chrome/bug89419.sjs";
response.setStatusLine("1.1", 302, "Found"); response.setStatusLine("1.1", 302, "Found");
if (getState(redirectstate) == "") { if (getState(redirectstate) == "") {

View File

@@ -1,7 +1,10 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.setHeader("Content-Type", "text/html"); response.setHeader("Content-Type", "text/html");
response.write("<body onload='window.parent.onloadCount++'>" + response.write(
request.method + " " + "<body onload='window.parent.onloadCount++'>" +
request.method +
" " +
Date.now() + Date.now() +
"</body>"); "</body>"
);
} }

View File

@@ -3,12 +3,14 @@ function handleRequest(request, response) {
response.setHeader("Cache-Control", "no-cache"); response.setHeader("Cache-Control", "no-cache");
response.write("<body onload='"); response.write("<body onload='");
if (!request.hasHeader('Referer')) { if (!request.hasHeader("Referer")) {
response.write("window.parent.onloadCount++;"); response.write("window.parent.onloadCount++;");
} }
if (request.queryString == "newwindow") { if (request.queryString == "newwindow") {
response.write("if (window.opener) { window.opener.parent.onloadCount++; window.opener.parent.doNextStep(); }"); response.write(
"if (window.opener) { window.opener.parent.onloadCount++; window.opener.parent.doNextStep(); }"
);
response.write("if (!window.opener) window.close();"); response.write("if (!window.opener) window.close();");
response.write("'>"); response.write("'>");
} else { } else {

View File

@@ -2,7 +2,8 @@
let self = this; let self = this;
Cu.import("resource://gre/modules/Timer.jsm"); // eslint-disable-next-line mozilla/use-chromeutils-import
let { setTimeout } = Cu.import("resource://gre/modules/Timer.jsm");
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC( const BinaryInputStream = CC(
@@ -26,7 +27,7 @@ function* generateBody(fragments, size) {
let chunkSize = (size / fragments) | 0; let chunkSize = (size / fragments) | 0;
let remaining = size; let remaining = size;
log(`Chunk size ${chunkSize}`) log(`Chunk size ${chunkSize}`);
while (remaining > 0) { while (remaining > 0) {
let data = new Uint8Array(Math.min(remaining, chunkSize)); let data = new Uint8Array(Math.min(remaining, chunkSize));
for (let i = 0; i < data.length; ++i) { for (let i = 0; i < data.length; ++i) {
@@ -35,7 +36,7 @@ function* generateBody(fragments, size) {
} }
yield data; yield data;
log(`Remaining to chunk ${remaining}`) log(`Remaining to chunk ${remaining}`);
remaining -= data.length; remaining -= data.length;
} }
} }
@@ -47,7 +48,7 @@ function readStream(inputStream) {
result.push(inputStream.readBytes(available)); result.push(inputStream.readBytes(available));
} }
return result.join(''); return result.join("");
} }
function now() { function now() {
@@ -68,7 +69,9 @@ async function handleRequest(request, response) {
message = "bad"; message = "bad";
} else { } else {
log("Read POST body"); log("Read POST body");
let body = new URLSearchParams(readStream(new BinaryInputStream(request.bodyInputStream))); let body = new URLSearchParams(
readStream(new BinaryInputStream(request.bodyInputStream))
);
message = body.get("token") || "bad"; message = body.get("token") || "bad";
log(`The result was ${message}`); log(`The result was ${message}`);
} }
@@ -81,17 +84,21 @@ async function handleRequest(request, response) {
let header = "<!doctype html><!-- "; let header = "<!doctype html><!-- ";
let footer = ` --><script>"use strict"; let target = (opener || parent); target.postMessage('${message}', '*');</script>`; let footer = ` --><script>"use strict"; let target = (opener || parent); target.postMessage('${message}', '*');</script>`;
log("Set headers") log("Set headers");
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.setHeader("Content-Length", `${size + header.length + footer.length}`, false); response.setHeader(
"Content-Length",
`${size + header.length + footer.length}`,
false
);
response.setStatusLine(request.httpVersion, "200", "OK"); response.setStatusLine(request.httpVersion, "200", "OK");
response.processAsync(); response.processAsync();
log("Write header"); log("Write header");
response.write(header); response.write(header);
log("Write body") log("Write body");
for (let data of generateBody(fragments, size)) { for (let data of generateBody(fragments, size)) {
delay = Math.max(0, delayUntil - now()) delay = Math.max(0, delayUntil - now());
log(`Delay sending fragment for ${delay / fragments}`); log(`Delay sending fragment for ${delay / fragments}`);
let failed = false; let failed = false;
await new Promise(resolve => { await new Promise(resolve => {
@@ -112,10 +119,10 @@ async function handleRequest(request, response) {
} }
fragments = Math.max(--fragments, 1); fragments = Math.max(--fragments, 1);
log(`Fragments left ${fragments}`) log(`Fragments left ${fragments}`);
} }
log("Write footer") log("Write footer");
response.write(footer); response.write(footer);
response.finish(); response.finish();

View File

@@ -1,10 +1,17 @@
jsURL = "javascript:" + escape('window.parent.postMessage("JS uri ran", "*");\ jsURL =
"javascript:" +
escape(
'window.parent.postMessage("JS uri ran", "*");\
return \'\ return \'\
<script>\ <script>\
window.parent.postMessage("Able to access private: " +\ window.parent.postMessage("Able to access private: " +\
window.parent.private, "*");\ window.parent.private, "*");\
</script>\''); </script>\''
dataURL = "data:text/html," + escape('<!DOCTYPE HTML>\ );
dataURL =
"data:text/html," +
escape(
'<!DOCTYPE HTML>\
<script>\ <script>\
try {\ try {\
window.parent.postMessage("Able to access private: " +\ window.parent.postMessage("Able to access private: " +\
@@ -13,7 +20,8 @@ try {\
catch (e) {\ catch (e) {\
window.parent.postMessage("pass", "*");\ window.parent.postMessage("pass", "*");\
}\ }\
</script>'); </script>'
);
tests = [ tests = [
// Plain document should work as normal // Plain document should work as normal
@@ -29,8 +37,7 @@ catch (e) {\
</script>', </script>',
// refresh to plain doc // refresh to plain doc
{ refresh: "file_bug475636.sjs?1", { refresh: "file_bug475636.sjs?1", doc: "<!DOCTYPE HTML>" },
doc: '<!DOCTYPE HTML>' },
// meta-refresh to plain doc // meta-refresh to plain doc
'<!DOCTYPE HTML>\ '<!DOCTYPE HTML>\
@@ -39,51 +46,52 @@ catch (e) {\
</head>', </head>',
// refresh to data url // refresh to data url
{ refresh: dataURL, { refresh: dataURL, doc: "<!DOCTYPE HTML>" },
doc: '<!DOCTYPE HTML>' },
// meta-refresh to data url // meta-refresh to data url
'<!DOCTYPE HTML>\ '<!DOCTYPE HTML>\
<head>\ <head>\
<meta http-equiv="refresh" content="0; url=' + dataURL + '">\ <meta http-equiv="refresh" content="0; url=' +
dataURL +
'">\
</head>', </head>',
// refresh to js url should not be followed // refresh to js url should not be followed
{ refresh: jsURL, {
refresh: jsURL,
doc: doc:
'<!DOCTYPE HTML>\ '<!DOCTYPE HTML>\
<script>\ <script>\
setTimeout(function() {\ setTimeout(function() {\
window.parent.postMessage("pass", "*");\ window.parent.postMessage("pass", "*");\
}, 2000);\ }, 2000);\
</script>' }, </script>',
},
// meta refresh to js url should not be followed // meta refresh to js url should not be followed
'<!DOCTYPE HTML>\ '<!DOCTYPE HTML>\
<head>\ <head>\
<meta http-equiv="refresh" content="0; url=' + jsURL + '">\ <meta http-equiv="refresh" content="0; url=' +
jsURL +
'">\
</head>\ </head>\
<script>\ <script>\
setTimeout(function() {\ setTimeout(function() {\
window.parent.postMessage("pass", "*");\ window.parent.postMessage("pass", "*");\
}, 2000);\ }, 2000);\
</script>' </script>',
]; ];
function handleRequest(request, response) {
function handleRequest(request, response)
{
dump("@@@@@@@@@hi there: " + request.queryString + "\n"); dump("@@@@@@@@@hi there: " + request.queryString + "\n");
test = tests[parseInt(request.queryString, 10) - 1]; test = tests[parseInt(request.queryString, 10) - 1];
response.setHeader("Content-Type", "text/html"); response.setHeader("Content-Type", "text/html");
if (!test) { if (!test) {
response.write('<script>parent.postMessage("done", "*");</script>'); response.write('<script>parent.postMessage("done", "*");</script>');
} } else if (typeof test == "string") {
else if (typeof test == "string") {
response.write(test); response.write(test);
} } else if (test.refresh) {
else if (test.refresh) {
response.setHeader("Refresh", "0; url=" + test.refresh); response.setHeader("Refresh", "0; url=" + test.refresh);
response.write(test.doc); response.write(test.doc);
} }

View File

@@ -1,5 +1,8 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.write('<html><body onload=\'parent.page2Load("' + request.method + '")\'>file_bug580069_2.sjs</body></html>'); response.write(
"<html><body onload='parent.page2Load(\"" +
request.method +
"\")'>file_bug580069_2.sjs</body></html>"
);
} }

View File

@@ -1,14 +1,17 @@
function handleRequest(request, response) function handleRequest(request, response) {
{ var count = parseInt(getState("count"));
var count = parseInt(getState('count')); if (!count || request.queryString == "countreset") {
if (!count || request.queryString == 'countreset')
count = 0; count = 0;
}
setState('count', count + 1 + '');
setState("count", count + 1 + "");
response.setHeader('Content-Type', 'text/html', false);
response.setHeader('Cache-Control', 'max-age=0'); response.setHeader("Content-Type", "text/html", false);
response.write('<html><body onload="opener.onChildLoad()" ' + response.setHeader("Cache-Control", "max-age=0");
'onunload="parseInt(\'0\')">' + response.write(
count + '</body></html>'); '<html><body onload="opener.onChildLoad()" ' +
"onunload=\"parseInt('0')\">" +
count +
"</body></html>"
);
} }

View File

@@ -1,7 +1,5 @@
"use strict"; "use strict";
Cu.import("resource://gre/modules/Timer.jsm");
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC( const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1", "@mozilla.org/binaryinputstream;1",
@@ -23,7 +21,7 @@ async function handleRequest(request, response) {
if (request.method !== "POST") { if (request.method !== "POST") {
message = "bad"; message = "bad";
} else { } else {
log("Reading request") log("Reading request");
let available = 0; let available = 0;
let inputStream = new BinaryInputStream(request.bodyInputStream); let inputStream = new BinaryInputStream(request.bodyInputStream);
while ((available = inputStream.available()) > 0) { while ((available = inputStream.available()) > 0) {
@@ -31,10 +29,12 @@ async function handleRequest(request, response) {
} }
} }
log("Setting Headers") log("Setting Headers");
response.setHeader("Content-Type", "text/html", false); response.setHeader("Content-Type", "text/html", false);
response.setStatusLine(request.httpVersion, "200", "OK"); response.setStatusLine(request.httpVersion, "200", "OK");
log("Writing body"); log("Writing body");
response.write('<script>"use strict"; let target = opener ? opener : parent; target.postMessage("done", "*");</script>'); response.write(
log("Done") '<script>"use strict"; let target = opener ? opener : parent; target.postMessage("done", "*");</script>'
);
log("Done");
} }

View File

@@ -7,7 +7,7 @@ function handleRequest(request, response) {
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
// Wait a bit. // Wait a bit.
var s = Date.now(); var s = Date.now();
while (Date.now() - s < 1000); while (Date.now() - s < 1000) {}
response.write(`<!DOCTYPE HTML> response.write(`<!DOCTYPE HTML>
<html> <html>

View File

@@ -20,7 +20,10 @@ function handleRequest(request, response) {
setState("sessionhistory_do_redirect", ""); setState("sessionhistory_do_redirect", "");
response.setStatusLine("1.1", 302, "Found"); response.setStatusLine("1.1", 302, "Found");
response.setHeader("Location", response.setHeader(
"file_session_history_on_redirect_2.html", false); "Location",
"file_session_history_on_redirect_2.html",
false
);
} }
} }

View File

@@ -1,12 +1,16 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.processAsync(); response.processAsync();
timer = Components.classes["@mozilla.org/timer;1"]. timer = Components.classes["@mozilla.org/timer;1"].createInstance(
createInstance(Components.interfaces.nsITimer); Components.interfaces.nsITimer
timer.init(function() { );
timer.init(
function() {
response.finish(); response.finish();
}, 5000, Components.interfaces.nsITimer.TYPE_ONE_SHOT); },
5000,
Components.interfaces.nsITimer.TYPE_ONE_SHOT
);
response.setStatusLine(null, 200, "OK"); response.setStatusLine(null, 200, "OK");
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);

View File

@@ -1,11 +1,15 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.processAsync(); response.processAsync();
timer = Components.classes["@mozilla.org/timer;1"]. timer = Components.classes["@mozilla.org/timer;1"].createInstance(
createInstance(Components.interfaces.nsITimer); Components.interfaces.nsITimer
timer.init(function() { );
timer.init(
function() {
response.write("Here the content. But slowly."); response.write("Here the content. But slowly.");
response.finish(); response.finish();
}, 1000, Components.interfaces.nsITimer.TYPE_ONE_SHOT); },
1000,
Components.interfaces.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -1,8 +1,8 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setStatusLine("1.1", 500, "Internal Server Error"); response.setStatusLine("1.1", 500, "Internal Server Error");
response.setHeader("Content-Type", "image/svg+xml", false); response.setHeader("Content-Type", "image/svg+xml", false);
let body = "<svg xmlns='http://www.w3.org/2000/svg' width='70' height='0'></svg>"; let body =
"<svg xmlns='http://www.w3.org/2000/svg' width='70' height='0'></svg>";
response.bodyOutputStream.write(body, body.length); response.bodyOutputStream.write(body, body.length);
} }

View File

@@ -1,8 +1,7 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setStatusLine(null, 401, "Unauthorized"); response.setStatusLine(null, 401, "Unauthorized");
response.setHeader("WWW-Authenticate", "basic realm=\"restricted\"", false); response.setHeader("WWW-Authenticate", 'basic realm="restricted"', false);
response.setHeader("Access-Control-Allow-Origin", "*", false); response.setHeader("Access-Control-Allow-Origin", "*", false);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);

View File

@@ -1,10 +1,11 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
if (request.method == "GET") { if (request.method == "GET") {
response.write(request.queryString); response.write(request.queryString);
@@ -14,11 +15,11 @@ function handleRequest(request, response)
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);
} }
} }

View File

@@ -1,6 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setStatusLine(null, 302, "Moved"); response.setStatusLine(null, 302, "Moved");
response.setHeader("Location", "http://nosuchdomain.localhost", false); response.setHeader("Location", "http://nosuchdomain.localhost", false);
} }

View File

@@ -1,20 +1,21 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
var body = new BinaryInputStream(request.bodyInputStream); var body = new BinaryInputStream(request.bodyInputStream);
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);
} }

View File

@@ -1,11 +1,10 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain; charset=ISO-8859-1", false); response.setHeader("Content-Type", "text/plain; charset=ISO-8859-1", false);
const body = [0xC1]; const body = [0xc1];
var bos = Components.classes["@mozilla.org/binaryoutputstream;1"] var bos = Components.classes[
.createInstance(Components.interfaces.nsIBinaryOutputStream); "@mozilla.org/binaryoutputstream;1"
].createInstance(Components.interfaces.nsIBinaryOutputStream);
bos.setOutputStream(response.bodyOutputStream); bos.setOutputStream(response.bodyOutputStream);
bos.writeByteArray(body); bos.writeByteArray(body);
} }

View File

@@ -1,4 +1,8 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(null, 302, "Found"); response.setStatusLine(null, 302, "Found");
response.setHeader("Location", "http://example.com/tests/dom/base/test/bug461735-post-redirect.js", false); response.setHeader(
"Location",
"http://example.com/tests/dom/base/test/bug461735-post-redirect.js",
false
);
} }

View File

@@ -1,4 +1,8 @@
function handleRequest(request, response) { function handleRequest(request, response) {
response.setStatusLine(null, 302, "Found"); response.setStatusLine(null, 302, "Found");
response.setHeader("Location", "http://mochi.test:8888/tests/dom/base/test/bug461735-post-redirect.js", false); response.setHeader(
"Location",
"http://mochi.test:8888/tests/dom/base/test/bug461735-post-redirect.js",
false
);
} }

View File

@@ -1,15 +1,11 @@
function handleRequest(request, response) {
function handleRequest(request, response)
{
var body = "loaded"; var body = "loaded";
var origin = "localhost"; var origin = "localhost";
try { try {
var origin = request.getHeader("Origin"); var origin = request.getHeader("Origin");
} catch (e) {} } catch (e) {}
response.setHeader("Access-Control-Allow-Origin", response.setHeader("Access-Control-Allow-Origin", origin, false);
origin,
false);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);
response.setHeader("Access-Control-Allow-Methods", "XMETHOD", false); response.setHeader("Access-Control-Allow-Methods", "XMETHOD", false);
response.setHeader("Connection", "Keep-alive", false); response.setHeader("Connection", "Keep-alive", false);

View File

@@ -1,26 +1,22 @@
function handleRequest(request, response) function handleRequest(request, response) {
{ if (request.queryString == "") {
if (request.queryString == "") var etag = request.hasHeader("If-Match")
{ ? request.getHeader("If-Match")
var etag = request.hasHeader("If-Match") ? request.getHeader("If-Match") : null; : null;
if (!etag || etag == getState("etag")) if (!etag || etag == getState("etag")) {
{
response.setStatusLine(request.httpVersion, 200, "Ok"); response.setStatusLine(request.httpVersion, 200, "Ok");
response.setHeader("Content-Type", "text/html"); response.setHeader("Content-Type", "text/html");
response.setHeader("ETag", getState("etag")); response.setHeader("ETag", getState("etag"));
response.setHeader("Cache-control", "max-age=36000"); response.setHeader("Cache-control", "max-age=36000");
response.write(getState("etag")); response.write(getState("etag"));
} } else if (etag) {
else if (etag)
{
response.setStatusLine(request.httpVersion, 412, "Precondition Failed"); response.setStatusLine(request.httpVersion, 412, "Precondition Failed");
} }
} } else {
else
{
var etag = request.queryString.match(/^etag=(.*)$/); var etag = request.queryString.match(/^etag=(.*)$/);
if (etag) if (etag) {
setState("etag", etag[1]); setState("etag", etag[1]);
}
response.setStatusLine(request.httpVersion, 204, "No content"); response.setStatusLine(request.httpVersion, 204, "No content");
} }

View File

@@ -1,18 +1,20 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
var body = new BinaryInputStream(request.bodyInputStream); var body = new BinaryInputStream(request.bodyInputStream);
var avail; var avail;
var bytes = []; var bytes = [];
while ((avail = body.available()) > 0) while ((avail = body.available()) > 0) {
Array.prototype.push.apply(bytes, body.readByteArray(avail)); Array.prototype.push.apply(bytes, body.readByteArray(avail));
}
var data = String.fromCharCode.apply(null, bytes); var data = String.fromCharCode.apply(null, bytes);
response.bodyOutputStream.write(data, data.length); response.bodyOutputStream.write(data, data.length);

View File

@@ -1,10 +1,10 @@
function getInputStream(path) function getInputStream(path) {
{ var file = Components.classes["@mozilla.org/file/directory_service;1"]
var file = Components.classes["@mozilla.org/file/directory_service;1"]. .getService(Components.interfaces.nsIProperties)
getService(Components.interfaces.nsIProperties). .get("CurWorkD", Components.interfaces.nsIFile);
get("CurWorkD", Components.interfaces.nsIFile); var fis = Components.classes[
var fis = Components.classes['@mozilla.org/network/file-input-stream;1']. "@mozilla.org/network/file-input-stream;1"
createInstance(Components.interfaces.nsIFileInputStream); ].createInstance(Components.interfaces.nsIFileInputStream);
var split = path.split("/"); var split = path.split("/");
for (var i = 0; i < split.length; ++i) { for (var i = 0; i < split.length; ++i) {
file.append(split[i]); file.append(split[i]);
@@ -13,14 +13,12 @@ function getInputStream(path)
return fis; return fis;
} }
function handleRequest(request, response) {
var inputStream = getInputStream(
function handleRequest(request, response) "tests/dom/base/test/bug638112-response.txt"
{ );
var inputStream = getInputStream("tests/dom/base/test/bug638112-response.txt")
response.seizePower(); response.seizePower();
response.bodyOutputStream.writeFrom(inputStream, response.bodyOutputStream.writeFrom(inputStream, inputStream.available());
inputStream.available());
response.finish(); response.finish();
inputStream.close(); inputStream.close();
} }

View File

@@ -1,20 +1,46 @@
var BASE_URL = 'example.com/tests/dom/base/test/bug704320.sjs'; var BASE_URL = "example.com/tests/dom/base/test/bug704320.sjs";
function createTestUrl(schemeFrom, schemeTo, policy, action, type) { function createTestUrl(schemeFrom, schemeTo, policy, action, type) {
return schemeTo + '://' + BASE_URL + '?' + return (
'action=' + action + '&' + schemeTo +
'scheme=' + schemeFrom + '-to-' + schemeTo + '&' + "://" +
'policy=' + policy + '&' + BASE_URL +
'type=' + type; "?" +
"action=" +
action +
"&" +
"scheme=" +
schemeFrom +
"-to-" +
schemeTo +
"&" +
"policy=" +
policy +
"&" +
"type=" +
type
);
} }
function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) { function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) {
return schemeFrom + '://' + BASE_URL + '?' + return (
'action=create-2nd-level-iframe&' + schemeFrom +
'scheme-from=' + schemeFrom + '&' + "://" +
'scheme-to=' + schemeTo + '&' + BASE_URL +
'policy=' + policy + '&' + "?" +
'type=' + type; "action=create-2nd-level-iframe&" +
"scheme-from=" +
schemeFrom +
"&" +
"scheme-to=" +
schemeTo +
"&" +
"policy=" +
policy +
"&" +
"type=" +
type
);
} }
// Creates the following test cases for the specified scheme and referrer // Creates the following test cases for the specified scheme and referrer
@@ -46,56 +72,102 @@ function create2ndLevelIframeUrl(schemeFrom, schemeTo, policy, type) {
// results. // results.
function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) { function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
var _createTestUrl = createTestUrl.bind( var _createTestUrl = createTestUrl.bind(
null, schemeFrom, schemeTo, policy, 'test'); null,
schemeFrom,
schemeTo,
policy,
"test"
);
var _create2ndLevelIframeUrl = create2ndLevelIframeUrl.bind( var _create2ndLevelIframeUrl = create2ndLevelIframeUrl.bind(
null, schemeFrom, schemeTo, policy); null,
schemeFrom,
schemeTo,
policy
);
var metaReferrerPolicyString = ''; var metaReferrerPolicyString = "";
if (optionalEarlierPolicy && optionalEarlierPolicy != '') { if (optionalEarlierPolicy && optionalEarlierPolicy != "") {
metaReferrerPolicyString += '<meta name="referrer" content="' + optionalEarlierPolicy + '">\n'; metaReferrerPolicyString +=
'<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
} }
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">'; metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
return '<!DOCTYPE HTML>\n\ return (
"<!DOCTYPE HTML>\n\
<html>\n\ <html>\n\
<head>\n\ <head>\n\
'+metaReferrerPolicyString+'\n\ " +
<link rel="stylesheet" type="text/css" href="' + _createTestUrl('stylesheet') + '">\n\ metaReferrerPolicyString +
'\n\
<link rel="stylesheet" type="text/css" href="' +
_createTestUrl("stylesheet") +
'">\n\
<style type="text/css">\n\ <style type="text/css">\n\
@import "' + _createTestUrl('import-css') + '";\n\ @import "' +
_createTestUrl("import-css") +
'";\n\
@font-face {\n\ @font-face {\n\
font-family: "Fake Serif Bold";\n\ font-family: "Fake Serif Bold";\n\
src: url("' + _createTestUrl('font-face') + '");\n\ src: url("' +
_createTestUrl("font-face") +
'");\n\
}\n\ }\n\
body {\n\ body {\n\
font-family: "Fake Serif Bold", serif;\n\ font-family: "Fake Serif Bold", serif;\n\
background: url("' + _createTestUrl('bg-url') + '");\n\ background: url("' +
_createTestUrl("bg-url") +
'");\n\
}\n\ }\n\
</style>\n\ </style>\n\
</head>\n\ </head>\n\
<body>\n\ <body>\n\
<script src="' + _createTestUrl('script') + '"></script>\n\ <script src="' +
<img src="' + _createTestUrl('img') + '"></img>\n\ _createTestUrl("script") +
<iframe src="' + _createTestUrl('iframe') + '"></iframe>\n\ '"></script>\n\
<audio src="' + _createTestUrl('audio') + '"></audio>\n\ <img src="' +
<video src="' + _createTestUrl('video') + '"></video>\n\ _createTestUrl("img") +
<object type="bogus" data="' + _createTestUrl('object') + '"></object>\n\ '"></img>\n\
<object type="image/svg+xml" data="' + _createTestUrl('object-svg') + '"></object>\n\ <iframe src="' +
<a id="link" href="' + _createTestUrl('link') + '" ping="' + _createTestUrl('link-ping') + '"></a>\n\ _createTestUrl("iframe") +
<iframe src="' + _create2ndLevelIframeUrl('form') + '"></iframe>\n\ '"></iframe>\n\
<iframe src="' + _create2ndLevelIframeUrl('window.location') + '"></iframe>\n\ <audio src="' +
_createTestUrl("audio") +
'"></audio>\n\
<video src="' +
_createTestUrl("video") +
'"></video>\n\
<object type="bogus" data="' +
_createTestUrl("object") +
'"></object>\n\
<object type="image/svg+xml" data="' +
_createTestUrl("object-svg") +
'"></object>\n\
<a id="link" href="' +
_createTestUrl("link") +
'" ping="' +
_createTestUrl("link-ping") +
'"></a>\n\
<iframe src="' +
_create2ndLevelIframeUrl("form") +
'"></iframe>\n\
<iframe src="' +
_create2ndLevelIframeUrl("window.location") +
'"></iframe>\n\
<script>\n\ <script>\n\
var _testFinished = 0\n\ var _testFinished = 0\n\
(function() {\n\ (function() {\n\
var x = new XMLHttpRequest();\n\ var x = new XMLHttpRequest();\n\
x.open("GET", "' + _createTestUrl('xmlhttprequest') + '");\n\ x.open("GET", "' +
_createTestUrl("xmlhttprequest") +
'");\n\
x.send();\n\ x.send();\n\
})();\n\ })();\n\
(function() {\n\ (function() {\n\
var eventSource = new EventSource("' + _createTestUrl('eventsource') + '");\n\ var eventSource = new EventSource("' +
_createTestUrl("eventsource") +
'");\n\
})();' + })();' +
// LOAD EVENT (most of the tests) // LOAD EVENT (most of the tests)
// fires when the resources for the page are loaded // fires when the resources for the page are loaded
'var _isLoaded = false;\n\ 'var _isLoaded = false;\n\
@@ -103,7 +175,6 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
this._isLoaded = true;\n\ this._isLoaded = true;\n\
this.checkForFinish();\n\ this.checkForFinish();\n\
}.bind(window), false);' + }.bind(window), false);' +
// WINDOW.OPEN test // WINDOW.OPEN test
// listen for incoming status from window.open, close the window // listen for incoming status from window.open, close the window
// and check if we're done. // and check if we're done.
@@ -115,8 +186,9 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
this.checkForFinish();\n\ this.checkForFinish();\n\
}\n\ }\n\
}.bind(window), false);\n\ }.bind(window), false);\n\
var win = window.open("' + _createTestUrl('window.open') + '", "");' + var win = window.open("' +
_createTestUrl("window.open") +
'", "");' +
// called by the two things that must complete: window.open page // called by the two things that must complete: window.open page
// and the window load event. When both are complete, this // and the window load event. When both are complete, this
// "finishes" the iframe subtest by clicking the link. // "finishes" the iframe subtest by clicking the link.
@@ -129,59 +201,87 @@ function createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy) {
}\n\ }\n\
</script>\n\ </script>\n\
</body>\n\ </body>\n\
</html>'; </html>'
);
} }
function createIframedFormTest(schemeFrom, schemeTo, policy) { function createIframedFormTest(schemeFrom, schemeTo, policy) {
var actionUrl = schemeTo + '://' + BASE_URL; var actionUrl = schemeTo + "://" + BASE_URL;
return '<!DOCTYPE HTML>\n\ return (
'<!DOCTYPE HTML>\n\
<html>\n\ <html>\n\
<head>\n\ <head>\n\
<meta name="referrer" content="' + policy + '">\n\ <meta name="referrer" content="' +
policy +
'">\n\
</head>\n\ </head>\n\
<body>\n\ <body>\n\
<form id="form" action="' + actionUrl + '">\n\ <form id="form" action="' +
actionUrl +
'">\n\
<input type="hidden" name="action" value="test">\n\ <input type="hidden" name="action" value="test">\n\
<input type="hidden" name="scheme" value="' + schemeFrom + '-to-' + schemeTo + '">\n\ <input type="hidden" name="scheme" value="' +
<input type="hidden" name="policy" value="' + policy + '">\n\ schemeFrom +
"-to-" +
schemeTo +
'">\n\
<input type="hidden" name="policy" value="' +
policy +
'">\n\
<input type="hidden" name="type" value="form">\n\ <input type="hidden" name="type" value="form">\n\
</form>\n\ </form>\n\
<script>\n\ <script>\n\
document.getElementById("form").submit();\n\ document.getElementById("form").submit();\n\
</script>\n\ </script>\n\
</body>\n\ </body>\n\
</html>'; </html>'
);
} }
function createIframedWindowLocationTest(schemeFrom, schemeTo, policy) { function createIframedWindowLocationTest(schemeFrom, schemeTo, policy) {
var url = createTestUrl( var url = createTestUrl(
schemeFrom, schemeTo, policy, 'test', 'window.location'); schemeFrom,
schemeTo,
policy,
"test",
"window.location"
);
return '<!DOCTYPE HTML>\n\ return (
'<!DOCTYPE HTML>\n\
<html>\n\ <html>\n\
<head>\n\ <head>\n\
<meta name="referrer" content="' + policy + '">\n\ <meta name="referrer" content="' +
policy +
'">\n\
</head>\n\ </head>\n\
<body>\n\ <body>\n\
<script>\n\ <script>\n\
window.location = "' + url + '";\n\ window.location = "' +
url +
'";\n\
</script>\n\ </script>\n\
</body>\n\ </body>\n\
</html>'; </html>'
);
} }
function createPolicyTest(policy, optionalEarlierPolicy) { function createPolicyTest(policy, optionalEarlierPolicy) {
var metaReferrerPolicyString = ''; var metaReferrerPolicyString = "";
if (optionalEarlierPolicy && optionalEarlierPolicy != '') { if (optionalEarlierPolicy && optionalEarlierPolicy != "") {
metaReferrerPolicyString += '<meta name="referrer" content="' + optionalEarlierPolicy + '">\n'; metaReferrerPolicyString +=
'<meta name="referrer" content="' + optionalEarlierPolicy + '">\n';
} }
metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">'; metaReferrerPolicyString += '<meta name="referrer" content="' + policy + '">';
return '<!DOCTYPE HTML>\n\ return (
"<!DOCTYPE HTML>\n\
<html>\n\ <html>\n\
<head>\n\ <head>\n\
'+metaReferrerPolicyString+'\n\ " +
metaReferrerPolicyString +
'\n\
<script type="text/javascript" src="/tests/dom/base/test/file_bug704320_preload_common.js"></script>\n\ <script type="text/javascript" src="/tests/dom/base/test/file_bug704320_preload_common.js"></script>\n\
</head>\n\ </head>\n\
<body>\n\ <body>\n\
@@ -190,53 +290,55 @@ function createPolicyTest(policy, optionalEarlierPolicy) {
<img src="http://example.com/tests/dom/base/test/bug704320_counter.sjs?type=img"\n\ <img src="http://example.com/tests/dom/base/test/bug704320_counter.sjs?type=img"\n\
onload="incrementLoad2(\'img\', 2);">\n\ onload="incrementLoad2(\'img\', 2);">\n\
</body>\n\ </body>\n\
</html>'; </html>'
);
} }
function handleRequest(request, response) { function handleRequest(request, response) {
var sharedKey = 'bug704320.sjs'; var sharedKey = "bug704320.sjs";
var params = request.queryString.split('&'); var params = request.queryString.split("&");
var action = params[0].split('=')[1]; var action = params[0].split("=")[1];
if (action === 'create-1st-level-iframe') { if (action === "create-1st-level-iframe") {
// ?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=origin // ?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=origin
var schemeFrom = params[1].split('=')[1]; var schemeFrom = params[1].split("=")[1];
var schemeTo = params[2].split('=')[1]; var schemeTo = params[2].split("=")[1];
var policy = params[3].split('=')[1]; var policy = params[3].split("=")[1];
var optionalEarlierPolicy = ''; var optionalEarlierPolicy = "";
if (params[4]) { if (params[4]) {
optionalEarlierPolicy = params[4].split('=')[1]; optionalEarlierPolicy = params[4].split("=")[1];
} }
response.setHeader('Content-Type', 'text/html; charset=utf-8', false); response.setHeader("Content-Type", "text/html; charset=utf-8", false);
response.setHeader('Cache-Control', 'no-cache', false); response.setHeader("Cache-Control", "no-cache", false);
response.write(createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy)); response.write(
} createTest(schemeFrom, schemeTo, policy, optionalEarlierPolicy)
else if (action === 'create-2nd-level-iframe') { );
} else if (action === "create-2nd-level-iframe") {
// ?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=origin&type=form" // ?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=origin&type=form"
var schemeFrom = params[1].split('=')[1]; var schemeFrom = params[1].split("=")[1];
var schemeTo = params[2].split('=')[1]; var schemeTo = params[2].split("=")[1];
var policy = params[3].split('=')[1]; var policy = params[3].split("=")[1];
var type = params[4].split('=')[1]; var type = params[4].split("=")[1];
response.setHeader('Content-Type', 'text/html; charset=utf-8', false); response.setHeader("Content-Type", "text/html; charset=utf-8", false);
response.setHeader('Cache-Control', 'no-cache', false); response.setHeader("Cache-Control", "no-cache", false);
if (type === 'form') { if (type === "form") {
response.write(createIframedFormTest(schemeFrom, schemeTo, policy)); response.write(createIframedFormTest(schemeFrom, schemeTo, policy));
} else if (type === 'window.location') { } else if (type === "window.location") {
response.write(createIframedWindowLocationTest( response.write(
schemeFrom, schemeTo, policy)); createIframedWindowLocationTest(schemeFrom, schemeTo, policy)
);
} }
} } else if (action === "test") {
else if (action === 'test') {
// ?action=test&scheme=http-to-https&policy=origin&type=img // ?action=test&scheme=http-to-https&policy=origin&type=img
var scheme = params[1].split('=')[1]; var scheme = params[1].split("=")[1];
var policy = params[2].split('=')[1]; var policy = params[2].split("=")[1];
var type = params[3].split('=')[1]; var type = params[3].split("=")[1];
var result = getSharedState(sharedKey); var result = getSharedState(sharedKey);
if (result === '') { if (result === "") {
result = {}; result = {};
} else { } else {
result = JSON.parse(result); result = JSON.parse(result);
@@ -250,42 +352,43 @@ function handleRequest(request, response) {
result[type][scheme] = {}; result[type][scheme] = {};
} }
if (request.hasHeader('Referer')) { if (request.hasHeader("Referer")) {
result[type][scheme][policy] = request.getHeader('Referer'); result[type][scheme][policy] = request.getHeader("Referer");
} else { } else {
result[type][scheme][policy] = ''; result[type][scheme][policy] = "";
} }
setSharedState(sharedKey, JSON.stringify(result)); setSharedState(sharedKey, JSON.stringify(result));
if (type === 'link') { if (type === "link") {
var loc = 'https://example.com/tests/dom/base/test/file_bug704320_redirect.html'; var loc =
response.setStatusLine('1.1', 302, 'Found'); "https://example.com/tests/dom/base/test/file_bug704320_redirect.html";
response.setHeader('Location', loc, false); response.setStatusLine("1.1", 302, "Found");
response.setHeader("Location", loc, false);
} }
if (type === 'window.open') { if (type === "window.open") {
response.setHeader('Cache-Control', 'no-cache', false); response.setHeader("Cache-Control", "no-cache", false);
response.setHeader('Content-Type', 'text/html', false); response.setHeader("Content-Type", "text/html", false);
response.write('<html><body><script>' response.write(
+ 'window.opener.postMessage("window.open", "*");' "<html><body><script>" +
+ '</script></body></html>'); 'window.opener.postMessage("window.open", "*");' +
"</script></body></html>"
);
} }
} } else if (action === "get-test-results") {
else if (action === 'get-test-results') {
// ?action=get-result // ?action=get-result
response.setHeader('Cache-Control', 'no-cache', false); response.setHeader("Cache-Control", "no-cache", false);
response.setHeader('Content-Type', 'text/plain', false); response.setHeader("Content-Type", "text/plain", false);
response.write(getSharedState(sharedKey)); response.write(getSharedState(sharedKey));
} } else if (action === "generate-policy-test") {
else if (action === 'generate-policy-test') {
// ?action=generate-policy-test&policy=b64-encoded-string // ?action=generate-policy-test&policy=b64-encoded-string
response.setHeader('Cache-Control', 'no-cache', false); response.setHeader("Cache-Control", "no-cache", false);
response.setHeader('Content-Type', 'text/html', false); response.setHeader("Content-Type", "text/html", false);
var policy = unescape(params[1].split('=')[1]); var policy = unescape(params[1].split("=")[1]);
var optionalEarlierPolicy = ''; var optionalEarlierPolicy = "";
if (params[2]) { if (params[2]) {
optionalEarlierPolicy = params[2].split('=')[1]; optionalEarlierPolicy = params[2].split("=")[1];
} }
response.write(createPolicyTest(policy, optionalEarlierPolicy)); response.write(createPolicyTest(policy, optionalEarlierPolicy));

View File

@@ -1,17 +1,20 @@
// Handle counting loads for bug 704320. // Handle counting loads for bug 704320.
const SHARED_KEY = "bug704320_counter"; const SHARED_KEY = "bug704320_counter";
const DEFAULT_STATE = {'css': {'count': 0, 'referrers': []}, const DEFAULT_STATE = {
'img': {'count': 0, 'referrers': []}, css: { count: 0, referrers: [] },
'js': {'count': 0, 'referrers': []}}; img: { count: 0, referrers: [] },
const TYPE_MAP = {'css': 'text/css', js: { count: 0, referrers: [] },
'js': 'application/javascript', };
'img': 'image/png', const TYPE_MAP = {
'html': 'text/html'}; css: "text/css",
js: "application/javascript",
img: "image/png",
html: "text/html",
};
// Writes an image to the response // Writes an image to the response
function WriteOutImage(response) function WriteOutImage(response) {
{
var file = Components.classes["@mozilla.org/file/directory_service;1"] var file = Components.classes["@mozilla.org/file/directory_service;1"]
.getService(Components.interfaces.nsIProperties) .getService(Components.interfaces.nsIProperties)
.get("CurWorkD", Components.interfaces.nsIFile); .get("CurWorkD", Components.interfaces.nsIFile);
@@ -20,25 +23,25 @@ function WriteOutImage(response)
file.append("image"); file.append("image");
file.append("test"); file.append("test");
file.append("mochitest"); file.append("mochitest");
file.append('blue.png'); file.append("blue.png");
var fileStream = Components.classes['@mozilla.org/network/file-input-stream;1'] var fileStream = Components.classes[
.createInstance(Components.interfaces.nsIFileInputStream); "@mozilla.org/network/file-input-stream;1"
].createInstance(Components.interfaces.nsIFileInputStream);
fileStream.init(file, 1, 0, false); fileStream.init(file, 1, 0, false);
response.bodyOutputStream.writeFrom(fileStream, fileStream.available()); response.bodyOutputStream.writeFrom(fileStream, fileStream.available());
} }
function handleRequest(request, response) function handleRequest(request, response) {
{
var query = {}; var query = {};
request.queryString.split('&').forEach(function (val) { request.queryString.split("&").forEach(function(val) {
var [name, value] = val.split('='); var [name, value] = val.split("=");
query[name] = unescape(value); query[name] = unescape(value);
}); });
var referrerLevel = "none"; var referrerLevel = "none";
if (request.hasHeader('Referer')) { if (request.hasHeader("Referer")) {
let referrer = request.getHeader('Referer'); let referrer = request.getHeader("Referer");
if (referrer.indexOf("bug704320") > 0) { if (referrer.indexOf("bug704320") > 0) {
referrerLevel = "full"; referrerLevel = "full";
} else if (referrer == "http://mochi.test:8888/") { } else if (referrer == "http://mochi.test:8888/") {
@@ -47,7 +50,7 @@ function handleRequest(request, response)
} }
var state = getSharedState(SHARED_KEY); var state = getSharedState(SHARED_KEY);
if (state === '') { if (state === "") {
state = DEFAULT_STATE; state = DEFAULT_STATE;
} else { } else {
state = JSON.parse(state); state = JSON.parse(state);
@@ -55,7 +58,6 @@ function handleRequest(request, response)
response.setStatusLine(request.httpVersion, 200, "OK"); response.setStatusLine(request.httpVersion, 200, "OK");
//avoid confusing cache behaviors //avoid confusing cache behaviors
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
@@ -73,20 +75,20 @@ function handleRequest(request, response)
return; return;
} }
if ('type' in query) { if ("type" in query) {
state[query.type].count++; state[query.type].count++;
response.setHeader("Content-Type", TYPE_MAP[query.type], false); response.setHeader("Content-Type", TYPE_MAP[query.type], false);
if (state[query.type].referrers.indexOf(referrerLevel) < 0) { if (state[query.type].referrers.indexOf(referrerLevel) < 0) {
state[query.type].referrers.push(referrerLevel); state[query.type].referrers.push(referrerLevel);
} }
if (query.type == 'img') { if (query.type == "img") {
WriteOutImage(response); WriteOutImage(response);
} }
} }
if ('content' in query) { if ("content" in query) {
response.write(unescape(query['content'])); response.write(unescape(query.content));
} }
setSharedState(SHARED_KEY, JSON.stringify(state)); setSharedState(SHARED_KEY, JSON.stringify(state));

View File

@@ -1,7 +1,9 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setStatusLine(request.httpVersion, 200, "Ok"); response.setStatusLine(request.httpVersion, 200, "Ok");
response.setHeader("X-appended-result", request.getHeader("X-appended-to-this")); response.setHeader(
"X-appended-result",
request.getHeader("X-appended-to-this")
);
response.setHeader("X-Accept-Result", request.getHeader("Accept")); response.setHeader("X-Accept-Result", request.getHeader("Accept"));
response.write(""); response.write("");
} }

View File

@@ -2,7 +2,8 @@ function handleRequest(request, response) {
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
var referer = request.hasHeader("Referer") ? request.getHeader("Referer") var referer = request.hasHeader("Referer")
? request.getHeader("Referer")
: ""; : "";
response.write("Referer: " + referer); response.write("Referer: " + referer);
} }

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
let [status, statusText, encodedBody] = request.queryString.split("&"); let [status, statusText, encodedBody] = request.queryString.split("&");
let body = decodeURIComponent(encodedBody); let body = decodeURIComponent(encodedBody);
response.setStatusLine(request.httpVersion, status, statusText); response.setStatusLine(request.httpVersion, status, statusText);

View File

@@ -1,10 +1,18 @@
// this will take strings_to_send.length*500 ms = 5 sec // this will take strings_to_send.length*500 ms = 5 sec
var timer = null; var timer = null;
var strings_to_send = ["retry:999999999\ndata\r\n\nda", "ta", ":", "de", "layed1\n\n", var strings_to_send = [
"retry:999999999\ndata\r\n\nda",
"ta",
":",
"de",
"layed1\n\n",
"", "",
"", "",
"data:delayed2\n\n", "", ""]; "data:delayed2\n\n",
"",
"",
];
var resp = null; var resp = null;
function sendNextString() { function sendNextString() {
@@ -29,7 +37,7 @@ function handleRequest(request, response) {
var bytes = strings_to_send.reduce((len, s) => len + s.length, 0); var bytes = strings_to_send.reduce((len, s) => len + s.length, 0);
response.seizePower(); response.seizePower();
response.write("HTTP/1.1 200 OK\r\n") response.write("HTTP/1.1 200 OK\r\n");
response.write(`Content-Length: ${bytes}\r\n`); response.write(`Content-Length: ${bytes}\r\n`);
response.write("Content-Type: text/event-stream; charset=utf-8\r\n"); response.write("Content-Type: text/event-stream; charset=utf-8\r\n");
response.write("Cache-Control: no-cache, must-revalidate\r\n"); response.write("Cache-Control: no-cache, must-revalidate\r\n");
@@ -37,6 +45,12 @@ function handleRequest(request, response) {
resp = response; resp = response;
timer = Components.classes["@mozilla.org/timer;1"].createInstance(Components.interfaces.nsITimer); timer = Components.classes["@mozilla.org/timer;1"].createInstance(
timer.initWithCallback(sendNextString, 500, Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); Components.interfaces.nsITimer
);
timer.initWithCallback(
sendNextString,
500,
Components.interfaces.nsITimer.TYPE_REPEATING_SLACK
);
} }

View File

@@ -1,7 +1,9 @@
const CC = Components.Constructor; const CC = Components.Constructor;
const BinaryInputStream = CC("@mozilla.org/binaryinputstream;1", const BinaryInputStream = CC(
"@mozilla.org/binaryinputstream;1",
"nsIBinaryInputStream", "nsIBinaryInputStream",
"setInputStream"); "setInputStream"
);
function utf8decode(s) { function utf8decode(s) {
return decodeURIComponent(escape(s)); return decodeURIComponent(escape(s));
@@ -23,34 +25,45 @@ function handleRequest(request, response) {
if (request.method == "POST") { if (request.method == "POST") {
var contentTypeParams = {}; var contentTypeParams = {};
request.getHeader("Content-Type").split(/\s*\;\s*/).forEach(function(s) { request
if (s.indexOf('=') >= 0) { .getHeader("Content-Type")
let [name, value] = s.split('='); .split(/\s*\;\s*/)
.forEach(function(s) {
if (s.indexOf("=") >= 0) {
let [name, value] = s.split("=");
contentTypeParams[name] = value; contentTypeParams[name] = value;
} } else {
else { contentTypeParams[""] = s;
contentTypeParams[''] = s;
} }
}); });
if (contentTypeParams[''] == "multipart/form-data" && if (
request.queryString == "") { contentTypeParams[""] == "multipart/form-data" &&
requestBody.split("--" + contentTypeParams.boundary).slice(1, -1).forEach(function (s) { request.queryString == ""
) {
requestBody
.split("--" + contentTypeParams.boundary)
.slice(1, -1)
.forEach(function(s) {
let headers = {}; let headers = {};
let headerEnd = s.indexOf("\r\n\r\n"); let headerEnd = s.indexOf("\r\n\r\n");
s.substr(2, headerEnd-2).split("\r\n").forEach(function(s) { s.substr(2, headerEnd - 2)
.split("\r\n")
.forEach(function(s) {
// We're assuming UTF8 for now // We're assuming UTF8 for now
let [name, value] = s.split(': '); let [name, value] = s.split(": ");
headers[name] = utf8decode(value); headers[name] = utf8decode(value);
}); });
let body = s.substring(headerEnd + 4, s.length - 2); let body = s.substring(headerEnd + 4, s.length - 2);
if (!headers["Content-Type"] || headers["Content-Type"] == "text/plain") { if (
!headers["Content-Type"] ||
headers["Content-Type"] == "text/plain"
) {
// We're assuming UTF8 for now // We're assuming UTF8 for now
body = utf8decode(body); body = utf8decode(body);
} }
result.push({ headers: headers, body: body}); result.push({ headers, body });
}); });
} }
} }

View File

@@ -1,90 +1,92 @@
// Test server for bug 1268962 // Test server for bug 1268962
'use strict'; "use strict";
Components.utils.importGlobalProperties(["URLSearchParams"]); Components.utils.importGlobalProperties(["URLSearchParams"]);
const HTTPStatus = new Map([ const HTTPStatus = new Map([
[100, 'Continue'], [100, "Continue"],
[101, 'Switching Protocol'], [101, "Switching Protocol"],
[200, 'OK'], [200, "OK"],
[201, 'Created'], [201, "Created"],
[202, 'Accepted'], [202, "Accepted"],
[203, 'Non-Authoritative Information'], [203, "Non-Authoritative Information"],
[204, 'No Content'], [204, "No Content"],
[205, 'Reset Content'], [205, "Reset Content"],
[206, 'Partial Content'], [206, "Partial Content"],
[300, 'Multiple Choice'], [300, "Multiple Choice"],
[301, 'Moved Permanently'], [301, "Moved Permanently"],
[302, 'Found'], [302, "Found"],
[303, 'See Other'], [303, "See Other"],
[304, 'Not Modified'], [304, "Not Modified"],
[305, 'Use Proxy'], [305, "Use Proxy"],
[306, 'unused'], [306, "unused"],
[307, 'Temporary Redirect'], [307, "Temporary Redirect"],
[308, 'Permanent Redirect'], [308, "Permanent Redirect"],
[400, 'Bad Request'], [400, "Bad Request"],
[401, 'Unauthorized'], [401, "Unauthorized"],
[402, 'Payment Required'], [402, "Payment Required"],
[403, 'Forbidden'], [403, "Forbidden"],
[404, 'Not Found'], [404, "Not Found"],
[405, 'Method Not Allowed'], [405, "Method Not Allowed"],
[406, 'Not Acceptable'], [406, "Not Acceptable"],
[407, 'Proxy Authentication Required'], [407, "Proxy Authentication Required"],
[408, 'Request Timeout'], [408, "Request Timeout"],
[409, 'Conflict'], [409, "Conflict"],
[410, 'Gone'], [410, "Gone"],
[411, 'Length Required'], [411, "Length Required"],
[412, 'Precondition Failed'], [412, "Precondition Failed"],
[413, 'Request Entity Too Large'], [413, "Request Entity Too Large"],
[414, 'Request-URI Too Long'], [414, "Request-URI Too Long"],
[415, 'Unsupported Media Type'], [415, "Unsupported Media Type"],
[416, 'Requested Range Not Satisfiable'], [416, "Requested Range Not Satisfiable"],
[417, 'Expectation Failed'], [417, "Expectation Failed"],
[500, 'Internal Server Error'], [500, "Internal Server Error"],
[501, 'Not Implemented'], [501, "Not Implemented"],
[502, 'Bad Gateway'], [502, "Bad Gateway"],
[503, 'Service Unavailable'], [503, "Service Unavailable"],
[504, 'Gateway Timeout'], [504, "Gateway Timeout"],
[505, 'HTTP Version Not Supported'] [505, "HTTP Version Not Supported"],
]); ]);
const SAME_ORIGIN = 'http://mochi.test:8888/tests/dom/base/test/file_bug1268962.sjs'; const SAME_ORIGIN =
const CROSS_ORIGIN = 'http://example.com/tests/dom/base/test/file_bug1268962.sjs'; "http://mochi.test:8888/tests/dom/base/test/file_bug1268962.sjs";
const CROSS_ORIGIN =
"http://example.com/tests/dom/base/test/file_bug1268962.sjs";
function handleRequest(request, response) { function handleRequest(request, response) {
const queryMap = new URLSearchParams(request.queryString); const queryMap = new URLSearchParams(request.queryString);
// Check redirection before everything else. // Check redirection before everything else.
if (queryMap.has('redirect')) { if (queryMap.has("redirect")) {
let redirect = queryMap.get('redirect'); let redirect = queryMap.get("redirect");
let location; let location;
if (redirect == 'sameorigin') { if (redirect == "sameorigin") {
location = SAME_ORIGIN; location = SAME_ORIGIN;
} else if (redirect == 'crossorigin') { } else if (redirect == "crossorigin") {
location = CROSS_ORIGIN; location = CROSS_ORIGIN;
} }
if (location) { if (location) {
// Use HTTP 302 redirection. // Use HTTP 302 redirection.
response.setStatusLine('1.1', 302, HTTPStatus.get(302)); response.setStatusLine("1.1", 302, HTTPStatus.get(302));
// Forward query strings except the redirect option. // Forward query strings except the redirect option.
queryMap.delete('redirect'); queryMap.delete("redirect");
response.setHeader('Location', location + '?' + queryMap.toString()); response.setHeader("Location", location + "?" + queryMap.toString());
return; return;
} }
} }
if (queryMap.has('statusCode')) { if (queryMap.has("statusCode")) {
let statusCode = parseInt(queryMap.get('statusCode')); let statusCode = parseInt(queryMap.get("statusCode"));
let statusText = HTTPStatus.get(statusCode); let statusText = HTTPStatus.get(statusCode);
response.setStatusLine('1.1', statusCode, statusText); response.setStatusLine("1.1", statusCode, statusText);
} }
if (queryMap.has('cacheControl')) { if (queryMap.has("cacheControl")) {
let cacheControl = queryMap.get('cacheControl'); let cacheControl = queryMap.get("cacheControl");
response.setHeader('Cache-Control', cacheControl); response.setHeader("Cache-Control", cacheControl);
} }
if (queryMap.has('allowOrigin')) { if (queryMap.has("allowOrigin")) {
let allowOrigin = queryMap.get('allowOrigin'); let allowOrigin = queryMap.get("allowOrigin");
response.setHeader('Access-Control-Allow-Origin', allowOrigin); response.setHeader("Access-Control-Allow-Origin", allowOrigin);
} }
} }

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.write(decodeURIComponent(request.queryString)); response.write(decodeURIComponent(request.queryString));
} }

View File

@@ -5,19 +5,18 @@ function handleRequest(request, response) {
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
response.write( response.write(
'<!DOCTYPE html>' + "<!DOCTYPE html>" +
'<div></div>' + "<div></div>" +
'<script>' + "<script>" +
'function doWrite() {' + "function doWrite() {" +
' document.write("<p></p>");' + ' document.write("<p></p>");' +
' parent.done();' + " parent.done();" +
' document.close();' + " document.close();" +
'}' + "}" +
'setTimeout(doWrite, 0);' + "setTimeout(doWrite, 0);" +
'</script>' "</script>"
); );
response.bodyOutputStream.flush(); response.bodyOutputStream.flush();
// leave the stream open // leave the stream open
} }

View File

@@ -5,22 +5,28 @@ const nsITimer = Components.interfaces.nsITimer;
function attemptUnblock(s) { function attemptUnblock(s) {
try { try {
let blockedResponse = null; let blockedResponse = null;
getObjectState("bug503481_" + s, function(x) {blockedResponse = x.wrappedJSObject.r}); getObjectState("bug503481_" + s, function(x) {
blockedResponse = x.wrappedJSObject.r;
});
blockedResponse.finish(); blockedResponse.finish();
setObjectState("bug503481_" + s, null); setObjectState("bug503481_" + s, null);
} catch (e) { } catch (e) {
dump("unable to unblock " + s + "retrying in half a second\n"); dump("unable to unblock " + s + "retrying in half a second\n");
timer = Components.classes["@mozilla.org/timer;1"] timer = Components.classes["@mozilla.org/timer;1"].createInstance(nsITimer);
.createInstance(nsITimer); timer.initWithCallback(
timer.initWithCallback(function () { attemptUnblock(s) }, 500, nsITimer.TYPE_ONE_SHOT); function() {
attemptUnblock(s);
},
500,
nsITimer.TYPE_ONE_SHOT
);
} }
} }
function handleRequest(request, response) function handleRequest(request, response) {
{
var query = {}; var query = {};
request.queryString.split('&').forEach(function (val) { request.queryString.split("&").forEach(function(val) {
var [name, value] = val.split('='); var [name, value] = val.split("=");
query[name] = unescape(value); query[name] = unescape(value);
}); });
@@ -32,7 +38,12 @@ function handleRequest(request, response)
if (query.blockOn) { if (query.blockOn) {
response.processAsync(); response.processAsync();
x = { r: response, QueryInterface: function(iid) { return this } }; x = {
r: response,
QueryInterface(iid) {
return this;
},
};
x.wrappedJSObject = x; x.wrappedJSObject = x;
setObjectState("bug503481_" + query.blockOn, x); setObjectState("bug503481_" + query.blockOn, x);
} }

View File

@@ -1,6 +1,5 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
// Echos the referrer back to the requester. // Echos the referrer back to the requester.
response.setHeader('Content-Type', 'text/plain', false); response.setHeader("Content-Type", "text/plain", false);
response.write(request.getHeader('Referer')); response.write(request.getHeader("Referer"));
} }

View File

@@ -1,15 +1,19 @@
var timer; var timer;
function handleRequest(request, response) function handleRequest(request, response) {
{
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.write("Responded"); response.write("Responded");
response.processAsync(); response.processAsync();
timer = Components.classes["@mozilla.org/timer;1"] timer = Components.classes["@mozilla.org/timer;1"].createInstance(
.createInstance(Components.interfaces.nsITimer); Components.interfaces.nsITimer
timer.initWithCallback(function() { );
timer.initWithCallback(
function() {
response.finish(); response.finish();
// 50ms certainly be enough for one refresh driver firing to happen! // 50ms certainly be enough for one refresh driver firing to happen!
}, 50, Components.interfaces.nsITimer.TYPE_ONE_SHOT); },
50,
Components.interfaces.nsITimer.TYPE_ONE_SHOT
);
} }

View File

@@ -1,5 +1,4 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
response.processAsync(); response.processAsync();
response.setHeader("Content-Type", "text/plain", false); response.setHeader("Content-Type", "text/plain", false);
response.setHeader("X-Frame-Options", "DENY", false); response.setHeader("X-Frame-Options", "DENY", false);

View File

@@ -1,8 +1,6 @@
function handleRequest(request, response) function handleRequest(request, response) {
{
if (request.hasHeader("User-Agent")) { if (request.hasHeader("User-Agent")) {
response.setHeader("Result-User-Agent", response.setHeader("Result-User-Agent", request.getHeader("User-Agent"));
request.getHeader("User-Agent"));
} }
response.write(""); response.write("");
} }

View File

@@ -1,47 +1,68 @@
function handleRequest(request, response) function handleRequest(request, response) {
{ if (
if ((request.queryString == "test=user1_xhr" && (request.queryString == "test=user1_xhr" &&
request.hasHeader("Authorization") && request.hasHeader("Authorization") &&
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=") || request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=") ||
(request.queryString == "test=user1_evtsrc" && (request.queryString == "test=user1_evtsrc" &&
request.hasHeader("Authorization") && request.hasHeader("Authorization") &&
request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=")) { request.getHeader("Authorization") == "Basic dXNlciAxOnBhc3N3b3JkIDE=")
) {
response.setStatusLine(null, 200, "OK"); response.setStatusLine(null, 200, "OK");
response.setHeader("Content-Type", "text/event-stream", false); response.setHeader("Content-Type", "text/event-stream", false);
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false); response.setHeader(
"Access-Control-Allow-Origin",
"http://mochi.test:8888",
false
);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);
response.setHeader("Cache-Control", "no-cache, must-revalidate", false); response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
if (request.queryString == "test=user1_xhr") { if (request.queryString == "test=user1_xhr") {
response.setHeader("Set-Cookie", "test=5c", false); response.setHeader("Set-Cookie", "test=5c", false);
} }
response.write("event: message\ndata: 1\n\n"); response.write("event: message\ndata: 1\n\n");
} else if ((request.queryString == "test=user2_xhr" && } else if (
(request.queryString == "test=user2_xhr" &&
request.hasHeader("Authorization") && request.hasHeader("Authorization") &&
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=") || request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=") ||
(request.queryString == "test=user2_evtsrc" && (request.queryString == "test=user2_evtsrc" &&
request.hasHeader("Authorization") && request.hasHeader("Authorization") &&
request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=" && request.getHeader("Authorization") == "Basic dXNlciAyOnBhc3N3b3JkIDI=" &&
request.hasHeader("Cookie") && request.hasHeader("Cookie") &&
request.getHeader("Cookie") == "test=5d")) { request.getHeader("Cookie") == "test=5d")
) {
response.setStatusLine(null, 200, "OK"); response.setStatusLine(null, 200, "OK");
response.setHeader("Content-Type", "text/event-stream", false); response.setHeader("Content-Type", "text/event-stream", false);
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false); response.setHeader(
"Access-Control-Allow-Origin",
"http://mochi.test:8888",
false
);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);
response.setHeader("Cache-Control", "no-cache, must-revalidate", false); response.setHeader("Cache-Control", "no-cache, must-revalidate", false);
if (request.queryString == "test=user2_xhr") { if (request.queryString == "test=user2_xhr") {
response.setHeader("Set-Cookie", "test=5d", false); response.setHeader("Set-Cookie", "test=5d", false);
} }
response.write("event: message\ndata: 1\n\n"); response.write("event: message\ndata: 1\n\n");
} else if (request.queryString == "test=user1_xhr" || } else if (
request.queryString == "test=user2_xhr") { request.queryString == "test=user1_xhr" ||
request.queryString == "test=user2_xhr"
) {
response.setStatusLine(null, 401, "Unauthorized"); response.setStatusLine(null, 401, "Unauthorized");
response.setHeader("WWW-Authenticate", "basic realm=\"restricted\"", false); response.setHeader("WWW-Authenticate", 'basic realm="restricted"', false);
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false); response.setHeader(
"Access-Control-Allow-Origin",
"http://mochi.test:8888",
false
);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);
response.write("Unauthorized"); response.write("Unauthorized");
} else { } else {
response.setStatusLine(null, 403, "Forbidden"); response.setStatusLine(null, 403, "Forbidden");
response.setHeader("Access-Control-Allow-Origin", "http://mochi.test:8888", false); response.setHeader(
"Access-Control-Allow-Origin",
"http://mochi.test:8888",
false
);
response.setHeader("Access-Control-Allow-Credentials", "true", false); response.setHeader("Access-Control-Allow-Credentials", "true", false);
response.write("Forbidden"); response.write("Forbidden");
} }

View File

@@ -1,15 +1,18 @@
// SJS file for X-Frame-Options mochitests // SJS file for X-Frame-Options mochitests
function handleRequest(request, response) function handleRequest(request, response) {
{
var query = {}; var query = {};
var BOUNDARY = "BOUNDARYOMG3984"; var BOUNDARY = "BOUNDARYOMG3984";
request.queryString.split('&').forEach(function (val) { request.queryString.split("&").forEach(function(val) {
var [name, value] = val.split('='); var [name, value] = val.split("=");
query[name] = unescape(value); query[name] = unescape(value);
}); });
if (query['multipart'] == "1") { if (query.multipart == "1") {
response.setHeader("Content-Type", "multipart/x-mixed-replace;boundary=" + BOUNDARY, false); response.setHeader(
"Content-Type",
"multipart/x-mixed-replace;boundary=" + BOUNDARY,
false
);
response.setHeader("Cache-Control", "no-cache", false); response.setHeader("Cache-Control", "no-cache", false);
response.setStatusLine(request.httpVersion, 200, "OK"); response.setStatusLine(request.httpVersion, 200, "OK");
response.write("--" + BOUNDARY + "\r\n"); response.write("--" + BOUNDARY + "\r\n");
@@ -20,45 +23,45 @@ function handleRequest(request, response)
} }
var testHeaders = { var testHeaders = {
"deny": "DENY", deny: "DENY",
"sameorigin": "SAMEORIGIN", sameorigin: "SAMEORIGIN",
"sameorigin2": "SAMEORIGIN, SAMEORIGIN", sameorigin2: "SAMEORIGIN, SAMEORIGIN",
"sameorigin3": "SAMEORIGIN,SAMEORIGIN , SAMEORIGIN", sameorigin3: "SAMEORIGIN,SAMEORIGIN , SAMEORIGIN",
"mixedpolicy": "DENY,SAMEORIGIN", mixedpolicy: "DENY,SAMEORIGIN",
/* added for bug 836132 */ /* added for bug 836132 */
"afa": "ALLOW-FROM http://mochi.test:8888/", afa: "ALLOW-FROM http://mochi.test:8888/",
"afd": "ALLOW-FROM http://example.com/", afd: "ALLOW-FROM http://example.com/",
"afa1": "ALLOW-FROM http://mochi.test:8888", afa1: "ALLOW-FROM http://mochi.test:8888",
"afd1": "ALLOW-FROM:example.com", afd1: "ALLOW-FROM:example.com",
"afd2": "ALLOW-FROM: example.com", afd2: "ALLOW-FROM: example.com",
"afd3": "ALLOW-FROM example.com", afd3: "ALLOW-FROM example.com",
"afd4": "ALLOW-FROM:http://example.com", afd4: "ALLOW-FROM:http://example.com",
"afd5": "ALLOW-FROM: http://example.com", afd5: "ALLOW-FROM: http://example.com",
"afd6": "ALLOW-FROM http://example.com", afd6: "ALLOW-FROM http://example.com",
"afd7": "ALLOW-FROM:mochi.test:8888", afd7: "ALLOW-FROM:mochi.test:8888",
"afd8": "ALLOW-FROM: mochi.test:8888", afd8: "ALLOW-FROM: mochi.test:8888",
"afd9": "ALLOW-FROM:http://mochi.test:8888", afd9: "ALLOW-FROM:http://mochi.test:8888",
"afd10": "ALLOW-FROM: http://mochi.test:8888", afd10: "ALLOW-FROM: http://mochi.test:8888",
"afd11": "ALLOW-FROM mochi.test:8888", afd11: "ALLOW-FROM mochi.test:8888",
"afd12": "ALLOW-FROM", afd12: "ALLOW-FROM",
"afd13": "ALLOW-FROM ", afd13: "ALLOW-FROM ",
"afd14": "ALLOW-FROM:" afd14: "ALLOW-FROM:",
}; };
if (testHeaders.hasOwnProperty(query['xfo'])) { if (testHeaders.hasOwnProperty(query.xfo)) {
response.setHeader("X-Frame-Options", testHeaders[query['xfo']], false); response.setHeader("X-Frame-Options", testHeaders[query.xfo], false);
} }
// from the test harness we'll be checking for the presence of this element // from the test harness we'll be checking for the presence of this element
// to test if the page loaded // to test if the page loaded
response.write("<h1 id=\"test\">" + query["testid"] + "</h1>"); response.write('<h1 id="test">' + query.testid + "</h1>");
if (query['testid'] == "postmessage") { if (query.testid == "postmessage") {
response.write("<script>parent.opener.postMessage('ok', '*');</script>"); response.write("<script>parent.opener.postMessage('ok', '*');</script>");
} }
if (query['multipart'] == "1") { if (query.multipart == "1") {
response.write("\r\n--" + BOUNDARY + "\r\n"); response.write("\r\n--" + BOUNDARY + "\r\n");
} }
} }

Some files were not shown because too many files have changed in this diff Show More