<!DOCTYPE html>
<title>Test window.fence.setReportEventDataForAutomaticBeacons</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/utils.js"></script>
<script src="/common/dispatcher/dispatcher.js"></script>
<script src="resources/utils.js"></script>
<script src="/resources/testdriver.js"></script>
<script src="/resources/testdriver-actions.js"></script>
<script src="/resources/testdriver-vendor.js"></script>

<body>
<script>
promise_test(async(t) => {
  const actions = new test_driver.Actions();
  const fencedframe = await attachFencedFrameContext(
      {generator_api: 'fledge', automatic_beacon: true});
  const new_url = new URL("resources/dummy.html", location.href);
  const beacon_data = "This is the beacon data!";

  await fencedframe.execute((new_url, beacon_data) => {
    addEventListener("click", (event) => {
      let beacon_event = {
        eventType: "reserved.top_navigation",
        eventData: beacon_data,
        destination: ["buyer"],
      }
      window.fence.setReportEventDataForAutomaticBeacons(beacon_event);
      window.open(new_url, "_blank");
    });
  }, [new_url, beacon_data]);

  await actions.pointerMove(0, 0, {origin: fencedframe.element})
               .pointerDown()
               .pointerUp()
               .send();

  const received_beacon_data = await nextAutomaticBeacon();
  assert_equals(received_beacon_data, beacon_data);
}, 'Set and trigger an automatic beacon in a click handler');

promise_test(async(t) => {
  const fencedframe = await attachFencedFrameContext(
    {generator_api: 'fledge', automatic_beacon: true});
  const new_url = new URL("resources/dummy.html", location.href);
  const beacon_data = "This is the beacon data!";

  await fencedframe.execute((new_url, beacon_data) => {
    const actions = new test_driver.Actions();
    let a = document.createElement('a');
    a.textContent = "Click me!";
    a.href = new_url;
    a.target = "_blank";

    // When the anchor link is clicked, the click handler will set the data
    // before the navigation happens. This test checks to make sure that the
    // data makes it to the correct place by the time the navigation commits.
    a.onclick = () => {
      let beacon_event = {
        eventType: "reserved.top_navigation",
        eventData: beacon_data,
        destination: ["buyer"],
      }
      window.fence.setReportEventDataForAutomaticBeacons(beacon_event);
    };
    document.body.appendChild(a);

    // This will trigger the beacon data storing + navigation.
    return actions.pointerMove(0, 0, {origin: a})
                 .pointerDown()
                 .pointerUp()
                 .send();
  }, [new_url, beacon_data]);

  const received_beacon_data = await nextAutomaticBeacon();
  assert_equals(received_beacon_data, beacon_data);
}, 'Set and trigger an automatic beacon in an <a> click handler');

</script>
</body>
