<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
</head>
<body onload="runTest()">
<script>
    description("Check that only HttpOnly cookies remain if all script-accessible cookies are deleted.");
    jsTestIsAsync = true;

    const httpOnlyCookieName = "http-only-cookie";
    const serverSideCookieName = "server-side-cookie";
    const clientSideCookieName = "client-side-cookie";

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

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

    function checkCookies(isAfterScriptAccessibleDeletion) {
        let unsortedTestPassedMessages = [];
        let cookies = internals.getCookies();
        if (!cookies.length)
            testFailed((isAfterScriptAccessibleDeletion ? "After" : "Before") + " script-accessible deletion: No cookies found.");
        for (let cookie of cookies) {
            switch (cookie.name) {
                case httpOnlyCookieName:
                    unsortedTestPassedMessages.push((isAfterScriptAccessibleDeletion ? "After" : "Before") + " script-accessible deletion: " + (isAfterScriptAccessibleDeletion ? " " : "") + "HttpOnly cookie exists.");
                    break;
                case serverSideCookieName:
                    if (isAfterScriptAccessibleDeletion)
                        testFailed("After script-accessible deletion:  Regular server-side cookie exists.");
                    else
                        unsortedTestPassedMessages.push("Before script-accessible deletion: Regular server-side cookie exists.");
                    break;
                case clientSideCookieName:
                    if (isAfterScriptAccessibleDeletion)
                        testFailed("After script-accessible deletion:  Client-side cookie exists.");
                    else
                        unsortedTestPassedMessages.push("Before script-accessible deletion: Client-side cookie exists.");
                    break;
            }
        }
        let sortedTestPassedMessages = unsortedTestPassedMessages.sort(sortStringArray);
        for (let testPassedMessage of sortedTestPassedMessages)
            testPassed(testPassedMessage);
    }

    async function runTest() {
        if (!testRunner || !internals) {
            testFailed("No testRunner or no internals.");
            return;
        }
        testRunner.setUseITPDatabase(true);
        await fetch("/cookies/resources/set-http-only-cookie.php?cookieName=" + httpOnlyCookieName, { credentials: "same-origin" });
        await fetch("/cookies/resources/setCookies.cgi", { headers: { "Set-Cookie": serverSideCookieName + "=1; path=/;" }, credentials: "same-origin" });
        document.cookie = clientSideCookieName + "=1";
        checkCookies(false);
        testRunner.statisticsDeleteCookiesForHost("http://127.0.0.1", false);
        checkCookies(true);
        testRunner.statisticsDeleteCookiesForHost("http://127.0.0.1", true);
        let cookiesLeft = internals.getCookies().length;
        if (cookiesLeft === 0)
            testPassed("After full deletion:               All cookies are gone.");
        else
            testFailed("After full deletion:              " + cookiesLeft + " cookie(s) left.");
        finishJSTest();
    }
</script>
</body>
</html>
