<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Tests for Prevalent Resource With User Interaction Timeout</title>
    <script src="/js-test-resources/js-test.js"></script>
    <script src="resources/util.js"></script>
</head>
<body>
<script>
    const hostUnderTest = "127.0.0.1:8000";
    const statisticsUrl = "http://" + hostUnderTest + "/temp";
    function runTestRunnerTest() {
        if (document.cookie !== "")
            testFailed("document.cookie not empty.");
        const cookie = "testCookie=testValue";
        document.cookie = cookie + "; max-age=100;";
        if (document.cookie !== cookie)
            testFailed("document.cookie did not get set.");

        testRunner.setStatisticsPrevalentResource(statisticsUrl, true, function() {
            if (!testRunner.isStatisticsPrevalentResource(statisticsUrl))
                testFailed("Host did not get set as prevalent resource.");

            testRunner.setStatisticsHasHadUserInteraction(statisticsUrl, true, function() {
                if (!testRunner.isStatisticsHasHadUserInteraction(statisticsUrl))
                    testFailed("Host did not get logged for user interaction.");

                testRunner.installStatisticsDidModifyDataRecordsCallback(function() {
                    if (document.cookie !== "")
                        testFailed("Cookie not deleted: " + document.cookie);
                    else
                        testPassed("Cookie deleted.");
                    internals.setResourceLoadStatisticsEnabled(false);
                    testRunner.statisticsResetToConsistentState(function() {
                        testRunner.notifyDone();
                    });
                });
                testRunner.setStatisticsShouldClassifyResourcesBeforeDataRecordsRemoval(false);
                testRunner.setStatisticsMinimumTimeBetweenDataRecordsRemoval(0);
                testRunner.setStatisticsTimeToLiveUserInteraction(0);

                // This is to ensure the timeout we're testing.
                setTimeout("testRunner.statisticsProcessStatisticsAndDataRecords()", 1000);
            });
        });
    }

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