text: // META: global=window,worker
  // META: script=/common/get-host-info.sub.js
  // META: script=/resource-timing/resources/sizes-helper.js
  
  const baseUrl =
    new URL('/resource-timing/resources/TAOResponse.py?tao=wildcard', location.href).href;
  const expectedSize = 4;
  
  const hostInfo = get_host_info();
  performance.clearResourceTimings();
  
  const accumulateEntry = () => {
    return new Promise(resolve => {
      const po = new PerformanceObserver(list => {
        resolve(list);
      });
      po.observe({type: "resource", buffered: true});
    });
  };
  
  const checkResourceSizes = () => {
    const entries = performance.getEntriesByType('resource');
    for (let entry of entries) {
      checkSizeFields(entry, expectedSize, expectedSize + headerSize);
    }
  }
  
  const redirectUrl = (redirectSourceOrigin, allowOrigin, targetUrl) => {
    return redirectSourceOrigin +
      '/resource-timing/resources/redirect-cors.py?allow_origin=' +
      encodeURIComponent(allowOrigin) +
      '&timing_allow_origin=*' +
      '&location=' + encodeURIComponent(targetUrl);
  }
  
  promise_test(() => {
    // Use a different URL every time so that the cache behaviour does not
    // depend on execution order.
    const directUrl = cacheBustUrl(baseUrl);
    const sameOriginRedirect = redirectUrl(hostInfo.ORIGIN, '*', directUrl);
    const crossOriginRedirect = redirectUrl(hostInfo.REMOTE_ORIGIN,
      hostInfo.ORIGIN, directUrl);
    const mixedRedirect = redirectUrl(hostInfo.REMOTE_ORIGIN,
      hostInfo.ORIGIN, sameOriginRedirect);
    const complexRedirect = redirectUrl(hostInfo.ORIGIN,
      hostInfo.REMOTE_ORIGIN, mixedRedirect);
    let eatBody = response => response.arrayBuffer();
    return fetch(directUrl)
      .then(eatBody)
      .then(() => fetch(sameOriginRedirect))
      .then(eatBody)
      .then(() => fetch(crossOriginRedirect))
      .then(eatBody)
      .then(() => fetch(mixedRedirect))
      .then(eatBody)
      .then(() => fetch(complexRedirect))
      .then(eatBody)
      .then(accumulateEntry)
      .then(checkResourceSizes);
  }, 'PerformanceResourceTiming sizes Fetch with redirect test');
  
  done();
  