<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script>
        description("Tests that redirects for a non-sandboxed iframe nested in a sandboxed iframe get counted properly.");
        jsTestIsAsync = true;
        window.addEventListener("message", receiveMessage, false);

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

        function finishTest() {
            setEnableFeature(false);
            finishJSTest();
        }

        if (testRunner) {
            setEnableFeature(true);
            testRunner.setStatisticsNotifyPagesWhenDataRecordsWereScanned(true);
            testRunner.installStatisticsDidScanDataRecordsCallback(checkStats);
        }

        var lastPageInRedirectChainLoaded = false;
        var statsChecked = false;

        function receiveMessage(event) {
            if (event.origin === "null") {
                if (event.data.indexOf("PASS") === -1)
                    testFailed(event.data.replace("FAIL ", ""));
            } else
                testFailed("Received a message from an unexpected origin: " + event.origin);

            lastPageInRedirectChainLoaded = true;
            if (statsChecked)
                finishTest();
            else
                testRunner.statisticsNotifyObserver();
        }

        function checkStats() {
            shouldBeTrue('testRunner.isStatisticsRegisteredAsSubFrameUnder("http://localhost", "http://127.0.0.1")');
            shouldBeTrue('testRunner.isStatisticsRegisteredAsRedirectingTo("http://localhost", "http://127.0.0.1")');
            shouldBeTrue('testRunner.isStatisticsRegisteredAsRedirectingTo("http://127.0.0.1", "http://localhost")');

            statsChecked = true;
            if (lastPageInRedirectChainLoaded)
                finishTest();
        }
    </script>
</head>
<body>
<iframe sandbox="allow-scripts" src="http://127.0.0.1:8000/resourceLoadStatistics/resources/page-with-non-sandboxed-iframe-redirect-localhost-to-ip-to-localhost.html">
</iframe>
</body>
</html>