<!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>
