Source code

Revision control

Copy as Markdown

Other Tools

/**
* Listen for notifications from the child.
* These are sent in case of error, or when the loads we await have completed.
*/
window.addEventListener("message", function (event) {
if (event.data == "childLoadComplete") {
// all loads happen, continue the test.
advance();
} else if (event.data == "childOverload") {
// too many loads happened in a test frame, abort.
ok(false, "Too many load handlers called in test.");
SimpleTest.finish();
} else if (event.data.indexOf("fail-") == 0) {
// something else failed in the test frame, abort.
ok(false, "Child failed the test with error " + event.data.substr(5));
SimpleTest.finish();
}
});
/**
* helper to perform an XHR.
*/
function doXHR(url, onSuccess, onFail) {
var xhr = new XMLHttpRequest();
xhr.onload = function () {
if (xhr.status == 200) {
onSuccess(xhr);
} else {
onFail(xhr);
}
};
xhr.open("GET", url, true);
xhr.send(null);
}
/**
* This triggers state-resetting on the counter server.
*/
function resetCounter() {
doXHR(
"/tests/dom/base/test/bug704320_counter.sjs?reset",
advance,
function (xhr) {
ok(false, "Need to be able to reset the request counter");
SimpleTest.finish();
}
);
}
/**
* Grabs the results via XHR and passes to checker.
*/
function checkIndividualResults(testname, expected) {
doXHR(
"/tests/dom/base/test/bug704320_counter.sjs?results",
function (xhr) {
var results = JSON.parse(xhr.responseText);
info(xhr.responseText);
ok(
"img" in results,
testname + " test: some image loads required in results object."
);
is(
results.img.count,
2,
testname + " Test: Expected 2 loads for image requests."
);
expected.forEach(function (ref) {
ok(
results.img.referrers.includes(ref),
testname +
" Test: Expected " +
ref +
" referrer policy in test, results were " +
JSON.stringify(results.img.referrers) +
"."
);
});
advance();
},
function (xhr) {
ok(false, "Can't get results from the counter server.");
SimpleTest.finish();
}
);
}
/**
* Grabs the results via XHR and checks them
*/
function checkExpectedGlobalResults(testName) {
var url = "bug704320.sjs?action=get-test-results";
doXHR(
url,
function (xhr) {
var response = JSON.parse(xhr.response);
for (type in response) {
for (scheme in response[type]) {
for (policy in response[type][scheme]) {
var expectedResult =
EXPECTED_RESULTS[type] === undefined
? EXPECTED_RESULTS.default[scheme][policy]
: EXPECTED_RESULTS[type][scheme][policy];
is(
response[type][scheme][policy],
expectedResult,
type + " " + scheme + " " + policy
);
}
}
}
advance(testName);
},
function (xhr) {
ok(false, "Can't get results from the counter server.");
SimpleTest.finish();
}
);
}
var EXPECTED_RESULTS = {
// From docshell/base/nsDocShell.cpp:
// "If the document containing the hyperlink being audited was not retrieved
// over an encrypted connection and its address does not have the same
// origin as "ping URL", send a referrer."
"link-ping": {
// Same-origin
"http-to-http": {
"no-referrer": "",
"unsafe-url": "",
origin: "",
"origin-when-cross-origin": "",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
"http-to-https": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=unsafe-url",
origin: "http://example.com/",
"origin-when-cross-origin": "http://example.com/",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=no-referrer-when-downgrade",
"same-origin": "",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin": "http://example.com/",
},
// Encrypted and not same-origin
"https-to-http": {
"no-referrer": "",
"unsafe-url": "",
origin: "",
"origin-when-cross-origin": "",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
// Encrypted
"https-to-https": {
"no-referrer": "",
"unsafe-url": "",
origin: "",
"origin-when-cross-origin": "",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
},
// form is tested in a 2nd level iframe.
form: {
"http-to-http": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=unsafe-url&type=form",
origin: "http://example.com/",
"origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=origin-when-cross-origin&type=form",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=no-referrer-when-downgrade&type=form",
"same-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=same-origin&type=form",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=strict-origin-when-cross-origin&type=form",
},
"http-to-https": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=unsafe-url&type=form",
origin: "http://example.com/",
"origin-when-cross-origin": "http://example.com/",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=no-referrer-when-downgrade&type=form",
"same-origin": "",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin": "http://example.com/",
},
"https-to-http": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=http&policy=unsafe-url&type=form",
"origin-when-cross-origin": "https://example.com/",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
"https-to-https": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=unsafe-url&type=form",
"origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=origin-when-cross-origin&type=form",
"no-referrer-when-downgrade":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=no-referrer-when-downgrade&type=form",
"same-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=same-origin&type=form",
"strict-origin": "https://example.com/",
"strict-origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=strict-origin-when-cross-origin&type=form",
},
},
// window.location is tested in a 2nd level iframe.
"window.location": {
"http-to-http": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=unsafe-url&type=window.location",
origin: "http://example.com/",
"origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=origin-when-cross-origin&type=window.location",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=no-referrer-when-downgrade&type=window.location",
"same-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=same-origin&type=window.location",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=http&policy=strict-origin-when-cross-origin&type=window.location",
},
"http-to-https": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=unsafe-url&type=window.location",
origin: "http://example.com/",
"origin-when-cross-origin": "http://example.com/",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=http&scheme-to=https&policy=no-referrer-when-downgrade&type=window.location",
"same-origin": "",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin": "http://example.com/",
},
"https-to-http": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=http&policy=unsafe-url&type=window.location",
"origin-when-cross-origin": "https://example.com/",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
"https-to-https": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=unsafe-url&type=window.location",
"origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=origin-when-cross-origin&type=window.location",
"no-referrer-when-downgrade":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=no-referrer-when-downgrade&type=window.location",
"same-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=same-origin&type=window.location",
"strict-origin": "https://example.com/",
"strict-origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-2nd-level-iframe&scheme-from=https&scheme-to=https&policy=strict-origin-when-cross-origin&type=window.location",
},
},
default: {
"http-to-http": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=http&policy=unsafe-url",
origin: "http://example.com/",
"origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=http&policy=origin-when-cross-origin",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=http&policy=no-referrer-when-downgrade",
"same-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=http&policy=same-origin",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=http&policy=strict-origin-when-cross-origin",
},
"http-to-https": {
"no-referrer": "",
"unsafe-url":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=unsafe-url",
origin: "http://example.com/",
"origin-when-cross-origin": "http://example.com/",
"no-referrer-when-downgrade":
"http://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=http&scheme-to=https&policy=no-referrer-when-downgrade",
"same-origin": "",
"strict-origin": "http://example.com/",
"strict-origin-when-cross-origin": "http://example.com/",
},
"https-to-http": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=http&policy=unsafe-url",
"origin-when-cross-origin": "https://example.com/",
"no-referrer-when-downgrade": "",
"same-origin": "",
"strict-origin": "",
"strict-origin-when-cross-origin": "",
},
"https-to-https": {
"no-referrer": "",
"unsafe-url":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=https&policy=unsafe-url",
"origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=https&policy=origin-when-cross-origin",
"no-referrer-when-downgrade":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=https&policy=no-referrer-when-downgrade",
"same-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=https&policy=same-origin",
"strict-origin": "https://example.com/",
"strict-origin-when-cross-origin":
"https://example.com/tests/dom/base/test/bug704320.sjs?action=create-1st-level-iframe&scheme-from=https&scheme-to=https&policy=strict-origin-when-cross-origin",
},
},
};