<!DOCTYPE html>
<title>Test automatic beacons in ad components</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,
    component_origin: get_host_info().HTTPS_REMOTE_ORIGIN,
    num_components: 1,
    // These headers will also be given to the component ad.
    headers: [["Allow-Fenced-Frame-Automatic-Beacons", "true"]]
  });
  const new_url = new URL("resources/close.html", location.href);

  await fencedframe.execute(async (new_url) => {
    window.fence.setReportEventDataForAutomaticBeacons({
      eventType: "reserved.top_navigation_start",
      eventData: "this is the beacon data from the root fenced frame",
      destination: ["buyer"],
      crossOriginExposed: true,
    });

    // Add an ad component that will perform the top-level navigation.
    // The headers are the same as the ones given to `fencedframe`.
    const ad_component = await attachComponentFencedFrameContext();
    await ad_component.execute(async (new_url) => {
      window.fence.setReportEventDataForAutomaticBeacons({
        eventType: "reserved.top_navigation_start",
        eventData: "this is the beacon data from the ad component",
        destination: ["buyer"],
        crossOriginExposed: true,
      });
      addEventListener("click", (event) => {
        window.open(new_url);
      });
    }, [new_url]);
  }, [new_url]);

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

  // The component frame should not use its parent's data.
  // The component frame's data should not have been set.
  // The referrer header should be set to the root ad frame's origin.
  await verifyBeaconData("reserved.top_navigation_start", "<No data>");
}, 'Automatic beacon in an ad component should send without data with a ' +
   'header opt-in.');
</script>
</body>
