<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/cookies/resources/cookie-utilities.js"></script>
    <script src="resources/util.js"></script>
</head>
<body onload="setTimeout('runTest()', 0)">
<script>
    description("Check that cookies created by JavaScript after a cross-site navigation with link query and fragment get capped to 24 hours.");
    jsTestIsAsync = true;

    function testCookies() {
        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 twelveHoursInSeconds = 12 * 60 * 60;
        const shortLivedCookieMaxAge = { name : "shortLivedCookieMaxAge", lifetime : "Max-Age=" + twelveHoursInSeconds + ";" };
        document.cookie = shortLivedCookieMaxAge.name + "=foobar; " + shortLivedCookieMaxAge.lifetime + " path=/";

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

        const oneDayInSeconds = 2 * twelveHoursInSeconds;
        const twoDaysInSeconds = 2 * oneDayInSeconds;
        const longLivedCookieMaxAge = { name : "longLivedCookieMaxAge", lifetime : "Max-Age=" + twoDaysInSeconds + ";" };
        document.cookie = longLivedCookieMaxAge.name + "=foobar; " + longLivedCookieMaxAge.lifetime + " path=/";

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

        const overTwelveHoursInSeconds = twelveHoursInSeconds + 30;
        const overOneDayInSeconds = oneDayInSeconds + 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, overTwelveHoursInSeconds);
                        break;
                    case shortLivedCookieExpires.name:
                        checkThatCookieDoesNotExpireAfter(cookie, overTwelveHoursInSeconds);
                        break;
                    case longLivedCookieMaxAge.name:
                        checkThatCookieDoesNotExpireAfter(cookie, overOneDayInSeconds);
                        break;
                    case longLivedCookieExpires.name:
                        checkThatCookieDoesNotExpireAfter(cookie, overOneDayInSeconds);
                        break;
                }
            }

            resetCookiesForCurrentOrigin();

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

        setEnableFeature(false, finishJSTest);
    }

    function navigateCrossOrigin() {
        document.location.href = destinationOrigin + "/resourceLoadStatistics/capped-lifetime-for-cookie-set-in-js-with-link-query-and-fragment-from-prevalent-resource.html?link=query#link=fragment";
    }

    const destinationOrigin = "http://localhost:8000";
    const prevalentResourceOrigin = "http://127.0.0.1:8000";
    function runTest() {
        if (document.location.origin === prevalentResourceOrigin) {
            setEnableFeature(true, function () {
                testRunner.setStatisticsPrevalentResource(prevalentResourceOrigin, true, function() {
                    if (!testRunner.isStatisticsPrevalentResource(prevalentResourceOrigin))
                        testFailed("Host did not get set as prevalent resource.");
                    testRunner.statisticsUpdateCookieBlocking(navigateCrossOrigin);
                });

            });
        } else {
            testCookies();
        }
    }
</script>
</body>
</html>
