| <!DOCTYPE html> |
| <script src="/resources/testharness.js"></script> |
| <script src="/resources/testharnessreport.js"></script> |
| <script src="resources/test-helpers.sub.js"></script> |
| |
| <script> |
| const timingEventOrder = [ |
| 'startTime', |
| 'workerStart', |
| 'fetchStart', |
| 'requestStart', |
| 'responseStart', |
| 'responseEnd', |
| ]; |
| |
| function navigate_in_frame(frame, url) { |
| frame.contentWindow.location = url; |
| return new Promise((resolve) => { |
| frame.addEventListener('load', () => { |
| const timing = frame.contentWindow.performance.getEntriesByType('navigation')[0]; |
| const {timeOrigin} = frame.contentWindow.performance; |
| resolve({ |
| workerStart: timing.workerStart + timeOrigin, |
| fetchStart: timing.fetchStart + timeOrigin |
| }) |
| }); |
| }); |
| } |
| |
| const worker_url = 'resources/navigation-timing-worker-extended.js'; |
| |
| promise_test(async (t) => { |
| const scope = 'resources/timings/dummy.html'; |
| const registration = await service_worker_unregister_and_register(t, worker_url, scope); |
| t.add_cleanup(() => registration.unregister()); |
| await wait_for_state(t, registration.installing, 'activating'); |
| const frame = await with_iframe('resources/empty.html'); |
| t.add_cleanup(() => frame.remove()); |
| |
| const [timingFromEntry, timingFromWorker] = await Promise.all([ |
| navigate_in_frame(frame, scope), |
| new Promise(resolve => { |
| window.addEventListener('message', m => { |
| resolve(m.data) |
| }) |
| })]) |
| |
| assert_greater_than(timingFromWorker.activateWorkerEnd, timingFromEntry.workerStart, |
| 'workerStart marking should not wait for worker activation to finish'); |
| assert_greater_than(timingFromEntry.fetchStart, timingFromWorker.activateWorkerEnd, |
| 'fetchStart should be marked once the worker is activated'); |
| assert_greater_than(timingFromWorker.handleFetchEvent, timingFromEntry.fetchStart, |
| 'fetchStart should be marked before the Fetch event handler is called'); |
| }, 'Service worker controlled navigation timing'); |
| </script> |