<!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 fencedframe = await attachFencedFrameContext(
      {generator_api: 'fledge', register_beacon: true,
       origin: get_host_info().HTTPS_REMOTE_ORIGIN});
  // `once` defaults to false.
  let beacon_event = {
    eventType: "reserved.top_navigation_commit",
    eventData: "This is the beacon data!",
    destination: ["buyer"],
  }

  await setupAutomaticBeacon(fencedframe, [beacon_event]);

  // The first click should trigger the automatic beacon, but the beacon data
  // should not be cleared out.
  await new test_driver.Actions()
               .pointerMove(0, 0, {origin: fencedframe.element})
               .pointerDown()
               .pointerUp()
               .send();
  await verifyBeaconData(beacon_event.eventType, beacon_event.eventData,
      get_host_info().HTTPS_REMOTE_ORIGIN);

  // The second click should still have associated automatic beacon data, and a
  // beacon should be sent.
  await new test_driver.Actions()
               .pointerMove(0, 0, {origin: fencedframe.element})
               .pointerDown()
               .pointerUp()
               .send();
  await verifyBeaconData(beacon_event.eventType, beacon_event.eventData,
      get_host_info().HTTPS_REMOTE_ORIGIN);
}, 'Set persisting automatic beacon but trigger two events in a click handler');

</script>
</body>
