<!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>
    // Frame layout:
    // top=this-file [
    //   child1=child-one.html,
    //   child-so=consumption-sameorigin-child.html [
    //     gchild=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");

        test_driver.click(document.getElementById("child-so"));
    }

    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-sameorigin-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-report') {
            test(() => {
                assert_false(msg.isActive);
                assert_true(msg.hasBeenActive);
            }, "Child1 frame final state");
        } else if (msg.type == 'child-sameorigin-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_true(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 same-origin frame boundary</h1>
  <p>Tests that user activation consumption resets the transient states in all same-origin frames.</p>
  <ol id="instructions">
    <li>Click anywhere on the green area (child frame).
  </ol>
  <iframe id="child1" width="300px" height="40px"
          src="resources/child-one.html">
  </iframe>
  <iframe id="child-so" width="300px" height="140px"
          src="resources/consumption-sameorigin-child.html">
  </iframe>
</body>
</html>
