<!DOCTYPE html>
<!--
   Tentative due to:
   https://github.com/whatwg/html/issues/1983
-->
<html>
<head>
  <script src="/resources/testharness.js"></script>
  <script src="/resources/testharnessreport.js"></script>
  <script src="/resources/testdriver.js"></script>
  <script src="/resources/testdriver-vendor.js"></script>
  <script>
    let chained_timeout_test = async_test("Chained setTimeout test");

    const max_call_depth = 3;
    const delay_ms = 10;

    function testInitialStates(depth) {
        assert_true(1 <= depth && depth <= max_call_depth);

        chained_timeout_test.step_timeout(() => {
            let test_name = "Call-depth=" + depth + ": initial activation states are false";
            test(() => {
                assert_false(navigator.userActivation.isActive);
                assert_false(navigator.userActivation.hasBeenActive);
            }, test_name);

            if (depth < max_call_depth)
                testInitialStates(depth+1);
            else
                test_driver.click(document.body);
        }, delay_ms);
    }

    function testFinalStates(depth) {
        assert_true(1 <= depth && depth <= max_call_depth);

        chained_timeout_test.step_timeout(() => {
            let test_name = "Call-depth=" + depth + ": after-click activation states are true";
            test(() => {
                assert_true(navigator.userActivation.isActive);
                assert_true(navigator.userActivation.hasBeenActive);
            }, test_name);

            if (depth < max_call_depth)
                testFinalStates(depth+1);
            else
                chained_timeout_test.done();
        }, delay_ms)
    }

    function run() {
        window.addEventListener("click", event => {
            testFinalStates(1);
        });

        testInitialStates(1);
    }
  </script>
</head>
<body onload="run()">
  <h1>User activation state in chained setTimeout calls</h1>
  <p>Tests that user activation state is visible in arbitrary call depth of setTimeout.</p>
  <ol id="instructions">
    <li>Click anywhere in the document.
  </ol></body>
</html>
