<!DOCTYPE HTML>
<meta charset=utf-8>
<title>LongTask Timing: long task in nested child iframe</title>
<body>

<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/utils.js"></script>

<h1>Long Task in Nested Child Iframe</h1>
<div id="log"></div>
<script>
  promise_test(async (t) => {
    assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.');
  const initialTime = performance.now();
  const performanceObserverTimeout = 5 * 1000;
  const longTasksPromise = new Promise(resolve => {
    const observer = new PerformanceObserver(
      t.step_func(function (entryList) {
        const entries = entryList.getEntries();
        entries.forEach(longtask => {
          assert_equals(longtask.entryType, 'longtask');
          if (hasUnrelatedTaskName(longtask.name, 'same-origin-descendant')) {
            return;
          }
          checkLongTaskEntry(longtask, 'same-origin-descendant');
          // Assert the TaskAttributionTiming entry in attribution.
          assert_equals(longtask.attribution.length, 1,
            'Exactly one attribution entry is expected');
          const attribution = longtask.attribution[0];
          assert_equals(attribution.entryType, 'taskattribution');
          assert_equals(attribution.name, 'unknown');
          assert_equals(attribution.duration, 0);
          assert_equals(attribution.startTime, 0);
          assert_equals(attribution.containerType, 'iframe');
          assert_equals(attribution.containerId, 'child-iframe-id');
          assert_equals(attribution.containerName, 'child-iframe-name');
          assert_equals(attribution.containerSrc, 'resources/subframe-with-longtask.html');
          observer.disconnect();
          resolve();
        })
      })
    );
    observer.observe({
      entryTypes: ['longtask']
    });
    const iframe = document.createElement('iframe');
    iframe.id = 'child-iframe-id';
    iframe.name = 'child-iframe-name';
    document.body.appendChild(iframe);
    iframe.src = 'resources/subframe-with-longtask.html';
  });
  const timeout = new Promise(
    (resolve, reject) => t.step_timeout(
      () => {
        reject(new Error('observer failed to find any entries'))
      },
      performanceObserverTimeout)
  )
  return Promise.race([longTasksPromise, timeout]);
}, 'Performance longtask entries in child iframe are observable in parent.');
</script>

</body>
