Source code

Revision control

Copy as Markdown

Other Tools

// Delay after fetch start:
// - 0.0 seconds: before BFCache
// - 2.0 seconds: when in BFCache
// - 3.5 seconds: after restored from BFCache
function runTest(urlToFetch, hasCSP, shouldSucceed, description) {
runBfcacheTest({
funcBeforeNavigation: async (urlToFetch, hasCSP) => {
if (hasCSP) {
// Set CSP.
const meta = document.createElement('meta');
meta.setAttribute('http-equiv', 'Content-Security-Policy');
meta.setAttribute('content', "connect-src 'self'");
document.head.appendChild(meta);
}
// Initiate a `fetch()`.
window.fetchPromise = fetch(urlToFetch);
// Wait for 0.5 seconds to receive response headers for the fetch()
// before BFCache, if any.
await new Promise(resolve => setTimeout(resolve, 500));
},
argsBeforeNavigation: [urlToFetch, hasCSP],
funcBeforeBackNavigation: () => {
// Wait for 2 seconds before back navigating to pageA.
return new Promise(resolve => setTimeout(resolve, 2000));
},
funcAfterAssertion: async (pageA, pageB, t) => {
// Wait for fetch() completion and check the result.
const result = pageA.execute_script(
() => window.fetchPromise.then(r => r.text()));
if (shouldSucceed) {
assert_equals(
await result,
'Body',
'Fetch should complete successfully after restored from BFCache');
} else {
await promise_rejects_js(t, TypeError, result,
'Fetch should fail after restored from BFCache');
}
}
}, 'Eligibility (in-flight fetch): ' + description);
}
const url = new URL('../resources/slow.py', location);
const sameOriginUrl = url.href;
const crossSiteUrl = originCrossSite + url.pathname;