chromium/third_party/blink/web_tests/http/tests/serviceworker/navigation_preload/resources/navigation-preload-resource-timing-worker.js

async function wait_for_performance_entries(url) {
  const entries = performance.getEntriesByName(url);
  if (entries.length > 0) {
    return entries;
  }
  return new Promise(resolve => {
    new PerformanceObserver(list => {
      const entries = list.getEntriesByName(url);
      if (entries.length > 0) {
        resolve(entries);
      }
    }).observe({ entryTypes: ['resource'] });
  });
}

self.addEventListener('activate', event => {
  event.waitUntil(self.registration.navigationPreload.enable());
});

self.addEventListener('fetch', event => {
  let headers;
  event.respondWith(
    event.preloadResponse
      .then(response => {
        headers = response.headers;
        return response.text();
      })
      .then(_ => wait_for_performance_entries(event.request.url))
      .then(entries => {
        return new Response(JSON.stringify({timingEntries: entries}),
                            {headers: {'Content-Type': 'text/html'}});
      })
  );
});