70 lines
2.9 KiB
HTML
70 lines
2.9 KiB
HTML
<!doctype html>
|
|
<meta charset="utf-8">
|
|
<title>Same-URL Referrer Policy applied to Refresh</title>
|
|
<link rel="help" href="https://bugzilla.mozilla.org/show_bug.cgi?id=266554">
|
|
<link rel="help" href="https://w3c.github.io/webappsec-referrer-policy/#determine-requests-referrer">
|
|
<link rel="help" href="https://html.spec.whatwg.org/multipage/browsing-the-web.html#populating-a-session-history-entry:concept-request">
|
|
<link rel="author" title="Zach Hoffman" href="mailto:zach@zrhoffman.net">
|
|
<script src="/resources/testharness.js"></script>
|
|
<script src="/resources/testharnessreport.js"></script>
|
|
<script src="./resources/refresh-by-host.js"></script>
|
|
<body>
|
|
<script>
|
|
const expectationsByPolicy = {
|
|
"no-referrer": kExpectEmptyString,
|
|
"no-referrer-when-downgrade": kExpectFullURL,
|
|
"origin": kExpectOrigin,
|
|
"origin-when-cross-origin": kExpectFullURL,
|
|
"same-origin": kExpectFullURL,
|
|
"strict-origin": kExpectOrigin,
|
|
"strict-origin-when-cross-origin": kExpectFullURL,
|
|
"unsafe-url": kExpectFullURL,
|
|
"": kExpectFullURL,
|
|
};
|
|
|
|
refreshWithPoliciesSameURLTest(expectationsByPolicy);
|
|
|
|
function refreshWithPoliciesSameURLTest(aExpectationsByPolicy) {
|
|
Object.entries(aExpectationsByPolicy).forEach(([policy, expected]) =>
|
|
Object.entries(kRefreshOptionsByDescription).forEach(([description, refreshFrom]) => {
|
|
let expectedURL = new URL(refreshFrom, location).href;
|
|
const originalURL = expectedURL + "?" + new URLSearchParams({url: expectedURL, policy});
|
|
let expectedReferrer = location.href;
|
|
|
|
promise_test(async t => {
|
|
let loadCount = 0;
|
|
const { promise: frameLoaded, resolve: resolveFrameLoaded } = 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, originalURL, "original page loads");
|
|
assert_equals(frame.contentDocument.referrer, expectedReferrer, "referrer is parent frame");
|
|
|
|
expectedReferrer = referrerPolicyExpectationValue(expected, frame);
|
|
} else if (loadCount === 2) {
|
|
assert_equals(frame.contentWindow.location.href, expectedURL, "refresh page has expected URL");
|
|
assert_equals(frame.contentDocument.referrer, expectedReferrer, "document referrer is same page");
|
|
}
|
|
} finally {
|
|
if (loadCount === 2) {
|
|
resolveFrameLoaded();
|
|
}
|
|
}
|
|
}));
|
|
|
|
frame.src = originalURL;
|
|
document.body.appendChild(frame);
|
|
|
|
await frameLoaded;
|
|
} finally {
|
|
frame.remove();
|
|
t.done();
|
|
}
|
|
}, `same-URL ${description} with referrer policy "${policy}" refreshes with ${expected} as referrer`);
|
|
}));
|
|
}
|
|
</script>
|