<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Tests for Classification Based on Mixed Statistics</title>
    <script src="/js-test-resources/js-test.js"></script>
</head>
<body>
<script>
    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";

    function completeTest() {
        if (!testRunner.isStatisticsPrevalentResource(statisticsUrl))
            testFailed("Host did not get classified as prevalent resource.");
        if (testRunner.isStatisticsVeryPrevalentResource(statisticsUrl))
            testFailed("Host got classified as very prevalent resource.");
        else
            testPassed("Host classified as prevalent resource.");

        testRunner.statisticsResetToConsistentState();
        internals.setResourceLoadStatisticsEnabled(false);
        testRunner.notifyDone();        
    }

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

        testRunner.setStatisticsSubframeUnderTopFrameOrigin(statisticsUrl, topFrameOrigin1);
        testRunner.setStatisticsSubframeUnderTopFrameOrigin(statisticsUrl, topFrameOrigin4);

        testRunner.setStatisticsSubresourceUnderTopFrameOrigin(statisticsUrl, topFrameOrigin2);
        testRunner.setStatisticsSubresourceUnderTopFrameOrigin(statisticsUrl, topFrameOrigin3);
        testRunner.setStatisticsSubresourceUnderTopFrameOrigin(statisticsUrl, topFrameOrigin4);

        testRunner.setStatisticsSubresourceUniqueRedirectTo(statisticsUrl, topFrameOrigin3);
        testRunner.setStatisticsSubresourceUniqueRedirectTo(statisticsUrl, topFrameOrigin1);

        testRunner.installStatisticsDidScanDataRecordsCallback(completeTest);

        testRunner.statisticsProcessStatisticsAndDataRecords();
    }

    if (document.location.host === hostUnderTest && window.testRunner && window.internals) {
        testRunner.waitUntilDone();
        internals.setResourceLoadStatisticsEnabled(true);
        runTestRunnerTest();
    }
</script>
</body>
</html>
