<!DOCTYPE html>
<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-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/utils.js"></script>
<title>Test that fenced frame notifyEvent() requires transient activation</title>

<body>
  <script>
    promise_test(async (t) => {
      const fencedframe = await attachFencedFrameContext(
                  {generator_api: 'fledge'});
      t.add_cleanup(async () => document.body.removeChild(fencedframe.element));

      let notified_promise = new Promise((resolve) => {
        fencedframe.element.addEventListener('fencedtreeclick', () => {
          resolve();
        });
      });

      await fencedframe.execute(() => {
        document.addEventListener('click', (e) => {
          assert_true(navigator.userActivation.isActive);
          window.fence.notifyEvent(e);
        });
      });

      let actions = new test_driver.Actions();
      await actions.pointerMove(10, 10, {origin: fencedframe.element})
        .pointerDown()
        .pointerUp()
        .send();

      await notified_promise;

      await fencedframe.execute(() => {
        assert_false(navigator.userActivation.isActive);
      });

      assert_true(navigator.userActivation.isActive);
      assert_true(navigator.userActivation.hasBeenActive);
    }, 'Test that notifyEvent() consumes transient user activation in the ' +
       'fenced frame and notifies activation to the embedder.');

    promise_test(async (t) => {
      const fencedframe = await attachFencedFrameContext(
                  {generator_api: 'fledge'});
      t.add_cleanup(async () => document.body.removeChild(fencedframe.element));

      let notified_promise = new Promise((resolve) => {
        fencedframe.element.addEventListener('fencedtreeclick', () => {
          resolve('notified');
        });
      });

      let opened_key = token();
      await fencedframe.execute((opened) => {
        document.addEventListener('click', (e) => {
          // We can't use `attachWindowContext` here because it requres the
          // event handler to be async, which means the state of the `e` may
          // change while we're observing it. We'll look up the key written by
          // embeddee.html later to determine the window opened.
          let opened_url = generateURL('embeddee.html', [opened]);
          window.open(opened_url, '_blank');
          window.fence.notifyEvent(e);
        });
      }, [opened_key]);

      let actions = new test_driver.Actions();
      await actions.pointerMove(10, 10, {origin: fencedframe.element})
        .pointerDown()
        .pointerUp()
        .send();

      // Confirm that the popup actually opened after clicking the fenced frame.
      let opened_value = await nextValueFromServer(opened_key);
      assert_equals(opened_value, 'PASS');
      // Confirmed that the call to notifyEvent never actually fired, because
      // opening the popup consumed user activation.
      let result = await Promise.race([
        notified_promise,
        new Promise((resolve) => {
          t.step_timeout(() => resolve('timeout'), 2000);
        })
      ]);
      assert_equals(result, 'timeout');
    }, "Test that popup navigation on click prevents notifyEvent() from " +
       "firing.");
  </script>
</body>
