<!doctype html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
  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_greater_than_equal(entries.length, 1);
        const entry = entries[0];
        assert_equals(typeof(entry.toJSON), 'function');
        const entryJSON = entry.toJSON();
        assert_equals(typeof(entryJSON), 'object');
        // Check attributes inheritted from PerformanceEntry.
        const performanceEntryKeys = [
            'name',
            'entryType',
            'startTime',
            'duration'
        ];
        for (const key of performanceEntryKeys) {
            assert_equals(entryJSON[key], entry[key],
                `entry.toJSON().${key} should match entry.${key}`);
        }

        // Check PerformanceLongTaskTiming specific entries.
        assert_equals(typeof(entryJSON.attribution), 'object');
        const entryJsonAttribution = entryJSON.attribution[0];
        assert_equals(typeof(entryJsonAttribution), 'object');
        assert_equals(entryJSON.attribution.length, entry.attribution.length);

        // Check TaskAttributionTiming toJSON.
        const entryAttribution = entry.attribution[0];
        assert_equals(typeof(entryAttribution.toJSON), 'function');
        const entryAttributionJSON = entryAttribution.toJSON();
        assert_equals(typeof(entryAttributionJSON), 'object');
        // Check TaskAttributionTiming attributes, from both:
        // 1) |entryJsonAttribution| from  PerformanceLongTaskTiming.
        // 2) |entryAttributionJSON| from TaskAttributionTiming.
        const taskAttributionTimingKeys = [
            'name',
            'entryType',
            'startTime',
            'duration',
            'containerType',
            'containerSrc',
            'containerId',
            'containerName'
        ];
        for (const key of taskAttributionTimingKeys) {
            assert_equals(entryAttributionJSON[key], entryAttribution[key],
                `attribution.toJSON().${key} should match attribution.${key}`);
            assert_equals(entryJsonAttribution[key], entryAttribution[key],
                `entry.toJSON().attribution[0].${key} should match attribution.${key}`);
        }
        t.done();
      })
    );
    observer.observe({entryTypes: ['longtask']});

    window.onload = () => {
        // Trigger a long task.
        const begin = window.performance.now();
        while (window.performance.now() < begin + 60);
    };
  }, 'Test toJSON() in PerformanceLongTaskTiming and TaskAttributionTiming');
</script>
</body>
</html>
