Source code

Revision control

Copy as Markdown

Other Tools

function getSessionStorageKeys() {
let keys = [];
let txt = '';
for (let i = 0; i < sessionStorage.length; ++i) {
keys.push(sessionStorage.key(i));
}
keys.sort();
keys.forEach((key) => {
if (txt.length) {
txt += ', ';
}
txt += key;
});
return txt;
}
function getNextMessage(channel) {
return new Promise(resolve => {
channel.addEventListener('message', e => {
resolve(e.data);
}, {once: true});
});
}
// session_storage_test() is a utility function for running session storage
// related tests that open a initiator page using window.open().
function session_storage_test(testPath, uid) {
promise_test(async t => {
const testChannel = new PrerenderChannel('test-channel', uid);
t.add_cleanup(() => {
testChannel.close();
});
const gotMessage = getNextMessage(testChannel);
const url = 'resources/' + testPath + '?uid=' + uid;
window.open(url, '_blank', 'noopener');
assert_equals(await gotMessage, 'Done');
}, testPath);
}
// RunSessionStorageTest() is a utility function for running session storage
// related tests that requires coordinated code execution on both the initiator
// page and the prerendering page. The passed |func| function will be called
// with the following arguments:
// - isPrerendering: Whether the |func| is called in the prerendering page.
// - url: The URL of the prerendering page. |func| should call
// startPrerendering(url) when |isPrerendering| is false to start the
// prerendering.
// - channel: A PrerenderChannel which can be used to coordinate the code
// execution on the initiator page and the prerendering page.
// - done: A function that should be called when the test completes
// successfully.
async function RunSessionStorageTest(func, uid) {
const url = new URL(document.URL);
url.searchParams.set('prerendering', '');
const params = new URLSearchParams(location.search);
// The main test page loads the initiator page, then the initiator page will
// prerender itself with the `prerendering` parameter.
const isPrerendering = params.has('prerendering');
const prerenderChannel = new PrerenderChannel('prerender-channel', uid);
const testChannel = new PrerenderChannel('test-channel', uid);
window.addEventListener('pagehide', () => {
prerenderChannel.close();
testChannel.close();
});
try {
await func(isPrerendering, url.toString(), prerenderChannel, () => {
testChannel.postMessage('Done');
})
} catch (e) {
testChannel.postMessage(e.toString());
}
}