| <!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> |