<!DOCTYPE html>
<meta charset="utf-8">
<meta name="timeout" content="long">
<script src="/common/utils.js"></script>
<script src="/common/get-host-info.sub.js"></script>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/test-helpers.sub.js"></script>
<script>
const {REMOTE_ORIGIN} = get_host_info();

/*
  This test does the following:
  - Loads a service worker
  - Loads an iframe in the service worker's scope
  - The service worker tries to fetch a resource which is either:
    - constructed inside the service worker
    - fetched from a different URL ny the service worker
    - Streamed from a differend URL by the service worker
    - Passes through
  - By default the RT entry should have encoded/decoded body size. except for
    the case where the response is an opaque pass-through.
*/
function test_scenario({tao, mode, name}) {
    promise_test(async (t) => {
        const uid = token();
        const worker_url = `resources/fetch-response.js?uid=${uid}`;
        const scope = `resources/fetch-response.html?uid=${uid}`;
        const iframe = document.createElement('iframe');
        const path = name === "passthrough" ? `element-timing/resources/TAOImage.py?origin=*&tao=${
            tao === "pass" ? "wildcard" : "none"})}` : name;

        iframe.src = `${scope}&path=${encodeURIComponent(
            `${mode === "same-origin" ? "" : REMOTE_ORIGIN}/${path}`)}&mode=${mode}`;
        const registration = await service_worker_unregister_and_register(t, worker_url, scope);
        t.add_cleanup(() => registration.unregister());
        t.add_cleanup(() => iframe.remove());
        await wait_for_state(t, registration.installing, 'activated');
        const waitForMessage = new Promise(resolve =>
          window.addEventListener('message', ({data}) => resolve(data)));
        document.body.appendChild(iframe);
        const {buffer, entry} = await waitForMessage;
        const expectPass = name !== "passthrough" || mode !== "no-cors";
        assert_equals(buffer.byteLength, expectPass ? entry.decodedBodySize : 0);
        assert_equals(buffer.byteLength, expectPass ? entry.encodedBodySize : 0);
    }, `Response body size: ${name}, ${mode}, TAO ${tao}`);
}
for (const mode of ["cors", "no-cors", "same-origin"]) {
  for (const tao of ["pass", "fail"])
    for (const name of ['constructed', 'forward', 'stream', 'passthrough']) {
      test_scenario({tao, mode, name});
    }
}

</script>
