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

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

        if (testRunner) {
            setEnableFeature(true, function() {
                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/redirect.py/?redirectTo=http://localhost:8000/resourceLoadStatistics/resources/redirect.py/?redirectTo=http://127.0.0.1:8000/resourceLoadStatistics/resources/iframe-report-back-loaded.html">
</iframe>
</body>
</html>
