<!DOCTYPE html>
<title>Test setReportEventDataForAutomaticBeacons called only once</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>
<script src="/common/get-host-info.sub.js"></script>
<script src="resources/automatic-beacon-helper.js"></script>

<body>
<script>
promise_test(async(t) => {
  const actions = new test_driver.Actions();
  const fencedframe = await attachFencedFrameContext(
      {generator_api: 'fledge', register_beacon: true,
       origin: get_host_info().HTTPS_REMOTE_ORIGIN});

  let beacon_event = {
    eventType: "reserved.top_navigation_commit",
    eventData: "This is the beacon data!",
    destination: ["buyer"],
    once: true,
  }
  await setupAutomaticBeacon(fencedframe, [beacon_event],
      "resources/dummy.html", NavigationTrigger.ClickOnce);

  // The first click should trigger the automatic beacon and clear the beacon
  // data.
  await actions.pointerMove(0, 0, {origin: fencedframe.element})
               .pointerDown()
               .pointerUp()
               .send();
  await verifyBeaconData(beacon_event.eventType, beacon_event.eventData);

  // The second click should not have any associated automatic beacon info, so
  // no beacon should be sent.
  // Set up a timeout to ensure that there's enough time to send any potential
  // automatic beacons.
  await actions.pointerMove(0, 0, {origin: fencedframe.element})
               .pointerDown()
               .pointerUp()
               .send();
  await verifyBeaconData(beacon_event.eventType, beacon_event.eventData, false,
      t);
}, 'Set expiring automatic beacon but trigger two events in a click handler');

</script>
</body>
