<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>This test validates that PerformanceResourceTiming's toJSON method
       contains all of the entry's attributes.</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<link rel="help"
      href="https://www.w3.org/TR/resource-timing-2/#dom-performanceresourcetiming-tojson">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
promise_test(() => {
  return new Promise((resolve, reject) => {
    const po = new PerformanceObserver(list => {
      const entries = list.getEntries();
      if (entries.length < 1) {
        throw new Error(`No entries to run the test with.`);
      }
      assert_greater_than_equal(entries.length, 1);
      const entry = entries[0];
      assert_equals(typeof(entry.toJSON), 'function');
      const json = entry.toJSON();
      assert_equals(typeof(json), 'object');

      const performanceResourceTimingKeys = [
        'name',
        'entryType',
        'startTime',
        'duration',
        'initiatorType',
        'nextHopProtocol',
        'workerStart',
        'redirectStart',
        'redirectEnd',
        'fetchStart',
        'domainLookupStart',
        'domainLookupEnd',
        'connectStart',
        'connectEnd',
        'secureConnectionStart',
        'requestStart',
        'responseStart',
        'responseEnd',
        'transferSize',
        'encodedBodySize',
        'decodedBodySize',
        'renderBlockingStatus',
        'responseStatus',
        'contentType',
      ];
      for (const key of performanceResourceTimingKeys) {
        try {
          assert_false(json[key] === undefined,
            `entry.toJSON().${key} is undefined`);
          assert_equals(json[key], entry[key],
            `entry.toJSON().${key} should match entry.${key}`);
        } catch(e) {
          reject(e);
        }
      }
      resolve();
    });
    po.observe({type: "resource", buffered: true});
  });
}, 'Test toJSON() in PerformanceResourceTiming');
</script>
</body>
</html>
