<!DOCTYPE html>
<!--
   Tentative due to:
   https://github.com/whatwg/html/issues/1983
-->
<html>
<head>
  <meta name="timeout" content="long">
  <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 src="resources/utils.js"></script>
  <script>
    // Frame layout:
    // top=origin0:this-file [
    //   child1=origin1:child-one.html,
    //   child-xo=origin2:consumption-crossorigin-child.html [
    //     gchild=origin3:child-two.html
    //   ]
    // ]
    let consumption_test = async_test("Consumption test");

    let num_children_to_load = 3;
    let num_children_to_report = 3;

    function finishLoadPhase() {
        assert_equals(num_children_to_load, 0);

        test(() => {
            assert_false(navigator.userActivation.isActive);
            assert_false(navigator.userActivation.hasBeenActive);
        }, "Parent frame initial state");

        delayByFrames(() => test_driver.click(document.getElementById("child1")), 5);
        // The click at "child-xo" happens after receiving "child-one-clicked" msg.
    }

    function finishReportPhase() {
        assert_equals(num_children_to_report, 0);

        test(() => {
            assert_false(navigator.userActivation.isActive);
            assert_true(navigator.userActivation.hasBeenActive);
        }, "Parent frame final state");

        consumption_test.done();
    }

    window.addEventListener("message", event => {
        var msg = JSON.parse(event.data);

        if (msg.type == 'child-one-loaded') {
            test(() => {
                assert_false(msg.isActive);
                assert_false(msg.hasBeenActive);
            }, "Child1 frame initial state");
        } else if (msg.type == 'child-crossorigin-loaded') {
            test(() => {
                assert_false(msg.isActive);
                assert_false(msg.hasBeenActive);
            }, "Child2 frame initial state");
        } else if (msg.type == 'child-two-loaded') {
            test(() => {
                assert_false(msg.isActive);
                assert_false(msg.hasBeenActive);
            }, "Grandchild frame initial state");
        } else if (msg.type == 'child-one-clicked') {
            test_driver.click(document.getElementById("child-xo"));
        } else if (msg.type == 'child-one-report') {
            test(() => {
                assert_false(msg.isActive);
                assert_true(msg.hasBeenActive);
            }, "Child1 frame final state");
        } else if (msg.type == 'child-crossorigin-report') {
            // This msg was triggered by a user click followed by a window.open().
            test(() => {
                assert_false(msg.isActive);
                assert_true(msg.hasBeenActive);
            }, "Child2 frame final state");

            // Ask remaining frames to report states.
            let ask_report = JSON.stringify({"type": "report"});
            frames[0].postMessage(ask_report, "*");
            frames[1].frames[0].postMessage(ask_report, "*");
        } else if (msg.type == 'child-two-report') {
            test(() => {
                assert_false(msg.isActive);
                assert_false(msg.hasBeenActive);
            }, "Grand child frame final state");
        }

        // Phase switching.
        if (msg.type.endsWith("-loaded")) {
            if (--num_children_to_load == 0)
                finishLoadPhase();
        } else if (msg.type.endsWith("-report")) {
            if (--num_children_to_report == 0)
                finishReportPhase();
        }
    });
  </script>
</head>
<body>
  <h1>User activation consumption across cross-origin frame boundary</h1>
  <p>Tests that user activation consumption resets the transient states in all cross-origin frames.</p>
  <ol id="instructions">
    <li>Click anywhere on the yellow area.
    <li>Click anywhere on the green area (child frame).
  </ol>
  <iframe id="child1" width="300px" height="40px"
          src="http://{{domains[www1]}}:{{ports[http][0]}}/html/user-activation/resources/child-one.html">
  </iframe>
  <iframe id="child-xo" width="300px" height="140px"
          src="http://{{domains[www2]}}:{{ports[http][0]}}/html/user-activation/resources/consumption-crossorigin-child.sub.html">
  </iframe>
</body>
</html>
