<!DOCTYPE html>
<html>
<head>
    <script src="/cookies/resources/cookie-utilities.js"></script>
</head>
<body onload="setTimeout('run()', 0)">
<div id="description">Tests setting all of a site's cookies to SameSite=strict.</div>
<br>
<div id="output"></div>
<br>
<script>
    testRunner.waitUntilDone();
    testRunner.dumpAsText();

    function sortStringArray(a, b) {
        a = a.toLowerCase();
        b = b.toLowerCase();

        return a > b ? 1 : b > a ? -1 : 0;
    }

    function addLinebreakToOutput() {
        let element = document.createElement("br");
        output.appendChild(element);
    }

    function addOutput(message) {
        let element = document.createElement("div");
        element.innerText = message;
        output.appendChild(element);
    }

    function stringifyCookieProperties(cookie, isBefore) {
        let cookieString = "'" + cookie.name + (isBefore ? "' 1 Before Change --" : "' 2 After Change ---");
        if (cookie.domain)
            cookieString += " domain: '" + cookie.domain + "'";
        if (cookie.path)
            cookieString += " path: '" + cookie.path + "'";
        if (cookie.expires)
            cookieString += " expiry set";
        if (cookie.isHttpOnly)
            cookieString += " isHttpOnly: '" + cookie.isHttpOnly + "'";
        if (cookie.isSecure)
            cookieString += " isSecure: '" + cookie.isSecure + "'";
        if (cookie.isSession)
            cookieString += " isSession: '" + cookie.isSession + "'";
        if (cookie.isSameSiteNone)
            cookieString += " isSameSiteNone: '" + cookie.isSameSiteNone + "'";
        if (cookie.isSameSiteLax)
            cookieString += " isSameSiteLax: '" + cookie.isSameSiteLax + "'";
        if (cookie.isSameSiteStrict)
            cookieString += " isSameSiteStrict: '" + cookie.isSameSiteStrict + "'";
        return cookieString;
    }

    let cookiesBeforeChange;
    let cookiesAfterChange;

    function checkCookies() {
        if (!cookiesBeforeChange.length) {
            addOutput("FAIL: No cookies found before change.");
            testRunner.notifyDone();
            return;
        }

        if (!cookiesBeforeChange.length || !cookiesAfterChange.length) {
            addOutput("FAIL: No cookies found after change.");
            testRunner.notifyDone();
            return;
        }

        if (cookiesBeforeChange.length !== cookiesAfterChange.length) {
            addOutput("FAIL: Not the same amount of cookies before and after change.");
            testRunner.notifyDone();
            return;
        }

        let unsortedTestPassedMessages = [];
        for (let i = 0; i < cookiesBeforeChange.length; ++i) {
            unsortedTestPassedMessages.push(stringifyCookieProperties(cookiesBeforeChange[i], true));
            unsortedTestPassedMessages.push(stringifyCookieProperties(cookiesAfterChange[i], false));
        }

        let sortedTestPassedMessages = unsortedTestPassedMessages.sort(sortStringArray);
        let row = 1;
        for (let testPassedMessage of sortedTestPassedMessages) {
            addOutput(testPassedMessage);
            if (row % 2 === 0)
                addLinebreakToOutput();
            ++row;
        }
    }

    function run() {
        fetch("resources/set-all-kinds-of-cookies.php?dummy=" + Math.random())
            .then(() => {
                document.cookie = "clientSideCookie=1";
                cookiesBeforeChange = internals.getCookies();
                testRunner.statisticsSetToSameSiteStrictCookies("http://127.0.0.1:8000", function () {
                    cookiesAfterChange = internals.getCookies();
                    checkCookies();
                    testRunner.notifyDone();
                });
            })
    }
</script>
</body>
</html>
