<!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>

<h1>Long Task in Nested Child Iframe</h1>
<div id="log"></div>
<script>
  const initialTime = performance.now();
  async_test(function (t) {
    assert_implements(window.PerformanceLongTaskTiming, 'Longtasks are not supported.');
    const observer = new PerformanceObserver(
        t.step_func(function (entryList) {
            const entries = entryList.getEntries();
            assert_equals(entries.length, 1,
                'Exactly one entry is expected.');
            const longtask = entries[0];
            assert_equals(longtask.entryType, 'longtask');
            if (longtask.name == 'self' ||
                longtask.name == 'multiple-contexts' ||
                longtask.name == 'unknown')
              return;

            assert_equals(longtask.name, 'same-origin-descendant');
            assert_greater_than(longtask.duration, 50);
            assert_greater_than_equal(longtask.startTime, initialTime);
            const currentTime = performance.now();
            assert_less_than_equal(longtask.startTime, currentTime);

            // 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();
            t.done();
        })
    );
    observer.observe({entryTypes: ['longtask']});
    window.onload = () => {
        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';
    };
}, 'Performance longtask entries in child iframe are observable in parent.');
</script>

</body>
