blob: 1bf021f557eb64825ee1aef1ed1c9e0165b4ca09 [file] [log] [blame]
<!DOCTYPE html>
<html>
<head>
<script src="/js-test-resources/js-test.js"></script>
</head>
<body onload="doTest()">
<div id="description"></div>
<div id="console"></div>
</body>
<script>
description(`
Based on RFC 6265 Section-5.4:
2. The user agent SHOULD sort the cookie-list in the following order:
a) Cookies with longer paths are listed before cookies with shorter paths.
b) Among cookies that have equal-length path fields, cookies with earlier
creation-times are listed before cookies with later creation-times.
`);
window.jsTestIsAsync = true;
function doTest() {
const resultUrl = 'resources/cookie-with-multiple-level-path.php';
setCookie('foo', 'bar', '/')
.then(() => setCookie('foo', 'buz', '/cookies/resources')) // override foo
.then(() => fetch(resultUrl))
.then(response => response.text())
.then(result => {
// a. foo=bar (created=T, path=/)
// b. foo=buz (created=T, path=/cookies/resources)
// then order must be: b => a
shouldBe(() => result, "'foo=buz; foo=bar'");
finishJSTest();
})
.catch((e) => {
testFailed("Exception caught");
console.log(e);
finishJSTest();
});
}
function setCookie(name, value, path) {
const url = '/cookies/resources/setCookies.cgi';
const cookie = prepareCookieHeader(name, value, path, 60);
return fetch(url, {headers: {"Set-Cookie": cookie}});
}
function prepareCookieHeader(name, value, path, maxAge = 30) {
const entries = [[name, value]];
if (path)
entries.push(['path', path]);
if (maxAge) {
const expires = new Date(Date.now() + maxAge * 1000);
entries.push(['expires', expires.toUTCString()]);
entries.push(['max-age', maxAge]);
} else
entries.push(['max-age', 0]);
return entries
.map(([name, value]) => name + '=' + value)
.join('; ');
}
function sleep(timeout) {
return new Promise((resolve) => {
setTimeout(resolve, timeout);
});
}
</script>
</html>