diff options
Diffstat (limited to 'test/wpt/tests/service-workers/service-worker/resource-timing-bodySize.https.html')
-rw-r--r-- | test/wpt/tests/service-workers/service-worker/resource-timing-bodySize.https.html | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/test/wpt/tests/service-workers/service-worker/resource-timing-bodySize.https.html b/test/wpt/tests/service-workers/service-worker/resource-timing-bodySize.https.html new file mode 100644 index 0000000..5c2b1eb --- /dev/null +++ b/test/wpt/tests/service-workers/service-worker/resource-timing-bodySize.https.html @@ -0,0 +1,55 @@ +<!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> |