Source code

Revision control

Copy as Markdown

Other Tools

const kOriginTypeDescriptions = {
true: "same-origin",
false: "cross-origin",
}
const kRefreshOptionsByDescription = {
"meta refresh": "resources/refresh-policy.sub.html",
"header refresh": "resources/refresh-policy.py",
};
const kExpectEmptyString = "the empty string";
const kExpectOrigin = "origin";
const kExpectFullURL = "full url";
function referrerPolicyExpectationValue(aExpected, aFrame) {
let expectedReferrer;
switch (aExpected) {
case kExpectEmptyString:
expectedReferrer = "";
break;
case kExpectOrigin:
expectedReferrer = new URL(aFrame.src).origin + "/";
break;
case kExpectFullURL:
expectedReferrer = aFrame.src;
break;
default:
throw new Error(`unexpected referrer type ${aExpected}`);
}
return expectedReferrer;
}
function refreshWithPoliciesTest(aExpectedURL, aExpectationsByPolicy) {
const isSameOrigin = location.origin === new URL(aExpectedURL).origin;
Object.entries(aExpectationsByPolicy).forEach(([policy, expected]) =>
Object.entries(kRefreshOptionsByDescription).forEach(([description, refreshFrom]) =>
promise_test(async t => {
const originalPath = refreshFrom + "?" + new URLSearchParams({url: aExpectedURL, policy});
let expectedReferrer = location.href;
let loadCount = 0;
const { promise: frameLoaded, resolve: resolveFrameLoaded } = Promise.withResolvers();
const { promise: messageHandled, resolve: resolveMessageHandled } = Promise.withResolvers();
const frame = document.createElement("iframe");
try {
frame.addEventListener("load", t.step_func(() => {
loadCount++;
try {
if (loadCount === 1) {
assert_equals(frame.contentWindow.location.href, new URL(originalPath, location).href, "original page loads");
assert_equals(frame.contentDocument.referrer, expectedReferrer, "referrer is parent frame");
expectedReferrer = referrerPolicyExpectationValue(expected, frame);
}
} finally {
if (loadCount === 1) {
resolveFrameLoaded();
}
}
}));
addEventListener("message", t.step_func(msg => {
const {referrer, documentReferrer, url} = msg.data;
try {
assert_equals(url, aExpectedURL, "refresh page has expected URL");
assert_equals(referrer, expectedReferrer, "referrer header is previous page");
assert_equals(documentReferrer, expectedReferrer, "document referrer is previous page");
} finally {
resolveMessageHandled();
}
}));
frame.src = originalPath;
document.body.appendChild(frame);
await frameLoaded;
await messageHandled;
} finally {
frame.remove();
t.done();
}
}, `${kOriginTypeDescriptions[isSameOrigin]} ${description} with referrer policy "${policy}" refreshes with ${expected} as referrer`)))
}