<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="/js-test-resources/ui-helper.js"></script>
    <script src="/resourceLoadStatistics/resources/util.js"></script>
    <script>
        description("Tests that cross-origin iframe storage access is denied if the iframe is sandboxed, has the allow token, the iframe origin is a prevalent resource, the iframe origin has not had user interaction, and the user opts in.");
        jsTestIsAsync = true;

        window.addEventListener("message", receiveMessage, false);

        function receiveMessage(event) {
            if (event.origin === "http://localhost:8000") {
                if (event.data.indexOf("PASS") !== -1)
                    testPassed(event.data.replace("PASS ", ""));
                else
                    testFailed(event.data);
            } else
                testFailed("Received a message from an unexpected origin: " + event.origin);
            setEnableFeature(false, finishJSTest);
        }

        function activateElement(elementId) {
            var element = document.getElementById(elementId);
            var centerX = element.offsetLeft + element.offsetWidth / 2;
            var centerY = element.offsetTop + element.offsetHeight / 2;
            UIHelper.activateAt(centerX, centerY).then(
                function () {
                    if (window.eventSender)
                        eventSender.keyDown("escape");
                    else {
                        testFailed("No eventSender.");
                        setEnableFeature(false, finishJSTest);
                    }
                },
                function () {
                    testFailed("Promise rejected.");
                    setEnableFeature(false, finishJSTest);
                }
            );
        }

        function runTest() {
            activateElement("TheIframeThatRequestsStorageAccess");
        }

        const hostUnderTest = "localhost:8000";
        const statisticsUrl = "http://" + hostUnderTest + "/temp";
        testRunner.setUseITPDatabase(true);
        setEnableFeature(true, function() {
            testRunner.setStatisticsPrevalentResource(statisticsUrl, true, function() {
                if (!testRunner.isStatisticsPrevalentResource(statisticsUrl))
                    testFailed("Host did not get set as prevalent resource.");
                let iframeElement = document.createElement("iframe");
                iframeElement.setAttribute("sandbox", "allow-storage-access-by-user-activation allow-scripts allow-same-origin allow-modals");
                iframeElement.onload = runTest;
                iframeElement.id = "TheIframeThatRequestsStorageAccess";
                iframeElement.src = "http://localhost:8000/storageAccess/resources/request-storage-access-iframe.html#userShouldGrantAccess,userShouldBeConsulted,policyShouldNotGrantAccess,isNotSameOriginIframe";
                document.body.appendChild(iframeElement);
            });
        });
    </script>
</head>
<body>
</body>
</html>
