<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <script src="/js-test-resources/js-test.js"></script>
</head>
<body>
<script>
    description("Tests for classification based on top frame redirect collusion.");
    jsTestIsAsync = true;

    const hostUnderTest = "127.0.0.1:8000";
    const statisticsUrl = "http://" + hostUnderTest + "/temp";
    const topFrameOrigin1 = "http://127.0.0.2:8000/temp";
    const topFrameOrigin2 = "http://127.0.0.3:8000/temp";
    const topFrameOrigin3 = "http://127.0.0.4:8000/temp";
    const topFrameOrigin4 = "http://127.0.0.5:8000/temp";
    const topFrameOrigin5 = "http://localhost:8000/";

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

    function runTest() {
        testRunner.setStatisticsTopFrameUniqueRedirectFrom(statisticsUrl, topFrameOrigin1);
        testRunner.setStatisticsTopFrameUniqueRedirectFrom(topFrameOrigin1, topFrameOrigin2);
        testRunner.setStatisticsTopFrameUniqueRedirectFrom(topFrameOrigin2, topFrameOrigin3);
        testRunner.setStatisticsTopFrameUniqueRedirectFrom(topFrameOrigin3, topFrameOrigin4);

        testRunner.setStatisticsPrevalentResource(statisticsUrl, true);
        if (!testRunner.isStatisticsPrevalentResource(statisticsUrl))
            testFailed("Host explicity set did not get set as prevalent resource.");
        if (testRunner.isStatisticsPrevalentResource(topFrameOrigin1))
            testPassed("Colluding host 1 got set as prevalent resource.");
        if (testRunner.isStatisticsVeryPrevalentResource(topFrameOrigin1))
            testFailed("Colluding host 1 got classified as very prevalent resource.");
        if (testRunner.isStatisticsPrevalentResource(topFrameOrigin2))
            testPassed("Colluding host 2 got set as prevalent resource.");
        if (testRunner.isStatisticsVeryPrevalentResource(topFrameOrigin2))
            testFailed("Colluding host 2 got classified as very prevalent resource.");
        if (testRunner.isStatisticsPrevalentResource(topFrameOrigin3))
            testPassed("Colluding host 3 got set as prevalent resource.");
        if (testRunner.isStatisticsVeryPrevalentResource(topFrameOrigin3))
            testFailed("Colluding host 3 got classified as very prevalent resource.");
        if (testRunner.isStatisticsPrevalentResource(topFrameOrigin4))
            testPassed("Colluding host 4 got set as prevalent resource.");
        if (testRunner.isStatisticsVeryPrevalentResource(topFrameOrigin4))
            testFailed("Colluding host 4 got classified as very prevalent resource.");
        if (testRunner.isStatisticsPrevalentResource(topFrameOrigin5))
            testPassed("Colluding localhost got set as prevalent resource after actual navigational redirect.");
        if (testRunner.isStatisticsVeryPrevalentResource(topFrameOrigin5))
            testFailed("Colluding localhost got classified as very prevalent resource.");

        setEnableFeature(false);
        finishJSTest();
    }

    if (document.location.hash === "" && window.testRunner && window.internals) {
        setEnableFeature(true);

        testRunner.setStatisticsPrevalentResource(statisticsUrl, false);
        if (testRunner.isStatisticsPrevalentResource(statisticsUrl))
            testFailed("Host did not get set as non-prevalent resource.");

        document.location.href = topFrameOrigin5 + "resourceLoadStatistics/resources/redirect.php?redirectTo=http://127.0.0.1:8000/resourceLoadStatistics/classify-as-prevalent-based-on-top-frame-redirect-collusion.html#continue";
    } else {
        testRunner.statisticsNotifyObserver();
        runTest();
    }
</script>
</body>
</html>
