<!doctype html>
<html>
<head>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>

test(() => {
  // Check Performance attributes.
  assert_equals(typeof(performance.toJSON), 'function');
  const json = performance.toJSON();
  assert_equals(typeof(json), 'object');
  assert_equals(json.timeOrigin, performance.timeOrigin,
    'performance.toJSON().timeOrigin should match performance.timeOrigin');

  // Check PerformanceTiming toJSON.
  const jsonTiming = json.timing;
  const timing = performance.timing;
  assert_equals(typeof(timing.toJSON), 'function');
  const timingJSON = timing.toJSON();
  assert_equals(typeof(timingJSON), 'object');
  // Check PerformanceTiming attributes, from both:
  // 1) |jsonTiming| from  Performance.
  // 2) |timingJSON| from PerformanceTiming.
  const performanceTimingKeys = [
    'navigationStart',
    'unloadEventStart',
    'unloadEventEnd',
    'redirectStart',
    'redirectEnd',
    'fetchStart',
    'domainLookupStart',
    'domainLookupEnd',
    'connectStart',
    'connectEnd',
    'secureConnectionStart',
    'requestStart',
    'responseStart',
    'responseEnd',
    'domLoading',
    'domInteractive',
    'domContentLoadedEventStart',
    'domContentLoadedEventEnd',
    'domComplete',
    'loadEventStart',
    'loadEventEnd'
  ];
  for (const key of performanceTimingKeys) {
    assert_equals(jsonTiming[key], timing[key],
      `performance.toJSON().timing.${key} should match performance.timing.${key}`);
    assert_equals(timingJSON[key], timing[key],
      `performance.timing.toJSON().${key} should match performance.timing.${key}`);
  }

  // Check PerformanceNavigation toJSON.
  const jsonNavigation = json.navigation;
  const navigation = performance.navigation;
  assert_equals(typeof(navigation.toJSON), 'function');
  const navigationJSON = navigation.toJSON();
  assert_equals(typeof(navigationJSON), 'object');
  // Check PerformanceNavigation attributes, from both:
  // 1) |jsonNavigation| from  Performance.
  // 2) |navigationJSON| from PerformanceNavigation.
  let performanceNavigationKeys = ['type', 'redirectCount'];
  for (const key of performanceNavigationKeys) {
    assert_equals(jsonNavigation[key], navigation[key],
      `performance.toJSON().navigation.${key} should match performance.navigation.${key}`);
    assert_equals(navigationJSON[key], navigation[key],
      `performance.navigation.toJSON().${key} should match performance.navigation.${key}`);
  }
}, 'Test performance.toJSON()');
</script>
</body>
</html>