<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/cookies/resources/cookie-utilities.js"></script>
</head>
<body>
<script>
    description("Check that cookies created by JavaScript with max-age or expiry longer than a week get capped to a week.");
    jsTestIsAsync = true;

    if (internals)
        internals.setResourceLoadStatisticsEnabled(true);

    let passedTests = 0;
    function checkThatCookieDoesNotExpireAfter(cookieData, maxAgeInSeconds) {
        let now = new Date();
        let maxExpiryDateInMilliseconds = now.getTime() + (maxAgeInSeconds * 1000);

        if (maxExpiryDateInMilliseconds > cookieData["expires"])
            ++passedTests;
        else
            testFailed("Cookie named " + cookieData["name"] + " expires in more than " + maxAgeInSeconds + " seconds.");
    }

    const twoDaysInSeconds = 2 * 24 * 60 * 60;
    const shortLivedCookieMaxAge = { name : "shortLivedCookieMaxAge", lifetime : "Max-Age=" + twoDaysInSeconds + ";" };
    document.cookie = shortLivedCookieMaxAge.name + "=foobar; " + shortLivedCookieMaxAge.lifetime + " path=/";

    const twoDaysAsExpiresDate = createExpiresDateFromMaxAge(twoDaysInSeconds);
    const shortLivedCookieExpires = { name : "shortLivedCookieExpires", lifetime : "Expires=" + twoDaysAsExpiresDate + ";" };
    document.cookie = shortLivedCookieExpires.name + "=foobar; " + shortLivedCookieExpires.lifetime + " path=/";

    const oneWeekInSeconds = 7 * 24 * 60 * 60;
    const twoWeeksInSeconds = 2 * oneWeekInSeconds;
    const longLivedCookieMaxAge = { name : "longLivedCookieMaxAge", lifetime : "Max-Age=" + twoWeeksInSeconds + ";" };
    document.cookie = longLivedCookieMaxAge.name + "=foobar; " + longLivedCookieMaxAge.lifetime + " path=/";

    const twoWeeksAsExpiresDate = createExpiresDateFromMaxAge(twoWeeksInSeconds);
    const longLivedCookieExpires = { name : "longLivedCookieExpires", lifetime : "Expires=" + twoWeeksAsExpiresDate + ";" };
    document.cookie = longLivedCookieExpires.name + "=foobar; " + longLivedCookieExpires.lifetime + " path=/";

    const overTwoDaysInSeconds = twoDaysInSeconds + 30;
    const overOneWeekInSeconds = oneWeekInSeconds + 30;
    if (internals) {
        let cookies = internals.getCookies();
        if (!cookies.length)
            testFailed("No cookies found.");
        for (let cookie of cookies) {
            switch (cookie.name) {
                case shortLivedCookieMaxAge.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoDaysInSeconds);
                    break;
                case shortLivedCookieExpires.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overTwoDaysInSeconds);
                    break;
                case longLivedCookieMaxAge.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overOneWeekInSeconds);
                    break;
                case longLivedCookieExpires.name:
                    checkThatCookieDoesNotExpireAfter(cookie, overOneWeekInSeconds);
                    break;
            }
        }

        resetCookiesForCurrentOrigin();

        if (passedTests === 4) {
            testPassed("The two short-lived cookies don't expire after more than " + overTwoDaysInSeconds + " seconds.");
            testPassed("The two long-lived cookies don't expire after more than " + overOneWeekInSeconds + " seconds.");
        } else
            testFailed("At least one cookie's expiry attribute was beyond the test thresholds.");
    } else
        testFailed("No internals object.");

    if (internals)
        internals.setResourceLoadStatisticsEnabled(false);

    finishJSTest();
</script>
</body>
</html>
