<!DOCTYPE html>
<html>
<body onload="runTest()">
<script src="/js-test-resources/js-test.js"></script>
<script src="/js-test-resources/ui-helper.js"></script>
<script>
    description("Tests that top frame storage access is always granted in case the page requests it.");
    jsTestIsAsync = true;

    function setEnableFeature(enable) {
        if (!enable)
            testRunner.statisticsResetToConsistentState();
        internals.setResourceLoadStatisticsEnabled(enable);
        testRunner.setCookieStoragePartitioningEnabled(enable);
        testRunner.setStorageAccessAPIEnabled(enable);
    }

    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 () {
            },
            function () {
                testFailed("Promise rejected.");
                setEnableFeature(false);
                finishJSTest();
            }
        );
    }

    var hasStorageAccess;
    var requestStorageAccessResolved;

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

    function continueAfterRequestWithUserGesture() {
        var promise = document.hasStorageAccess();
        promise.then(
            function (hasAccess) {
                hasStorageAccess = hasAccess;
                shouldBe("requestStorageAccessResolved", "true");
                shouldBe("hasStorageAccess", "true");
                setEnableFeature(false);
                finishJSTest();
            },
            function (reason) {
                testFailed("document.hasStorageAccess() was rejected. Reason: " + reason);
                setEnableFeature(false);
                finishJSTest();
            }
        );
    }

    function runTest() {
        activateElement("theButton");
    }
</script>
<button id="theButton" onclick="makeRequestWithUserGesture()">Request Access</button>
</body>
</html>