<!DOCTYPE html>
<html>
<body>
<script src="/js-test-resources/js-test.js"></script>
<script src="/js-test-resources/ui-helper.js"></script>
<script>
    description("Tests that user interaction is reported after history removal since that means all statistics have been reset.");
    jsTestIsAsync = true;

    const topFrameOrigin = "http://127.0.0.1:8000";
    const subFrameOrigin = "http://localhost:8000";

    function activateElement(elementId, callback) {
        var element = document.getElementById(elementId);
        var centerX = element.offsetLeft + element.offsetWidth / 2;
        var centerY = element.offsetTop + element.offsetHeight / 2;
        UIHelper.activateAt(centerX, centerY).then(
            function() {
                callback();
            },
            function() {
                testFailed("Promise rejected.");
                finishJSTest();
            }
        );
    }

    function firstInteraction() {
        shouldBeFalse("testRunner.isStatisticsHasHadUserInteraction(topFrameOrigin)");
        shouldBeFalse("testRunner.isStatisticsHasHadUserInteraction(subFrameOrigin)");
        activateElement("testElement", clearWebsiteData);
    }

    function clearWebsiteData() {
        shouldBeTrue("testRunner.isStatisticsHasHadUserInteraction(topFrameOrigin)");
        shouldBeFalse("testRunner.isStatisticsHasHadUserInteraction(subFrameOrigin)");

        if (testRunner)
            testRunner.statisticsClearThroughWebsiteDataRemoval(secondInteraction);
    }

    function secondInteraction() {
        shouldBeFalse("testRunner.isStatisticsHasHadUserInteraction(topFrameOrigin)");
        activateElement("testElement", finishTest);
    }

    function finishTest() {
        shouldBeTrue("testRunner.isStatisticsHasHadUserInteraction(topFrameOrigin)");
        shouldBeFalse("testRunner.isStatisticsHasHadUserInteraction(subFrameOrigin)");

        finishJSTest();
    }

    onload = function() {
        if (internals)
            internals.setResourceLoadStatisticsEnabled(true);

        shouldBe("document.location.origin", "topFrameOrigin");

        firstInteraction();
    };
</script>
<div id="testElement">This is the test element</div>
</body>
</html>