<!DOCTYPE html>
<html>
<head>
    <script src="/js-test-resources/js-test.js"></script>
    <script>
        description("Tests that redirects for sandboxed iframes 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://localhost:8000/resourceLoadStatistics/resources/redirect.php/?redirectTo=http://127.0.0.1:8000/resourceLoadStatistics/resources/redirect.php/?redirectTo=http://localhost:8000/resourceLoadStatistics/resources/iframe-report-back-loaded.html">
</iframe>
</body>
</html>