<html>
<head>
    <script>
        const hashArguments = document.location.hash.substring(1).split(",");
        const userShouldGrantAccess = hashArguments[0] === "userShouldGrantAccess";
        const userShouldBeConsulted = hashArguments[1] === "userShouldBeConsulted";
        const policyShouldGrantAccess = hashArguments[2] === "policyShouldGrantAccess";
        const sameSiteNavigation = hashArguments[3] === "sameSiteNavigation";

        var requestStorageAccessResolved;

        function makeRequestWithUserGesture() {
            var promise = document.requestStorageAccess();
            promise.then(
                function () {
                    requestStorageAccessResolved = true;
                    continueAfterRequestWithUserGesture();
                },
                function () {
                    requestStorageAccessResolved = false;
                    continueAfterRequestWithUserGesture();
                }
            );
        }

        function navigate() {
            if (sameSiteNavigation) {
                document.location.href = "http://localhost:8000/storageAccess/resources/has-storage-access-iframe.html#policyShouldGrantAccess";
            } else {
                document.location.href = "http://127.0.0.1:8000/resourceLoadStatistics/resources/redirect.php?redirectTo=http://localhost:8000/storageAccess/resources/has-storage-access-iframe.html";
            }
        }

        function setCookieAndNavigate() {
            document.cookie = "cookieSetClientSideAfterGrantedStorageAccess=value";
            top.postMessage("document.cookie == " + document.cookie, "http://127.0.0.1:8000");
            setTimeout("navigate()", 200);
        }

        function continueAfterRequestWithUserGesture() {
            var promise = document.hasStorageAccess();
            promise.then(
                function (hasAccess) {
                    if (requestStorageAccessResolved
                        && hasAccess
                        && (userShouldGrantAccess || !userShouldBeConsulted)
                        && policyShouldGrantAccess)
                        top.postMessage("PASS Storage access was granted.", "http://127.0.0.1:8000");
                    else if (!hasAccess
                        && !requestStorageAccessResolved
                        && ((!userShouldGrantAccess && userShouldBeConsulted) || !policyShouldGrantAccess))
                        top.postMessage("PASS Storage access was denied.", "http://127.0.0.1:8000");
                    else
                        top.postMessage("FAIL Storage access was " +
                            (hasAccess ? "" : "not ") +
                            "granted and requestStorageAccessResolved was " +
                            (requestStorageAccessResolved ? "" : "not ") +
                            "granted but should " +
                            (userShouldGrantAccess && policyShouldGrantAccess ? "" : "not ") +
                            "have been granted.", "http://127.0.0.1:8000");
                    setTimeout("setCookieAndNavigate()", 200);
                },
                function (reason) {
                    top.postMessage("FAIL document.hasStorageAccess() was rejected. Reason: " + reason, "http://127.0.0.1:8000");
                }
            );
        }

        top.postMessage("document.cookie == " + document.cookie, "http://127.0.0.1:8000");
    </script>
</head>
<body onclick="makeRequestWithUserGesture()">
</body>
</html>